ETH Price: $2,382.07 (+4.14%)

Token

Smart Aliens (SAS)

Overview

Max Total Supply

777,000,000 SAS

Holders

380 (0.00%)

Total Transfers

-

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

$27,668.97

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Smart Aliens is a competitive game that merges a sci-fi shooter and tycoon-style open-world gameplay, featuring game economics and a ranking system.

Contract Source Code Verified (Exact Match)

Contract Name:
SAS

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Arbiscan.io on 2023-05-22
*/

// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.19;

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

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

interface IERC20 {
    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
    );
}

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

        (bool success, ) = recipient.call{value: amount}("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                0,
                "Address: low-level call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                value,
                "Address: low-level call with value failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(
            address(this).balance >= value,
            "Address: insufficient balance for call"
        );
        (bool success, bytes memory returndata) = target.call{value: value}(
            data
        );
        return
            verifyCallResultFromTarget(
                target,
                success,
                returndata,
                errorMessage
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data
    ) internal view returns (bytes memory) {
        return
            functionStaticCall(
                target,
                data,
                "Address: low-level static call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return
            verifyCallResultFromTarget(
                target,
                success,
                returndata,
                errorMessage
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data
    ) internal returns (bytes memory) {
        return
            functionDelegateCall(
                target,
                data,
                "Address: low-level delegate call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return
            verifyCallResultFromTarget(
                target,
                success,
                returndata,
                errorMessage
            );
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(
        bytes memory returndata,
        string memory errorMessage
    ) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

interface IUniswapV2Factory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function getPair(
        address tokenA,
        address tokenB
    ) external view returns (address pair);

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function createPair(
        address tokenA,
        address tokenB
    ) external returns (address pair);

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

interface IUniswapV2Pair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 value);

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(
        address owner,
        address spender
    ) external view returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function burn(
        address to
    ) external returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB, uint256 liquidity);

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(
        uint256 amountIn,
        address[] calldata path
    ) external view returns (uint256[] memory amounts);

    function getAmountsIn(
        uint256 amountOut,
        address[] calldata path
    ) external view returns (uint256[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

contract SAS is Context, IERC20, Ownable {
    using Address for address;
    //Contract Update Information
    string public constant contractVersion = "3.4";
    string public constant contractDev = "CFG";
    string public constant contractEdition = "Factory";
    //Definition of Wallets for Marketing or team.
    address payable public marketingWallet =
        payable(0x7619B78d72E6286E8d0F84F1a0fee93fF0A07c68);

    //Dead Wallet for SAFU Contract
    address public constant deadWallet =
        0x000000000000000000000000000000000000dEaD;
    //Mapping section for better tracking.
    mapping(address => uint256) private _tOwned;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) private _isExcludedFromFee;

    //Loging and Event Information for better troubleshooting.
    event Log(string, uint256);
    event AuditLog(string, address);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );
    event SwapTokensForETH(uint256 amountIn, address[] path);
    //Supply Definition.
    uint256 private _tTotal = 777_000_000 ether;
    uint256 private _tFeeTotal;
    //Token Definition.
    string public constant name = "Smart Aliens";
    string public constant symbol = "SAS";
    uint8 public constant decimals = 18;
    //Taxes Definition.
    uint public buyFee = 5;
    uint256 public transferFee = 0;
    uint256 public sellFee = 5;

    uint256 public marketingTokensCollected = 0;
    uint256 public totalMarketingTokensCollected = 0;

    uint256 public minimumTokensBeforeSwap = 100_000 ether;

    //Router and Pair Configuration.
    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    address private immutable WETH;
    //Tracking of Automatic Swap vs Manual Swap.
    bool public inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;

    modifier lockTheSwap() {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    constructor() {
        _tOwned[_msgSender()] = _tTotal;
        address currentRouter;
        //Adding Variables for all the routers for easier deployment for our customers.
        if (block.chainid == 56) {
            currentRouter = 0x10ED43C718714eb63d5aA57B78B54704E256024E; // PCS Router
            _isExcludedFromFee[
                0x407993575c91ce7643a4d4cCACc9A98c36eE1BBE
            ] = true; //PinkSale Lock
        } else if (block.chainid == 97) {
            currentRouter = 0xD99D1c33F9fC3444f8101754aBC46c52416550D1; // PCS Testnet
            _isExcludedFromFee[
                0x5E5b9bE5fd939c578ABE5800a90C566eeEbA44a5
            ] = true; //PinkSale Lock
        } else if (block.chainid == 43114) {
            currentRouter = 0x60aE616a2155Ee3d9A68541Ba4544862310933d4; //Avax Mainnet
        } else if (block.chainid == 137) {
            currentRouter = 0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff; //Polygon Ropsten
        } else if (block.chainid == 6066) {
            currentRouter = 0x4169Db906fcBFB8b12DbD20d98850Aee05B7D889; //Tres Leches Chain
        } else if (block.chainid == 250) {
            currentRouter = 0xF491e7B69E4244ad4002BC14e878a34207E38c29; //SpookySwap FTM
        } else if (block.chainid == 42161) {
            currentRouter = 0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506; //Arbitrum Sushi
            _isExcludedFromFee[
                0xeBb415084Ce323338CFD3174162964CC23753dFD
            ] = true; //PinkSale Lock
        } else if (block.chainid == 1 || block.chainid == 5) {
            currentRouter = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; //Mainnet
            _isExcludedFromFee[
                0x71B5759d73262FBb223956913ecF4ecC51057641
            ] = true; //PinkSale Lock
        } else {
            revert("You're not Blade");
        }

        //End of Router Variables.
        //Create Pair in the contructor, this may fail on some blockchains and can be done in a separate line if needed.
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(currentRouter);
        WETH = _uniswapV2Router.WETH();
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), WETH);
        uniswapV2Router = _uniswapV2Router;

        //Approve router to be used.
        _approve(msg.sender, address(uniswapV2Router), type(uint256).max);
        _approve(address(this), address(uniswapV2Router), type(uint256).max);
        //Exclude from Fees
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;

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

    //Readable Functions.
    function totalSupply() public view override returns (uint256) {
        return _tTotal;
    }

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

    //ERC 20 Standard Transfer Functions
    function transfer(
        address recipient,
        uint256 amount
    ) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    //ERC 20 Standard Allowance Function
    function allowance(
        address _owner,
        address spender
    ) public view override returns (uint256) {
        return _allowances[_owner][spender];
    }

    //ERC 20 Standard Approve Function
    function approve(
        address spender,
        uint256 amount
    ) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    //ERC 20 Standard Transfer From
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public override returns (bool) {
        uint currentAllowance = _allowances[sender][_msgSender()];
        require(
            currentAllowance >= amount,
            "ERC20: transfer amount exceeds allowance"
        );
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), currentAllowance - amount);
        return true;
    }

    //ERC 20 Standard increase Allowance
    function increaseAllowance(
        address spender,
        uint256 addedValue
    ) public virtual returns (bool) {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender] + addedValue
        );
        return true;
    }

    //ERC 20 Standard decrease Allowance
    function decreaseAllowance(
        address spender,
        uint256 subtractedValue
    ) public virtual returns (bool) {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender] - subtractedValue
        );
        return true;
    }

    //Approve Function
    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);
    }

    //Transfer function, validate correct wallet structure, take fees, and other custom taxes are done during the transfer.
    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");
        require(
            _tOwned[from] >= amount,
            "ERC20: transfer amount exceeds balance"
        );

        //Adding logic for automatic swap.
        uint256 contractTokenBalance = balanceOf(address(this));
        bool overMinimumTokenBalance = contractTokenBalance >=
            minimumTokensBeforeSwap;
        uint fee = 0;
        bool fromLP = from == uniswapV2Pair;
        bool toLP = to == uniswapV2Pair;
        //if any account belongs to _isExcludedFromFee account then remove the fee
        if (
            !inSwapAndLiquify &&
            !fromLP &&
            overMinimumTokenBalance &&
            swapAndLiquifyEnabled
        ) {
            swapAndLiquify();
        }
        // This saves a bit of gas on transfers
        bool NOTfromExcluded = !_isExcludedFromFee[from];
        bool NOTtoExcluded = !_isExcludedFromFee[to];
        // Apply tax when necessary
        if (toLP && NOTfromExcluded) {
            fee = (sellFee * amount) / 100;
        } else if (fromLP && NOTtoExcluded) {
            fee = (buyFee * amount) / 100;
        } else if (NOTtoExcluded && NOTfromExcluded) {
            fee = (transferFee * amount) / 100;
        }
        amount -= fee;
        if (fee > 0) {
            _tokenTransfer(from, address(this), fee);
            marketingTokensCollected += fee;
            totalMarketingTokensCollected += fee;
        }
        _tokenTransfer(from, to, amount);
    }

    //Swap Tokens for BNB or to add liquidity either automatically or manual, due to SAFU this was changed to Automatic after enable trading.
    //Corrected newBalance bug, it sending bnb to wallet and any remaining is on contract and can be recoverred.
    function swapAndLiquify() public lockTheSwap {
        uint256 totalTokens = balanceOf(address(this));
        swapTokensForEth(totalTokens);
        uint ethBalance = address(this).balance;

        transferToAddressETH(marketingWallet, ethBalance);

        marketingTokensCollected = 0;
    }

    //swap for eth is to support the converstion of tokens to weth during swapandliquify this is a supporting function
    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = WETH;
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this), // The contract
            block.timestamp
        );

        emit SwapTokensForETH(tokenAmount, path);
    }

    //ERC 20 standard transfer, only added if taking fees to countup the amount of fees for better tracking and split purpose.
    function _tokenTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) private {
        _tOwned[sender] -= amount;
        _tOwned[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

    //View the wallets that are excluded from view.
    function isExcludedFromFee(address account) external view returns (bool) {
        return _isExcludedFromFee[account];
    }

    //exclude wallets from fees, this is needed for launch or other contracts.
    function excludeFromFee(address account) external onlyOwner {
        require(
            _isExcludedFromFee[account] != true,
            "The wallet is already excluded!"
        );
        _isExcludedFromFee[account] = true;
        emit AuditLog(
            "We have excluded the following walled in fees:",
            account
        );
    }

    //include wallet back in fees.
    function includeInFee(address account) external onlyOwner {
        require(
            _isExcludedFromFee[account] != false,
            "The wallet is already included!"
        );
        _isExcludedFromFee[account] = false;
        emit AuditLog(
            "We have including the following walled in fees:",
            account
        );
    }

    //Automatic Swap Configuration.
    function setTokensToSwap(
        uint256 _minimumTokensBeforeSwap
    ) external onlyOwner {
        require(
            _minimumTokensBeforeSwap >= 100 ether,
            "You need to enter more than 100 tokens."
        );
        minimumTokensBeforeSwap = _minimumTokensBeforeSwap;
        emit Log(
            "We have updated minimunTokensBeforeSwap to:",
            minimumTokensBeforeSwap
        );
    }

    //set a new marketing wallet.
    function setMarketingWallet(address _marketingWallet) external onlyOwner {
        require(_marketingWallet != address(0), "setmarketingWallet: ZERO");
        marketingWallet = payable(_marketingWallet);
        emit AuditLog("We have Updated the MarketingWallet:", marketingWallet);
    }

    //This allow you to configure buy fees, in this contract all fees goes to marketing during the swapandliquify.
    function setBuyFee(uint256 _buyFee) external onlyOwner {
        require(_buyFee <= 5, "Buy Fee cannot be more than 5%");
        buyFee = _buyFee;
        emit Log("We have updated the buy fee to:", buyFee);
    }

    //This allow you to configure sell fee, in this contract all fees goes to marketing during the swapandliquify.
    function setSellFee(uint256 _sellFee) external onlyOwner {
        require(_sellFee <= 5, "Sell Fee cannot be more than 5%");
        sellFee = _sellFee;
        emit Log("We have updated the sell fee to:", sellFee);
    }

    function setTransferFee(uint256 _transferFee) external onlyOwner {
        require(_transferFee <= 5, "transfer Fee cannot be more than 5%");
        transferFee = _transferFee;
        emit Log("We have updated the transfer fee to:", _transferFee);
    }

    function transferToAddressETH(
        address payable recipient,
        uint256 amount
    ) private {
        (bool succ, ) = recipient.call{value: amount}("");
        require(succ, "Transfer failed.");
    }

    //to recieve ETH from uniswapV2Router when swaping
    receive() external payable {}

    /////---fallback--////
    //This cannot be removed as is a fallback to the swapAndLiquify
    event SwapETHForTokens(uint256 amountIn, address[] path);

    function swapETHForTokens(uint256 amount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = WETH;
        path[1] = address(this);
        // make the swap
        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{
            value: amount
        }(
            0, // accept any amount of Tokens
            path,
            deadWallet, // Burn address
            block.timestamp + 300
        );
        emit SwapETHForTokens(amount, path);
    }

    // Withdraw ETH that's potentially stuck in the Contract
    function recoverETHfromContract() external onlyOwner {
        uint ethBalance = address(this).balance;
        (bool succ, ) = payable(marketingWallet).call{value: ethBalance}("");
        require(succ, "Transfer failed");
        emit AuditLog(
            "We have recover the stock eth from contract.",
            marketingWallet
        );
    }

    // Withdraw ERC20 tokens that are potentially stuck in Contract
    //your not able to withdraw own tokens due to swapandliquify.
    function recoverTokensFromContract(
        address _tokenAddress,
        uint256 _amount
    ) external onlyOwner {
        require(
            _tokenAddress != address(this),
            "Owner can't claim contract's balance of its own tokens"
        );
        bool succ = IERC20(_tokenAddress).transfer(marketingWallet, _amount);
        require(succ, "Transfer failed");
        emit Log("We have recovered tokens from contract:", _amount);
    }
}

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":"string","name":"","type":"string"},{"indexed":false,"internalType":"address","name":"","type":"address"}],"name":"AuditLog","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"","type":"string"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"Log","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":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapETHForTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapTokensForETH","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":[{"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":"buyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractDev","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractEdition","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractVersion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"inSwapAndLiquify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingTokensCollected","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recoverETHfromContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recoverTokensFromContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyFee","type":"uint256"}],"name":"setBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingWallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellFee","type":"uint256"}],"name":"setSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minimumTokensBeforeSwap","type":"uint256"}],"name":"setTokensToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_transferFee","type":"uint256"}],"name":"setTransferFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMarketingTokensCollected","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","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":"transferFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e0604052600180546001600160a01b031916737619b78d72e6286e8d0f84f1a0fee93ff0a07c681790556b0282b82666abfd3da90000006005908155600781905560006008819055600991909155600a819055600b5569152d02c7e14af6800000600c55600d805461ff0019166101001790553480156200008057600080fd5b506200008c3362000593565b600554336000908152600260205260408120919091554660380362000110575073407993575c91ce7643a4d4ccacc9a98c36ee1bbe60005260046020527f08c4af94d8202ba5e54a3e903f85ac9d5fea893273242d4351861b8bbd750f5e805460ff191660011790557310ed43c718714eb63d5aa57b78b54704e256024e6200033e565b466061036200017e5750735e5b9be5fd939c578abe5800a90c566eeeba44a560005260046020527f65bf78b4da50a390256c55a501ce5996ea5884d4bc60c7ccdb6040afecc732a9805460ff1916600117905573d99d1c33f9fc3444f8101754abc46c52416550d16200033e565b4661a86a03620001a457507360ae616a2155ee3d9a68541ba4544862310933d46200033e565b46608903620001c9575073a5e0829caced8ffdd4de3c43696c57f7d7a678ff6200033e565b466117b203620001ef5750734169db906fcbfb8b12dbd20d98850aee05b7d8896200033e565b4660fa0362000214575073f491e7b69e4244ad4002bc14e878a34207e38c296200033e565b4661a4b10362000283575073ebb415084ce323338cfd3174162964cc23753dfd60005260046020527f6b2598e28cbe88f18b5046672f2b9c1c422c67a4dca00ba189a6c5fa4c308222805460ff19166001179055731b02da8cb0d097eb8d57a175b88c7d8b479975066200033e565b4660011480620002935750466005145b15620002fe57507371b5759d73262fbb223956913ecf4ecc5105764160005260046020527f181b38dae107ad7a36f51e654ef972d6c41d165bcb40c2dfb49fb5e641e8f466805460ff19166001179055737a250d5630b4cf539739df2c5dacb4c659f2488d6200033e565b60405162461bcd60e51b815260206004820152601060248201526f596f75277265206e6f7420426c61646560801b60448201526064015b60405180910390fd5b6000819050806001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000382573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003a891906200070b565b6001600160a01b031660c0816001600160a01b031681525050806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000400573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200042691906200070b565b60c0516040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af115801562000478573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200049e91906200070b565b6001600160a01b0390811660a05281166080819052620004c3903390600019620005e3565b620004da30608051600019620005e360201b60201c565b600160046000620004f36000546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff1995861617905530815260049092529020805490911660011790556200053b3390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6005546040516200058391815260200190565b60405180910390a350506200073d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038316620006475760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840162000335565b6001600160a01b038216620006aa5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840162000335565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000602082840312156200071e57600080fd5b81516001600160a01b03811681146200073657600080fd5b9392505050565b60805160a05160c051611db362000782600039600061184001526000818161049e01526116210152600081816102fd0152818161189801526118d40152611db36000f3fe60806040526004361061023f5760003560e01c806370a082311161012e578063a457c2d7116100ab578063d2d7ad831161006f578063d2d7ad831461073a578063dd62ed3e14610750578063e6be4a7214610796578063ea2f0b37146107b6578063f2fde38b146107d657600080fd5b8063a457c2d7146106ba578063a9059cbb146106da578063acb2ad6f146106fa578063b29ad50a14610710578063ce831ed51461072557600080fd5b80638b4cee08116100f25780638b4cee08146105fe5780638da5cb5b1461061e5780638f02bb5b1461063c57806395d89b411461065c578063a0a8e4601461068b57600080fd5b806370a082311461054e578063715018a61461058457806375f0a874146105995780637724bad8146105b957806385141a77146105e857600080fd5b806339509351116101bc57806349bd5a5e1161018057806349bd5a5e1461048c5780634a74bb02146104c05780635342acb4146104df5780635d098b38146105185780636ca60bc61461053857600080fd5b806339509351146104005780634076350314610420578063437823ec14610436578063461d947614610456578063470624021461047657600080fd5b8063220f669611610203578063220f66961461035657806323b872dd146103705780632a4a7ba8146103905780632b14ca56146103c3578063313ce567146103d957600080fd5b806306fdde031461024b578063095ea7b3146102995780630cc835a3146102c95780631694505e146102eb57806318160ddd1461033757600080fd5b3661024657005b600080fd5b34801561025757600080fd5b506102836040518060400160405280600c81526020016b536d61727420416c69656e7360a01b81525081565b6040516102909190611ab1565b60405180910390f35b3480156102a557600080fd5b506102b96102b4366004611b1b565b6107f6565b6040519015158152602001610290565b3480156102d557600080fd5b506102e96102e4366004611b45565b61080d565b005b3480156102f757600080fd5b5061031f7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610290565b34801561034357600080fd5b506005545b604051908152602001610290565b34801561036257600080fd5b50600d546102b99060ff1681565b34801561037c57600080fd5b506102b961038b366004611b5e565b6108cc565b34801561039c57600080fd5b5061028360405180604001604052806007815260200166466163746f727960c81b81525081565b3480156103cf57600080fd5b5061034860095481565b3480156103e557600080fd5b506103ee601281565b60405160ff9091168152602001610290565b34801561040c57600080fd5b506102b961041b366004611b1b565b61097b565b34801561042c57600080fd5b50610348600b5481565b34801561044257600080fd5b506102e9610451366004611b9a565b6109b2565b34801561046257600080fd5b506102e9610471366004611b45565b610ac2565b34801561048257600080fd5b5061034860075481565b34801561049857600080fd5b5061031f7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104cc57600080fd5b50600d546102b990610100900460ff1681565b3480156104eb57600080fd5b506102b96104fa366004611b9a565b6001600160a01b031660009081526004602052604090205460ff1690565b34801561052457600080fd5b506102e9610533366004611b9a565b610ba1565b34801561054457600080fd5b50610348600a5481565b34801561055a57600080fd5b50610348610569366004611b9a565b6001600160a01b031660009081526002602052604090205490565b34801561059057600080fd5b506102e9610c80565b3480156105a557600080fd5b5060015461031f906001600160a01b031681565b3480156105c557600080fd5b506102836040518060400160405280600381526020016243464760e81b81525081565b3480156105f457600080fd5b5061031f61dead81565b34801561060a57600080fd5b506102e9610619366004611b45565b610c94565b34801561062a57600080fd5b506000546001600160a01b031661031f565b34801561064857600080fd5b506102e9610657366004611b45565b610d45565b34801561066857600080fd5b506102836040518060400160405280600381526020016253415360e81b81525081565b34801561069757600080fd5b50610283604051806040016040528060038152602001620ccb8d60ea1b81525081565b3480156106c657600080fd5b506102b96106d5366004611b1b565b610e11565b3480156106e657600080fd5b506102b96106f5366004611b1b565b610e48565b34801561070657600080fd5b5061034860085481565b34801561071c57600080fd5b506102e9610e55565b34801561073157600080fd5b506102e9610ea8565b34801561074657600080fd5b50610348600c5481565b34801561075c57600080fd5b5061034861076b366004611bbc565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b3480156107a257600080fd5b506102e96107b1366004611b1b565b610fc7565b3480156107c257600080fd5b506102e96107d1366004611b9a565b611169565b3480156107e257600080fd5b506102e96107f1366004611b9a565b61126b565b60006108033384846112e4565b5060015b92915050565b610815611409565b600581111561086b5760405162461bcd60e51b815260206004820152601e60248201527f427579204665652063616e6e6f74206265206d6f7265207468616e203525000060448201526064015b60405180910390fd5b600781905560408051818152601f918101919091527f57652068617665207570646174656420746865206275792066656520746f3a00606082015260208101829052600080516020611d3e833981519152906080015b60405180910390a150565b6001600160a01b0383166000908152600360209081526040808320338452909152812054828110156109515760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610862565b61095c858585611463565b610970853361096b8685611c05565b6112e4565b506001949350505050565b3360008181526003602090815260408083206001600160a01b0387168452909152812054909161080391859061096b908690611c18565b6109ba611409565b6001600160a01b03811660009081526004602052604090205460ff161515600103610a275760405162461bcd60e51b815260206004820152601f60248201527f5468652077616c6c657420697320616c7265616479206578636c7564656421006044820152606401610862565b6001600160a01b03811660009081526004602052604090819020805460ff1916600117905551600080516020611d5e833981519152906108c19083906040808252602e908201527f57652068617665206578636c756465642074686520666f6c6c6f77696e67207760608201526d30b63632b21034b7103332b2b99d60911b60808201526001600160a01b0391909116602082015260a00190565b610aca611409565b68056bc75e2d63100000811015610b335760405162461bcd60e51b815260206004820152602760248201527f596f75206e65656420746f20656e746572206d6f7265207468616e20313030206044820152663a37b5b2b7399760c91b6064820152608401610862565b600c81905560408051818152602b918101919091527f576520686176652075706461746564206d696e696d756e546f6b656e7342656660608201526a37b932a9bbb0b8103a379d60a91b608082015260208101829052600080516020611d3e8339815191529060a0016108c1565b610ba9611409565b6001600160a01b038116610bff5760405162461bcd60e51b815260206004820152601860248201527f7365746d61726b6574696e6757616c6c65743a205a45524f00000000000000006044820152606401610862565b600180546001600160a01b0319166001600160a01b038316908117909155604080518181526024918101919091527f57652068617665205570646174656420746865204d61726b6574696e6757616c6060820152633632ba1d60e11b60808201526020810191909152600080516020611d5e8339815191529060a0016108c1565b610c88611409565b610c926000611799565b565b610c9c611409565b6005811115610ced5760405162461bcd60e51b815260206004820152601f60248201527f53656c6c204665652063616e6e6f74206265206d6f7265207468616e203525006044820152606401610862565b60098190556040805181815260209181018290527f576520686176652075706461746564207468652073656c6c2066656520746f3a6060820152908101829052600080516020611d3e833981519152906080016108c1565b610d4d611409565b6005811115610daa5760405162461bcd60e51b815260206004820152602360248201527f7472616e73666572204665652063616e6e6f74206265206d6f7265207468616e60448201526220352560e81b6064820152608401610862565b6008819055604080518181526024918101919091527f57652068617665207570646174656420746865207472616e7366657220666565606082015263103a379d60e11b608082015260208101829052600080516020611d3e8339815191529060a0016108c1565b3360008181526003602090815260408083206001600160a01b0387168452909152812054909161080391859061096b908690611c05565b6000610803338484611463565b600d805460ff19166001179055306000908152600260205260408120549050610e7d816117e9565b6001544790610e95906001600160a01b031682611975565b50506000600a55600d805460ff19169055565b610eb0611409565b60015460405147916000916001600160a01b039091169083908381818185875af1925050503d8060008114610f01576040519150601f19603f3d011682016040523d82523d6000602084013e610f06565b606091505b5050905080610f495760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610862565b60015460408051818152602c918101919091527f57652068617665207265636f766572207468652073746f636b2065746820667260608201526b37b69031b7b73a3930b1ba1760a11b60808201526001600160a01b039091166020820152600080516020611d5e8339815191529060a0015b60405180910390a15050565b610fcf611409565b306001600160a01b038316036110465760405162461bcd60e51b815260206004820152603660248201527f4f776e65722063616e277420636c61696d20636f6e747261637427732062616c604482015275616e6365206f6620697473206f776e20746f6b656e7360501b6064820152608401610862565b60015460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905260009184169063a9059cbb906044016020604051808303816000875af115801561109b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110bf9190611c2b565b9050806111005760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610862565b604080518181526027818301527f57652068617665207265636f766572656420746f6b656e732066726f6d20636f606082015266373a3930b1ba1d60c91b6080820152602081018490529051600080516020611d3e8339815191529181900360a00190a1505050565b611171611409565b6001600160a01b03811660009081526004602052604081205460ff16151590036111dd5760405162461bcd60e51b815260206004820152601f60248201527f5468652077616c6c657420697320616c726561647920696e636c7564656421006044820152606401610862565b6001600160a01b038116600081815260046020908152604091829020805460ff191690558151828152602f928101929092527f5765206861766520696e636c7564696e672074686520666f6c6c6f77696e672060608301526e3bb0b63632b21034b7103332b2b99d60891b6080830152810191909152600080516020611d5e8339815191529060a0016108c1565b611273611409565b6001600160a01b0381166112d85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610862565b6112e181611799565b50565b6001600160a01b0383166113465760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610862565b6001600160a01b0382166113a75760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610862565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000546001600160a01b03163314610c925760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610862565b6001600160a01b0383166114c75760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610862565b6001600160a01b0382166115295760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610862565b6000811161158b5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610862565b6001600160a01b0383166000908152600260205260409020548111156116025760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610862565b30600090815260026020526040812054600c54600d54919290831015917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03908116888216811492918816149060ff16158015611664575081155b801561166d5750835b80156116805750600d54610100900460ff165b1561168d5761168d610e55565b6001600160a01b0380891660009081526004602052604080822054928a16825290205460ff918216159116158280156116c35750815b156116e9576064886009546116d89190611c4d565b6116e29190611c64565b9450611734565b8380156116f35750805b15611708576064886007546116d89190611c4d565b8080156117125750815b15611734576064886008546117279190611c4d565b6117319190611c64565b94505b61173e8589611c05565b97508415611782576117518a3087611a10565b84600a60008282546117639190611c18565b9250508190555084600b600082825461177c9190611c18565b90915550505b61178d8a8a8a611a10565b50505050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061181e5761181e611c86565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061187257611872611c86565b60200260200101906001600160a01b031690816001600160a01b0316815250506118bd307f0000000000000000000000000000000000000000000000000000000000000000846112e4565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac94790611912908590600090869030904290600401611ce0565b600060405180830381600087803b15801561192c57600080fd5b505af1158015611940573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78282604051610fbb929190611d1c565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146119c2576040519150601f19603f3d011682016040523d82523d6000602084013e6119c7565b606091505b5050905080611a0b5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610862565b505050565b6001600160a01b03831660009081526002602052604081208054839290611a38908490611c05565b90915550506001600160a01b03821660009081526002602052604081208054839290611a65908490611c18565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516113fc91815260200190565b600060208083528351808285015260005b81811015611ade57858101830151858201604001528201611ac2565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114611b1657600080fd5b919050565b60008060408385031215611b2e57600080fd5b611b3783611aff565b946020939093013593505050565b600060208284031215611b5757600080fd5b5035919050565b600080600060608486031215611b7357600080fd5b611b7c84611aff565b9250611b8a60208501611aff565b9150604084013590509250925092565b600060208284031215611bac57600080fd5b611bb582611aff565b9392505050565b60008060408385031215611bcf57600080fd5b611bd883611aff565b9150611be660208401611aff565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561080757610807611bef565b8082018082111561080757610807611bef565b600060208284031215611c3d57600080fd5b81518015158114611bb557600080fd5b808202811582820484141761080757610807611bef565b600082611c8157634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015611cd55781516001600160a01b031687529582019590820190600101611cb0565b509495945050505050565b85815284602082015260a060408201526000611cff60a0830186611c9c565b6001600160a01b0394909416606083015250608001529392505050565b828152604060208201526000611d356040830184611c9c565b94935050505056fedd970dd9b5bfe707922155b058a407655cb18288b807e2216442bca8ad83d6b5025dbd6ad989fe1a64db7dc049e29723ff9d35a97d84ae9aab96196f00ec1a00a2646970667358221220114a8a303c492418630e55188d8b72d8869d6d1832fc88bd032c1c9419a050c164736f6c63430008130033

