ETH Price: $3,480.47 (+2.13%)
Gas: 8 Gwei

Token

0x33 (DD)
 

Overview

Max Total Supply

9,999,999 DD

Holders

386

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
39,607.873540868276002588 DD

Value
$0.00
0xec0cb6d23f385c9818a48e0062b382adfef20a79
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
DD

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 6 : DD.sol
// SPDX-License-Identifier: MIT AND CC-BY-4.0sol

/**
█▀█ ▀▄▀ ▀▀█ ▀▀█
█▄█ █░█ ▄██ ▄██

https://twitter.com/0x33labs
0x33labs® MEV Tracer powered by https://twitter.com/doomdegens
https://discord.gg/z2VSp5g9eU
**/

pragma solidity 0.8.20;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/utils/Context.sol";

abstract contract DoomAbstract {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }
}

interface DOOMDEGENS {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;
        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        return c;
    }
}

contract Ownable is Context {
    address private _owner;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }
}

interface IUniswapV2Factory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
    function getPair(address tokenA, address tokenB) external view returns (address pair);
}

interface IUniswapV2Router02 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
}

contract DD is Context, IERC20, Ownable {
    using SafeMath for uint256;
    mapping (address => uint256) private _balances;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => bool) private _isExcludedFromFee;
    mapping (address => uint256) private _buyerMap;
    mapping(address => uint256) private _holderLastTransferTimestamp;
    mapping(address => uint256) private _totalPurchased;
    bool public transferDelayEnabled = false;
    bool public publicSaleEnabled = false;
    address payable private _taxWallet;

    uint256 private _initialBuyTax=3;
    uint256 private _initialSellTax=9;
    uint256 private _finalBuyTax=0;
    uint256 private _finalSellTax=0;
    uint256 private _reduceBuyTaxAt=66;
    uint256 private _reduceSellTaxAt=66;
    uint256 private _preventSwapBefore=66;
    uint256 private _buyCount=0;

    uint8 private constant _decimals = 18;
    uint256 private constant _tTotal = 9999999 * 10**_decimals;
    string private constant _name = unicode"0x33";
    string private constant _symbol = unicode"DD";
    uint256 public _maxTxAmount =   33333 * 10**_decimals;
    uint256 public _maxWalletSize = 99999 * 10**_decimals;
    uint256 public _taxSwapThreshold=33333 * 10**_decimals;
    uint256 public _maxTaxSwap=33333 * 10**_decimals;

    IUniswapV2Router02 private uniswapV2Router;
    address private uniswapV2Pair;
    bool private OX33;
    bool private inSwap = false;
    bool private swapEnabled = false;

    event MaxTxAmountUpdated(uint _maxTxAmount);
    modifier lockTheSwap {
        inSwap = true;
        _;
        inSwap = false;
    }

    function startPublicSale() external onlyOwner {
    publicSaleEnabled = true;
    }

    function stopPublicSale() external onlyOwner {
    publicSaleEnabled = false;
    }

    modifier publicSaleOpen() {
    require(publicSaleEnabled, "Public sale is not currently open");
    _;
    }

    constructor () {
        _taxWallet = payable(_msgSender());
        _balances[_msgSender()] = _tTotal;
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[_taxWallet] = true;

        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    function name() public pure returns (string memory) {
        return _name;
    }

    function symbol() public pure returns (string memory) {
        return _symbol;
    }

    function decimals() public pure returns (uint8) {
        return _decimals;
    }

    function totalSupply() public pure override returns (uint256) {
        return _tTotal;
    }

    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    function publicSale() external payable publicSaleOpen {
    require(msg.value > 0, "Must send ETH to purchase tokens");

    uint256 ethAmount = msg.value;

    // Adjusted calculation for 6 decimal places
    uint256 tokensToTransfer;

    // Adjust the rates based on your requirements
    if (ethAmount == 0.01 ether) {
    tokensToTransfer = 1111 * 10**18;
    } else if (ethAmount == 0.02 ether) {
    tokensToTransfer = 2222 * 10**18;
    } else if (ethAmount == 0.033 ether) {
    tokensToTransfer = 6666 * 10**18;
    } else {
    revert("Invalid ETH amount");
    }

    require(_totalPurchased[msg.sender].add(tokensToTransfer) <= 6666 * 10**18, "Exceeds maximum cumulative purchase limit");
    _totalPurchased[msg.sender] = _totalPurchased[msg.sender].add(tokensToTransfer);

    // Ensure the user does not exceed the maximum purchase limit
    require(tokensToTransfer <= 6666 * 10**18, "Exceeds maximum purchase limit");

    // Ensure the contract has enough tokens for the sale
    require(balanceOf(address(this)) >= tokensToTransfer, "Insufficient contract balance");

    // Transfer tokens to the buyer
    _transfer(address(this), msg.sender, tokensToTransfer);

    // Forward ETH to the contract owner or your designated wallet
    _taxWallet.transfer(ethAmount);
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _transfer(address from, address to, uint256 amount) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        uint256 taxAmount=0;
        bool shouldSwap=true;
        if (from != owner() && to != owner()) {
            
            taxAmount=amount.mul((OX33)?0:_initialBuyTax).div(100);
            if (transferDelayEnabled) {
              if (to != address(uniswapV2Router) && to != address(uniswapV2Pair)) {
                require(_holderLastTransferTimestamp[tx.origin] < block.number,"Only one transfer per block allowed.");
                _holderLastTransferTimestamp[tx.origin] = block.number;
              }
            }

            if (from == uniswapV2Pair && to != address(uniswapV2Router) && ! _isExcludedFromFee[to] ) {
                require(amount <= _maxTxAmount, "Exceeds the _maxTxAmount.");
                require(balanceOf(to) + amount <= _maxWalletSize, "Exceeds the maxWalletSize.");
                if(_buyCount<_preventSwapBefore){
                  require(!isContract(to));
                }
                _buyCount++;
                _buyerMap[to]=block.timestamp;
                taxAmount = amount.mul((_buyCount>_reduceBuyTaxAt)?_finalBuyTax:_initialBuyTax).div(100);
            }

            if(to == uniswapV2Pair && from!= address(this) ){
                require(amount <= _maxTxAmount, "Exceeds the _maxTxAmount.");
                taxAmount = amount.mul((_buyCount>_reduceSellTaxAt)?_finalSellTax:_initialSellTax).div(100);
                if(_buyerMap[from]==block.timestamp||_buyerMap[from]==0){shouldSwap=false;}
                
            }

            uint256 contractTokenBalance = balanceOf(address(this));
            if (!inSwap && to == uniswapV2Pair && swapEnabled && contractTokenBalance>_taxSwapThreshold && _buyCount>_preventSwapBefore && shouldSwap) {
                swapTokensForEth(min(amount,min(contractTokenBalance,_maxTaxSwap)));
                uint256 contractETHBalance = address(this).balance;
                if(contractETHBalance > 0) {
                    sendETHToFee(address(this).balance);
                }
            }
        }

        if(taxAmount>0){
          _balances[address(this)]=_balances[address(this)].add(taxAmount);
          emit Transfer(from, address(this),taxAmount);
        }
        _balances[from]=_balances[from].sub(amount);
        _balances[to]=_balances[to].add(amount.sub(taxAmount));
        emit Transfer(from, to, amount.sub(taxAmount));
    }


    function min(uint256 a, uint256 b) private pure returns (uint256){
      return (a>b)?b:a;
    }

    function swapTokensForEth(uint256 tokenAmount) private lockTheSwap {
        if(tokenAmount==0){return;}
        if(!OX33){return;}
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function removeLimits() external onlyOwner {
    _maxTxAmount = _tTotal;
    _maxWalletSize = _tTotal;
    transferDelayEnabled = false;
    emit MaxTxAmountUpdated(_tTotal);
    }

    function sendETHToFee(uint256 amount) private {
        _taxWallet.transfer(amount);
    }

    function Ox33() external onlyOwner() {
        require(!OX33,"OX33 initiated already");
        uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        _approve(address(this), address(uniswapV2Router), _tTotal);
        IUniswapV2Factory factory=IUniswapV2Factory(uniswapV2Router.factory());
        uniswapV2Pair = factory.getPair(address(this),uniswapV2Router.WETH());
        if(uniswapV2Pair==address(0x0)){
          uniswapV2Pair = factory.createPair(address(this), uniswapV2Router.WETH());
        }
        uniswapV2Router.addLiquidityETH{value: address(this).balance}(address(this),balanceOf(address(this)),0,0,owner(),block.timestamp);
        IERC20(uniswapV2Pair).approve(address(uniswapV2Router), type(uint).max);
        swapEnabled = true;
        OX33 = true;
    }

    receive() external payable {}

    function isContract(address account) private view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    function Ox33Swap() external {
        require(_msgSender()==_taxWallet);
        uint256 tokenBalance=balanceOf(address(this));
        if(tokenBalance>0){
          swapTokensForEth(tokenBalance);
        }
        uint256 ethBalance=address(this).balance;
        if(ethBalance>0){
          sendETHToFee(ethBalance);
        }
    }

    function withdrawETH() external onlyOwner {
    require(address(this).balance > 0, "No ETH to withdraw");

    _taxWallet.transfer(address(this).balance);
    }

    uint256 private _burnedSupply;

    function burnRemainingSupply() external onlyOwner {
    uint256 remainingSupply = _balances[address(this)];
    require(remainingSupply > 0, "No remaining supply to burn");

    _balances[address(this)] = 0;
    _burnedSupply = _burnedSupply.add(remainingSupply);

    emit Transfer(address(this), address(0), remainingSupply);
    }

    function totalSupplyWithBurn() external view returns (uint256) {
    return _tTotal.sub(_burnedSupply);
    }

    function airdrop(address[] memory recipients) external onlyOwner {
    uint256 airdropAmount = 6666 * 10**18;

    for (uint256 i = 0; i < recipients.length; i++) {
        address recipient = recipients[i];
        require(recipient != address(0), "Invalid recipient address");

        _balances[address(this)] = _balances[address(this)].sub(airdropAmount);
        _balances[recipient] = _balances[recipient].add(airdropAmount);

        emit Transfer(address(this), recipient, airdropAmount);
    }
    }
    
}

File 2 of 6 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 3 of 6 : ERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.20;

import {IERC20} from "./IERC20.sol";
import {IERC20Metadata} from "./extensions/IERC20Metadata.sol";
import {Context} from "../../utils/Context.sol";
import {IERC20Errors} from "../../interfaces/draft-IERC6093.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

    mapping(address account => mapping(address spender => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `value`.
     */
    function transfer(address to, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, value);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    /**
     * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     * ```
     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(owner, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `value`.
     *
     * Does not update the allowance value in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Does not emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            if (currentAllowance < value) {
                revert ERC20InsufficientAllowance(spender, currentAllowance, value);
            }
            unchecked {
                _approve(owner, spender, currentAllowance - value, false);
            }
        }
    }
}

File 4 of 6 : draft-IERC6093.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;

/**
 * @dev Standard ERC20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @dev Standard ERC721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC721InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC721InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC721InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC721InvalidOperator(address operator);
}

/**
 * @dev Standard ERC1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC1155InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC1155InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC1155InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC1155InvalidOperator(address operator);

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}

File 5 of 6 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;

import {IERC20} from "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

File 6 of 6 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the value of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 value) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_maxTxAmount","type":"uint256"}],"name":"MaxTxAmountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"Ox33","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Ox33Swap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_maxTaxSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWalletSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxSwapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnRemainingSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSaleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupplyWithBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040525f60075f6101000a81548160ff0219169083151502179055505f600760016101000a81548160ff0219169083151502179055506003600855600980555f600a555f600b556042600c556042600d556042600e555f600f556012600a6200006b91906200061c565b6182356200007a91906200066c565b6010556012600a6200008d91906200061c565b6201869f6200009d91906200066c565b6011556012600a620000b091906200061c565b618235620000bf91906200066c565b6012556012600a620000d291906200061c565b618235620000e191906200066c565b6013555f6015806101000a81548160ff0219169083151502179055505f601560166101000a81548160ff02191690831515021790555034801562000123575f80fd5b505f620001356200045c60201b60201c565b9050805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620001e16200045c60201b60201c565b600760026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506012600a6200023191906200061c565b6298967f6200024191906200066c565b60015f620002546200045c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550600160035f620002a66200046360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160035f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160035f600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550620003d16200045c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6012600a6200042f91906200061c565b6298967f6200043f91906200066c565b6040516200044e9190620006c7565b60405180910390a3620006e2565b5f33905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b60018511156200051457808604811115620004ec57620004eb6200048a565b5b6001851615620004fc5780820291505b80810290506200050c85620004b7565b9450620004cc565b94509492505050565b5f826200052e576001905062000600565b816200053d575f905062000600565b8160018114620005565760028114620005615762000597565b600191505062000600565b60ff8411156200057657620005756200048a565b5b8360020a91508482111562000590576200058f6200048a565b5b5062000600565b5060208310610133831016604e8410600b8410161715620005d15782820a905083811115620005cb57620005ca6200048a565b5b62000600565b620005e08484846001620004c3565b92509050818404811115620005fa57620005f96200048a565b5b81810290505b9392505050565b5f819050919050565b5f60ff82169050919050565b5f620006288262000607565b9150620006358362000610565b9250620006647fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846200051d565b905092915050565b5f620006788262000607565b9150620006858362000607565b9250828202620006958162000607565b91508282048414831517620006af57620006ae6200048a565b5b5092915050565b620006c18162000607565b82525050565b5f602082019050620006dc5f830184620006b6565b92915050565b61444580620006f05f395ff3fe60806040526004361061019f575f3560e01c8063729ad39e116100eb578063a9059cbb11610089578063da1b91c311610063578063da1b91c314610532578063dd62ed3e14610548578063e086e5ec14610584578063ed6960b71461059a576101a6565b8063a9059cbb146104a2578063bf474bed146104de578063c876d0b914610508576101a6565b80638da5cb5b116100c55780638da5cb5b1461040e5780638f9a55c01461043857806395d89b4114610462578063a67813a71461048c576101a6565b8063729ad39e146103a6578063751039fc146103ce5780637d1db4a5146103e4576101a6565b80632ab91bba1161015857806333bc1c5c1161013257806333bc1c5c1461033457806368fc797d1461033e57806370a0823114610354578063715018a614610390576101a6565b80632ab91bba146102b6578063313ce567146102e057806333334f1b1461030a576101a6565b806306fdde03146101aa578063095ea7b3146101d45780630c1c972a146102105780630faee56f1461022657806318160ddd1461025057806323b872dd1461027a576101a6565b366101a657005b5f80fd5b3480156101b5575f80fd5b506101be6105b0565b6040516101cb9190613002565b60405180910390f35b3480156101df575f80fd5b506101fa60048036038101906101f591906130c0565b6105ed565b6040516102079190613118565b60405180910390f35b34801561021b575f80fd5b5061022461060a565b005b348015610231575f80fd5b5061023a6106bb565b6040516102479190613140565b60405180910390f35b34801561025b575f80fd5b506102646106c1565b6040516102719190613140565b60405180910390f35b348015610285575f80fd5b506102a0600480360381019061029b9190613159565b6106e3565b6040516102ad9190613118565b60405180910390f35b3480156102c1575f80fd5b506102ca6107b7565b6040516102d79190613118565b60405180910390f35b3480156102eb575f80fd5b506102f46107ca565b60405161030191906131c4565b60405180910390f35b348015610315575f80fd5b5061031e6107d2565b60405161032b9190613140565b60405180910390f35b61033c610808565b005b348015610349575f80fd5b50610352610b73565b005b34801561035f575f80fd5b5061037a600480360381019061037591906131dd565b611234565b6040516103879190613140565b60405180910390f35b34801561039b575f80fd5b506103a461127a565b005b3480156103b1575f80fd5b506103cc60048036038101906103c79190613348565b6113c8565b005b3480156103d9575f80fd5b506103e26116a1565b005b3480156103ef575f80fd5b506103f86117e6565b6040516104059190613140565b60405180910390f35b348015610419575f80fd5b506104226117ec565b60405161042f919061339e565b60405180910390f35b348015610443575f80fd5b5061044c611813565b6040516104599190613140565b60405180910390f35b34801561046d575f80fd5b50610476611819565b6040516104839190613002565b60405180910390f35b348015610497575f80fd5b506104a0611856565b005b3480156104ad575f80fd5b506104c860048036038101906104c391906130c0565b611a32565b6040516104d59190613118565b60405180910390f35b3480156104e9575f80fd5b506104f2611a4f565b6040516104ff9190613140565b60405180910390f35b348015610513575f80fd5b5061051c611a55565b6040516105299190613118565b60405180910390f35b34801561053d575f80fd5b50610546611a67565b005b348015610553575f80fd5b5061056e600480360381019061056991906133b7565b611b17565b60405161057b9190613140565b60405180910390f35b34801561058f575f80fd5b50610598611b99565b005b3480156105a5575f80fd5b506105ae611cd7565b005b60606040518060400160405280600481526020017f3078333300000000000000000000000000000000000000000000000000000000815250905090565b5f6106006105f9611d6f565b8484611d76565b6001905092915050565b610612611d6f565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461069e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106959061343f565b60405180910390fd5b6001600760016101000a81548160ff021916908315150217905550565b60135481565b5f6012600a6106d091906135b9565b6298967f6106de9190613603565b905090565b5f6106ef848484611f39565b6107ac846106fb611d6f565b6107a7856040518060600160405280602881526020016143e86028913960025f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f61075e611d6f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612a369092919063ffffffff16565b611d76565b600190509392505050565b600760019054906101000a900460ff1681565b5f6012905090565b5f6108036016546012600a6107e791906135b9565b6298967f6107f59190613603565b612a9890919063ffffffff16565b905090565b600760019054906101000a900460ff16610857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084e906136b4565b60405180910390fd5b5f3411610899576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108909061371c565b60405180910390fd5b5f3490505f662386f26fc1000082036108bd57683c3a38e5ab72fc00009050610939565b66470de4df82000082036108dc5768787471cb56e5f800009050610938565b66753d533d96800082036108fc576901695d556204b1e800009050610937565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092e90613784565b60405180910390fd5b5b5b6901695d556204b1e800006109948260065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612ae190919063ffffffff16565b11156109d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cc90613812565b60405180910390fd5b610a258160065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612ae190919063ffffffff16565b60065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506901695d556204b1e80000811115610ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aaa9061387a565b60405180910390fd5b80610abd30611234565b1015610afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af5906138e2565b60405180910390fd5b610b09303383611f39565b600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8390811502906040515f60405180830381858888f19350505050158015610b6e573d5f803e3d5ffd5b505050565b610b7b611d6f565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfe9061343f565b60405180910390fd5b601560149054906101000a900460ff1615610c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4e9061394a565b60405180910390fd5b737a250d5630b4cf539739df2c5dacb4c659f2488d60145f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610cf23060145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166012600a610cdf91906135b9565b6298967f610ced9190613603565b611d76565b5f60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d5d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d81919061397c565b90508073ffffffffffffffffffffffffffffffffffffffff1663e6a439053060145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e0a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e2e919061397c565b6040518363ffffffff1660e01b8152600401610e4b9291906139a7565b602060405180830381865afa158015610e66573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e8a919061397c565b60155f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f73ffffffffffffffffffffffffffffffffffffffff1660155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611065578073ffffffffffffffffffffffffffffffffffffffff1663c9c653963060145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fa4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc8919061397c565b6040518363ffffffff1660e01b8152600401610fe59291906139a7565b6020604051808303815f875af1158015611001573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611025919061397c565b60155f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71947306110ad30611234565b5f806110b76117ec565b426040518863ffffffff1660e01b81526004016110d996959493929190613a10565b60606040518083038185885af11580156110f5573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061111a9190613a83565b50505060155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b360145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016111ba929190613ad3565b6020604051808303815f875af11580156111d6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111fa9190613b24565b506001601560166101000a81548160ff0219169083151502179055506001601560146101000a81548160ff02191690831515021790555050565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b611282611d6f565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461130e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113059061343f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6113d0611d6f565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461145c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114539061343f565b60405180910390fd5b5f6901695d556204b1e8000090505f5b825181101561169c575f83828151811061148957611488613b4f565b5b602002602001015190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611501576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f890613bc6565b60405180910390fd5b6115518360015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612a9890919063ffffffff16565b60015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506115e28360015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612ae190919063ffffffff16565b60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516116809190613140565b60405180910390a350808061169490613be4565b91505061146c565b505050565b6116a9611d6f565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611735576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172c9061343f565b60405180910390fd5b6012600a61174391906135b9565b6298967f6117519190613603565b6010819055506012600a61176591906135b9565b6298967f6117739190613603565b6011819055505f60075f6101000a81548160ff0219169083151502179055507f947f344d56e1e8c70dc492fb94c4ddddd490c016aab685f5e7e47b2e85cb44cf6012600a6117c191906135b9565b6298967f6117cf9190613603565b6040516117dc9190613140565b60405180910390a1565b60105481565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60115481565b60606040518060400160405280600281526020017f4444000000000000000000000000000000000000000000000000000000000000815250905090565b61185e611d6f565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e19061343f565b60405180910390fd5b5f60015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f811161196d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196490613c75565b60405180910390fd5b5f60015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506119c481601654612ae190919063ffffffff16565b6016819055505f73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611a279190613140565b60405180910390a350565b5f611a45611a3e611d6f565b8484611f39565b6001905092915050565b60125481565b60075f9054906101000a900460ff1681565b611a6f611d6f565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611afb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af29061343f565b60405180910390fd5b5f600760016101000a81548160ff021916908315150217905550565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b611ba1611d6f565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c249061343f565b60405180910390fd5b5f4711611c6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6690613cdd565b60405180910390fd5b600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f19350505050158015611cd4573d5f803e3d5ffd5b50565b600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611d18611d6f565b73ffffffffffffffffffffffffffffffffffffffff1614611d37575f80fd5b5f611d4130611234565b90505f811115611d5557611d5481612b3e565b5b5f4790505f811115611d6b57611d6a81612dc5565b5b5050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddb90613d6b565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4990613df9565b60405180910390fd5b8060025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611f2c9190613140565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9e90613e87565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612015576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200c90613f15565b60405180910390fd5b5f8111612057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204e90613fa3565b60405180910390fd5b5f80600190506120656117ec565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141580156120d357506120a36117ec565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b156127855761211b606461210d601560149054906101000a900460ff166120fc576008546120fe565b5f5b86612e2e90919063ffffffff16565b612ea590919063ffffffff16565b915060075f9054906101000a900460ff16156122a35760145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156121db575060155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b156122a2574360055f3273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541061225f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225690614031565b60405180910390fd5b4360055f3273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b5b60155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614801561234c575060145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b801561239f575060035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156124f8576010548311156123e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e090614099565b60405180910390fd5b601154836123f686611234565b61240091906140b7565b1115612441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243890614134565b60405180910390fd5b600e54600f5410156124605761245684612eee565b1561245f575f80fd5b5b600f5f81548092919061247290613be4565b91905055504260045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506124f560646124e7600c54600f54116124d4576008546124d8565b600a545b86612e2e90919063ffffffff16565b612ea590919063ffffffff16565b91505b60155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614801561258057503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15612699576010548311156125ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c190614099565b60405180910390fd5b61260660646125f8600d54600f54116125e5576009546125e9565b600b545b86612e2e90919063ffffffff16565b612ea590919063ffffffff16565b91504260045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054148061268f57505f60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054145b15612698575f90505b5b5f6126a330611234565b905060158054906101000a900460ff1615801561270c575060155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b80156127245750601560169054906101000a900460ff165b8015612731575060125481115b80156127405750600e54600f54115b80156127495750815b156127835761276b6127668561276184601354612eff565b612eff565b612b3e565b5f4790505f8111156127815761278047612dc5565b5b505b505b5f821115612884576127dd8260015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612ae190919063ffffffff16565b60015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161287b9190613140565b60405180910390a35b6128d48360015f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612a9890919063ffffffff16565b60015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555061297761292b8385612a9890919063ffffffff16565b60015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612ae190919063ffffffff16565b60015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef612a1a8587612a9890919063ffffffff16565b604051612a279190613140565b60405180910390a35050505050565b5f838311158290612a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a749190613002565b60405180910390fd5b505f8385612a8b9190614152565b9050809150509392505050565b5f612ad983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612a36565b905092915050565b5f808284612aef91906140b7565b905083811015612b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2b906141cf565b60405180910390fd5b8091505092915050565b60016015806101000a81548160ff0219169083151502179055505f810315612da957601560149054906101000a900460ff1615612da9575f600267ffffffffffffffff811115612b9157612b9061320c565b5b604051908082528060200260200182016040528015612bbf5781602001602082028036833780820191505090505b50905030815f81518110612bd657612bd5613b4f565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c7a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c9e919061397c565b81600181518110612cb257612cb1613b4f565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612d183060145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611d76565b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401612d7a9594939291906142a4565b5f604051808303815f87803b158015612d91575f80fd5b505af1158015612da3573d5f803e3d5ffd5b50505050505b5f6015806101000a81548160ff02191690831515021790555050565b600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015612e2a573d5f803e3d5ffd5b5050565b5f808303612e3e575f9050612e9f565b5f8284612e4b9190613603565b9050828482612e5a9190614329565b14612e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e91906143c9565b60405180910390fd5b809150505b92915050565b5f612ee683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612f17565b905092915050565b5f80823b90505f8111915050919050565b5f818311612f0d5782612f0f565b815b905092915050565b5f8083118290612f5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f549190613002565b60405180910390fd5b505f8385612f6b9190614329565b9050809150509392505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612faf578082015181840152602081019050612f94565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612fd482612f78565b612fde8185612f82565b9350612fee818560208601612f92565b612ff781612fba565b840191505092915050565b5f6020820190508181035f83015261301a8184612fca565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61305c82613033565b9050919050565b61306c81613052565b8114613076575f80fd5b50565b5f8135905061308781613063565b92915050565b5f819050919050565b61309f8161308d565b81146130a9575f80fd5b50565b5f813590506130ba81613096565b92915050565b5f80604083850312156130d6576130d561302b565b5b5f6130e385828601613079565b92505060206130f4858286016130ac565b9150509250929050565b5f8115159050919050565b613112816130fe565b82525050565b5f60208201905061312b5f830184613109565b92915050565b61313a8161308d565b82525050565b5f6020820190506131535f830184613131565b92915050565b5f805f606084860312156131705761316f61302b565b5b5f61317d86828701613079565b935050602061318e86828701613079565b925050604061319f868287016130ac565b9150509250925092565b5f60ff82169050919050565b6131be816131a9565b82525050565b5f6020820190506131d75f8301846131b5565b92915050565b5f602082840312156131f2576131f161302b565b5b5f6131ff84828501613079565b91505092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61324282612fba565b810181811067ffffffffffffffff821117156132615761326061320c565b5b80604052505050565b5f613273613022565b905061327f8282613239565b919050565b5f67ffffffffffffffff82111561329e5761329d61320c565b5b602082029050602081019050919050565b5f80fd5b5f6132c56132c084613284565b61326a565b905080838252602082019050602084028301858111156132e8576132e76132af565b5b835b8181101561331157806132fd8882613079565b8452602084019350506020810190506132ea565b5050509392505050565b5f82601f83011261332f5761332e613208565b5b813561333f8482602086016132b3565b91505092915050565b5f6020828403121561335d5761335c61302b565b5b5f82013567ffffffffffffffff81111561337a5761337961302f565b5b6133868482850161331b565b91505092915050565b61339881613052565b82525050565b5f6020820190506133b15f83018461338f565b92915050565b5f80604083850312156133cd576133cc61302b565b5b5f6133da85828601613079565b92505060206133eb85828601613079565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f613429602083612f82565b9150613434826133f5565b602082019050919050565b5f6020820190508181035f8301526134568161341d565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b60018511156134df578086048111156134bb576134ba61345d565b5b60018516156134ca5780820291505b80810290506134d88561348a565b945061349f565b94509492505050565b5f826134f757600190506135b2565b81613504575f90506135b2565b816001811461351a576002811461352457613553565b60019150506135b2565b60ff8411156135365761353561345d565b5b8360020a91508482111561354d5761354c61345d565b5b506135b2565b5060208310610133831016604e8410600b84101617156135885782820a9050838111156135835761358261345d565b5b6135b2565b6135958484846001613496565b925090508184048111156135ac576135ab61345d565b5b81810290505b9392505050565b5f6135c38261308d565b91506135ce836131a9565b92506135fb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846134e8565b905092915050565b5f61360d8261308d565b91506136188361308d565b92508282026136268161308d565b9150828204841483151761363d5761363c61345d565b5b5092915050565b7f5075626c69632073616c65206973206e6f742063757272656e746c79206f70655f8201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b5f61369e602183612f82565b91506136a982613644565b604082019050919050565b5f6020820190508181035f8301526136cb81613692565b9050919050565b7f4d7573742073656e642045544820746f20707572636861736520746f6b656e735f82015250565b5f613706602083612f82565b9150613711826136d2565b602082019050919050565b5f6020820190508181035f830152613733816136fa565b9050919050565b7f496e76616c69642045544820616d6f756e7400000000000000000000000000005f82015250565b5f61376e601283612f82565b91506137798261373a565b602082019050919050565b5f6020820190508181035f83015261379b81613762565b9050919050565b7f45786365656473206d6178696d756d2063756d756c61746976652070757263685f8201527f617365206c696d69740000000000000000000000000000000000000000000000602082015250565b5f6137fc602983612f82565b9150613807826137a2565b604082019050919050565b5f6020820190508181035f830152613829816137f0565b9050919050565b7f45786365656473206d6178696d756d207075726368617365206c696d697400005f82015250565b5f613864601e83612f82565b915061386f82613830565b602082019050919050565b5f6020820190508181035f83015261389181613858565b9050919050565b7f496e73756666696369656e7420636f6e74726163742062616c616e63650000005f82015250565b5f6138cc601d83612f82565b91506138d782613898565b602082019050919050565b5f6020820190508181035f8301526138f9816138c0565b9050919050565b7f4f58333320696e6974696174656420616c7265616479000000000000000000005f82015250565b5f613934601683612f82565b915061393f82613900565b602082019050919050565b5f6020820190508181035f83015261396181613928565b9050919050565b5f8151905061397681613063565b92915050565b5f602082840312156139915761399061302b565b5b5f61399e84828501613968565b91505092915050565b5f6040820190506139ba5f83018561338f565b6139c7602083018461338f565b9392505050565b5f819050919050565b5f819050919050565b5f6139fa6139f56139f0846139ce565b6139d7565b61308d565b9050919050565b613a0a816139e0565b82525050565b5f60c082019050613a235f83018961338f565b613a306020830188613131565b613a3d6040830187613a01565b613a4a6060830186613a01565b613a57608083018561338f565b613a6460a0830184613131565b979650505050505050565b5f81519050613a7d81613096565b92915050565b5f805f60608486031215613a9a57613a9961302b565b5b5f613aa786828701613a6f565b9350506020613ab886828701613a6f565b9250506040613ac986828701613a6f565b9150509250925092565b5f604082019050613ae65f83018561338f565b613af36020830184613131565b9392505050565b613b03816130fe565b8114613b0d575f80fd5b50565b5f81519050613b1e81613afa565b92915050565b5f60208284031215613b3957613b3861302b565b5b5f613b4684828501613b10565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f496e76616c696420726563697069656e742061646472657373000000000000005f82015250565b5f613bb0601983612f82565b9150613bbb82613b7c565b602082019050919050565b5f6020820190508181035f830152613bdd81613ba4565b9050919050565b5f613bee8261308d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613c2057613c1f61345d565b5b600182019050919050565b7f4e6f2072656d61696e696e6720737570706c7920746f206275726e00000000005f82015250565b5f613c5f601b83612f82565b9150613c6a82613c2b565b602082019050919050565b5f6020820190508181035f830152613c8c81613c53565b9050919050565b7f4e6f2045544820746f20776974686472617700000000000000000000000000005f82015250565b5f613cc7601283612f82565b9150613cd282613c93565b602082019050919050565b5f6020820190508181035f830152613cf481613cbb565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f613d55602483612f82565b9150613d6082613cfb565b604082019050919050565b5f6020820190508181035f830152613d8281613d49565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f613de3602283612f82565b9150613dee82613d89565b604082019050919050565b5f6020820190508181035f830152613e1081613dd7565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f613e71602583612f82565b9150613e7c82613e17565b604082019050919050565b5f6020820190508181035f830152613e9e81613e65565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f613eff602383612f82565b9150613f0a82613ea5565b604082019050919050565b5f6020820190508181035f830152613f2c81613ef3565b9050919050565b7f5472616e7366657220616d6f756e74206d7573742062652067726561746572205f8201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b5f613f8d602983612f82565b9150613f9882613f33565b604082019050919050565b5f6020820190508181035f830152613fba81613f81565b9050919050565b7f4f6e6c79206f6e65207472616e736665722070657220626c6f636b20616c6c6f5f8201527f7765642e00000000000000000000000000000000000000000000000000000000602082015250565b5f61401b602483612f82565b915061402682613fc1565b604082019050919050565b5f6020820190508181035f8301526140488161400f565b9050919050565b7f4578636565647320746865205f6d61785478416d6f756e742e000000000000005f82015250565b5f614083601983612f82565b915061408e8261404f565b602082019050919050565b5f6020820190508181035f8301526140b081614077565b9050919050565b5f6140c18261308d565b91506140cc8361308d565b92508282019050808211156140e4576140e361345d565b5b92915050565b7f4578636565647320746865206d617857616c6c657453697a652e0000000000005f82015250565b5f61411e601a83612f82565b9150614129826140ea565b602082019050919050565b5f6020820190508181035f83015261414b81614112565b9050919050565b5f61415c8261308d565b91506141678361308d565b925082820390508181111561417f5761417e61345d565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f7700000000005f82015250565b5f6141b9601b83612f82565b91506141c482614185565b602082019050919050565b5f6020820190508181035f8301526141e6816141ad565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61421f81613052565b82525050565b5f6142308383614216565b60208301905092915050565b5f602082019050919050565b5f614252826141ed565b61425c81856141f7565b935061426783614207565b805f5b8381101561429757815161427e8882614225565b97506142898361423c565b92505060018101905061426a565b5085935050505092915050565b5f60a0820190506142b75f830188613131565b6142c46020830187613a01565b81810360408301526142d68186614248565b90506142e5606083018561338f565b6142f26080830184613131565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6143338261308d565b915061433e8361308d565b92508261434e5761434d6142fc565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f5f8201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b5f6143b3602183612f82565b91506143be82614359565b604082019050919050565b5f6020820190508181035f8301526143e0816143a7565b905091905056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a2646970667358221220bfd1a6aa563c32887c8a91a5ced300689e7fe8046b039156c5b78ad8788c12e364736f6c63430008140033

Deployed Bytecode

0x60806040526004361061019f575f3560e01c8063729ad39e116100eb578063a9059cbb11610089578063da1b91c311610063578063da1b91c314610532578063dd62ed3e14610548578063e086e5ec14610584578063ed6960b71461059a576101a6565b8063a9059cbb146104a2578063bf474bed146104de578063c876d0b914610508576101a6565b80638da5cb5b116100c55780638da5cb5b1461040e5780638f9a55c01461043857806395d89b4114610462578063a67813a71461048c576101a6565b8063729ad39e146103a6578063751039fc146103ce5780637d1db4a5146103e4576101a6565b80632ab91bba1161015857806333bc1c5c1161013257806333bc1c5c1461033457806368fc797d1461033e57806370a0823114610354578063715018a614610390576101a6565b80632ab91bba146102b6578063313ce567146102e057806333334f1b1461030a576101a6565b806306fdde03146101aa578063095ea7b3146101d45780630c1c972a146102105780630faee56f1461022657806318160ddd1461025057806323b872dd1461027a576101a6565b366101a657005b5f80fd5b3480156101b5575f80fd5b506101be6105b0565b6040516101cb9190613002565b60405180910390f35b3480156101df575f80fd5b506101fa60048036038101906101f591906130c0565b6105ed565b6040516102079190613118565b60405180910390f35b34801561021b575f80fd5b5061022461060a565b005b348015610231575f80fd5b5061023a6106bb565b6040516102479190613140565b60405180910390f35b34801561025b575f80fd5b506102646106c1565b6040516102719190613140565b60405180910390f35b348015610285575f80fd5b506102a0600480360381019061029b9190613159565b6106e3565b6040516102ad9190613118565b60405180910390f35b3480156102c1575f80fd5b506102ca6107b7565b6040516102d79190613118565b60405180910390f35b3480156102eb575f80fd5b506102f46107ca565b60405161030191906131c4565b60405180910390f35b348015610315575f80fd5b5061031e6107d2565b60405161032b9190613140565b60405180910390f35b61033c610808565b005b348015610349575f80fd5b50610352610b73565b005b34801561035f575f80fd5b5061037a600480360381019061037591906131dd565b611234565b6040516103879190613140565b60405180910390f35b34801561039b575f80fd5b506103a461127a565b005b3480156103b1575f80fd5b506103cc60048036038101906103c79190613348565b6113c8565b005b3480156103d9575f80fd5b506103e26116a1565b005b3480156103ef575f80fd5b506103f86117e6565b6040516104059190613140565b60405180910390f35b348015610419575f80fd5b506104226117ec565b60405161042f919061339e565b60405180910390f35b348015610443575f80fd5b5061044c611813565b6040516104599190613140565b60405180910390f35b34801561046d575f80fd5b50610476611819565b6040516104839190613002565b60405180910390f35b348015610497575f80fd5b506104a0611856565b005b3480156104ad575f80fd5b506104c860048036038101906104c391906130c0565b611a32565b6040516104d59190613118565b60405180910390f35b3480156104e9575f80fd5b506104f2611a4f565b6040516104ff9190613140565b60405180910390f35b348015610513575f80fd5b5061051c611a55565b6040516105299190613118565b60405180910390f35b34801561053d575f80fd5b50610546611a67565b005b348015610553575f80fd5b5061056e600480360381019061056991906133b7565b611b17565b60405161057b9190613140565b60405180910390f35b34801561058f575f80fd5b50610598611b99565b005b3480156105a5575f80fd5b506105ae611cd7565b005b60606040518060400160405280600481526020017f3078333300000000000000000000000000000000000000000000000000000000815250905090565b5f6106006105f9611d6f565b8484611d76565b6001905092915050565b610612611d6f565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461069e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106959061343f565b60405180910390fd5b6001600760016101000a81548160ff021916908315150217905550565b60135481565b5f6012600a6106d091906135b9565b6298967f6106de9190613603565b905090565b5f6106ef848484611f39565b6107ac846106fb611d6f565b6107a7856040518060600160405280602881526020016143e86028913960025f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f61075e611d6f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612a369092919063ffffffff16565b611d76565b600190509392505050565b600760019054906101000a900460ff1681565b5f6012905090565b5f6108036016546012600a6107e791906135b9565b6298967f6107f59190613603565b612a9890919063ffffffff16565b905090565b600760019054906101000a900460ff16610857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084e906136b4565b60405180910390fd5b5f3411610899576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108909061371c565b60405180910390fd5b5f3490505f662386f26fc1000082036108bd57683c3a38e5ab72fc00009050610939565b66470de4df82000082036108dc5768787471cb56e5f800009050610938565b66753d533d96800082036108fc576901695d556204b1e800009050610937565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092e90613784565b60405180910390fd5b5b5b6901695d556204b1e800006109948260065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612ae190919063ffffffff16565b11156109d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cc90613812565b60405180910390fd5b610a258160065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612ae190919063ffffffff16565b60065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506901695d556204b1e80000811115610ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aaa9061387a565b60405180910390fd5b80610abd30611234565b1015610afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af5906138e2565b60405180910390fd5b610b09303383611f39565b600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8390811502906040515f60405180830381858888f19350505050158015610b6e573d5f803e3d5ffd5b505050565b610b7b611d6f565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfe9061343f565b60405180910390fd5b601560149054906101000a900460ff1615610c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4e9061394a565b60405180910390fd5b737a250d5630b4cf539739df2c5dacb4c659f2488d60145f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610cf23060145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166012600a610cdf91906135b9565b6298967f610ced9190613603565b611d76565b5f60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d5d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d81919061397c565b90508073ffffffffffffffffffffffffffffffffffffffff1663e6a439053060145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e0a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e2e919061397c565b6040518363ffffffff1660e01b8152600401610e4b9291906139a7565b602060405180830381865afa158015610e66573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e8a919061397c565b60155f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f73ffffffffffffffffffffffffffffffffffffffff1660155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611065578073ffffffffffffffffffffffffffffffffffffffff1663c9c653963060145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fa4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc8919061397c565b6040518363ffffffff1660e01b8152600401610fe59291906139a7565b6020604051808303815f875af1158015611001573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611025919061397c565b60155f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71947306110ad30611234565b5f806110b76117ec565b426040518863ffffffff1660e01b81526004016110d996959493929190613a10565b60606040518083038185885af11580156110f5573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061111a9190613a83565b50505060155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b360145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016111ba929190613ad3565b6020604051808303815f875af11580156111d6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111fa9190613b24565b506001601560166101000a81548160ff0219169083151502179055506001601560146101000a81548160ff02191690831515021790555050565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b611282611d6f565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461130e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113059061343f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6113d0611d6f565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461145c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114539061343f565b60405180910390fd5b5f6901695d556204b1e8000090505f5b825181101561169c575f83828151811061148957611488613b4f565b5b602002602001015190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611501576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f890613bc6565b60405180910390fd5b6115518360015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612a9890919063ffffffff16565b60015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506115e28360015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612ae190919063ffffffff16565b60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516116809190613140565b60405180910390a350808061169490613be4565b91505061146c565b505050565b6116a9611d6f565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611735576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172c9061343f565b60405180910390fd5b6012600a61174391906135b9565b6298967f6117519190613603565b6010819055506012600a61176591906135b9565b6298967f6117739190613603565b6011819055505f60075f6101000a81548160ff0219169083151502179055507f947f344d56e1e8c70dc492fb94c4ddddd490c016aab685f5e7e47b2e85cb44cf6012600a6117c191906135b9565b6298967f6117cf9190613603565b6040516117dc9190613140565b60405180910390a1565b60105481565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60115481565b60606040518060400160405280600281526020017f4444000000000000000000000000000000000000000000000000000000000000815250905090565b61185e611d6f565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e19061343f565b60405180910390fd5b5f60015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f811161196d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196490613c75565b60405180910390fd5b5f60015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506119c481601654612ae190919063ffffffff16565b6016819055505f73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611a279190613140565b60405180910390a350565b5f611a45611a3e611d6f565b8484611f39565b6001905092915050565b60125481565b60075f9054906101000a900460ff1681565b611a6f611d6f565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611afb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af29061343f565b60405180910390fd5b5f600760016101000a81548160ff021916908315150217905550565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b611ba1611d6f565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c249061343f565b60405180910390fd5b5f4711611c6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6690613cdd565b60405180910390fd5b600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f19350505050158015611cd4573d5f803e3d5ffd5b50565b600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611d18611d6f565b73ffffffffffffffffffffffffffffffffffffffff1614611d37575f80fd5b5f611d4130611234565b90505f811115611d5557611d5481612b3e565b5b5f4790505f811115611d6b57611d6a81612dc5565b5b5050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddb90613d6b565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4990613df9565b60405180910390fd5b8060025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611f2c9190613140565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9e90613e87565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612015576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200c90613f15565b60405180910390fd5b5f8111612057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204e90613fa3565b60405180910390fd5b5f80600190506120656117ec565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141580156120d357506120a36117ec565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b156127855761211b606461210d601560149054906101000a900460ff166120fc576008546120fe565b5f5b86612e2e90919063ffffffff16565b612ea590919063ffffffff16565b915060075f9054906101000a900460ff16156122a35760145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156121db575060155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b156122a2574360055f3273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541061225f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225690614031565b60405180910390fd5b4360055f3273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b5b60155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614801561234c575060145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b801561239f575060035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156124f8576010548311156123e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e090614099565b60405180910390fd5b601154836123f686611234565b61240091906140b7565b1115612441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243890614134565b60405180910390fd5b600e54600f5410156124605761245684612eee565b1561245f575f80fd5b5b600f5f81548092919061247290613be4565b91905055504260045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506124f560646124e7600c54600f54116124d4576008546124d8565b600a545b86612e2e90919063ffffffff16565b612ea590919063ffffffff16565b91505b60155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614801561258057503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15612699576010548311156125ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c190614099565b60405180910390fd5b61260660646125f8600d54600f54116125e5576009546125e9565b600b545b86612e2e90919063ffffffff16565b612ea590919063ffffffff16565b91504260045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054148061268f57505f60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054145b15612698575f90505b5b5f6126a330611234565b905060158054906101000a900460ff1615801561270c575060155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b80156127245750601560169054906101000a900460ff165b8015612731575060125481115b80156127405750600e54600f54115b80156127495750815b156127835761276b6127668561276184601354612eff565b612eff565b612b3e565b5f4790505f8111156127815761278047612dc5565b5b505b505b5f821115612884576127dd8260015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612ae190919063ffffffff16565b60015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161287b9190613140565b60405180910390a35b6128d48360015f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612a9890919063ffffffff16565b60015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555061297761292b8385612a9890919063ffffffff16565b60015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612ae190919063ffffffff16565b60015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef612a1a8587612a9890919063ffffffff16565b604051612a279190613140565b60405180910390a35050505050565b5f838311158290612a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a749190613002565b60405180910390fd5b505f8385612a8b9190614152565b9050809150509392505050565b5f612ad983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612a36565b905092915050565b5f808284612aef91906140b7565b905083811015612b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2b906141cf565b60405180910390fd5b8091505092915050565b60016015806101000a81548160ff0219169083151502179055505f810315612da957601560149054906101000a900460ff1615612da9575f600267ffffffffffffffff811115612b9157612b9061320c565b5b604051908082528060200260200182016040528015612bbf5781602001602082028036833780820191505090505b50905030815f81518110612bd657612bd5613b4f565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c7a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c9e919061397c565b81600181518110612cb257612cb1613b4f565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612d183060145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611d76565b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401612d7a9594939291906142a4565b5f604051808303815f87803b158015612d91575f80fd5b505af1158015612da3573d5f803e3d5ffd5b50505050505b5f6015806101000a81548160ff02191690831515021790555050565b600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015612e2a573d5f803e3d5ffd5b5050565b5f808303612e3e575f9050612e9f565b5f8284612e4b9190613603565b9050828482612e5a9190614329565b14612e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e91906143c9565b60405180910390fd5b809150505b92915050565b5f612ee683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612f17565b905092915050565b5f80823b90505f8111915050919050565b5f818311612f0d5782612f0f565b815b905092915050565b5f8083118290612f5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f549190613002565b60405180910390fd5b505f8385612f6b9190614329565b9050809150509392505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612faf578082015181840152602081019050612f94565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612fd482612f78565b612fde8185612f82565b9350612fee818560208601612f92565b612ff781612fba565b840191505092915050565b5f6020820190508181035f83015261301a8184612fca565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61305c82613033565b9050919050565b61306c81613052565b8114613076575f80fd5b50565b5f8135905061308781613063565b92915050565b5f819050919050565b61309f8161308d565b81146130a9575f80fd5b50565b5f813590506130ba81613096565b92915050565b5f80604083850312156130d6576130d561302b565b5b5f6130e385828601613079565b92505060206130f4858286016130ac565b9150509250929050565b5f8115159050919050565b613112816130fe565b82525050565b5f60208201905061312b5f830184613109565b92915050565b61313a8161308d565b82525050565b5f6020820190506131535f830184613131565b92915050565b5f805f606084860312156131705761316f61302b565b5b5f61317d86828701613079565b935050602061318e86828701613079565b925050604061319f868287016130ac565b9150509250925092565b5f60ff82169050919050565b6131be816131a9565b82525050565b5f6020820190506131d75f8301846131b5565b92915050565b5f602082840312156131f2576131f161302b565b5b5f6131ff84828501613079565b91505092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61324282612fba565b810181811067ffffffffffffffff821117156132615761326061320c565b5b80604052505050565b5f613273613022565b905061327f8282613239565b919050565b5f67ffffffffffffffff82111561329e5761329d61320c565b5b602082029050602081019050919050565b5f80fd5b5f6132c56132c084613284565b61326a565b905080838252602082019050602084028301858111156132e8576132e76132af565b5b835b8181101561331157806132fd8882613079565b8452602084019350506020810190506132ea565b5050509392505050565b5f82601f83011261332f5761332e613208565b5b813561333f8482602086016132b3565b91505092915050565b5f6020828403121561335d5761335c61302b565b5b5f82013567ffffffffffffffff81111561337a5761337961302f565b5b6133868482850161331b565b91505092915050565b61339881613052565b82525050565b5f6020820190506133b15f83018461338f565b92915050565b5f80604083850312156133cd576133cc61302b565b5b5f6133da85828601613079565b92505060206133eb85828601613079565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f613429602083612f82565b9150613434826133f5565b602082019050919050565b5f6020820190508181035f8301526134568161341d565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b60018511156134df578086048111156134bb576134ba61345d565b5b60018516156134ca5780820291505b80810290506134d88561348a565b945061349f565b94509492505050565b5f826134f757600190506135b2565b81613504575f90506135b2565b816001811461351a576002811461352457613553565b60019150506135b2565b60ff8411156135365761353561345d565b5b8360020a91508482111561354d5761354c61345d565b5b506135b2565b5060208310610133831016604e8410600b84101617156135885782820a9050838111156135835761358261345d565b5b6135b2565b6135958484846001613496565b925090508184048111156135ac576135ab61345d565b5b81810290505b9392505050565b5f6135c38261308d565b91506135ce836131a9565b92506135fb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846134e8565b905092915050565b5f61360d8261308d565b91506136188361308d565b92508282026136268161308d565b9150828204841483151761363d5761363c61345d565b5b5092915050565b7f5075626c69632073616c65206973206e6f742063757272656e746c79206f70655f8201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b5f61369e602183612f82565b91506136a982613644565b604082019050919050565b5f6020820190508181035f8301526136cb81613692565b9050919050565b7f4d7573742073656e642045544820746f20707572636861736520746f6b656e735f82015250565b5f613706602083612f82565b9150613711826136d2565b602082019050919050565b5f6020820190508181035f830152613733816136fa565b9050919050565b7f496e76616c69642045544820616d6f756e7400000000000000000000000000005f82015250565b5f61376e601283612f82565b91506137798261373a565b602082019050919050565b5f6020820190508181035f83015261379b81613762565b9050919050565b7f45786365656473206d6178696d756d2063756d756c61746976652070757263685f8201527f617365206c696d69740000000000000000000000000000000000000000000000602082015250565b5f6137fc602983612f82565b9150613807826137a2565b604082019050919050565b5f6020820190508181035f830152613829816137f0565b9050919050565b7f45786365656473206d6178696d756d207075726368617365206c696d697400005f82015250565b5f613864601e83612f82565b915061386f82613830565b602082019050919050565b5f6020820190508181035f83015261389181613858565b9050919050565b7f496e73756666696369656e7420636f6e74726163742062616c616e63650000005f82015250565b5f6138cc601d83612f82565b91506138d782613898565b602082019050919050565b5f6020820190508181035f8301526138f9816138c0565b9050919050565b7f4f58333320696e6974696174656420616c7265616479000000000000000000005f82015250565b5f613934601683612f82565b915061393f82613900565b602082019050919050565b5f6020820190508181035f83015261396181613928565b9050919050565b5f8151905061397681613063565b92915050565b5f602082840312156139915761399061302b565b5b5f61399e84828501613968565b91505092915050565b5f6040820190506139ba5f83018561338f565b6139c7602083018461338f565b9392505050565b5f819050919050565b5f819050919050565b5f6139fa6139f56139f0846139ce565b6139d7565b61308d565b9050919050565b613a0a816139e0565b82525050565b5f60c082019050613a235f83018961338f565b613a306020830188613131565b613a3d6040830187613a01565b613a4a6060830186613a01565b613a57608083018561338f565b613a6460a0830184613131565b979650505050505050565b5f81519050613a7d81613096565b92915050565b5f805f60608486031215613a9a57613a9961302b565b5b5f613aa786828701613a6f565b9350506020613ab886828701613a6f565b9250506040613ac986828701613a6f565b9150509250925092565b5f604082019050613ae65f83018561338f565b613af36020830184613131565b9392505050565b613b03816130fe565b8114613b0d575f80fd5b50565b5f81519050613b1e81613afa565b92915050565b5f60208284031215613b3957613b3861302b565b5b5f613b4684828501613b10565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f496e76616c696420726563697069656e742061646472657373000000000000005f82015250565b5f613bb0601983612f82565b9150613bbb82613b7c565b602082019050919050565b5f6020820190508181035f830152613bdd81613ba4565b9050919050565b5f613bee8261308d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613c2057613c1f61345d565b5b600182019050919050565b7f4e6f2072656d61696e696e6720737570706c7920746f206275726e00000000005f82015250565b5f613c5f601b83612f82565b9150613c6a82613c2b565b602082019050919050565b5f6020820190508181035f830152613c8c81613c53565b9050919050565b7f4e6f2045544820746f20776974686472617700000000000000000000000000005f82015250565b5f613cc7601283612f82565b9150613cd282613c93565b602082019050919050565b5f6020820190508181035f830152613cf481613cbb565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f613d55602483612f82565b9150613d6082613cfb565b604082019050919050565b5f6020820190508181035f830152613d8281613d49565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f613de3602283612f82565b9150613dee82613d89565b604082019050919050565b5f6020820190508181035f830152613e1081613dd7565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f613e71602583612f82565b9150613e7c82613e17565b604082019050919050565b5f6020820190508181035f830152613e9e81613e65565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f613eff602383612f82565b9150613f0a82613ea5565b604082019050919050565b5f6020820190508181035f830152613f2c81613ef3565b9050919050565b7f5472616e7366657220616d6f756e74206d7573742062652067726561746572205f8201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b5f613f8d602983612f82565b9150613f9882613f33565b604082019050919050565b5f6020820190508181035f830152613fba81613f81565b9050919050565b7f4f6e6c79206f6e65207472616e736665722070657220626c6f636b20616c6c6f5f8201527f7765642e00000000000000000000000000000000000000000000000000000000602082015250565b5f61401b602483612f82565b915061402682613fc1565b604082019050919050565b5f6020820190508181035f8301526140488161400f565b9050919050565b7f4578636565647320746865205f6d61785478416d6f756e742e000000000000005f82015250565b5f614083601983612f82565b915061408e8261404f565b602082019050919050565b5f6020820190508181035f8301526140b081614077565b9050919050565b5f6140c18261308d565b91506140cc8361308d565b92508282019050808211156140e4576140e361345d565b5b92915050565b7f4578636565647320746865206d617857616c6c657453697a652e0000000000005f82015250565b5f61411e601a83612f82565b9150614129826140ea565b602082019050919050565b5f6020820190508181035f83015261414b81614112565b9050919050565b5f61415c8261308d565b91506141678361308d565b925082820390508181111561417f5761417e61345d565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f7700000000005f82015250565b5f6141b9601b83612f82565b91506141c482614185565b602082019050919050565b5f6020820190508181035f8301526141e6816141ad565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61421f81613052565b82525050565b5f6142308383614216565b60208301905092915050565b5f602082019050919050565b5f614252826141ed565b61425c81856141f7565b935061426783614207565b805f5b8381101561429757815161427e8882614225565b97506142898361423c565b92505060018101905061426a565b5085935050505092915050565b5f60a0820190506142b75f830188613131565b6142c46020830187613a01565b81810360408301526142d68186614248565b90506142e5606083018561338f565b6142f26080830184613131565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6143338261308d565b915061433e8361308d565b92508261434e5761434d6142fc565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f5f8201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b5f6143b3602183612f82565b91506143be82614359565b604082019050919050565b5f6020820190508181035f8301526143e0816143a7565b905091905056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a2646970667358221220bfd1a6aa563c32887c8a91a5ced300689e7fe8046b039156c5b78ad8788c12e364736f6c63430008140033

Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.