Deployed Bytecode

0x60806040526004361061023f5760003560e01c806370a082311161012e578063a457c2d7116100ab578063d2d7ad831161006f578063d2d7ad831461073a578063dd62ed3e14610750578063e6be4a7214610796578063ea2f0b37146107b6578063f2fde38b146107d657600080fd5b8063a457c2d7146106ba578063a9059cbb146106da578063acb2ad6f146106fa578063b29ad50a14610710578063ce831ed51461072557600080fd5b80638b4cee08116100f25780638b4cee08146105fe5780638da5cb5b1461061e5780638f02bb5b1461063c57806395d89b411461065c578063a0a8e4601461068b57600080fd5b806370a082311461054e578063715018a61461058457806375f0a874146105995780637724bad8146105b957806385141a77146105e857600080fd5b806339509351116101bc57806349bd5a5e1161018057806349bd5a5e1461048c5780634a74bb02146104c05780635342acb4146104df5780635d098b38146105185780636ca60bc61461053857600080fd5b806339509351146104005780634076350314610420578063437823ec14610436578063461d947614610456578063470624021461047657600080fd5b8063220f669611610203578063220f66961461035657806323b872dd146103705780632a4a7ba8146103905780632b14ca56146103c3578063313ce567146103d957600080fd5b806306fdde031461024b578063095ea7b3146102995780630cc835a3146102c95780631694505e146102eb57806318160ddd1461033757600080fd5b3661024657005b600080fd5b34801561025757600080fd5b506102836040518060400160405280600c81526020016b536d61727420416c69656e7360a01b81525081565b6040516102909190611ab1565b60405180910390f35b3480156102a557600080fd5b506102b96102b4366004611b1b565b6107f6565b6040519015158152602001610290565b3480156102d557600080fd5b506102e96102e4366004611b45565b61080d565b005b3480156102f757600080fd5b5061031f7f0000000000000000000000001b02da8cb0d097eb8d57a175b88c7d8b4799750681565b6040516001600160a01b039091168152602001610290565b34801561034357600080fd5b506005545b604051908152602001610290565b34801561036257600080fd5b50600d546102b99060ff1681565b34801561037c57600080fd5b506102b961038b366004611b5e565b6108cc565b34801561039c57600080fd5b5061028360405180604001604052806007815260200166466163746f727960c81b81525081565b3480156103cf57600080fd5b5061034860095481565b3480156103e557600080fd5b506103ee601281565b60405160ff9091168152602001610290565b34801561040c57600080fd5b506102b961041b366004611b1b565b61097b565b34801561042c57600080fd5b50610348600b5481565b34801561044257600080fd5b506102e9610451366004611b9a565b6109b2565b34801561046257600080fd5b506102e9610471366004611b45565b610ac2565b34801561048257600080fd5b5061034860075481565b34801561049857600080fd5b5061031f7f0000000000000000000000008f1939aadaea4fe5203d79051b8afde0951aeebe81565b3480156104cc57600080fd5b50600d546102b990610100900460ff1681565b3480156104eb57600080fd5b506102b96104fa366004611b9a565b6001600160a01b031660009081526004602052604090205460ff1690565b34801561052457600080fd5b506102e9610533366004611b9a565b610ba1565b34801561054457600080fd5b50610348600a5481565b34801561055a57600080fd5b50610348610569366004611b9a565b6001600160a01b031660009081526002602052604090205490565b34801561059057600080fd5b506102e9610c80565b3480156105a557600080fd5b5060015461031f906001600160a01b031681565b3480156105c557600080fd5b506102836040518060400160405280600381526020016243464760e81b81525081565b3480156105f457600080fd5b5061031f61dead81565b34801561060a57600080fd5b506102e9610619366004611b45565b610c94565b34801561062a57600080fd5b506000546001600160a01b031661031f565b34801561064857600080fd5b506102e9610657366004611b45565b610d45565b34801561066857600080fd5b506102836040518060400160405280600381526020016253415360e81b81525081565b34801561069757600080fd5b50610283604051806040016040528060038152602001620ccb8d60ea1b81525081565b3480156106c657600080fd5b506102b96106d5366004611b1b565b610e11565b3480156106e657600080fd5b506102b96106f5366004611b1b565b610e48565b34801561070657600080fd5b5061034860085481565b34801561071c57600080fd5b506102e9610e55565b34801561073157600080fd5b506102e9610ea8565b34801561074657600080fd5b50610348600c5481565b34801561075c57600080fd5b5061034861076b366004611bbc565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b3480156107a257600080fd5b506102e96107b1366004611b1b565b610fc7565b3480156107c257600080fd5b506102e96107d1366004611b9a565b611169565b3480156107e257600080fd5b506102e96107f1366004611b9a565b61126b565b60006108033384846112e4565b5060015b92915050565b610815611409565b600581111561086b5760405162461bcd60e51b815260206004820152601e60248201527f427579204665652063616e6e6f74206265206d6f7265207468616e203525000060448201526064015b60405180910390fd5b600781905560408051818152601f918101919091527f57652068617665207570646174656420746865206275792066656520746f3a00606082015260208101829052600080516020611d3e833981519152906080015b60405180910390a150565b6001600160a01b0383166000908152600360209081526040808320338452909152812054828110156109515760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610862565b61095c858585611463565b610970853361096b8685611c05565b6112e4565b506001949350505050565b3360008181526003602090815260408083206001600160a01b0387168452909152812054909161080391859061096b908690611c18565b6109ba611409565b6001600160a01b03811660009081526004602052604090205460ff161515600103610a275760405162461bcd60e51b815260206004820152601f60248201527f5468652077616c6c657420697320616c7265616479206578636c7564656421006044820152606401610862565b6001600160a01b03811660009081526004602052604090819020805460ff1916600117905551600080516020611d5e833981519152906108c19083906040808252602e908201527f57652068617665206578636c756465642074686520666f6c6c6f77696e67207760608201526d30b63632b21034b7103332b2b99d60911b60808201526001600160a01b0391909116602082015260a00190565b610aca611409565b68056bc75e2d63100000811015610b335760405162461bcd60e51b815260206004820152602760248201527f596f75206e65656420746f20656e746572206d6f7265207468616e20313030206044820152663a37b5b2b7399760c91b6064820152608401610862565b600c81905560408051818152602b918101919091527f576520686176652075706461746564206d696e696d756e546f6b656e7342656660608201526a37b932a9bbb0b8103a379d60a91b608082015260208101829052600080516020611d3e8339815191529060a0016108c1565b610ba9611409565b6001600160a01b038116610bff5760405162461bcd60e51b815260206004820152601860248201527f7365746d61726b6574696e6757616c6c65743a205a45524f00000000000000006044820152606401610862565b600180546001600160a01b0319166001600160a01b038316908117909155604080518181526024918101919091527f57652068617665205570646174656420746865204d61726b6574696e6757616c6060820152633632ba1d60e11b60808201526020810191909152600080516020611d5e8339815191529060a0016108c1565b610c88611409565b610c926000611799565b565b610c9c611409565b6005811115610ced5760405162461bcd60e51b815260206004820152601f60248201527f53656c6c204665652063616e6e6f74206265206d6f7265207468616e203525006044820152606401610862565b60098190556040805181815260209181018290527f576520686176652075706461746564207468652073656c6c2066656520746f3a6060820152908101829052600080516020611d3e833981519152906080016108c1565b610d4d611409565b6005811115610daa5760405162461bcd60e51b815260206004820152602360248201527f7472616e73666572204665652063616e6e6f74206265206d6f7265207468616e60448201526220352560e81b6064820152608401610862565b6008819055604080518181526024918101919091527f57652068617665207570646174656420746865207472616e7366657220666565606082015263103a379d60e11b608082015260208101829052600080516020611d3e8339815191529060a0016108c1565b3360008181526003602090815260408083206001600160a01b0387168452909152812054909161080391859061096b908690611c05565b6000610803338484611463565b600d805460ff19166001179055306000908152600260205260408120549050610e7d816117e9565b6001544790610e95906001600160a01b031682611975565b50506000600a55600d805460ff19169055565b610eb0611409565b60015460405147916000916001600160a01b039091169083908381818185875af1925050503d8060008114610f01576040519150601f19603f3d011682016040523d82523d6000602084013e610f06565b606091505b5050905080610f495760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610862565b60015460408051818152602c918101919091527f57652068617665207265636f766572207468652073746f636b2065746820667260608201526b37b69031b7b73a3930b1ba1760a11b60808201526001600160a01b039091166020820152600080516020611d5e8339815191529060a0015b60405180910390a15050565b610fcf611409565b306001600160a01b038316036110465760405162461bcd60e51b815260206004820152603660248201527f4f776e65722063616e277420636c61696d20636f6e747261637427732062616c604482015275616e6365206f6620697473206f776e20746f6b656e7360501b6064820152608401610862565b60015460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905260009184169063a9059cbb906044016020604051808303816000875af115801561109b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110bf9190611c2b565b9050806111005760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610862565b604080518181526027818301527f57652068617665207265636f766572656420746f6b656e732066726f6d20636f606082015266373a3930b1ba1d60c91b6080820152602081018490529051600080516020611d3e8339815191529181900360a00190a1505050565b611171611409565b6001600160a01b03811660009081526004602052604081205460ff16151590036111dd5760405162461bcd60e51b815260206004820152601f60248201527f5468652077616c6c657420697320616c726561647920696e636c7564656421006044820152606401610862565b6001600160a01b038116600081815260046020908152604091829020805460ff191690558151828152602f928101929092527f5765206861766520696e636c7564696e672074686520666f6c6c6f77696e672060608301526e3bb0b63632b21034b7103332b2b99d60891b6080830152810191909152600080516020611d5e8339815191529060a0016108c1565b611273611409565b6001600160a01b0381166112d85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610862565b6112e181611799565b50565b6001600160a01b0383166113465760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610862565b6001600160a01b0382166113a75760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610862565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000546001600160a01b03163314610c925760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610862565b6001600160a01b0383166114c75760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610862565b6001600160a01b0382166115295760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610862565b6000811161158b5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610862565b6001600160a01b0383166000908152600260205260409020548111156116025760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610862565b30600090815260026020526040812054600c54600d54919290831015917f0000000000000000000000008f1939aadaea4fe5203d79051b8afde0951aeebe6001600160a01b03908116888216811492918816149060ff16158015611664575081155b801561166d5750835b80156116805750600d54610100900460ff165b1561168d5761168d610e55565b6001600160a01b0380891660009081526004602052604080822054928a16825290205460ff918216159116158280156116c35750815b156116e9576064886009546116d89190611c4d565b6116e29190611c64565b9450611734565b8380156116f35750805b15611708576064886007546116d89190611c4d565b8080156117125750815b15611734576064886008546117279190611c4d565b6117319190611c64565b94505b61173e8589611c05565b97508415611782576117518a3087611a10565b84600a60008282546117639190611c18565b9250508190555084600b600082825461177c9190611c18565b90915550505b61178d8a8a8a611a10565b50505050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061181e5761181e611c86565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab18160018151811061187257611872611c86565b60200260200101906001600160a01b031690816001600160a01b0316815250506118bd307f0000000000000000000000001b02da8cb0d097eb8d57a175b88c7d8b47997506846112e4565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000001b02da8cb0d097eb8d57a175b88c7d8b47997506169063791ac94790611912908590600090869030904290600401611ce0565b600060405180830381600087803b15801561192c57600080fd5b505af1158015611940573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78282604051610fbb929190611d1c565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146119c2576040519150601f19603f3d011682016040523d82523d6000602084013e6119c7565b606091505b5050905080611a0b5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610862565b505050565b6001600160a01b03831660009081526002602052604081208054839290611a38908490611c05565b90915550506001600160a01b03821660009081526002602052604081208054839290611a65908490611c18565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516113fc91815260200190565b600060208083528351808285015260005b81811015611ade57858101830151858201604001528201611ac2565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114611b1657600080fd5b919050565b60008060408385031215611b2e57600080fd5b611b3783611aff565b946020939093013593505050565b600060208284031215611b5757600080fd5b5035919050565b600080600060608486031215611b7357600080fd5b611b7c84611aff565b9250611b8a60208501611aff565b9150604084013590509250925092565b600060208284031215611bac57600080fd5b611bb582611aff565b9392505050565b60008060408385031215611bcf57600080fd5b611bd883611aff565b9150611be660208401611aff565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561080757610807611bef565b8082018082111561080757610807611bef565b600060208284031215611c3d57600080fd5b81518015158114611bb557600080fd5b808202811582820484141761080757610807611bef565b600082611c8157634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015611cd55781516001600160a01b031687529582019590820190600101611cb0565b509495945050505050565b85815284602082015260a060408201526000611cff60a0830186611c9c565b6001600160a01b0394909416606083015250608001529392505050565b828152604060208201526000611d356040830184611c9c565b94935050505056fedd970dd9b5bfe707922155b058a407655cb18288b807e2216442bca8ad83d6b5025dbd6ad989fe1a64db7dc049e29723ff9d35a97d84ae9aab96196f00ec1a00a2646970667358221220114a8a303c492418630e55188d8b72d8869d6d1832fc88bd032c1c9419a050c164736f6c63430008130033

Deployed Bytecode Sourcemap

22897:15956:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24213:44;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;24213:44:0;;;;;;;;;;;;:::i;:::-;;;;;;;;28531:186;;;;;;;;;;-1:-1:-1;28531:186:0;;;;;:::i;:::-;;:::i;:::-;;;1169:14:1;;1162:22;1144:41;;1132:2;1117:18;28531:186:0;1004:187:1;35918:218:0;;;;;;;;;;-1:-1:-1;35918:218:0;;;;;:::i;:::-;;:::i;:::-;;24684:51;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1572:32:1;;;1554:51;;1542:2;1527:18;24684:51:0;1381:230:1;27801:95:0;;;;;;;;;;-1:-1:-1;27881:7:0;;27801:95;;;1762:25:1;;;1750:2;1735:18;27801:95:0;1616:177:1;24874:28:0;;;;;;;;;;-1:-1:-1;24874:28:0;;;;;;;;28762:478;;;;;;;;;;-1:-1:-1;28762:478:0;;;;;:::i;:::-;;:::i;23114:50::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;23114:50:0;;;;;24441:26;;;;;;;;;;;;;;;;24308:35;;;;;;;;;;;;24341:2;24308:35;;;;;2303:4:1;2291:17;;;2273:36;;2261:2;2246:18;24308:35:0;2131:184:1;29290:290:0;;;;;;;;;;-1:-1:-1;29290:290:0;;;;;:::i;:::-;;:::i;24526:48::-;;;;;;;;;;;;;;;;34219:360;;;;;;;;;;-1:-1:-1;34219:360:0;;;;;:::i;:::-;;:::i;35029:428::-;;;;;;;;;;-1:-1:-1;35029:428:0;;;;;:::i;:::-;;:::i;24375:22::-;;;;;;;;;;;;;;;;24742:38;;;;;;;;;;;;;;;24909:40;;;;;;;;;;-1:-1:-1;24909:40:0;;;;;;;;;;;34005:126;;;;;;;;;;-1:-1:-1;34005:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;34096:27:0;34072:4;34096:27;;;:18;:27;;;;;;;;;34005:126;35500:294;;;;;;;;;;-1:-1:-1;35500:294:0;;;;;:::i;:::-;;:::i;24476:43::-;;;;;;;;;;;;;;;;27904:117;;;;;;;;;;-1:-1:-1;27904:117:0;;;;;:::i;:::-;-1:-1:-1;;;;;27997:16:0;27970:7;27997:16;;;:7;:16;;;;;;;27904:117;13017:103;;;;;;;;;;;;;:::i;23223:101::-;;;;;;;;;;-1:-1:-1;23223:101:0;;;;-1:-1:-1;;;;;23223:101:0;;;23065:42;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;23065:42:0;;;;;23370:88;;;;;;;;;;;;23416:42;23370:88;;36260:226;;;;;;;;;;-1:-1:-1;36260:226:0;;;;;:::i;:::-;;:::i;12369:87::-;;;;;;;;;;-1:-1:-1;12415:7:0;12442:6;-1:-1:-1;;;;;12442:6:0;12369:87;;36494:259;;;;;;;;;;-1:-1:-1;36494:259:0;;;;;:::i;:::-;;:::i;24264:37::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;24264:37:0;;;;;23012:46;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;23012:46:0;;;;;29630:300;;;;;;;;;;-1:-1:-1;29630:300:0;;;;;:::i;:::-;;:::i;28071:192::-;;;;;;;;;;-1:-1:-1;28071:192:0;;;;;:::i;:::-;;:::i;24404:30::-;;;;;;;;;;;;;;;;32486:303;;;;;;;;;;;;;:::i;37882:359::-;;;;;;;;;;;;;:::i;24583:54::-;;;;;;;;;;;;;;;;28313:170;;;;;;;;;;-1:-1:-1;28313:170:0;;;;;:::i;:::-;-1:-1:-1;;;;;28447:19:0;;;28420:7;28447:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;28313:170;38385:465;;;;;;;;;;-1:-1:-1;38385:465:0;;;;;:::i;:::-;;:::i;34623:361::-;;;;;;;;;;-1:-1:-1;34623:361:0;;;;;:::i;:::-;;:::i;13275:238::-;;;;;;;;;;-1:-1:-1;13275:238:0;;;;;:::i;:::-;;:::i;28531:186::-;28631:4;28648:39;180:10;28671:7;28680:6;28648:8;:39::i;:::-;-1:-1:-1;28705:4:0;28531:186;;;;;:::o;35918:218::-;12255:13;:11;:13::i;:::-;36003:1:::1;35992:7;:12;;35984:55;;;::::0;-1:-1:-1;;;35984:55:0;;3410:2:1;35984:55:0::1;::::0;::::1;3392:21:1::0;3449:2;3429:18;;;3422:30;3488:32;3468:18;;;3461:60;3538:18;;35984:55:0::1;;;;;;;;;36050:6;:16:::0;;;36082:46:::1;::::0;;3779:21:1;;;3836:2;3816:18;;;3809:30;;;;3875:33;3870:2;3855:18;;3848:61;3976:4;3961:20;;3954:36;;;-1:-1:-1;;;;;;;;;;;36082:46:0;3941:3:1;3926:19;36082:46:0::1;;;;;;;;35918:218:::0;:::o;28762:478::-;-1:-1:-1;;;;;28935:19:0;;28894:4;28935:19;;;:11;:19;;;;;;;;180:10;28935:33;;;;;;;;29001:26;;;;28979:116;;;;-1:-1:-1;;;28979:116:0;;4203:2:1;28979:116:0;;;4185:21:1;4242:2;4222:18;;;4215:30;4281:34;4261:18;;;4254:62;-1:-1:-1;;;4332:18:1;;;4325:38;4380:19;;28979:116:0;4001:404:1;28979:116:0;29106:36;29116:6;29124:9;29135:6;29106:9;:36::i;:::-;29153:57;29162:6;180:10;29184:25;29203:6;29184:16;:25;:::i;:::-;29153:8;:57::i;:::-;-1:-1:-1;29228:4:0;;28762:478;-1:-1:-1;;;;28762:478:0:o;29290:290::-;180:10;29403:4;29492:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;29492:34:0;;;;;;;;;;29403:4;;29420:130;;29470:7;;29492:47;;29529:10;;29492:47;:::i;34219:360::-;12255:13;:11;:13::i;:::-;-1:-1:-1;;;;;34312:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;::::1;;:35;;:27:::0;:35;34290:116:::1;;;::::0;-1:-1:-1;;;34290:116:0;;5007:2:1;34290:116:0::1;::::0;::::1;4989:21:1::0;5046:2;5026:18;;;5019:30;5085:33;5065:18;;;5058:61;5136:18;;34290:116:0::1;4805:355:1::0;34290:116:0::1;-1:-1:-1::0;;;;;34417:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;:34;;-1:-1:-1;;34417:34:0::1;34447:4;34417:34;::::0;;34467:104;-1:-1:-1;;;;;;;;;;;34467:104:0;::::1;::::0;34436:7;;5395:2:1;5377:21;;;5434:2;5414:18;;;5407:30;5473:34;5468:2;5453:18;;5446:62;-1:-1:-1;;;5539:3:1;5524:19;;5517:45;-1:-1:-1;;;;;5636:32:1;;;;5629:4;5614:20;;5607:62;5594:3;5579:19;;5165:510;35029:428:0;12255:13;:11;:13::i;:::-;35184:9:::1;35156:24;:37;;35134:126;;;::::0;-1:-1:-1;;;35134:126:0;;5882:2:1;35134:126:0::1;::::0;::::1;5864:21:1::0;5921:2;5901:18;;;5894:30;5960:34;5940:18;;;5933:62;-1:-1:-1;;;6011:18:1;;;6004:37;6058:19;;35134:126:0::1;5680:403:1::0;35134:126:0::1;35271:23;:50:::0;;;35337:112:::1;::::0;;6300:21:1;;;6357:2;6337:18;;;6330:30;;;;6396:34;6391:2;6376:18;;6369:62;-1:-1:-1;;;6462:3:1;6447:19;;6440:42;6549:4;6534:20;;6527:36;;;-1:-1:-1;;;;;;;;;;;35337:112:0;6514:3:1;6499:19;35337:112:0::1;6088:481:1::0;35500:294:0;12255:13;:11;:13::i;:::-;-1:-1:-1;;;;;35592:30:0;::::1;35584:67;;;::::0;-1:-1:-1;;;35584:67:0;;6776:2:1;35584:67:0::1;::::0;::::1;6758:21:1::0;6815:2;6795:18;;;6788:30;6854:26;6834:18;;;6827:54;6898:18;;35584:67:0::1;6574:348:1::0;35584:67:0::1;35662:15;:43:::0;;-1:-1:-1;;;;;;35662:43:0::1;-1:-1:-1::0;;;;;35662:43:0;::::1;::::0;;::::1;::::0;;;35721:65:::1;::::0;;7147:21:1;;;7204:2;7184:18;;;7177:30;;;;7243:34;7238:2;7223:18;;7216:62;-1:-1:-1;;;7309:3:1;7294:19;;7287:35;7389:4;7374:20;;7367:62;;;;-1:-1:-1;;;;;;;;;;;35721:65:0;7354:3:1;7339:19;35721:65:0::1;6927:508:1::0;13017:103:0;12255:13;:11;:13::i;:::-;13082:30:::1;13109:1;13082:18;:30::i;:::-;13017:103::o:0;36260:226::-;12255:13;:11;:13::i;:::-;36348:1:::1;36336:8;:13;;36328:57;;;::::0;-1:-1:-1;;;36328:57:0;;7642:2:1;36328:57:0::1;::::0;::::1;7624:21:1::0;7681:2;7661:18;;;7654:30;7720:33;7700:18;;;7693:61;7771:18;;36328:57:0::1;7440:355:1::0;36328:57:0::1;36396:7;:18:::0;;;36430:48:::1;::::0;;8012:21:1;;;8069:2;8049:18;;;8042:30;;;8108:34;8103:2;8088:18;;8081:62;8195:18;;;8188:34;;;-1:-1:-1;;;;;;;;;;;36430:48:0;8175:3:1;8160:19;36430:48:0::1;7800:428:1::0;36494:259:0;12255:13;:11;:13::i;:::-;36594:1:::1;36578:12;:17;;36570:65;;;::::0;-1:-1:-1;;;36570:65:0;;8435:2:1;36570:65:0::1;::::0;::::1;8417:21:1::0;8474:2;8454:18;;;8447:30;8513:34;8493:18;;;8486:62;-1:-1:-1;;;8564:18:1;;;8557:33;8607:19;;36570:65:0::1;8233:399:1::0;36570:65:0::1;36646:11;:26:::0;;;36688:57:::1;::::0;;8849:21:1;;;8906:2;8886:18;;;8879:30;;;;8945:34;8940:2;8925:18;;8918:62;-1:-1:-1;;;9011:3:1;8996:19;;8989:35;9091:4;9076:20;;9069:36;;;-1:-1:-1;;;;;;;;;;;36688:57:0;9056:3:1;9041:19;36688:57:0::1;8637:474:1::0;29630:300:0;180:10;29748:4;29837:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;29837:34:0;;;;;;;;;;29748:4;;29765:135;;29815:7;;29837:52;;29874:15;;29837:52;:::i;28071:192::-;28174:4;28191:42;180:10;28215:9;28226:6;28191:9;:42::i;32486:303::-;24992:16;:23;;-1:-1:-1;;24992:23:0;25011:4;24992:23;;;32582:4:::1;-1:-1:-1::0;27997:16:0;;;:7;:16;;;;;;32542:46:::1;;32599:29;32616:11;32599:16;:29::i;:::-;32712:15;::::0;32657:21:::1;::::0;32691:49:::1;::::0;-1:-1:-1;;;;;32712:15:0::1;32657:21:::0;32691:20:::1;:49::i;:::-;-1:-1:-1::0;;32780:1:0::1;32753:24;:28:::0;25038:16;:24;;-1:-1:-1;;25038:24:0;;;32486:303::o;37882:359::-;12255:13;:11;:13::i;:::-;38020:15:::1;::::0;38012:52:::1;::::0;37964:21:::1;::::0;37946:15:::1;::::0;-1:-1:-1;;;;;38020:15:0;;::::1;::::0;37964:21;;37946:15;38012:52;37946:15;38012:52;37964:21;38020:15;38012:52:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37996:68;;;38083:4;38075:32;;;::::0;-1:-1:-1;;;38075:32:0;;9528:2:1;38075:32:0::1;::::0;::::1;9510:21:1::0;9567:2;9547:18;;;9540:30;-1:-1:-1;;;9586:18:1;;;9579:45;9641:18;;38075:32:0::1;9326:339:1::0;38075:32:0::1;38207:15;::::0;38123:110:::1;::::0;;9890:21:1;;;9947:2;9927:18;;;9920:30;;;;9986:34;9981:2;9966:18;;9959:62;-1:-1:-1;;;10052:3:1;10037:19;;10030:43;-1:-1:-1;;;;;38207:15:0;;::::1;10140:4:1::0;10125:20;;10118:62;-1:-1:-1;;;;;;;;;;;38123:110:0;10105:3:1;10090:19;38123:110:0::1;;;;;;;;37935:306;;37882:359::o:0;38385:465::-;12255:13;:11;:13::i;:::-;38562:4:::1;-1:-1:-1::0;;;;;38537:30:0;::::1;::::0;38515:134:::1;;;::::0;-1:-1:-1;;;38515:134:0;;10393:2:1;38515:134:0::1;::::0;::::1;10375:21:1::0;10432:2;10412:18;;;10405:30;10471:34;10451:18;;;10444:62;-1:-1:-1;;;10522:18:1;;;10515:52;10584:19;;38515:134:0::1;10191:418:1::0;38515:134:0::1;38703:15;::::0;38672:56:::1;::::0;-1:-1:-1;;;38672:56:0;;-1:-1:-1;;;;;38703:15:0;;::::1;38672:56;::::0;::::1;10796:51:1::0;10863:18;;;10856:34;;;38660:9:0::1;::::0;38672:30;::::1;::::0;::::1;::::0;10769:18:1;;38672:56:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38660:68;;38747:4;38739:32;;;::::0;-1:-1:-1;;;38739:32:0;;9528:2:1;38739:32:0::1;::::0;::::1;9510:21:1::0;9567:2;9547:18;;;9540:30;-1:-1:-1;;;9586:18:1;;;9579:45;9641:18;;38739:32:0::1;9326:339:1::0;38739:32:0::1;38787:55;::::0;;11395:21:1;;;11452:2;11432:18;;;11425:30;11491:34;11486:2;11471:18;;11464:62;-1:-1:-1;;;11557:3:1;11542:19;;11535:38;11640:4;11625:20;;11618:36;;;38787:55:0;;-1:-1:-1;;;;;;;;;;;38787:55:0;;;;11605:3:1;38787:55:0;;::::1;38504:346;38385:465:::0;;:::o;34623:361::-;12255:13;:11;:13::i;:::-;-1:-1:-1;;;;;34714:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;::::1;;:36;;::::0;;34692:117:::1;;;::::0;-1:-1:-1;;;34692:117:0;;11867:2:1;34692:117:0::1;::::0;::::1;11849:21:1::0;11906:2;11886:18;;;11879:30;11945:33;11925:18;;;11918:61;11996:18;;34692:117:0::1;11665:355:1::0;34692:117:0::1;-1:-1:-1::0;;;;;34820:27:0;::::1;34850:5;34820:27:::0;;;:18:::1;:27;::::0;;;;;;;;:35;;-1:-1:-1;;34820:35:0::1;::::0;;34871:105;;12237:21:1;;;12294:2;12274:18;;;12267:30;;;;12333:34;12328:2;12313:18;;12306:62;-1:-1:-1;;;12399:3:1;12384:19;;12377:46;12475:20;;12468:62;;;;-1:-1:-1;;;;;;;;;;;34871:105:0;12455:3:1;12440:19;34871:105:0::1;12025:511:1::0;13275:238:0;12255:13;:11;:13::i;:::-;-1:-1:-1;;;;;13378:22:0;::::1;13356:110;;;::::0;-1:-1:-1;;;13356:110:0;;12743:2:1;13356:110:0::1;::::0;::::1;12725:21:1::0;12782:2;12762:18;;;12755:30;12821:34;12801:18;;;12794:62;-1:-1:-1;;;12872:18:1;;;12865:36;12918:19;;13356:110:0::1;12541:402:1::0;13356:110:0::1;13477:28;13496:8;13477:18;:28::i;:::-;13275:238:::0;:::o;29962:341::-;-1:-1:-1;;;;;30056:20:0;;30048:69;;;;-1:-1:-1;;;30048:69:0;;13150:2:1;30048:69:0;;;13132:21:1;13189:2;13169:18;;;13162:30;13228:34;13208:18;;;13201:62;-1:-1:-1;;;13279:18:1;;;13272:34;13323:19;;30048:69:0;12948:400:1;30048:69:0;-1:-1:-1;;;;;30136:21:0;;30128:68;;;;-1:-1:-1;;;30128:68:0;;13555:2:1;30128:68:0;;;13537:21:1;13594:2;13574:18;;;13567:30;13633:34;13613:18;;;13606:62;-1:-1:-1;;;13684:18:1;;;13677:32;13726:19;;30128:68:0;13353:398:1;30128:68:0;-1:-1:-1;;;;;30209:19:0;;;;;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;:37;;;30262:33;;1762:25:1;;;30262:33:0;;1735:18:1;30262:33:0;;;;;;;;29962:341;;;:::o;12534:132::-;12415:7;12442:6;-1:-1:-1;;;;;12442:6:0;180:10;12598:23;12590:68;;;;-1:-1:-1;;;12590:68:0;;13958:2:1;12590:68:0;;;13940:21:1;;;13977:18;;;13970:30;14036:34;14016:18;;;14009:62;14088:18;;12590:68:0;13756:356:1;30436:1785:0;-1:-1:-1;;;;;30524:18:0;;30516:68;;;;-1:-1:-1;;;30516:68:0;;14319:2:1;30516:68:0;;;14301:21:1;14358:2;14338:18;;;14331:30;14397:34;14377:18;;;14370:62;-1:-1:-1;;;14448:18:1;;;14441:35;14493:19;;30516:68:0;14117:401:1;30516:68:0;-1:-1:-1;;;;;30603:16:0;;30595:64;;;;-1:-1:-1;;;30595:64:0;;14725:2:1;30595:64:0;;;14707:21:1;14764:2;14744:18;;;14737:30;14803:34;14783:18;;;14776:62;-1:-1:-1;;;14854:18:1;;;14847:33;14897:19;;30595:64:0;14523:399:1;30595:64:0;30687:1;30678:6;:10;30670:64;;;;-1:-1:-1;;;30670:64:0;;15129:2:1;30670:64:0;;;15111:21:1;15168:2;15148:18;;;15141:30;15207:34;15187:18;;;15180:62;-1:-1:-1;;;15258:18:1;;;15251:39;15307:19;;30670:64:0;14927:405:1;30670:64:0;-1:-1:-1;;;;;30767:13:0;;;;;;:7;:13;;;;;;:23;-1:-1:-1;30767:23:0;30745:111;;;;-1:-1:-1;;;30745:111:0;;15539:2:1;30745:111:0;;;15521:21:1;15578:2;15558:18;;;15551:30;15617:34;15597:18;;;15590:62;-1:-1:-1;;;15668:18:1;;;15661:36;15714:19;;30745:111:0;15337:402:1;30745:111:0;30962:4;30913:28;27997:16;;;:7;:16;;;;;;31047:23;;31295:16;;27997;;31010:60;;;;;31126:13;-1:-1:-1;;;;;31118:21:0;;;;;;;;;31162:19;;;;;31295:16;;31294:17;:41;;;;;31329:6;31328:7;31294:41;:81;;;;;31352:23;31294:81;:119;;;;-1:-1:-1;31392:21:0;;;;;;;31294:119;31276:192;;;31440:16;:14;:16::i;:::-;-1:-1:-1;;;;;31551:24:0;;;31527:20;31551:24;;;:18;:24;;;;;;;31608:22;;;;;;;;31551:24;;;;31550:25;;31608:22;31607:23;31682:4;:23;;;;;31690:15;31682:23;31678:282;;;31749:3;31739:6;31729:7;;:16;;;;:::i;:::-;31728:24;;;;:::i;:::-;31722:30;;31678:282;;;31774:6;:23;;;;;31784:13;31774:23;31770:190;;;31840:3;31830:6;31821;;:15;;;;:::i;31770:190::-;31865:13;:32;;;;;31882:15;31865:32;31861:99;;;31945:3;31935:6;31921:11;;:20;;;;:::i;:::-;31920:28;;;;:::i;:::-;31914:34;;31861:99;31970:13;31980:3;31970:13;;:::i;:::-;;-1:-1:-1;31998:7:0;;31994:177;;32022:40;32037:4;32051;32058:3;32022:14;:40::i;:::-;32105:3;32077:24;;:31;;;;;;;:::i;:::-;;;;;;;;32156:3;32123:29;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;;31994:177:0;32181:32;32196:4;32202:2;32206:6;32181:14;:32::i;:::-;30505:1716;;;;;;;30436:1785;;;:::o;13673:191::-;13747:16;13766:6;;-1:-1:-1;;;;;13783:17:0;;;-1:-1:-1;;;;;;13783:17:0;;;;;;13816:40;;13766:6;;;;;;;13816:40;;13747:16;13816:40;13736:128;13673:191;:::o;32917:638::-;33067:16;;;33081:1;33067:16;;;;;;;;33043:21;;33067:16;;;;;;;;;;-1:-1:-1;33067:16:0;33043:40;;33112:4;33094;33099:1;33094:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;33094:23:0;;;-1:-1:-1;;;;;33094:23:0;;;;;33138:4;33128;33133:1;33128:7;;;;;;;;:::i;:::-;;;;;;:14;-1:-1:-1;;;;;33128:14:0;;;-1:-1:-1;;;;;33128:14:0;;;;;33153:62;33170:4;33185:15;33203:11;33153:8;:62::i;:::-;33254:240;;-1:-1:-1;;;33254:240:0;;-1:-1:-1;;;;;33254:15:0;:66;;;;:240;;33335:11;;33361:1;;33405:4;;33432;;33468:15;;33254:240;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33512:35;33529:11;33542:4;33512:35;;;;;;;:::i;36761:218::-;36879:9;36894;-1:-1:-1;;;;;36894:14:0;36916:6;36894:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36878:49;;;36946:4;36938:33;;;;-1:-1:-1;;;36938:33:0;;17995:2:1;36938:33:0;;;17977:21:1;18034:2;18014:18;;;18007:30;-1:-1:-1;;;18053:18:1;;;18046:46;18109:18;;36938:33:0;17793:340:1;36938:33:0;36867:112;36761:218;;:::o;33691:253::-;-1:-1:-1;;;;;33819:15:0;;;;;;:7;:15;;;;;:25;;33838:6;;33819:15;:25;;33838:6;;33819:25;:::i;:::-;;;;-1:-1:-1;;;;;;;33855:18:0;;;;;;:7;:18;;;;;:28;;33877:6;;33855:18;:28;;33877:6;;33855:28;:::i;:::-;;;;;;;;33918:9;-1:-1:-1;;;;;33901:35:0;33910:6;-1:-1:-1;;;;;33901:35:0;;33929:6;33901:35;;;;1762:25:1;;1750:2;1735:18;;1616:177;14:548;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:173::-;635:20;;-1:-1:-1;;;;;684:31:1;;674:42;;664:70;;730:1;727;720:12;664:70;567:173;;;:::o;745:254::-;813:6;821;874:2;862:9;853:7;849:23;845:32;842:52;;;890:1;887;880:12;842:52;913:29;932:9;913:29;:::i;:::-;903:39;989:2;974:18;;;;961:32;;-1:-1:-1;;;745:254:1:o;1196:180::-;1255:6;1308:2;1296:9;1287:7;1283:23;1279:32;1276:52;;;1324:1;1321;1314:12;1276:52;-1:-1:-1;1347:23:1;;1196:180;-1:-1:-1;1196:180:1:o;1798:328::-;1875:6;1883;1891;1944:2;1932:9;1923:7;1919:23;1915:32;1912:52;;;1960:1;1957;1950:12;1912:52;1983:29;2002:9;1983:29;:::i;:::-;1973:39;;2031:38;2065:2;2054:9;2050:18;2031:38;:::i;:::-;2021:48;;2116:2;2105:9;2101:18;2088:32;2078:42;;1798:328;;;;;:::o;2320:186::-;2379:6;2432:2;2420:9;2411:7;2407:23;2403:32;2400:52;;;2448:1;2445;2438:12;2400:52;2471:29;2490:9;2471:29;:::i;:::-;2461:39;2320:186;-1:-1:-1;;;2320:186:1:o;2943:260::-;3011:6;3019;3072:2;3060:9;3051:7;3047:23;3043:32;3040:52;;;3088:1;3085;3078:12;3040:52;3111:29;3130:9;3111:29;:::i;:::-;3101:39;;3159:38;3193:2;3182:9;3178:18;3159:38;:::i;:::-;3149:48;;2943:260;;;;;:::o;4410:127::-;4471:10;4466:3;4462:20;4459:1;4452:31;4502:4;4499:1;4492:15;4526:4;4523:1;4516:15;4542:128;4609:9;;;4630:11;;;4627:37;;;4644:18;;:::i;4675:125::-;4740:9;;;4761:10;;;4758:36;;;4774:18;;:::i;10901:277::-;10968:6;11021:2;11009:9;11000:7;10996:23;10992:32;10989:52;;;11037:1;11034;11027:12;10989:52;11069:9;11063:16;11122:5;11115:13;11108:21;11101:5;11098:32;11088:60;;11144:1;11141;11134:12;15744:168;15817:9;;;15848;;15865:15;;;15859:22;;15845:37;15835:71;;15886:18;;:::i;15917:217::-;15957:1;15983;15973:132;;16027:10;16022:3;16018:20;16015:1;16008:31;16062:4;16059:1;16052:15;16090:4;16087:1;16080:15;15973:132;-1:-1:-1;16119:9:1;;15917:217::o;16271:127::-;16332:10;16327:3;16323:20;16320:1;16313:31;16363:4;16360:1;16353:15;16387:4;16384:1;16377:15;16403:461;16456:3;16494:5;16488:12;16521:6;16516:3;16509:19;16547:4;16576:2;16571:3;16567:12;16560:19;;16613:2;16606:5;16602:14;16634:1;16644:195;16658:6;16655:1;16652:13;16644:195;;;16723:13;;-1:-1:-1;;;;;16719:39:1;16707:52;;16779:12;;;;16814:15;;;;16755:1;16673:9;16644:195;;;-1:-1:-1;16855:3:1;;16403:461;-1:-1:-1;;;;;16403:461:1:o;16869:582::-;17168:6;17157:9;17150:25;17211:6;17206:2;17195:9;17191:18;17184:34;17254:3;17249:2;17238:9;17234:18;17227:31;17131:4;17275:57;17327:3;17316:9;17312:19;17304:6;17275:57;:::i;:::-;-1:-1:-1;;;;;17368:32:1;;;;17363:2;17348:18;;17341:60;-1:-1:-1;17432:3:1;17417:19;17410:35;17267:65;16869:582;-1:-1:-1;;;16869:582:1:o;17456:332::-;17663:6;17652:9;17645:25;17706:2;17701;17690:9;17686:18;17679:30;17626:4;17726:56;17778:2;17767:9;17763:18;17755:6;17726:56;:::i;:::-;17718:64;17456:332;-1:-1:-1;;;;17456:332:1:o

Swarm Source

ipfs://114a8a303c492418630e55188d8b72d8869d6d1832fc88bd032c1c9419a050c1
[ 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.