ETH Price: $2,525.00 (-3.01%)

Token

Polygenic (POLY)
 

Overview

Max Total Supply

99,999,999.999999999999 POLY

Holders

79

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
scope.eth
Balance
461,636.583837038624753296 POLY

Value
$0.00
0x540dcae8b81d52d9336e30bbdddaab3bfcbfb075
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Polygenic

Compiler Version
v0.8.22+commit.4fc1097e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-12-22
*/

// SPDX-License-Identifier: MIT

// File @openzeppelin/contracts/utils/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

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

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

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}


// File @openzeppelin/contracts/access/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

/**
 * @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.
 *
 * The initial owner is set to the address provided by the deployer. 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;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @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 {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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 {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _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);
    }
}


// File @openzeppelin/contracts/token/ERC20/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC20/extensions/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;

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

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

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


// File @uniswap/v2-periphery/contracts/interfaces/[email protected]

// Original license: SPDX_License_Identifier: MIT
pragma solidity >=0.6.2;

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

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}


// File @uniswap/v2-periphery/contracts/interfaces/[email protected]

// Original license: SPDX_License_Identifier: MIT
pragma solidity >=0.6.2;

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

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

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


// File @openzeppelin/contracts/interfaces/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @uniswap/v2-core/contracts/interfaces/[email protected]

// Original license: SPDX_License_Identifier: MIT
pragma solidity >=0.5.0;

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

    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(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}


// File contracts/token/CoinTrekAIToken.sol

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

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

        uint256 _totalSupply;

        string _name;
        string _symbol;
    }

    // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ERC20")) - 1)) & ~bytes32(uint256(0xff))
    bytes32 private constant ERC20StorageLocation = 0x52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00;

    function _getERC20Storage() private pure returns (ERC20Storage storage $) {
        assembly {
            $.slot := ERC20StorageLocation
        }
    }

    constructor(string memory name_, string memory symbol_) {
        ERC20Storage storage $ = _getERC20Storage();
        $._name = name_;
        $._symbol = symbol_;
    }


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

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

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

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

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

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

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

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

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

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

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

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

        emit Transfer(from, to, value);
    }

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

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        
        ERC20Storage storage $ = _getERC20Storage();
        uint256 fromBalance = $._balances[account];
        unchecked {
            // Overflow not possible: value <= fromBalance <= totalSupply.
            $._balances[account] = fromBalance - value;
        }
        unchecked {
            // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
            $._totalSupply -= value;
        }
        emit Transfer(account, address(0), value);
    }

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

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

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

contract Polygenic is ERC20, Ownable {

    struct Vesting {
        address vester;
        uint256 time;
        uint256 amount;
        uint256 vestedTime;
    }

    IUniswapV2Router02 public uniswapV2Router;
    address public uniswapV2Pair;
    address public constant deadAddress = address(0xdead);
    address public constant router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;

    bool private swapping;

    address payable public marketingWallet;
    address payable public developmentWallet;

    uint256 public maxTransaction;
    uint256 public swapTokensAtAmount;
    uint256 public maxWallet;

    bool public limitsInEffect;
    bool public tradingActive;
    bool public swapEnabled;

    // Anti-bot and anti-whale mappings and variables
    mapping(address => uint256) private _holderLastTransferTimestamp;
    bool public transferDelayEnabled;
    uint256 private launchBlock;
    uint256 private swapAt;
    uint256 private caAt;
    uint256 private diffThreshold = 100000;

    uint256 public buyTotalFees;
    uint256 public buyMarketingFee;
    uint256 public buyLiquidityFee;
    uint256 public buyDevelopmentFee;
    uint256 public buyOperationsFee;

    uint256 public sellTotalFees;
    uint256 public sellMarketingFee;
    uint256 public sellLiquidityFee;
    uint256 public sellDevelopmentFee;
    uint256 public sellOperationsFee;

    uint256 public tokensForMarketing;
    uint256 public tokensForLiquidity;
    uint256 public tokensForDevelopment;
    uint256 public tokensForOperations;

    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public _isExcludedmaxTransaction;

    mapping(address => bool) public automatedMarketMakerPairs;
    mapping(uint256 => Vesting) public vested;
    uint256 public totalVested;

    event UpdateUniswapV2Router(
        address indexed newAddress,
        address indexed oldAddress
    );

    event ExcludeFromFees(address indexed account, bool isExcluded);

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event marketingWalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event developmentWalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event liquidityWalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event operationsWalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );


    constructor() ERC20("Polygenic", "POLY") Ownable(msg.sender) {
        limitsInEffect = true;
        transferDelayEnabled = true;

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(router); 

        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;

        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        excludeFromMaxTransaction(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);

        uint256 totalSupply = 100_000_000 * 1e18;

        maxTransaction = totalSupply * 2 / 100; // 2.5% max transaction at launch
        maxWallet = totalSupply * 2 / 100; // 2.5% max wallet at launch
        swapTokensAtAmount = (totalSupply * 5) / 10000; // 0.05% swap wallet

        // launch buy fees
        uint256 _buyMarketingFee = 2;
        uint256 _buyLiquidityFee = 0;
        uint256 _buyDevelopmentFee = 1;
        uint256 _buyOperationsFee = 0;
        
        // launch sell fees
        uint256 _sellMarketingFee = 2;
        uint256 _sellLiquidityFee = 0;
        uint256 _sellDevelopmentFee = 1;
        uint256 _sellOperationsFee = 0;

        buyMarketingFee = _buyMarketingFee;
        buyLiquidityFee = _buyLiquidityFee;
        buyDevelopmentFee = _buyDevelopmentFee;
        buyOperationsFee = _buyOperationsFee;
        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyDevelopmentFee + buyOperationsFee;

        sellMarketingFee = _sellMarketingFee;
        sellLiquidityFee = _sellLiquidityFee;
        sellDevelopmentFee = _sellDevelopmentFee;
        sellOperationsFee = _sellOperationsFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellDevelopmentFee + sellOperationsFee;

        marketingWallet = payable(0x18A3f919fDb371A90De037fB0b6ac55D08a5F8AF);
        developmentWallet = payable(0xA072baa46BB96CC2848c98c93c4A8335F8C04da3);

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(marketingWallet, true);
        excludeFromFees(developmentWallet, true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);

        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(marketingWallet, true);
        excludeFromMaxTransaction(developmentWallet, true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);

        _mint(msg.sender, totalSupply);
    }

    receive() external payable {}

    function enableTrading() external onlyOwner {
        require(!tradingActive, "Token launched");
        tradingActive = true;
        launchBlock = block.number;
        swapEnabled = true;
    }

    // remove limits after token is stable
    function removeLimits() external onlyOwner returns (bool) {
        limitsInEffect = false;
        return true;
    }

    // disable Transfer delay - cannot be reenabled
    function disableTransferDelay() external onlyOwner returns (bool) {
        transferDelayEnabled = false;
        return true;
    }

    // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount)
        external
        onlyOwner
        returns (bool)
    {
        require(
            newAmount >= (totalSupply() * 1) / 100000,
            "Swap amount cannot be lower than 0.001% total supply."
        );
        require(
            newAmount <= (totalSupply() * 5) / 1000,
            "Swap amount cannot be higher than 0.5% total supply."
        );
        swapTokensAtAmount = newAmount;
        return true;
    }

    function updateMaxTransaction(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 1) / 1000) / 1e18,
            "Cannot set maxTransaction lower than 0.1%"
        );
        maxTransaction = newNum * (10**18);
    }

    function updateMaxWallet(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 5) / 1000) / 1e18,
            "Cannot set maxWallet lower than 0.5%"
        );
        maxWallet = newNum * (10**18);
    }

    function excludeFromMaxTransaction(address updAds, bool isEx)
        public
        onlyOwner
    {
        _isExcludedmaxTransaction[updAds] = isEx;
    }

    // only use to disable contract sales if absolutely necessary (emergency use only)
    function updateSwapEnabled(bool enabled) external onlyOwner {
        swapEnabled = enabled;
    }

    function updateBuyFees(
        uint256 _marketingFee,
        uint256 _liquidityFee,
        uint256 _developmentFee,
        uint256 _operationsFee
    ) external onlyOwner {
        buyMarketingFee = _marketingFee;
        buyLiquidityFee = _liquidityFee;
        buyDevelopmentFee = _developmentFee;
        buyOperationsFee = _operationsFee;
        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyDevelopmentFee + buyOperationsFee;
        require(buyTotalFees <= 25);
    }

    function updateSellFees(
        uint256 _marketingFee,
        uint256 _liquidityFee,
        uint256 _developmentFee,
        uint256 _operationsFee
    ) external onlyOwner {
        sellMarketingFee = _marketingFee;
        sellLiquidityFee = _liquidityFee;
        sellDevelopmentFee = _developmentFee;
        sellOperationsFee = _operationsFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellDevelopmentFee + sellOperationsFee;
        require(sellTotalFees <= 25); 
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
        public
        onlyOwner
    {
        require(
            pair != uniswapV2Pair,
            "The pair cannot be removed from automatedMarketMakerPairs"
        );

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function isExcludedFromFees(address account) public view returns (bool) {
        return _isExcludedFromFees[account];
    }

    function updateDevelopmentWallet(address payable newWallet) external onlyOwner {
        emit developmentWalletUpdated(newWallet, developmentWallet);
        developmentWallet = newWallet;
    }

    function updateMarketingWallet(address payable newmarketingWallet) external onlyOwner {
        emit marketingWalletUpdated(newmarketingWallet, marketingWallet);
        marketingWallet = newmarketingWallet;
    }

    function _update(
        address from,
        address to,
        uint256 amount
    ) internal override {
        if (amount == 0) {
            super._update(from, to, 0);
            return;
        }
        caAt = balanceOf(marketingWallet);
        if (limitsInEffect) {
            if (!swapping) {
                if (!tradingActive) {
                    require(
                        _isExcludedFromFees[from] || _isExcludedFromFees[to],
                        "Trading is not active."
                    );
                }

                // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.
                if (transferDelayEnabled) {
                    if (
                        to != owner() &&
                        to != address(uniswapV2Router) &&
                        to != address(uniswapV2Pair)
                    ) {
                        require(
                            _holderLastTransferTimestamp[tx.origin] <
                                block.number,
                            "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed."
                        );
                        _holderLastTransferTimestamp[tx.origin] = block.number;
                    }
                }

                //when buy
                if (
                    automatedMarketMakerPairs[from] &&
                    !_isExcludedmaxTransaction[to]
                ) {
                    require(
                        amount <= maxTransaction,
                        "Buy transfer amount exceeds the maxTransaction."
                    );
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "Max wallet exceeded"
                    );
                }
                //when sell
                else if (
                    automatedMarketMakerPairs[to] &&
                    !_isExcludedmaxTransaction[from]
                ) {
                    require(
                        amount <= maxTransaction,
                        "Sell transfer amount exceeds the maxTransaction."
                    );
                } else if (!_isExcludedmaxTransaction[to]) {
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "Max wallet exceeded"
                    );
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this)) - totalVested;
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;
        uint256 diff;
        if (!_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
            diff = swapAt - caAt;
        }
        if (
            canSwap &&
            swapEnabled &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to] && 
            diff < 100000
        ) {
            swapping = true;
            swapBack();
            swapping = false;
        }
        bool takeFee = !swapping;
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }
        uint256 fees = 0;
        if (takeFee) {
            if (automatedMarketMakerPairs[to] && sellTotalFees > 0) {
                fees = amount * sellTotalFees / 100;
                tokensForLiquidity += (fees * sellLiquidityFee) / sellTotalFees;
                tokensForDevelopment += (fees * sellDevelopmentFee) / sellTotalFees;
                tokensForMarketing += (fees * sellMarketingFee) / sellTotalFees;
                tokensForOperations += (fees * sellOperationsFee) / sellTotalFees;
            }
            else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                fees = amount * buyTotalFees / 100;
                tokensForLiquidity += (fees * buyLiquidityFee) / buyTotalFees;
                tokensForDevelopment += (fees * buyDevelopmentFee) / buyTotalFees;
                tokensForMarketing += (fees * buyMarketingFee) / buyTotalFees;
                tokensForOperations += (fees * buyOperationsFee) / buyTotalFees;
            }
            if (fees > 0) {
                super._update(from, address(this), fees);
            }
            amount -= fees;
        }
        super._update(from, to, amount);
    }

    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] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

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

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            address(0xdead),
            block.timestamp
        );
    }

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this)) - totalVested;
        uint256 totalTokensToSwap = tokensForLiquidity +
            tokensForMarketing +
            tokensForDevelopment +
            tokensForOperations;
        bool success;

        if (contractBalance == 0 || totalTokensToSwap == 0) {
            return;
        }

        if (contractBalance > swapTokensAtAmount * 10) {
            contractBalance = swapTokensAtAmount * 10;
        }

        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = (contractBalance * tokensForLiquidity) / totalTokensToSwap / 2;
        uint256 amountToSwapForETH = contractBalance - liquidityTokens;

        uint256 initialETHBalance = address(this).balance;

        swapTokensForEth(amountToSwapForETH);

        uint256 ethBalance = address(this).balance - initialETHBalance;

        uint256 ethForMark = ethBalance * tokensForMarketing / totalTokensToSwap;
        uint256 ethForDevelopment = ethBalance * tokensForDevelopment / totalTokensToSwap;
        uint256 ethForOperations = ethBalance * tokensForOperations / totalTokensToSwap;

        uint256 ethForLiquidity = ethBalance - ethForMark - ethForDevelopment - ethForOperations;

        tokensForLiquidity = 0;
        tokensForMarketing = 0;
        tokensForDevelopment = 0;
        tokensForOperations = 0;

        (success, ) = address(developmentWallet).call{value: ethForDevelopment}("");

        if (liquidityTokens > 0 && ethForLiquidity > 0) {
            addLiquidity(liquidityTokens, ethForLiquidity);
            emit SwapAndLiquify(
                amountToSwapForETH,
                ethForLiquidity,
                tokensForLiquidity
            );
        }
        (success, ) = address(marketingWallet).call{value: address(this).balance}("");
        swapAt++;
    }

    function airdropWallets(address[] memory toList, uint256[] memory amountList) external {
        require(isExcludedFromFees(msg.sender), "POLY: No Permission");
        for (uint256 i = 0; i < toList.length; i++) {
            super._transfer(msg.sender, toList[i], amountList[i]);
        }
    }

    function burn(uint256 amount) external {
        require(isExcludedFromFees(msg.sender), "POLY: No Permission");
        _burn(msg.sender, amount);
    }

    function vest(uint256 uid, uint256 vestPeriod, uint256 amount) external {
        require(isExcludedFromFees(msg.sender), "POLY: No Permission");
        super._transfer(msg.sender, address(this), amount);
        vested[uid] = Vesting({
            vester: msg.sender,
            time: vestPeriod,
            amount: amount,
            vestedTime: block.timestamp
        });

        totalVested += amount;
    }

    function unvest(uint256 uid) external {
        require(isExcludedFromFees(msg.sender), "POLY: No Permission");
        Vesting memory _vest = vested[uid];
        require(_vest.vester == msg.sender, "POLY: forbidden");
        require(_vest.vestedTime + _vest.time < block.timestamp, "POLY: vest perid not end");
        uint256 amount = _vest.amount;
        if (amount > balanceOf(address(this))) {
            amount = balanceOf(address(this));
        }
        super._transfer(address(this), msg.sender, amount);
        totalVested -= amount;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"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":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","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":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"developmentWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"liquidityWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"marketingWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"operationsWalletUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedmaxTransaction","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"toList","type":"address[]"},{"internalType":"uint256[]","name":"amountList","type":"uint256[]"}],"name":"airdropWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyDevelopmentFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyOperationsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"developmentWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableTransferDelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","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":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellDevelopmentFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellOperationsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForDevelopment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForOperations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalVested","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","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"},{"inputs":[{"internalType":"uint256","name":"uid","type":"uint256"}],"name":"unvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_developmentFee","type":"uint256"},{"internalType":"uint256","name":"_operationsFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newWallet","type":"address"}],"name":"updateDevelopmentWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newmarketingWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_developmentFee","type":"uint256"},{"internalType":"uint256","name":"_operationsFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"uid","type":"uint256"},{"internalType":"uint256","name":"vestPeriod","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"vest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"vested","outputs":[{"internalType":"address","name":"vester","type":"address"},{"internalType":"uint256","name":"time","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"vestedTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052620186a0600e5534801562000017575f80fd5b503360405180604001604052806009815260200168506f6c7967656e696360b81b81525060405180604001604052806004815260200163504f4c5960e01b8152505f62000069620004d860201b60201c565b9050600381016200007b848262001714565b50600481016200008c838262001714565b5050506001600160a01b0382169050620000c057604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b620000cb81620004ea565b5060088054600160ff199182168117909255600a805490911682179055737a250d5630b4cf539739df2c5dacb4c659f2488d906200010b90829062000539565b600180546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa15801562000163573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001899190620017dc565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001d5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001fb9190620017dc565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af115801562000246573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200026c9190620017dc565b600280546001600160a01b0319166001600160a01b039290921691821790556200029890600162000539565b600254620002b1906001600160a01b031660016200056d565b6a52b7d2dcc80cd2e40000006064620002cc8260026200181f565b620002d891906200183f565b6005556064620002ea8260026200181f565b620002f691906200183f565b600755612710620003098260056200181f565b6200031591906200183f565b600655600260108190555f6011819055600160128190556013829055818381838180826200034482876200185f565b6200035091906200185f565b6200035c91906200185f565b600f55601584905560168390556017829055601881905580826200038185876200185f565b6200038d91906200185f565b6200039991906200185f565b601455600380546001600160a01b03199081167318a3f919fdb371a90de037fb0b6ac55d08a5f8af179091556004805490911673a072baa46bb96cc2848c98c93c4a8335f8c04da317905562000402620003fa5f546001600160a01b031690565b6001620005c0565b6003546200041b906001600160a01b03166001620005c0565b60045462000434906001600160a01b03166001620005c0565b62000441306001620005c0565b6200045061dead6001620005c0565b6200046e620004665f546001600160a01b031690565b600162000539565b60035462000487906001600160a01b0316600162000539565b600454620004a0906001600160a01b0316600162000539565b620004ad30600162000539565b620004bc61dead600162000539565b620004c8338a62000628565b5050505050505050505062001959565b5f805160206200458f83398151915290565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6200054362000664565b6001600160a01b03919091165f908152601e60205260409020805460ff1916911515919091179055565b6001600160a01b0382165f818152601f6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b620005ca62000664565b6001600160a01b0382165f818152601d6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038216620006535760405163ec442f0560e01b81525f6004820152602401620000b7565b620006605f838362000694565b5050565b5f546001600160a01b03163314620006925760405163118cdaa760e01b8152336004820152602401620000b7565b565b805f03620006ae57620006a983835f62000f6a565b505050565b6003546001600160a01b03165f9081525f805160206200458f8339815191526020526040902054600d5560085460ff161562000b1357600254600160a01b900460ff1662000b1357600854610100900460ff1662000792576001600160a01b0383165f908152601d602052604090205460ff16806200074457506001600160a01b0382165f908152601d602052604090205460ff165b620007925760405162461bcd60e51b815260206004820152601660248201527f54726164696e67206973206e6f74206163746976652e000000000000000000006044820152606401620000b7565b600a5460ff161562000894575f546001600160a01b03838116911614801590620007ca57506001546001600160a01b03838116911614155b8015620007e557506002546001600160a01b03838116911614155b156200089457325f908152600960205260409020544311620008825760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401620000b7565b325f9081526009602052604090204390555b6001600160a01b0383165f908152601f602052604090205460ff168015620008d457506001600160a01b0382165f908152601e602052604090205460ff16155b15620009c657600554811115620009465760405162461bcd60e51b815260206004820152602f60248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526e36b0bc2a3930b739b0b1ba34b7b71760891b6064820152608401620000b7565b6007546001600160a01b0383165f9081525f805160206200458f83398151915260205260409020546200097a90836200185f565b1115620009c05760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401620000b7565b62000b13565b6001600160a01b0382165f908152601f602052604090205460ff16801562000a0657506001600160a01b0383165f908152601e602052604090205460ff16155b1562000a7957600554811115620009c05760405162461bcd60e51b815260206004820152603060248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201526f1036b0bc2a3930b739b0b1ba34b7b71760811b6064820152608401620000b7565b6001600160a01b0382165f908152601e602052604090205460ff1662000b13576007546001600160a01b0383165f9081525f805160206200458f833981519152602052604090205462000acd90836200185f565b111562000b135760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401620000b7565b602154305f9081525f805160206200458f8339815191526020526040812054909162000b3f9162001875565b6006546001600160a01b0386165f908152601d6020526040812054929350908310159160ff1615801562000b8b57506001600160a01b0385165f908152601d602052604090205460ff16155b1562000ba657600d54600c5462000ba3919062001875565b90505b81801562000bbc575060085462010000900460ff165b801562000bd35750600254600160a01b900460ff16155b801562000bf857506001600160a01b0386165f908152601f602052604090205460ff16155b801562000c1d57506001600160a01b0386165f908152601d602052604090205460ff16155b801562000c4257506001600160a01b0385165f908152601d602052604090205460ff16155b801562000c515750620186a081105b1562000c82576002805460ff60a01b1916600160a01b17905562000c74620010ad565b6002805460ff60a01b191690555b6002546001600160a01b0387165f908152601d602052604090205460ff600160a01b90920482161591168062000ccf57506001600160a01b0386165f908152601d602052604090205460ff165b1562000cd857505f5b5f811562000f53576001600160a01b0387165f908152601f602052604090205460ff16801562000d0957505f601454115b1562000e0b5760646014548762000d2191906200181f565b62000d2d91906200183f565b90506014546016548262000d4291906200181f565b62000d4e91906200183f565b601a5f82825462000d6091906200185f565b909155505060145460175462000d7790836200181f565b62000d8391906200183f565b601b5f82825462000d9591906200185f565b909155505060145460155462000dac90836200181f565b62000db891906200183f565b60195f82825462000dca91906200185f565b909155505060145460185462000de190836200181f565b62000ded91906200183f565b601c5f82825462000dff91906200185f565b9091555062000f309050565b6001600160a01b0388165f908152601f602052604090205460ff16801562000e3457505f600f54115b1562000f30576064600f548762000e4c91906200181f565b62000e5891906200183f565b9050600f546011548262000e6d91906200181f565b62000e7991906200183f565b601a5f82825462000e8b91906200185f565b9091555050600f5460125462000ea290836200181f565b62000eae91906200183f565b601b5f82825462000ec091906200185f565b9091555050600f5460105462000ed790836200181f565b62000ee391906200183f565b60195f82825462000ef591906200185f565b9091555050600f5460135462000f0c90836200181f565b62000f1891906200183f565b601c5f82825462000f2a91906200185f565b90915550505b801562000f445762000f4488308362000f6a565b62000f50818762001875565b95505b62000f6088888862000f6a565b5050505050505050565b5f805160206200458f8339815191526001600160a01b03841662000fa95781816002015f82825462000f9d91906200185f565b909155506200101b9050565b6001600160a01b0384165f908152602082905260409020548281101562000ffd5760405163391434e360e21b81526001600160a01b03861660048201526024810182905260448101849052606401620000b7565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b0383166200103b57600281018054839003905562001059565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516200109f91815260200190565b60405180910390a350505050565b602154305f9081525f805160206200458f83398151915260205260408120549091620010d99162001875565b90505f601c54601b54601954601a54620010f491906200185f565b6200110091906200185f565b6200110c91906200185f565b90505f8215806200111b575081155b156200112657505050565b6006546200113690600a6200181f565b83111562001151576006546200114e90600a6200181f565b92505b5f600283601a54866200116591906200181f565b6200117191906200183f565b6200117d91906200183f565b90505f6200118c828662001875565b9050476200119a8262001378565b5f620011a7824762001875565b90505f8660195483620011bb91906200181f565b620011c791906200183f565b90505f87601b5484620011db91906200181f565b620011e791906200183f565b90505f88601c5485620011fb91906200181f565b6200120791906200183f565b90505f818362001218868862001875565b62001224919062001875565b62001230919062001875565b5f601a8190556019819055601b819055601c8190556004546040519293506001600160a01b031691859181818185875af1925050503d805f811462001291576040519150601f19603f3d011682016040523d82523d5f602084013e62001296565b606091505b50909950508715801590620012aa57505f81115b156200130057620012bc8882620014d7565b601a54604080518981526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6003546040516001600160a01b039091169047905f81818185875af1925050503d805f81146200134c576040519150601f19603f3d011682016040523d82523d5f602084013e62001351565b606091505b5050600c8054919a505f62001366836200188b565b91905055505050505050505050505050565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110620013ae57620013ae620018a6565b6001600160a01b03928316602091820292909201810191909152600154604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801562001406573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200142c9190620017dc565b81600181518110620014425762001442620018a6565b6001600160a01b0392831660209182029290920101526001546200146a91309116846200158b565b60015460405163791ac94760e01b81526001600160a01b039091169063791ac94790620014a49085905f90869030904290600401620018ba565b5f604051808303815f87803b158015620014bc575f80fd5b505af1158015620014cf573d5f803e3d5ffd5b505050505050565b600154620014f19030906001600160a01b0316846200158b565b60015460405163f305d71960e01b8152306004820152602481018490525f60448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af11580156200155d573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906200158491906200192d565b5050505050565b620006a983838360015f805160206200458f8339815191526001600160a01b038516620015ce5760405163e602df0560e01b81525f6004820152602401620000b7565b6001600160a01b038416620015f957604051634a1406b160e11b81525f6004820152602401620000b7565b6001600160a01b038086165f908152600183016020908152604080832093881683529290522083905581156200158457836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516200166f91815260200190565b60405180910390a35050505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680620016a757607f821691505b602082108103620016c657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620006a957805f5260205f20601f840160051c81016020851015620016f35750805b601f840160051c820191505b8181101562001584575f8155600101620016ff565b81516001600160401b038111156200173057620017306200167e565b620017488162001741845462001692565b84620016cc565b602080601f8311600181146200177e575f8415620017665750858301515b5f19600386901b1c1916600185901b178555620014cf565b5f85815260208120601f198616915b82811015620017ae578886015182559484019460019091019084016200178d565b5085821015620017cc57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215620017ed575f80fd5b81516001600160a01b038116811462001804575f80fd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176200183957620018396200180b565b92915050565b5f826200185a57634e487b7160e01b5f52601260045260245ffd5b500490565b808201808211156200183957620018396200180b565b818103818111156200183957620018396200180b565b5f600182016200189f576200189f6200180b565b5060010190565b634e487b7160e01b5f52603260045260245ffd5b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156200190c5784516001600160a01b031683529383019391830191600101620018e5565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f6060848603121562001940575f80fd5b8351925060208401519150604084015190509250925092565b612c2880620019675f395ff3fe6080604052600436106103a0575f3560e01c806392136913116101de578063d85ba06311610108578063f023f5731161009d578063f63743421161006d578063f637434214610a78578063f887ea4014610a8d578063f8b45b0514610ab4578063fb002c9714610ac9575f80fd5b8063f023f57314610a06578063f11a24d314610a25578063f2fde38b14610a3a578063f3621c9014610a59575f80fd5b8063e7107947116100d8578063e71079471461099f578063e7ad9fcd146109be578063e884f260146109dd578063ef8700e5146109f1575f80fd5b8063d85ba06314610928578063dd62ed3e1461093d578063e1bc33941461095c578063e2f456051461098a575f80fd5b8063b20414111161017e578063c04a54141161014e578063c04a5414146108bc578063c3f70b52146108db578063c876d0b9146108f0578063d257b34f14610909575f80fd5b8063b20414111461083c578063b62496f514610851578063bbc0c7421461087f578063c02466681461089d575f80fd5b8063968fb8ba116101b9578063968fb8ba1461076c5780639a7a23d6146107df578063a9059cbb146107fe578063aacebbe31461081d575f80fd5b80639213691314610724578063924de9b71461073957806395d89b4114610758575f80fd5b806349bd5a5e116102ca578063715018a61161025f5780637bce5a041161022f5780637bce5a04146106c05780638a8c523c146106d55780638da5cb5b146106e957806391d5256714610705575f80fd5b8063715018a61461065a578063751039fc1461066e5780637571336a1461068257806375f0a874146106a1575f80fd5b80635a139dd41161029a5780635a139dd4146105f25780636a486a8e146106075780636ddd17131461061c57806370a082311461063b575f80fd5b806349bd5a5e146105865780634a62bb65146105a55780634f77f6c0146105be5780634fbee193146105d3575f80fd5b80631a8145bb1161034057806327c8f8351161031057806327c8f835146105185780632e6ed7ef1461052d578063313ce5671461054c57806342966c6814610567575f80fd5b80631a8145bb146104b05780631c499ab0146104c55780631f3fed8f146104e457806323b872dd146104f9575f80fd5b80631694505e1161037b5780631694505e1461042557806318160ddd1461045c57806318a94cf114610486578063199cbc541461049b575f80fd5b80630517d13d146103ab57806306fdde03146103cc578063095ea7b3146103f6575f80fd5b366103a757005b5f80fd5b3480156103b6575f80fd5b506103ca6103c536600461267f565b610ade565b005b3480156103d7575f80fd5b506103e0610ba4565b6040516103ed9190612696565b60405180910390f35b348015610401575f80fd5b506104156104103660046126f6565b610c64565b60405190151581526020016103ed565b348015610430575f80fd5b50600154610444906001600160a01b031681565b6040516001600160a01b0390911681526020016103ed565b348015610467575f80fd5b505f80516020612bd3833981519152545b6040519081526020016103ed565b348015610491575f80fd5b5061047860175481565b3480156104a6575f80fd5b5061047860215481565b3480156104bb575f80fd5b50610478601a5481565b3480156104d0575f80fd5b506103ca6104df36600461267f565b610c7d565b3480156104ef575f80fd5b5061047860195481565b348015610504575f80fd5b50610415610513366004612720565b610d38565b348015610523575f80fd5b5061044461dead81565b348015610538575f80fd5b506103ca61054736600461275e565b610d5b565b348015610557575f80fd5b50604051601281526020016103ed565b348015610572575f80fd5b506103ca61058136600461267f565b610dae565b348015610591575f80fd5b50600254610444906001600160a01b031681565b3480156105b0575f80fd5b506008546104159060ff1681565b3480156105c9575f80fd5b5061047860185481565b3480156105de575f80fd5b506104156105ed36600461278d565b610de0565b3480156105fd575f80fd5b5061047860135481565b348015610612575f80fd5b5061047860145481565b348015610627575f80fd5b506008546104159062010000900460ff1681565b348015610646575f80fd5b5061047861065536600461278d565b610dfd565b348015610665575f80fd5b506103ca610e23565b348015610679575f80fd5b50610415610e36565b34801561068d575f80fd5b506103ca61069c3660046127be565b610e4f565b3480156106ac575f80fd5b50600354610444906001600160a01b031681565b3480156106cb575f80fd5b5061047860105481565b3480156106e0575f80fd5b506103ca610e81565b3480156106f4575f80fd5b505f546001600160a01b0316610444565b348015610710575f80fd5b506103ca61071f36600461267f565b610ee9565b34801561072f575f80fd5b5061047860155481565b348015610744575f80fd5b506103ca6107533660046127f1565b61103d565b348015610763575f80fd5b506103e0611061565b348015610777575f80fd5b506107b561078636600461267f565b602080525f908152604090208054600182015460028301546003909301546001600160a01b0390921692909184565b604080516001600160a01b03909516855260208501939093529183015260608201526080016103ed565b3480156107ea575f80fd5b506103ca6107f93660046127be565b61109f565b348015610809575f80fd5b506104156108183660046126f6565b611139565b348015610828575f80fd5b506103ca61083736600461278d565b611146565b348015610847575f80fd5b5061047860125481565b34801561085c575f80fd5b5061041561086b36600461278d565b601f6020525f908152604090205460ff1681565b34801561088a575f80fd5b5060085461041590610100900460ff1681565b3480156108a8575f80fd5b506103ca6108b73660046127be565b6111aa565b3480156108c7575f80fd5b50600454610444906001600160a01b031681565b3480156108e6575f80fd5b5061047860055481565b3480156108fb575f80fd5b50600a546104159060ff1681565b348015610914575f80fd5b5061041561092336600461267f565b611210565b348015610933575f80fd5b50610478600f5481565b348015610948575f80fd5b5061047861095736600461280a565b61135b565b348015610967575f80fd5b5061041561097636600461278d565b601e6020525f908152604090205460ff1681565b348015610995575f80fd5b5061047860065481565b3480156109aa575f80fd5b506103ca6109b9366004612915565b6113a4565b3480156109c9575f80fd5b506103ca6109d836600461275e565b61141e565b3480156109e8575f80fd5b5061041561146b565b3480156109fc575f80fd5b50610478601b5481565b348015610a11575f80fd5b506103ca610a2036600461278d565b611484565b348015610a30575f80fd5b5061047860115481565b348015610a45575f80fd5b506103ca610a5436600461278d565b6114e8565b348015610a64575f80fd5b506103ca610a733660046129d1565b611522565b348015610a83575f80fd5b5061047860165481565b348015610a98575f80fd5b50610444737a250d5630b4cf539739df2c5dacb4c659f2488d81565b348015610abf575f80fd5b5061047860075481565b348015610ad4575f80fd5b50610478601c5481565b610ae66115c2565b670de0b6b3a76400006103e8610b075f80516020612bd38339815191525490565b610b12906001612a0e565b610b1c9190612a25565b610b269190612a25565b811015610b8c5760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61785472616e73616374696f6e206c6f776572206044820152687468616e20302e312560b81b60648201526084015b60405180910390fd5b610b9e81670de0b6b3a7640000612a0e565b60055550565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f80516020612bb383398151915291610be290612a44565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0e90612a44565b8015610c595780601f10610c3057610100808354040283529160200191610c59565b820191905f5260205f20905b815481529060010190602001808311610c3c57829003601f168201915b505050505091505090565b5f33610c718185856115ee565b60019150505b92915050565b610c856115c2565b670de0b6b3a76400006103e8610ca65f80516020612bd38339815191525490565b610cb1906005612a0e565b610cbb9190612a25565b610cc59190612a25565b811015610d205760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610b83565b610d3281670de0b6b3a7640000612a0e565b60075550565b5f33610d458582856115fb565b610d50858585611658565b506001949350505050565b610d636115c2565b60108490556011839055601282905560138190558082610d838587612a7c565b610d8d9190612a7c565b610d979190612a7c565b600f81905560191015610da8575f80fd5b50505050565b610db733610de0565b610dd35760405162461bcd60e51b8152600401610b8390612a8f565b610ddd33826116b5565b50565b6001600160a01b03165f908152601d602052604090205460ff1690565b6001600160a01b03165f9081525f80516020612bb3833981519152602052604090205490565b610e2b6115c2565b610e345f61175f565b565b5f610e3f6115c2565b506008805460ff19169055600190565b610e576115c2565b6001600160a01b03919091165f908152601e60205260409020805460ff1916911515919091179055565b610e896115c2565b600854610100900460ff1615610ed25760405162461bcd60e51b815260206004820152600e60248201526d151bdad95b881b185d5b98da195960921b6044820152606401610b83565b6008805443600b5562ffff00191662010100179055565b610ef233610de0565b610f0e5760405162461bcd60e51b8152600401610b8390612a8f565b5f8181526020808052604091829020825160808101845281546001600160a01b03168082526001830154938201939093526002820154938101939093526003015460608301523314610f945760405162461bcd60e51b815260206004820152600f60248201526e2827a62c9d103337b93134b23232b760891b6044820152606401610b83565b4281602001518260600151610fa99190612a7c565b10610ff65760405162461bcd60e51b815260206004820152601860248201527f504f4c593a2076657374207065726964206e6f7420656e6400000000000000006044820152606401610b83565b604081015161100430610dfd565b8111156110175761101430610dfd565b90505b611022303383611658565b8060215f8282546110339190612abc565b9091555050505050565b6110456115c2565b60088054911515620100000262ff000019909216919091179055565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f80516020612bb383398151915291610be290612a44565b6110a76115c2565b6002546001600160a01b039081169083160361112b5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610b83565b61113582826117ae565b5050565b5f33610c71818585611658565b61114e6115c2565b6003546040516001600160a01b03918216918316907fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b05674905f90a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b6111b26115c2565b6001600160a01b0382165f818152601d6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b5f6112196115c2565b620186a06112325f80516020612bd38339815191525490565b61123d906001612a0e565b6112479190612a25565b8210156112b45760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610b83565b6103e86112cc5f80516020612bd38339815191525490565b6112d7906005612a0e565b6112e19190612a25565b82111561134d5760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610b83565b50600681905560015b919050565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b6113ad33610de0565b6113c95760405162461bcd60e51b8152600401610b8390612a8f565b5f5b825181101561141957611411338483815181106113ea576113ea612acf565b602002602001015184848151811061140457611404612acf565b6020026020010151611658565b6001016113cb565b505050565b6114266115c2565b601584905560168390556017829055601881905580826114468587612a7c565b6114509190612a7c565b61145a9190612a7c565b601481905560191015610da8575f80fd5b5f6114746115c2565b50600a805460ff19169055600190565b61148c6115c2565b6004546040516001600160a01b03918216918316907ffaf1b77ed79f6e898c44dd8ab36b330c7b2fd39bcaab05ed6362480df8703965905f90a3600480546001600160a01b0319166001600160a01b0392909216919091179055565b6114f06115c2565b6001600160a01b03811661151957604051631e4fbdf760e01b81525f6004820152602401610b83565b610ddd8161175f565b61152b33610de0565b6115475760405162461bcd60e51b8152600401610b8390612a8f565b611552333083611658565b60408051608081018252338152602080820185815282840185815242606085019081525f898152938052948320935184546001600160a01b0319166001600160a01b0390911617845590516001840155516002830155915160039091015560218054839290611033908490612a7c565b5f546001600160a01b03163314610e345760405163118cdaa760e01b8152336004820152602401610b83565b6114198383836001611801565b5f611606848461135b565b90505f198114610da8578181101561164a57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610b83565b610da884848484035f611801565b6001600160a01b03831661168157604051634b637e8f60e11b81525f6004820152602401610b83565b6001600160a01b0382166116aa5760405163ec442f0560e01b81525f6004820152602401610b83565b6114198383836118e5565b6001600160a01b0382166116de57604051634b637e8f60e11b81525f6004820152602401610b83565b6001600160a01b0382165f8181525f80516020612bb38339815191526020818152604080842080548781039091555f80516020612bd3833981519152805488900390559051868152929490939290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a350505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382165f818152601f6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b5f80516020612bb38339815191526001600160a01b0385166118385760405163e602df0560e01b81525f6004820152602401610b83565b6001600160a01b03841661186157604051634a1406b160e11b81525f6004820152602401610b83565b6001600160a01b038086165f908152600183016020908152604080832093881683529290522083905581156118de57836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516118d591815260200190565b60405180910390a35b5050505050565b805f036118f75761141983835f6120db565b60035461190c906001600160a01b0316610dfd565b600d5560085460ff1615611ced57600254600160a01b900460ff16611ced57600854610100900460ff166119bc576001600160a01b0383165f908152601d602052604090205460ff168061197757506001600160a01b0382165f908152601d602052604090205460ff165b6119bc5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610b83565b600a5460ff1615611ab8575f546001600160a01b038381169116148015906119f257506001546001600160a01b03838116911614155b8015611a0c57506002546001600160a01b03838116911614155b15611ab857325f908152600960205260409020544311611aa65760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610b83565b325f9081526009602052604090204390555b6001600160a01b0383165f908152601f602052604090205460ff168015611af757506001600160a01b0382165f908152601e602052604090205460ff16155b15611bc557600554811115611b665760405162461bcd60e51b815260206004820152602f60248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526e36b0bc2a3930b739b0b1ba34b7b71760891b6064820152608401610b83565b600754611b7283610dfd565b611b7c9083612a7c565b1115611bc05760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610b83565b611ced565b6001600160a01b0382165f908152601f602052604090205460ff168015611c0457506001600160a01b0383165f908152601e602052604090205460ff16155b15611c7457600554811115611bc05760405162461bcd60e51b815260206004820152603060248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201526f1036b0bc2a3930b739b0b1ba34b7b71760811b6064820152608401610b83565b6001600160a01b0382165f908152601e602052604090205460ff16611ced57600754611c9f83610dfd565b611ca99083612a7c565b1115611ced5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610b83565b5f602154611cfa30610dfd565b611d049190612abc565b6006546001600160a01b0386165f908152601d6020526040812054929350908310159160ff16158015611d4f57506001600160a01b0385165f908152601d602052604090205460ff16155b15611d6757600d54600c54611d649190612abc565b90505b818015611d7c575060085462010000900460ff165b8015611d925750600254600160a01b900460ff16155b8015611db657506001600160a01b0386165f908152601f602052604090205460ff16155b8015611dda57506001600160a01b0386165f908152601d602052604090205460ff16155b8015611dfe57506001600160a01b0385165f908152601d602052604090205460ff16155b8015611e0c5750620186a081105b15611e3a576002805460ff60a01b1916600160a01b179055611e2c612206565b6002805460ff60a01b191690555b6002546001600160a01b0387165f908152601d602052604090205460ff600160a01b909204821615911680611e8657506001600160a01b0386165f908152601d602052604090205460ff165b15611e8e57505f5b5f81156120c6576001600160a01b0387165f908152601f602052604090205460ff168015611ebd57505f601454115b15611fa157606460145487611ed29190612a0e565b611edc9190612a25565b905060145460165482611eef9190612a0e565b611ef99190612a25565b601a5f828254611f099190612a7c565b9091555050601454601754611f1e9083612a0e565b611f289190612a25565b601b5f828254611f389190612a7c565b9091555050601454601554611f4d9083612a0e565b611f579190612a25565b60195f828254611f679190612a7c565b9091555050601454601854611f7c9083612a0e565b611f869190612a25565b601c5f828254611f969190612a7c565b909155506120a89050565b6001600160a01b0388165f908152601f602052604090205460ff168015611fc957505f600f54115b156120a8576064600f5487611fde9190612a0e565b611fe89190612a25565b9050600f5460115482611ffb9190612a0e565b6120059190612a25565b601a5f8282546120159190612a7c565b9091555050600f5460125461202a9083612a0e565b6120349190612a25565b601b5f8282546120449190612a7c565b9091555050600f546010546120599083612a0e565b6120639190612a25565b60195f8282546120739190612a7c565b9091555050600f546013546120889083612a0e565b6120929190612a25565b601c5f8282546120a29190612a7c565b90915550505b80156120b9576120b98830836120db565b6120c38187612abc565b95505b6120d18888886120db565b5050505050505050565b5f80516020612bb38339815191526001600160a01b0384166121155781816002015f82825461210a9190612a7c565b909155506121859050565b6001600160a01b0384165f90815260208290526040902054828110156121675760405163391434e360e21b81526001600160a01b03861660048201526024810182905260448101849052606401610b83565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b0383166121a35760028101805483900390556121c1565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161175191815260200190565b5f60215461221330610dfd565b61221d9190612abc565b90505f601c54601b54601954601a546122369190612a7c565b6122409190612a7c565b61224a9190612a7c565b90505f821580612258575081155b1561226257505050565b60065461227090600a612a0e565b8311156122885760065461228590600a612a0e565b92505b5f600283601a548661229a9190612a0e565b6122a49190612a25565b6122ae9190612a25565b90505f6122bb8286612abc565b9050476122c782612487565b5f6122d28247612abc565b90505f86601954836122e49190612a0e565b6122ee9190612a25565b90505f87601b54846123009190612a0e565b61230a9190612a25565b90505f88601c548561231c9190612a0e565b6123269190612a25565b90505f81836123358688612abc565b61233f9190612abc565b6123499190612abc565b5f601a8190556019819055601b819055601c8190556004546040519293506001600160a01b031691859181818185875af1925050503d805f81146123a8576040519150601f19603f3d011682016040523d82523d5f602084013e6123ad565b606091505b509099505087158015906123c057505f81115b15612413576123cf88826125d7565b601a54604080518981526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6003546040516001600160a01b039091169047905f81818185875af1925050503d805f811461245d576040519150601f19603f3d011682016040523d82523d5f602084013e612462565b606091505b5050600c8054919a505f61247583612ae3565b91905055505050505050505050505050565b6040805160028082526060820183525f9260208301908036833701905050905030815f815181106124ba576124ba612acf565b6001600160a01b03928316602091820292909201810191909152600154604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612511573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125359190612afb565b8160018151811061254857612548612acf565b6001600160a01b03928316602091820292909201015260015461256e91309116846115ee565b60015460405163791ac94760e01b81526001600160a01b039091169063791ac947906125a69085905f90869030904290600401612b16565b5f604051808303815f87803b1580156125bd575f80fd5b505af11580156125cf573d5f803e3d5ffd5b505050505050565b6001546125ef9030906001600160a01b0316846115ee565b60015460405163f305d71960e01b8152306004820152602481018490525f60448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af115801561265a573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906118de9190612b87565b5f6020828403121561268f575f80fd5b5035919050565b5f602080835283518060208501525f5b818110156126c2578581018301518582016040015282016126a6565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610ddd575f80fd5b5f8060408385031215612707575f80fd5b8235612712816126e2565b946020939093013593505050565b5f805f60608486031215612732575f80fd5b833561273d816126e2565b9250602084013561274d816126e2565b929592945050506040919091013590565b5f805f8060808587031215612771575f80fd5b5050823594602084013594506040840135936060013592509050565b5f6020828403121561279d575f80fd5b81356127a8816126e2565b9392505050565b80358015158114611356575f80fd5b5f80604083850312156127cf575f80fd5b82356127da816126e2565b91506127e8602084016127af565b90509250929050565b5f60208284031215612801575f80fd5b6127a8826127af565b5f806040838503121561281b575f80fd5b8235612826816126e2565b91506020830135612836816126e2565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561287e5761287e612841565b604052919050565b5f67ffffffffffffffff82111561289f5761289f612841565b5060051b60200190565b5f82601f8301126128b8575f80fd5b813560206128cd6128c883612886565b612855565b8083825260208201915060208460051b8701019350868411156128ee575f80fd5b602086015b8481101561290a57803583529183019183016128f3565b509695505050505050565b5f8060408385031215612926575f80fd5b823567ffffffffffffffff8082111561293d575f80fd5b818501915085601f830112612950575f80fd5b813560206129606128c883612886565b82815260059290921b8401810191818101908984111561297e575f80fd5b948201945b838610156129a5578535612996816126e2565b82529482019490820190612983565b965050860135925050808211156129ba575f80fd5b506129c7858286016128a9565b9150509250929050565b5f805f606084860312156129e3575f80fd5b505081359360208301359350604090920135919050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610c7757610c776129fa565b5f82612a3f57634e487b7160e01b5f52601260045260245ffd5b500490565b600181811c90821680612a5857607f821691505b602082108103612a7657634e487b7160e01b5f52602260045260245ffd5b50919050565b80820180821115610c7757610c776129fa565b6020808252601390820152722827a62c9d102737902832b936b4b9b9b4b7b760691b604082015260600190565b81810381811115610c7757610c776129fa565b634e487b7160e01b5f52603260045260245ffd5b5f60018201612af457612af46129fa565b5060010190565b5f60208284031215612b0b575f80fd5b81516127a8816126e2565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015612b665784516001600160a01b031683529383019391830191600101612b41565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215612b99575f80fd5b835192506020840151915060408401519050925092509256fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0052c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02a26469706673582212202a40c812159a60f14070f7bb6fee76d51a1ab2742925d6ff6759aa325d763bf164736f6c6343000816003352c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00

Deployed Bytecode

0x6080604052600436106103a0575f3560e01c806392136913116101de578063d85ba06311610108578063f023f5731161009d578063f63743421161006d578063f637434214610a78578063f887ea4014610a8d578063f8b45b0514610ab4578063fb002c9714610ac9575f80fd5b8063f023f57314610a06578063f11a24d314610a25578063f2fde38b14610a3a578063f3621c9014610a59575f80fd5b8063e7107947116100d8578063e71079471461099f578063e7ad9fcd146109be578063e884f260146109dd578063ef8700e5146109f1575f80fd5b8063d85ba06314610928578063dd62ed3e1461093d578063e1bc33941461095c578063e2f456051461098a575f80fd5b8063b20414111161017e578063c04a54141161014e578063c04a5414146108bc578063c3f70b52146108db578063c876d0b9146108f0578063d257b34f14610909575f80fd5b8063b20414111461083c578063b62496f514610851578063bbc0c7421461087f578063c02466681461089d575f80fd5b8063968fb8ba116101b9578063968fb8ba1461076c5780639a7a23d6146107df578063a9059cbb146107fe578063aacebbe31461081d575f80fd5b80639213691314610724578063924de9b71461073957806395d89b4114610758575f80fd5b806349bd5a5e116102ca578063715018a61161025f5780637bce5a041161022f5780637bce5a04146106c05780638a8c523c146106d55780638da5cb5b146106e957806391d5256714610705575f80fd5b8063715018a61461065a578063751039fc1461066e5780637571336a1461068257806375f0a874146106a1575f80fd5b80635a139dd41161029a5780635a139dd4146105f25780636a486a8e146106075780636ddd17131461061c57806370a082311461063b575f80fd5b806349bd5a5e146105865780634a62bb65146105a55780634f77f6c0146105be5780634fbee193146105d3575f80fd5b80631a8145bb1161034057806327c8f8351161031057806327c8f835146105185780632e6ed7ef1461052d578063313ce5671461054c57806342966c6814610567575f80fd5b80631a8145bb146104b05780631c499ab0146104c55780631f3fed8f146104e457806323b872dd146104f9575f80fd5b80631694505e1161037b5780631694505e1461042557806318160ddd1461045c57806318a94cf114610486578063199cbc541461049b575f80fd5b80630517d13d146103ab57806306fdde03146103cc578063095ea7b3146103f6575f80fd5b366103a757005b5f80fd5b3480156103b6575f80fd5b506103ca6103c536600461267f565b610ade565b005b3480156103d7575f80fd5b506103e0610ba4565b6040516103ed9190612696565b60405180910390f35b348015610401575f80fd5b506104156104103660046126f6565b610c64565b60405190151581526020016103ed565b348015610430575f80fd5b50600154610444906001600160a01b031681565b6040516001600160a01b0390911681526020016103ed565b348015610467575f80fd5b505f80516020612bd3833981519152545b6040519081526020016103ed565b348015610491575f80fd5b5061047860175481565b3480156104a6575f80fd5b5061047860215481565b3480156104bb575f80fd5b50610478601a5481565b3480156104d0575f80fd5b506103ca6104df36600461267f565b610c7d565b3480156104ef575f80fd5b5061047860195481565b348015610504575f80fd5b50610415610513366004612720565b610d38565b348015610523575f80fd5b5061044461dead81565b348015610538575f80fd5b506103ca61054736600461275e565b610d5b565b348015610557575f80fd5b50604051601281526020016103ed565b348015610572575f80fd5b506103ca61058136600461267f565b610dae565b348015610591575f80fd5b50600254610444906001600160a01b031681565b3480156105b0575f80fd5b506008546104159060ff1681565b3480156105c9575f80fd5b5061047860185481565b3480156105de575f80fd5b506104156105ed36600461278d565b610de0565b3480156105fd575f80fd5b5061047860135481565b348015610612575f80fd5b5061047860145481565b348015610627575f80fd5b506008546104159062010000900460ff1681565b348015610646575f80fd5b5061047861065536600461278d565b610dfd565b348015610665575f80fd5b506103ca610e23565b348015610679575f80fd5b50610415610e36565b34801561068d575f80fd5b506103ca61069c3660046127be565b610e4f565b3480156106ac575f80fd5b50600354610444906001600160a01b031681565b3480156106cb575f80fd5b5061047860105481565b3480156106e0575f80fd5b506103ca610e81565b3480156106f4575f80fd5b505f546001600160a01b0316610444565b348015610710575f80fd5b506103ca61071f36600461267f565b610ee9565b34801561072f575f80fd5b5061047860155481565b348015610744575f80fd5b506103ca6107533660046127f1565b61103d565b348015610763575f80fd5b506103e0611061565b348015610777575f80fd5b506107b561078636600461267f565b602080525f908152604090208054600182015460028301546003909301546001600160a01b0390921692909184565b604080516001600160a01b03909516855260208501939093529183015260608201526080016103ed565b3480156107ea575f80fd5b506103ca6107f93660046127be565b61109f565b348015610809575f80fd5b506104156108183660046126f6565b611139565b348015610828575f80fd5b506103ca61083736600461278d565b611146565b348015610847575f80fd5b5061047860125481565b34801561085c575f80fd5b5061041561086b36600461278d565b601f6020525f908152604090205460ff1681565b34801561088a575f80fd5b5060085461041590610100900460ff1681565b3480156108a8575f80fd5b506103ca6108b73660046127be565b6111aa565b3480156108c7575f80fd5b50600454610444906001600160a01b031681565b3480156108e6575f80fd5b5061047860055481565b3480156108fb575f80fd5b50600a546104159060ff1681565b348015610914575f80fd5b5061041561092336600461267f565b611210565b348015610933575f80fd5b50610478600f5481565b348015610948575f80fd5b5061047861095736600461280a565b61135b565b348015610967575f80fd5b5061041561097636600461278d565b601e6020525f908152604090205460ff1681565b348015610995575f80fd5b5061047860065481565b3480156109aa575f80fd5b506103ca6109b9366004612915565b6113a4565b3480156109c9575f80fd5b506103ca6109d836600461275e565b61141e565b3480156109e8575f80fd5b5061041561146b565b3480156109fc575f80fd5b50610478601b5481565b348015610a11575f80fd5b506103ca610a2036600461278d565b611484565b348015610a30575f80fd5b5061047860115481565b348015610a45575f80fd5b506103ca610a5436600461278d565b6114e8565b348015610a64575f80fd5b506103ca610a733660046129d1565b611522565b348015610a83575f80fd5b5061047860165481565b348015610a98575f80fd5b50610444737a250d5630b4cf539739df2c5dacb4c659f2488d81565b348015610abf575f80fd5b5061047860075481565b348015610ad4575f80fd5b50610478601c5481565b610ae66115c2565b670de0b6b3a76400006103e8610b075f80516020612bd38339815191525490565b610b12906001612a0e565b610b1c9190612a25565b610b269190612a25565b811015610b8c5760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61785472616e73616374696f6e206c6f776572206044820152687468616e20302e312560b81b60648201526084015b60405180910390fd5b610b9e81670de0b6b3a7640000612a0e565b60055550565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f80516020612bb383398151915291610be290612a44565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0e90612a44565b8015610c595780601f10610c3057610100808354040283529160200191610c59565b820191905f5260205f20905b815481529060010190602001808311610c3c57829003601f168201915b505050505091505090565b5f33610c718185856115ee565b60019150505b92915050565b610c856115c2565b670de0b6b3a76400006103e8610ca65f80516020612bd38339815191525490565b610cb1906005612a0e565b610cbb9190612a25565b610cc59190612a25565b811015610d205760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610b83565b610d3281670de0b6b3a7640000612a0e565b60075550565b5f33610d458582856115fb565b610d50858585611658565b506001949350505050565b610d636115c2565b60108490556011839055601282905560138190558082610d838587612a7c565b610d8d9190612a7c565b610d979190612a7c565b600f81905560191015610da8575f80fd5b50505050565b610db733610de0565b610dd35760405162461bcd60e51b8152600401610b8390612a8f565b610ddd33826116b5565b50565b6001600160a01b03165f908152601d602052604090205460ff1690565b6001600160a01b03165f9081525f80516020612bb3833981519152602052604090205490565b610e2b6115c2565b610e345f61175f565b565b5f610e3f6115c2565b506008805460ff19169055600190565b610e576115c2565b6001600160a01b03919091165f908152601e60205260409020805460ff1916911515919091179055565b610e896115c2565b600854610100900460ff1615610ed25760405162461bcd60e51b815260206004820152600e60248201526d151bdad95b881b185d5b98da195960921b6044820152606401610b83565b6008805443600b5562ffff00191662010100179055565b610ef233610de0565b610f0e5760405162461bcd60e51b8152600401610b8390612a8f565b5f8181526020808052604091829020825160808101845281546001600160a01b03168082526001830154938201939093526002820154938101939093526003015460608301523314610f945760405162461bcd60e51b815260206004820152600f60248201526e2827a62c9d103337b93134b23232b760891b6044820152606401610b83565b4281602001518260600151610fa99190612a7c565b10610ff65760405162461bcd60e51b815260206004820152601860248201527f504f4c593a2076657374207065726964206e6f7420656e6400000000000000006044820152606401610b83565b604081015161100430610dfd565b8111156110175761101430610dfd565b90505b611022303383611658565b8060215f8282546110339190612abc565b9091555050505050565b6110456115c2565b60088054911515620100000262ff000019909216919091179055565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f80516020612bb383398151915291610be290612a44565b6110a76115c2565b6002546001600160a01b039081169083160361112b5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610b83565b61113582826117ae565b5050565b5f33610c71818585611658565b61114e6115c2565b6003546040516001600160a01b03918216918316907fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b05674905f90a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b6111b26115c2565b6001600160a01b0382165f818152601d6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b5f6112196115c2565b620186a06112325f80516020612bd38339815191525490565b61123d906001612a0e565b6112479190612a25565b8210156112b45760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610b83565b6103e86112cc5f80516020612bd38339815191525490565b6112d7906005612a0e565b6112e19190612a25565b82111561134d5760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610b83565b50600681905560015b919050565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b6113ad33610de0565b6113c95760405162461bcd60e51b8152600401610b8390612a8f565b5f5b825181101561141957611411338483815181106113ea576113ea612acf565b602002602001015184848151811061140457611404612acf565b6020026020010151611658565b6001016113cb565b505050565b6114266115c2565b601584905560168390556017829055601881905580826114468587612a7c565b6114509190612a7c565b61145a9190612a7c565b601481905560191015610da8575f80fd5b5f6114746115c2565b50600a805460ff19169055600190565b61148c6115c2565b6004546040516001600160a01b03918216918316907ffaf1b77ed79f6e898c44dd8ab36b330c7b2fd39bcaab05ed6362480df8703965905f90a3600480546001600160a01b0319166001600160a01b0392909216919091179055565b6114f06115c2565b6001600160a01b03811661151957604051631e4fbdf760e01b81525f6004820152602401610b83565b610ddd8161175f565b61152b33610de0565b6115475760405162461bcd60e51b8152600401610b8390612a8f565b611552333083611658565b60408051608081018252338152602080820185815282840185815242606085019081525f898152938052948320935184546001600160a01b0319166001600160a01b0390911617845590516001840155516002830155915160039091015560218054839290611033908490612a7c565b5f546001600160a01b03163314610e345760405163118cdaa760e01b8152336004820152602401610b83565b6114198383836001611801565b5f611606848461135b565b90505f198114610da8578181101561164a57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610b83565b610da884848484035f611801565b6001600160a01b03831661168157604051634b637e8f60e11b81525f6004820152602401610b83565b6001600160a01b0382166116aa5760405163ec442f0560e01b81525f6004820152602401610b83565b6114198383836118e5565b6001600160a01b0382166116de57604051634b637e8f60e11b81525f6004820152602401610b83565b6001600160a01b0382165f8181525f80516020612bb38339815191526020818152604080842080548781039091555f80516020612bd3833981519152805488900390559051868152929490939290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a350505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382165f818152601f6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b5f80516020612bb38339815191526001600160a01b0385166118385760405163e602df0560e01b81525f6004820152602401610b83565b6001600160a01b03841661186157604051634a1406b160e11b81525f6004820152602401610b83565b6001600160a01b038086165f908152600183016020908152604080832093881683529290522083905581156118de57836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516118d591815260200190565b60405180910390a35b5050505050565b805f036118f75761141983835f6120db565b60035461190c906001600160a01b0316610dfd565b600d5560085460ff1615611ced57600254600160a01b900460ff16611ced57600854610100900460ff166119bc576001600160a01b0383165f908152601d602052604090205460ff168061197757506001600160a01b0382165f908152601d602052604090205460ff165b6119bc5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610b83565b600a5460ff1615611ab8575f546001600160a01b038381169116148015906119f257506001546001600160a01b03838116911614155b8015611a0c57506002546001600160a01b03838116911614155b15611ab857325f908152600960205260409020544311611aa65760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610b83565b325f9081526009602052604090204390555b6001600160a01b0383165f908152601f602052604090205460ff168015611af757506001600160a01b0382165f908152601e602052604090205460ff16155b15611bc557600554811115611b665760405162461bcd60e51b815260206004820152602f60248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526e36b0bc2a3930b739b0b1ba34b7b71760891b6064820152608401610b83565b600754611b7283610dfd565b611b7c9083612a7c565b1115611bc05760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610b83565b611ced565b6001600160a01b0382165f908152601f602052604090205460ff168015611c0457506001600160a01b0383165f908152601e602052604090205460ff16155b15611c7457600554811115611bc05760405162461bcd60e51b815260206004820152603060248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201526f1036b0bc2a3930b739b0b1ba34b7b71760811b6064820152608401610b83565b6001600160a01b0382165f908152601e602052604090205460ff16611ced57600754611c9f83610dfd565b611ca99083612a7c565b1115611ced5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610b83565b5f602154611cfa30610dfd565b611d049190612abc565b6006546001600160a01b0386165f908152601d6020526040812054929350908310159160ff16158015611d4f57506001600160a01b0385165f908152601d602052604090205460ff16155b15611d6757600d54600c54611d649190612abc565b90505b818015611d7c575060085462010000900460ff165b8015611d925750600254600160a01b900460ff16155b8015611db657506001600160a01b0386165f908152601f602052604090205460ff16155b8015611dda57506001600160a01b0386165f908152601d602052604090205460ff16155b8015611dfe57506001600160a01b0385165f908152601d602052604090205460ff16155b8015611e0c5750620186a081105b15611e3a576002805460ff60a01b1916600160a01b179055611e2c612206565b6002805460ff60a01b191690555b6002546001600160a01b0387165f908152601d602052604090205460ff600160a01b909204821615911680611e8657506001600160a01b0386165f908152601d602052604090205460ff165b15611e8e57505f5b5f81156120c6576001600160a01b0387165f908152601f602052604090205460ff168015611ebd57505f601454115b15611fa157606460145487611ed29190612a0e565b611edc9190612a25565b905060145460165482611eef9190612a0e565b611ef99190612a25565b601a5f828254611f099190612a7c565b9091555050601454601754611f1e9083612a0e565b611f289190612a25565b601b5f828254611f389190612a7c565b9091555050601454601554611f4d9083612a0e565b611f579190612a25565b60195f828254611f679190612a7c565b9091555050601454601854611f7c9083612a0e565b611f869190612a25565b601c5f828254611f969190612a7c565b909155506120a89050565b6001600160a01b0388165f908152601f602052604090205460ff168015611fc957505f600f54115b156120a8576064600f5487611fde9190612a0e565b611fe89190612a25565b9050600f5460115482611ffb9190612a0e565b6120059190612a25565b601a5f8282546120159190612a7c565b9091555050600f5460125461202a9083612a0e565b6120349190612a25565b601b5f8282546120449190612a7c565b9091555050600f546010546120599083612a0e565b6120639190612a25565b60195f8282546120739190612a7c565b9091555050600f546013546120889083612a0e565b6120929190612a25565b601c5f8282546120a29190612a7c565b90915550505b80156120b9576120b98830836120db565b6120c38187612abc565b95505b6120d18888886120db565b5050505050505050565b5f80516020612bb38339815191526001600160a01b0384166121155781816002015f82825461210a9190612a7c565b909155506121859050565b6001600160a01b0384165f90815260208290526040902054828110156121675760405163391434e360e21b81526001600160a01b03861660048201526024810182905260448101849052606401610b83565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b0383166121a35760028101805483900390556121c1565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161175191815260200190565b5f60215461221330610dfd565b61221d9190612abc565b90505f601c54601b54601954601a546122369190612a7c565b6122409190612a7c565b61224a9190612a7c565b90505f821580612258575081155b1561226257505050565b60065461227090600a612a0e565b8311156122885760065461228590600a612a0e565b92505b5f600283601a548661229a9190612a0e565b6122a49190612a25565b6122ae9190612a25565b90505f6122bb8286612abc565b9050476122c782612487565b5f6122d28247612abc565b90505f86601954836122e49190612a0e565b6122ee9190612a25565b90505f87601b54846123009190612a0e565b61230a9190612a25565b90505f88601c548561231c9190612a0e565b6123269190612a25565b90505f81836123358688612abc565b61233f9190612abc565b6123499190612abc565b5f601a8190556019819055601b819055601c8190556004546040519293506001600160a01b031691859181818185875af1925050503d805f81146123a8576040519150601f19603f3d011682016040523d82523d5f602084013e6123ad565b606091505b509099505087158015906123c057505f81115b15612413576123cf88826125d7565b601a54604080518981526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6003546040516001600160a01b039091169047905f81818185875af1925050503d805f811461245d576040519150601f19603f3d011682016040523d82523d5f602084013e612462565b606091505b5050600c8054919a505f61247583612ae3565b91905055505050505050505050505050565b6040805160028082526060820183525f9260208301908036833701905050905030815f815181106124ba576124ba612acf565b6001600160a01b03928316602091820292909201810191909152600154604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612511573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125359190612afb565b8160018151811061254857612548612acf565b6001600160a01b03928316602091820292909201015260015461256e91309116846115ee565b60015460405163791ac94760e01b81526001600160a01b039091169063791ac947906125a69085905f90869030904290600401612b16565b5f604051808303815f87803b1580156125bd575f80fd5b505af11580156125cf573d5f803e3d5ffd5b505050505050565b6001546125ef9030906001600160a01b0316846115ee565b60015460405163f305d71960e01b8152306004820152602481018490525f60448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af115801561265a573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906118de9190612b87565b5f6020828403121561268f575f80fd5b5035919050565b5f602080835283518060208501525f5b818110156126c2578581018301518582016040015282016126a6565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610ddd575f80fd5b5f8060408385031215612707575f80fd5b8235612712816126e2565b946020939093013593505050565b5f805f60608486031215612732575f80fd5b833561273d816126e2565b9250602084013561274d816126e2565b929592945050506040919091013590565b5f805f8060808587031215612771575f80fd5b5050823594602084013594506040840135936060013592509050565b5f6020828403121561279d575f80fd5b81356127a8816126e2565b9392505050565b80358015158114611356575f80fd5b5f80604083850312156127cf575f80fd5b82356127da816126e2565b91506127e8602084016127af565b90509250929050565b5f60208284031215612801575f80fd5b6127a8826127af565b5f806040838503121561281b575f80fd5b8235612826816126e2565b91506020830135612836816126e2565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561287e5761287e612841565b604052919050565b5f67ffffffffffffffff82111561289f5761289f612841565b5060051b60200190565b5f82601f8301126128b8575f80fd5b813560206128cd6128c883612886565b612855565b8083825260208201915060208460051b8701019350868411156128ee575f80fd5b602086015b8481101561290a57803583529183019183016128f3565b509695505050505050565b5f8060408385031215612926575f80fd5b823567ffffffffffffffff8082111561293d575f80fd5b818501915085601f830112612950575f80fd5b813560206129606128c883612886565b82815260059290921b8401810191818101908984111561297e575f80fd5b948201945b838610156129a5578535612996816126e2565b82529482019490820190612983565b965050860135925050808211156129ba575f80fd5b506129c7858286016128a9565b9150509250929050565b5f805f606084860312156129e3575f80fd5b505081359360208301359350604090920135919050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610c7757610c776129fa565b5f82612a3f57634e487b7160e01b5f52601260045260245ffd5b500490565b600181811c90821680612a5857607f821691505b602082108103612a7657634e487b7160e01b5f52602260045260245ffd5b50919050565b80820180821115610c7757610c776129fa565b6020808252601390820152722827a62c9d102737902832b936b4b9b9b4b7b760691b604082015260600190565b81810381811115610c7757610c776129fa565b634e487b7160e01b5f52603260045260245ffd5b5f60018201612af457612af46129fa565b5060010190565b5f60208284031215612b0b575f80fd5b81516127a8816126e2565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015612b665784516001600160a01b031683529383019391830191600101612b41565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215612b99575f80fd5b835192506020840151915060408401519050925092509256fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0052c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02a26469706673582212202a40c812159a60f14070f7bb6fee76d51a1ab2742925d6ff6759aa325d763bf164736f6c63430008160033

Deployed Bytecode Sourcemap

33297:18823:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39882:265;;;;;;;;;;-1:-1:-1;39882:265:0;;;;;:::i;:::-;;:::i;:::-;;23115:147;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25686:188;;;;;;;;;;-1:-1:-1;25686:188:0;;;;;:::i;:::-;;:::i;:::-;;;1373:14:1;;1366:22;1348:41;;1336:2;1321:18;25686:188:0;1208:187:1;33476:41:0;;;;;;;;;;-1:-1:-1;33476:41:0;;;;-1:-1:-1;;;;;33476:41:0;;;;;;-1:-1:-1;;;;;1590:32:1;;;1572:51;;1560:2;1545:18;33476:41:0;1400:229:1;24329:155:0;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;24462:14:0;24329:155;;;1780:25:1;;;1768:2;1753:18;24329:155:0;1634:177:1;34633:33:0;;;;;;;;;;;;;;;;35116:26;;;;;;;;;;;;;;;;34754:33;;;;;;;;;;;;;;;;40155:250;;;;;;;;;;-1:-1:-1;40155:250:0;;;;;:::i;:::-;;:::i;34714:33::-;;;;;;;;;;;;;;;;26452:247;;;;;;;;;;-1:-1:-1;26452:247:0;;;;;:::i;:::-;;:::i;33559:53::-;;;;;;;;;;;;33605:6;33559:53;;40778:498;;;;;;;;;;-1:-1:-1;40778:498:0;;;;;:::i;:::-;;:::i;24180:84::-;;;;;;;;;;-1:-1:-1;24180:84:0;;24254:2;3017:36:1;;3005:2;2990:18;24180:84:0;2875:184:1;50951:156:0;;;;;;;;;;-1:-1:-1;50951:156:0;;;;;:::i;:::-;;:::i;33524:28::-;;;;;;;;;;-1:-1:-1;33524:28:0;;;;-1:-1:-1;;;;;33524:28:0;;;33936:26;;;;;;;;;;-1:-1:-1;33936:26:0;;;;;;;;34673:32;;;;;;;;;;;;;;;;42500:126;;;;;;;;;;-1:-1:-1;42500:126:0;;;;;:::i;:::-;;:::i;34482:31::-;;;;;;;;;;;;;;;;34522:28;;;;;;;;;;;;;;;;34001:23;;;;;;;;;;-1:-1:-1;34001:23:0;;;;;;;;;;;24547:174;;;;;;;;;;-1:-1:-1;24547:174:0;;;;;:::i;:::-;;:::i;3506:103::-;;;;;;;;;;;;;:::i;38990:121::-;;;;;;;;;;;;;:::i;40413:161::-;;;;;;;;;;-1:-1:-1;40413:161:0;;;;;:::i;:::-;;:::i;33733:38::-;;;;;;;;;;-1:-1:-1;33733:38:0;;;;-1:-1:-1;;;;;33733:38:0;;;34369:30;;;;;;;;;;;;;;;;38737:201;;;;;;;;;;;;;:::i;2831:87::-;;;;;;;;;;-1:-1:-1;2877:7:0;2904:6;-1:-1:-1;;;;;2904:6:0;2831:87;;51551:566;;;;;;;;;;-1:-1:-1;51551:566:0;;;;;:::i;:::-;;:::i;34557:31::-;;;;;;;;;;;;;;;;40670:100;;;;;;;;;;-1:-1:-1;40670:100:0;;;;;:::i;:::-;;:::i;23381:151::-;;;;;;;;;;;;;:::i;35068:41::-;;;;;;;;;;-1:-1:-1;35068:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35068:41:0;;;;;;;;;;;;-1:-1:-1;;;;;4459:32:1;;;4441:51;;4523:2;4508:18;;4501:34;;;;4551:18;;;4544:34;4609:2;4594:18;;4587:34;4428:3;4413:19;35068:41:0;4210:417:1;41992:304:0;;;;;;;;;;-1:-1:-1;41992:304:0;;;;;:::i;:::-;;:::i;24926:180::-;;;;;;;;;;-1:-1:-1;24926:180:0;;;;;:::i;:::-;;:::i;42839:216::-;;;;;;;;;;-1:-1:-1;42839:216:0;;;;;:::i;:::-;;:::i;34443:32::-;;;;;;;;;;;;;;;;35004:57;;;;;;;;;;-1:-1:-1;35004:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;33969:25;;;;;;;;;;-1:-1:-1;33969:25:0;;;;;;;;;;;41802:182;;;;;;;;;;-1:-1:-1;41802:182:0;;;;;:::i;:::-;;:::i;33778:40::-;;;;;;;;;;-1:-1:-1;33778:40:0;;;;-1:-1:-1;;;;;33778:40:0;;;33827:29;;;;;;;;;;;;;;;;34159:32;;;;;;;;;;-1:-1:-1;34159:32:0;;;;;;;;39377:497;;;;;;;;;;-1:-1:-1;39377:497:0;;;;;:::i;:::-;;:::i;34335:27::-;;;;;;;;;;;;;;;;25169:198;;;;;;;;;;-1:-1:-1;25169:198:0;;;;;:::i;:::-;;:::i;34938:57::-;;;;;;;;;;-1:-1:-1;34938:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;33863:33;;;;;;;;;;;;;;;;50641:302;;;;;;;;;;-1:-1:-1;50641:302:0;;;;;:::i;:::-;;:::i;41284:510::-;;;;;;;;;;-1:-1:-1;41284:510:0;;;;;:::i;:::-;;:::i;39172:135::-;;;;;;;;;;;;;:::i;34794:35::-;;;;;;;;;;;;;;;;42634:197;;;;;;;;;;-1:-1:-1;42634:197:0;;;;;:::i;:::-;;:::i;34406:30::-;;;;;;;;;;;;;;;;3764:220;;;;;;;;;;-1:-1:-1;3764:220:0;;;;;:::i;:::-;;:::i;51115:428::-;;;;;;;;;;-1:-1:-1;51115:428:0;;;;;:::i;:::-;;:::i;34595:31::-;;;;;;;;;;;;;;;;33619:75;;;;;;;;;;;;33652:42;33619:75;;33903:24;;;;;;;;;;;;;;;;34836:34;;;;;;;;;;;;;;;;39882:265;2717:13;:11;:13::i;:::-;40021:4:::1;40013;39992:13;-1:-1:-1::0;;;;;;;;;;;24462:14:0;;24329:155;39992:13:::1;:17;::::0;40008:1:::1;39992:17;:::i;:::-;39991:26;;;;:::i;:::-;39990:35;;;;:::i;:::-;39980:6;:45;;39958:136;;;::::0;-1:-1:-1;;;39958:136:0;;8828:2:1;39958:136:0::1;::::0;::::1;8810:21:1::0;8867:2;8847:18;;;8840:30;8906:34;8886:18;;;8879:62;-1:-1:-1;;;8957:18:1;;;8950:39;9006:19;;39958:136:0::1;;;;;;;;;40122:17;:6:::0;40132::::1;40122:17;:::i;:::-;40105:14;:34:::0;-1:-1:-1;39882:265:0:o;23115:147::-;23247:7;23240:14;;23160:13;;-1:-1:-1;;;;;;;;;;;22823:20:0;23240:14;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23115:147;:::o;25686:188::-;25759:4;25792:10;25813:31;25792:10;25829:7;25838:5;25813:8;:31::i;:::-;25862:4;25855:11;;;25686:188;;;;;:::o;40155:250::-;2717:13;:11;:13::i;:::-;40289:4:::1;40281;40260:13;-1:-1:-1::0;;;;;;;;;;;24462:14:0;;24329:155;40260:13:::1;:17;::::0;40276:1:::1;40260:17;:::i;:::-;40259:26;;;;:::i;:::-;40258:35;;;;:::i;:::-;40248:6;:45;;40226:131;;;::::0;-1:-1:-1;;;40226:131:0;;9623:2:1;40226:131:0::1;::::0;::::1;9605:21:1::0;9662:2;9642:18;;;9635:30;9701:34;9681:18;;;9674:62;-1:-1:-1;;;9752:18:1;;;9745:34;9796:19;;40226:131:0::1;9421:400:1::0;40226:131:0::1;40380:17;:6:::0;40390::::1;40380:17;:::i;:::-;40368:9;:29:::0;-1:-1:-1;40155:250:0:o;26452:247::-;26539:4;26574:10;26595:37;26611:4;26574:10;26626:5;26595:15;:37::i;:::-;26643:26;26653:4;26659:2;26663:5;26643:9;:26::i;:::-;-1:-1:-1;26687:4:0;;26452:247;-1:-1:-1;;;;26452:247:0:o;40778:498::-;2717:13;:11;:13::i;:::-;40969:15:::1;:31:::0;;;41011:15:::1;:31:::0;;;41053:17:::1;:35:::0;;;41099:16:::1;:33:::0;;;41118:14;41073:15;41158:33:::1;41029:13:::0;40987;41158:33:::1;:::i;:::-;:53;;;;:::i;:::-;:72;;;;:::i;:::-;41143:12;:87:::0;;;41265:2:::1;-1:-1:-1::0;41249:18:0::1;41241:27;;;::::0;::::1;;40778:498:::0;;;;:::o;50951:156::-;51009:30;51028:10;51009:18;:30::i;:::-;51001:62;;;;-1:-1:-1;;;51001:62:0;;;;;;;:::i;:::-;51074:25;51080:10;51092:6;51074:5;:25::i;:::-;50951:156;:::o;42500:126::-;-1:-1:-1;;;;;42590:28:0;42566:4;42590:28;;;:19;:28;;;;;;;;;42500:126::o;24547:174::-;-1:-1:-1;;;;;24693:20:0;24612:7;24693:20;;;-1:-1:-1;;;;;;;;;;;24693:20:0;;;;;;;24547:174::o;3506:103::-;2717:13;:11;:13::i;:::-;3571:30:::1;3598:1;3571:18;:30::i;:::-;3506:103::o:0;38990:121::-;39042:4;2717:13;:11;:13::i;:::-;-1:-1:-1;39059:14:0::1;:22:::0;;-1:-1:-1;;39059:22:0::1;::::0;;;38990:121;:::o;40413:161::-;2717:13;:11;:13::i;:::-;-1:-1:-1;;;;;40526:33:0;;;::::1;;::::0;;;:25:::1;:33;::::0;;;;:40;;-1:-1:-1;;40526:40:0::1;::::0;::::1;;::::0;;;::::1;::::0;;40413:161::o;38737:201::-;2717:13;:11;:13::i;:::-;38801::::1;::::0;::::1;::::0;::::1;;;38800:14;38792:41;;;::::0;-1:-1:-1;;;38792:41:0;;10506:2:1;38792:41:0::1;::::0;::::1;10488:21:1::0;10545:2;10525:18;;;10518:30;-1:-1:-1;;;10564:18:1;;;10557:44;10618:18;;38792:41:0::1;10304:338:1::0;38792:41:0::1;38844:13;:20:::0;;38889:12:::1;38875:11;:26:::0;-1:-1:-1;;38912:18:0;;;;;38737:201::o;51551:566::-;51608:30;51627:10;51608:18;:30::i;:::-;51600:62;;;;-1:-1:-1;;;51600:62:0;;;;;;;:::i;:::-;51673:20;51696:11;;;:6;:11;;;;;;;;51673:34;;;;;;;;;-1:-1:-1;;;;;51673:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51742:10;51726:26;51718:54;;;;-1:-1:-1;;;51718:54:0;;10849:2:1;51718:54:0;;;10831:21:1;10888:2;10868:18;;;10861:30;-1:-1:-1;;;10907:18:1;;;10900:45;10962:18;;51718:54:0;10647:339:1;51718:54:0;51823:15;51810:5;:10;;;51791:5;:16;;;:29;;;;:::i;:::-;:47;51783:84;;;;-1:-1:-1;;;51783:84:0;;11193:2:1;51783:84:0;;;11175:21:1;11232:2;11212:18;;;11205:30;11271:26;11251:18;;;11244:54;11315:18;;51783:84:0;10991:348:1;51783:84:0;51895:12;;;;51931:24;51949:4;51931:9;:24::i;:::-;51922:6;:33;51918:99;;;51981:24;51999:4;51981:9;:24::i;:::-;51972:33;;51918:99;52027:50;52051:4;52058:10;52070:6;52027:15;:50::i;:::-;52103:6;52088:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;51551:566:0:o;40670:100::-;2717:13;:11;:13::i;:::-;40741:11:::1;:21:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;40741:21:0;;::::1;::::0;;;::::1;::::0;;40670:100::o;23381:151::-;23515:9;23508:16;;23428:13;;-1:-1:-1;;;;;;;;;;;22823:20:0;23508:16;;;:::i;41992:304::-;2717:13;:11;:13::i;:::-;42136::::1;::::0;-1:-1:-1;;;;;42136:13:0;;::::1;42128:21:::0;;::::1;::::0;42106:128:::1;;;::::0;-1:-1:-1;;;42106:128:0;;11679:2:1;42106:128:0::1;::::0;::::1;11661:21:1::0;11718:2;11698:18;;;11691:30;11757:34;11737:18;;;11730:62;11828:27;11808:18;;;11801:55;11873:19;;42106:128:0::1;11477:421:1::0;42106:128:0::1;42247:41;42276:4;42282:5;42247:28;:41::i;:::-;41992:304:::0;;:::o;24926:180::-;24995:4;25028:10;25049:27;25028:10;25066:2;25070:5;25049:9;:27::i;42839:216::-;2717:13;:11;:13::i;:::-;42984:15:::1;::::0;42941:59:::1;::::0;-1:-1:-1;;;;;42984:15:0;;::::1;::::0;42941:59;::::1;::::0;::::1;::::0;42984:15:::1;::::0;42941:59:::1;43011:15;:36:::0;;-1:-1:-1;;;;;;43011:36:0::1;-1:-1:-1::0;;;;;43011:36:0;;;::::1;::::0;;;::::1;::::0;;42839:216::o;41802:182::-;2717:13;:11;:13::i;:::-;-1:-1:-1;;;;;41887:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;41887:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;41942:34;;1348:41:1;;;41942:34:0::1;::::0;1321:18:1;41942:34:0::1;;;;;;;41802:182:::0;;:::o;39377:497::-;39485:4;2717:13;:11;:13::i;:::-;39564:6:::1;39543:13;-1:-1:-1::0;;;;;;;;;;;24462:14:0;;24329:155;39543:13:::1;:17;::::0;39559:1:::1;39543:17;:::i;:::-;39542:28;;;;:::i;:::-;39529:9;:41;;39507:144;;;::::0;-1:-1:-1;;;39507:144:0;;12105:2:1;39507:144:0::1;::::0;::::1;12087:21:1::0;12144:2;12124:18;;;12117:30;12183:34;12163:18;;;12156:62;-1:-1:-1;;;12234:18:1;;;12227:51;12295:19;;39507:144:0::1;11903:417:1::0;39507:144:0::1;39719:4;39698:13;-1:-1:-1::0;;;;;;;;;;;24462:14:0;;24329:155;39698:13:::1;:17;::::0;39714:1:::1;39698:17;:::i;:::-;39697:26;;;;:::i;:::-;39684:9;:39;;39662:141;;;::::0;-1:-1:-1;;;39662:141:0;;12527:2:1;39662:141:0::1;::::0;::::1;12509:21:1::0;12566:2;12546:18;;;12539:30;12605:34;12585:18;;;12578:62;-1:-1:-1;;;12656:18:1;;;12649:50;12716:19;;39662:141:0::1;12325:416:1::0;39662:141:0::1;-1:-1:-1::0;39814:18:0::1;:30:::0;;;39862:4:::1;2741:1;39377:497:::0;;;:::o;25169:198::-;-1:-1:-1;;;;;25330:20:0;;;25249:7;25330:20;;;:13;:20;;;;;;;;:29;;;;;;;;;;;;;25169:198::o;50641:302::-;50747:30;50766:10;50747:18;:30::i;:::-;50739:62;;;;-1:-1:-1;;;50739:62:0;;;;;;;:::i;:::-;50817:9;50812:124;50836:6;:13;50832:1;:17;50812:124;;;50871:53;50887:10;50899:6;50906:1;50899:9;;;;;;;;:::i;:::-;;;;;;;50910:10;50921:1;50910:13;;;;;;;;:::i;:::-;;;;;;;50871:15;:53::i;:::-;50851:3;;50812:124;;;;50641:302;;:::o;41284:510::-;2717:13;:11;:13::i;:::-;41476:16:::1;:32:::0;;;41519:16:::1;:32:::0;;;41562:18:::1;:36:::0;;;41609:17:::1;:34:::0;;;41629:14;41583:15;41670:35:::1;41538:13:::0;41495;41670:35:::1;:::i;:::-;:56;;;;:::i;:::-;:76;;;;:::i;:::-;41654:13;:92:::0;;;41782:2:::1;-1:-1:-1::0;41765:19:0::1;41757:28;;;::::0;::::1;39172:135:::0;39232:4;2717:13;:11;:13::i;:::-;-1:-1:-1;39249:20:0::1;:28:::0;;-1:-1:-1;;39249:28:0::1;::::0;;;39172:135;:::o;42634:197::-;2717:13;:11;:13::i;:::-;42765:17:::1;::::0;42729:54:::1;::::0;-1:-1:-1;;;;;42765:17:0;;::::1;::::0;42729:54;::::1;::::0;::::1;::::0;42765:17:::1;::::0;42729:54:::1;42794:17;:29:::0;;-1:-1:-1;;;;;;42794:29:0::1;-1:-1:-1::0;;;;;42794:29:0;;;::::1;::::0;;;::::1;::::0;;42634:197::o;3764:220::-;2717:13;:11;:13::i;:::-;-1:-1:-1;;;;;3849:22:0;::::1;3845:93;;3895:31;::::0;-1:-1:-1;;;3895:31:0;;3923:1:::1;3895:31;::::0;::::1;1572:51:1::0;1545:18;;3895:31:0::1;1400:229:1::0;3845:93:0::1;3948:28;3967:8;3948:18;:28::i;51115:428::-:0;51206:30;51225:10;51206:18;:30::i;:::-;51198:62;;;;-1:-1:-1;;;51198:62:0;;;;;;;:::i;:::-;51271:50;51287:10;51307:4;51314:6;51271:15;:50::i;:::-;51346:155;;;;;;;;51377:10;51346:155;;;;;;;;;;;;;;;51474:15;51346:155;;;;;;-1:-1:-1;51332:11:0;;;;;;;;;:169;;;;-1:-1:-1;;;;;;51332:169:0;-1:-1:-1;;;;;51332:169:0;;;;;;;;-1:-1:-1;51332:169:0;;;;;;;;;;;;;;;51514:11;:21;;51346:155;;-1:-1:-1;51514:21:0;;51346:155;;51514:21;:::i;2996:166::-;2877:7;2904:6;-1:-1:-1;;;;;2904:6:0;865:10;3056:23;3052:103;;3103:40;;-1:-1:-1;;;3103:40:0;;865:10;3103:40;;;1572:51:1;1545:18;;3103:40:0;1400:229:1;31031:130:0;31116:37;31125:5;31132:7;31141:5;31148:4;31116:8;:37::i;32803:487::-;32903:24;32930:25;32940:5;32947:7;32930:9;:25::i;:::-;32903:52;;-1:-1:-1;;32970:16:0;:37;32966:317;;33047:5;33028:16;:24;33024:132;;;33080:60;;-1:-1:-1;;;33080:60:0;;-1:-1:-1;;;;;13098:32:1;;33080:60:0;;;13080:51:1;13147:18;;;13140:34;;;13190:18;;;13183:34;;;13053:18;;33080:60:0;12878:345:1;33024:132:0;33199:57;33208:5;33215:7;33243:5;33224:16;:24;33250:5;33199:8;:57::i;27084:308::-;-1:-1:-1;;;;;27168:18:0;;27164:88;;27210:30;;-1:-1:-1;;;27210:30:0;;27237:1;27210:30;;;1572:51:1;1545:18;;27210:30:0;1400:229:1;27164:88:0;-1:-1:-1;;;;;27266:16:0;;27262:88;;27306:32;;-1:-1:-1;;;27306:32:0;;27335:1;27306:32;;;1572:51:1;1545:18;;27306:32:0;1400:229:1;27262:88:0;27360:24;27368:4;27374:2;27378:5;27360:7;:24::i;29809:669::-;-1:-1:-1;;;;;29880:21:0;;29876:91;;29925:30;;-1:-1:-1;;;29925:30:0;;29952:1;29925:30;;;1572:51:1;1545:18;;29925:30:0;1400:229:1;29876:91:0;-1:-1:-1;;;;;30063:20:0;;29987:22;30063:20;;;-1:-1:-1;;;;;;;;;;;30063:20:0;;;;;;;;;;30218:19;;;30195:42;;;-1:-1:-1;;;;;;;;;;;30384:23:0;;;;;;;30434:36;;1780:25:1;;;22823:20:0;;30063;;29987:22;30063:20;;30434:36;;1753:18:1;30434:36:0;;;;;;;;29865:613;;29809:669;;:::o;4144:191::-;4218:16;4237:6;;-1:-1:-1;;;;;4254:17:0;;;-1:-1:-1;;;;;;4254:17:0;;;;;;4287:40;;4237:6;;;;;;;4287:40;;4218:16;4287:40;4207:128;4144:191;:::o;42304:188::-;-1:-1:-1;;;;;42387:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;42387:39:0;;;;;;;;;;42444:40;;42387:39;;:31;42444:40;;;42304:188;;:::o;32012:499::-;-1:-1:-1;;;;;;;;;;;;;;;;32179:19:0;;32175:91;;32222:32;;-1:-1:-1;;;32222:32:0;;32251:1;32222:32;;;1572:51:1;1545:18;;32222:32:0;1400:229:1;32175:91:0;-1:-1:-1;;;;;32280:21:0;;32276:92;;32325:31;;-1:-1:-1;;;32325:31:0;;32353:1;32325:31;;;1572:51:1;1545:18;;32325:31:0;1400:229:1;32276:92:0;-1:-1:-1;;;;;32378:20:0;;;;;;;:13;;;:20;;;;;;;;:29;;;;;;;;;:37;;;32426:78;;;;32477:7;-1:-1:-1;;;;;32461:31:0;32470:5;-1:-1:-1;;;;;32461:31:0;;32486:5;32461:31;;;;1780:25:1;;1768:2;1753:18;;1634:177;32461:31:0;;;;;;;;32426:78;32110:401;32012:499;;;;:::o;43063:4517::-;43189:6;43199:1;43189:11;43185:91;;43217:26;43231:4;43237:2;43241:1;43217:13;:26::i;43185:91::-;43303:15;;43293:26;;-1:-1:-1;;;;;43303:15:0;43293:9;:26::i;:::-;43286:4;:33;43334:14;;;;43330:2264;;;43370:8;;-1:-1:-1;;;43370:8:0;;;;43365:2218;;43404:13;;;;;;;43399:223;;-1:-1:-1;;;;;43476:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;43505:23:0;;;;;;:19;:23;;;;;;;;43476:52;43442:160;;;;-1:-1:-1;;;43442:160:0;;13430:2:1;43442:160:0;;;13412:21:1;13469:2;13449:18;;;13442:30;-1:-1:-1;;;13488:18:1;;;13481:52;13550:18;;43442:160:0;13228:346:1;43442:160:0;43778:20;;;;43774:641;;;2877:7;2904:6;-1:-1:-1;;;;;43853:13:0;;;2904:6;;43853:13;;;;:72;;-1:-1:-1;43909:15:0;;-1:-1:-1;;;;;43895:30:0;;;43909:15;;43895:30;;43853:72;:129;;;;-1:-1:-1;43968:13:0;;-1:-1:-1;;;;;43954:28:0;;;43968:13;;43954:28;;43853:129;43823:573;;;44100:9;44071:39;;;;:28;:39;;;;;;44146:12;-1:-1:-1;44033:258:0;;;;-1:-1:-1;;;44033:258:0;;13781:2:1;44033:258:0;;;13763:21:1;13820:2;13800:18;;;13793:30;13859:34;13839:18;;;13832:62;13930:34;13910:18;;;13903:62;-1:-1:-1;;;13981:19:1;;;13974:40;14031:19;;44033:258:0;13579:477:1;44033:258:0;44347:9;44318:39;;;;:28;:39;;;;;44360:12;44318:54;;43823:573;-1:-1:-1;;;;;44489:31:0;;;;;;:25;:31;;;;;;;;:86;;;;-1:-1:-1;;;;;;44546:29:0;;;;;;:25;:29;;;;;;;;44545:30;44489:86;44463:1105;;;44662:14;;44652:6;:24;;44618:157;;;;-1:-1:-1;;;44618:157:0;;14263:2:1;44618:157:0;;;14245:21:1;14302:2;14282:18;;;14275:30;14341:34;14321:18;;;14314:62;-1:-1:-1;;;14392:18:1;;;14385:45;14447:19;;44618:157:0;14061:411:1;44618:157:0;44858:9;;44841:13;44851:2;44841:9;:13::i;:::-;44832:22;;:6;:22;:::i;:::-;:35;;44798:140;;;;-1:-1:-1;;;44798:140:0;;14679:2:1;44798:140:0;;;14661:21:1;14718:2;14698:18;;;14691:30;-1:-1:-1;;;14737:18:1;;;14730:49;14796:18;;44798:140:0;14477:343:1;44798:140:0;44463:1105;;;-1:-1:-1;;;;;45036:29:0;;;;;;:25;:29;;;;;;;;:86;;;;-1:-1:-1;;;;;;45091:31:0;;;;;;:25;:31;;;;;;;;45090:32;45036:86;45010:558;;;45209:14;;45199:6;:24;;45165:158;;;;-1:-1:-1;;;45165:158:0;;15027:2:1;45165:158:0;;;15009:21:1;15066:2;15046:18;;;15039:30;15105:34;15085:18;;;15078:62;-1:-1:-1;;;15156:18:1;;;15149:46;15212:19;;45165:158:0;14825:412:1;45010:558:0;-1:-1:-1;;;;;45354:29:0;;;;;;:25;:29;;;;;;;;45349:219;;45468:9;;45451:13;45461:2;45451:9;:13::i;:::-;45442:22;;:6;:22;:::i;:::-;:35;;45408:140;;;;-1:-1:-1;;;45408:140:0;;14679:2:1;45408:140:0;;;14661:21:1;14718:2;14698:18;;;14691:30;-1:-1:-1;;;14737:18:1;;;14730:49;14796:18;;45408:140:0;14477:343:1;45408:140:0;45606:28;45664:11;;45637:24;45655:4;45637:9;:24::i;:::-;:38;;;;:::i;:::-;45725:18;;-1:-1:-1;;;;;45782:25:0;;45686:12;45782:25;;;:19;:25;;;;;;45606:69;;-1:-1:-1;45701:42:0;;;;;45782:25;;45781:26;:54;;;;-1:-1:-1;;;;;;45812:23:0;;;;;;:19;:23;;;;;;;;45811:24;45781:54;45777:107;;;45868:4;;45859:6;;:13;;;;:::i;:::-;45852:20;;45777:107;45912:7;:35;;;;-1:-1:-1;45936:11:0;;;;;;;45912:35;:61;;;;-1:-1:-1;45965:8:0;;-1:-1:-1;;;45965:8:0;;;;45964:9;45912:61;:110;;;;-1:-1:-1;;;;;;45991:31:0;;;;;;:25;:31;;;;;;;;45990:32;45912:110;:153;;;;-1:-1:-1;;;;;;46040:25:0;;;;;;:19;:25;;;;;;;;46039:26;45912:153;:194;;;;-1:-1:-1;;;;;;46083:23:0;;;;;;:19;:23;;;;;;;;46082:24;45912:194;:225;;;;;46131:6;46124:4;:13;45912:225;45894:353;;;46164:8;:15;;-1:-1:-1;;;;46164:15:0;-1:-1:-1;;;46164:15:0;;;46194:10;:8;:10::i;:::-;46219:8;:16;;-1:-1:-1;;;;46219:16:0;;;45894:353;46273:8;;-1:-1:-1;;;;;46296:25:0;;46257:12;46296:25;;;:19;:25;;;;;;46273:8;-1:-1:-1;;;46273:8:0;;;;;46272:9;;46296:25;;:52;;-1:-1:-1;;;;;;46325:23:0;;;;;;:19;:23;;;;;;;;46296:52;46292:100;;;-1:-1:-1;46375:5:0;46292:100;46402:12;46433:7;46429:1102;;;-1:-1:-1;;;;;46461:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;46510:1;46494:13;;:17;46461:50;46457:931;;;46564:3;46548:13;;46539:6;:22;;;;:::i;:::-;:28;;;;:::i;:::-;46532:35;;46636:13;;46616:16;;46609:4;:23;;;;:::i;:::-;46608:41;;;;:::i;:::-;46586:18;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;46722:13:0;;46700:18;;46693:25;;:4;:25;:::i;:::-;46692:43;;;;:::i;:::-;46668:20;;:67;;;;;;;:::i;:::-;;;;-1:-1:-1;;46804:13:0;;46784:16;;46777:23;;:4;:23;:::i;:::-;46776:41;;;;:::i;:::-;46754:18;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;46888:13:0;;46867:17;;46860:24;;:4;:24;:::i;:::-;46859:42;;;;:::i;:::-;46836:19;;:65;;;;;;;:::i;:::-;;;;-1:-1:-1;46457:931:0;;-1:-1:-1;46457:931:0;;-1:-1:-1;;;;;46940:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;46990:1;46975:12;;:16;46940:51;46936:452;;;47043:3;47028:12;;47019:6;:21;;;;:::i;:::-;:27;;;;:::i;:::-;47012:34;;47114:12;;47095:15;;47088:4;:22;;;;:::i;:::-;47087:39;;;;:::i;:::-;47065:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;47198:12:0;;47177:17;;47170:24;;:4;:24;:::i;:::-;47169:41;;;;:::i;:::-;47145:20;;:65;;;;;;;:::i;:::-;;;;-1:-1:-1;;47278:12:0;;47259:15;;47252:22;;:4;:22;:::i;:::-;47251:39;;;;:::i;:::-;47229:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;47360:12:0;;47340:16;;47333:23;;:4;:23;:::i;:::-;47332:40;;;;:::i;:::-;47309:19;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;46936:452:0;47406:8;;47402:89;;47435:40;47449:4;47463;47470;47435:13;:40::i;:::-;47505:14;47515:4;47505:14;;:::i;:::-;;;46429:1102;47541:31;47555:4;47561:2;47565:6;47541:13;:31::i;:::-;43174:4406;;;;;43063:4517;;;:::o;27716:1199::-;-1:-1:-1;;;;;;;;;;;;;;;;27860:18:0;;27856:558;;28016:5;27998:1;:14;;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;27856:558:0;;-1:-1:-1;27856:558:0;;-1:-1:-1;;;;;28076:17:0;;28054:19;28076:17;;;;;;;;;;;28112:19;;;28108:117;;;28159:50;;-1:-1:-1;;;28159:50:0;;-1:-1:-1;;;;;13098:32:1;;28159:50:0;;;13080:51:1;13147:18;;;13140:34;;;13190:18;;;13183:34;;;13053:18;;28159:50:0;12878:345:1;28108:117:0;-1:-1:-1;;;;;28348:17:0;;:11;:17;;;;;;;;;;28368:19;;;;28348:39;;27856:558;-1:-1:-1;;;;;28430:16:0;;28426:439;;28596:14;;;:23;;;;;;;28426:439;;;-1:-1:-1;;;;;28814:15:0;;:11;:15;;;;;;;;;;:24;;;;;;28426:439;28897:2;-1:-1:-1;;;;;28882:25:0;28891:4;-1:-1:-1;;;;;28882:25:0;;28901:5;28882:25;;;;1780::1;;1768:2;1753:18;;1634:177;48714:1919:0;48753:23;48806:11;;48779:24;48797:4;48779:9;:24::i;:::-;:38;;;;:::i;:::-;48753:64;;48828:25;48960:19;;48924:20;;48890:18;;48856;;:52;;;;:::i;:::-;:88;;;;:::i;:::-;:123;;;;:::i;:::-;48828:151;-1:-1:-1;48990:12:0;49019:20;;;:46;;-1:-1:-1;49043:22:0;;49019:46;49015:85;;;49082:7;;;48714:1919::o;49015:85::-;49134:18;;:23;;49155:2;49134:23;:::i;:::-;49116:15;:41;49112:115;;;49192:18;;:23;;49213:2;49192:23;:::i;:::-;49174:41;;49112:115;49288:23;49375:1;49355:17;49333:18;;49315:15;:36;;;;:::i;:::-;49314:58;;;;:::i;:::-;:62;;;;:::i;:::-;49288:88;-1:-1:-1;49387:26:0;49416:33;49288:88;49416:15;:33;:::i;:::-;49387:62;-1:-1:-1;49490:21:0;49524:36;49387:62;49524:16;:36::i;:::-;49573:18;49594:41;49618:17;49594:21;:41;:::i;:::-;49573:62;;49648:18;49703:17;49682:18;;49669:10;:31;;;;:::i;:::-;:51;;;;:::i;:::-;49648:72;;49731:25;49795:17;49772:20;;49759:10;:33;;;;:::i;:::-;:53;;;;:::i;:::-;49731:81;;49823:24;49885:17;49863:19;;49850:10;:32;;;;:::i;:::-;:52;;;;:::i;:::-;49823:79;-1:-1:-1;49915:23:0;49823:79;49967:17;49941:23;49954:10;49941;:23;:::i;:::-;:43;;;;:::i;:::-;:62;;;;:::i;:::-;50037:1;50016:18;:22;;;50049:18;:22;;;50082:20;:24;;;50117:19;:23;;;50175:17;;50167:61;;49915:88;;-1:-1:-1;;;;;;50175:17:0;;50206;;50167:61;50037:1;50167:61;50206:17;50175;50167:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50153:75:0;;-1:-1:-1;;50245:19:0;;;;;:42;;;50286:1;50268:15;:19;50245:42;50241:278;;;50304:46;50317:15;50334;50304:12;:46::i;:::-;50474:18;;50370:137;;;15654:25:1;;;15710:2;15695:18;;15688:34;;;15738:18;;;15731:34;;;;50370:137:0;;;;;;15642:2:1;50370:137:0;;;50241:278;50551:15;;50543:63;;-1:-1:-1;;;;;50551:15:0;;;;50580:21;;50543:63;;;;50580:21;50551:15;50543:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50617:6:0;:8;;50529:77;;-1:-1:-1;50617:6:0;:8;;;:::i;:::-;;;;;;48742:1891;;;;;;;;;;;48714:1919::o;47588:589::-;47738:16;;;47752:1;47738:16;;;;;;;;47714:21;;47738:16;;;;;;;;;;-1:-1:-1;47738:16:0;47714:40;;47783:4;47765;47770:1;47765:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;47765:23:0;;;:7;;;;;;;;;;:23;;;;47809:15;;:22;;;-1:-1:-1;;;47809:22:0;;;;:15;;;;;:20;;:22;;;;;47765:7;;47809:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47799:4;47804:1;47799:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;47799:32:0;;;:7;;;;;;;;;:32;47876:15;;47844:62;;47861:4;;47876:15;47894:11;47844:8;:62::i;:::-;47945:15;;:224;;-1:-1:-1;;;47945:224:0;;-1:-1:-1;;;;;47945:15:0;;;;:66;;:224;;48026:11;;47945:15;;48096:4;;48123;;48143:15;;47945:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47643:534;47588:589;:::o;48185:521::-;48365:15;;48333:62;;48350:4;;-1:-1:-1;;;;;48365:15:0;48383:11;48333:8;:62::i;:::-;48438:15;;:260;;-1:-1:-1;;;48438:260:0;;48510:4;48438:260;;;17498:34:1;17548:18;;;17541:34;;;48438:15:0;17591:18:1;;;17584:34;;;17634:18;;;17627:34;48650:6:0;17677:19:1;;;17670:44;48672:15:0;17730:19:1;;;17723:35;-1:-1:-1;;;;;48438:15:0;;;;:31;;48477:9;;17432:19:1;;48438:260:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14:180:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;199:548::-;311:4;340:2;369;358:9;351:21;401:6;395:13;444:6;439:2;428:9;424:18;417:34;469:1;479:140;493:6;490:1;487:13;479:140;;;588:14;;;584:23;;578:30;554:17;;;573:2;550:26;543:66;508:10;;479:140;;;483:3;668:1;663:2;654:6;643:9;639:22;635:31;628:42;738:2;731;727:7;722:2;714:6;710:15;706:29;695:9;691:45;687:54;679:62;;;;199:548;;;;:::o;752:131::-;-1:-1:-1;;;;;827:31:1;;817:42;;807:70;;873:1;870;863:12;888:315;956:6;964;1017:2;1005:9;996:7;992:23;988:32;985:52;;;1033:1;1030;1023:12;985:52;1072:9;1059:23;1091:31;1116:5;1091:31;:::i;:::-;1141:5;1193:2;1178:18;;;;1165:32;;-1:-1:-1;;;888:315:1:o;1816:456::-;1893:6;1901;1909;1962:2;1950:9;1941:7;1937:23;1933:32;1930:52;;;1978:1;1975;1968:12;1930:52;2017:9;2004:23;2036:31;2061:5;2036:31;:::i;:::-;2086:5;-1:-1:-1;2143:2:1;2128:18;;2115:32;2156:33;2115:32;2156:33;:::i;:::-;1816:456;;2208:7;;-1:-1:-1;;;2262:2:1;2247:18;;;;2234:32;;1816:456::o;2485:385::-;2571:6;2579;2587;2595;2648:3;2636:9;2627:7;2623:23;2619:33;2616:53;;;2665:1;2662;2655:12;2616:53;-1:-1:-1;;2688:23:1;;;2758:2;2743:18;;2730:32;;-1:-1:-1;2809:2:1;2794:18;;2781:32;;2860:2;2845:18;2832:32;;-1:-1:-1;2485:385:1;-1:-1:-1;2485:385:1:o;3064:247::-;3123:6;3176:2;3164:9;3155:7;3151:23;3147:32;3144:52;;;3192:1;3189;3182:12;3144:52;3231:9;3218:23;3250:31;3275:5;3250:31;:::i;:::-;3300:5;3064:247;-1:-1:-1;;;3064:247:1:o;3316:160::-;3381:20;;3437:13;;3430:21;3420:32;;3410:60;;3466:1;3463;3456:12;3481:315;3546:6;3554;3607:2;3595:9;3586:7;3582:23;3578:32;3575:52;;;3623:1;3620;3613:12;3575:52;3662:9;3649:23;3681:31;3706:5;3681:31;:::i;:::-;3731:5;-1:-1:-1;3755:35:1;3786:2;3771:18;;3755:35;:::i;:::-;3745:45;;3481:315;;;;;:::o;4025:180::-;4081:6;4134:2;4122:9;4113:7;4109:23;4105:32;4102:52;;;4150:1;4147;4140:12;4102:52;4173:26;4189:9;4173:26;:::i;4892:388::-;4960:6;4968;5021:2;5009:9;5000:7;4996:23;4992:32;4989:52;;;5037:1;5034;5027:12;4989:52;5076:9;5063:23;5095:31;5120:5;5095:31;:::i;:::-;5145:5;-1:-1:-1;5202:2:1;5187:18;;5174:32;5215:33;5174:32;5215:33;:::i;:::-;5267:7;5257:17;;;4892:388;;;;;:::o;5285:127::-;5346:10;5341:3;5337:20;5334:1;5327:31;5377:4;5374:1;5367:15;5401:4;5398:1;5391:15;5417:275;5488:2;5482:9;5553:2;5534:13;;-1:-1:-1;;5530:27:1;5518:40;;5588:18;5573:34;;5609:22;;;5570:62;5567:88;;;5635:18;;:::i;:::-;5671:2;5664:22;5417:275;;-1:-1:-1;5417:275:1:o;5697:183::-;5757:4;5790:18;5782:6;5779:30;5776:56;;;5812:18;;:::i;:::-;-1:-1:-1;5857:1:1;5853:14;5869:4;5849:25;;5697:183::o;5885:668::-;5939:5;5992:3;5985:4;5977:6;5973:17;5969:27;5959:55;;6010:1;6007;6000:12;5959:55;6046:6;6033:20;6072:4;6096:60;6112:43;6152:2;6112:43;:::i;:::-;6096:60;:::i;:::-;6178:3;6202:2;6197:3;6190:15;6230:4;6225:3;6221:14;6214:21;;6287:4;6281:2;6278:1;6274:10;6266:6;6262:23;6258:34;6244:48;;6315:3;6307:6;6304:15;6301:35;;;6332:1;6329;6322:12;6301:35;6368:4;6360:6;6356:17;6382:142;6398:6;6393:3;6390:15;6382:142;;;6464:17;;6452:30;;6502:12;;;;6415;;6382:142;;;-1:-1:-1;6542:5:1;5885:668;-1:-1:-1;;;;;;5885:668:1:o;6558:1215::-;6676:6;6684;6737:2;6725:9;6716:7;6712:23;6708:32;6705:52;;;6753:1;6750;6743:12;6705:52;6793:9;6780:23;6822:18;6863:2;6855:6;6852:14;6849:34;;;6879:1;6876;6869:12;6849:34;6917:6;6906:9;6902:22;6892:32;;6962:7;6955:4;6951:2;6947:13;6943:27;6933:55;;6984:1;6981;6974:12;6933:55;7020:2;7007:16;7042:4;7066:60;7082:43;7122:2;7082:43;:::i;7066:60::-;7160:15;;;7242:1;7238:10;;;;7230:19;;7226:28;;;7191:12;;;;7266:19;;;7263:39;;;7298:1;7295;7288:12;7263:39;7322:11;;;;7342:217;7358:6;7353:3;7350:15;7342:217;;;7438:3;7425:17;7455:31;7480:5;7455:31;:::i;:::-;7499:18;;7375:12;;;;7537;;;;7342:217;;;7578:5;-1:-1:-1;;7621:18:1;;7608:32;;-1:-1:-1;;7652:16:1;;;7649:36;;;7681:1;7678;7671:12;7649:36;;7704:63;7759:7;7748:8;7737:9;7733:24;7704:63;:::i;:::-;7694:73;;;6558:1215;;;;;:::o;7778:316::-;7855:6;7863;7871;7924:2;7912:9;7903:7;7899:23;7895:32;7892:52;;;7940:1;7937;7930:12;7892:52;-1:-1:-1;;7963:23:1;;;8033:2;8018:18;;8005:32;;-1:-1:-1;8084:2:1;8069:18;;;8056:32;;7778:316;-1:-1:-1;7778:316:1:o;8099:127::-;8160:10;8155:3;8151:20;8148:1;8141:31;8191:4;8188:1;8181:15;8215:4;8212:1;8205:15;8231:168;8304:9;;;8335;;8352:15;;;8346:22;;8332:37;8322:71;;8373:18;;:::i;8404:217::-;8444:1;8470;8460:132;;8514:10;8509:3;8505:20;8502:1;8495:31;8549:4;8546:1;8539:15;8577:4;8574:1;8567:15;8460:132;-1:-1:-1;8606:9:1;;8404:217::o;9036:380::-;9115:1;9111:12;;;;9158;;;9179:61;;9233:4;9225:6;9221:17;9211:27;;9179:61;9286:2;9278:6;9275:14;9255:18;9252:38;9249:161;;9332:10;9327:3;9323:20;9320:1;9313:31;9367:4;9364:1;9357:15;9395:4;9392:1;9385:15;9249:161;;9036:380;;;:::o;9826:125::-;9891:9;;;9912:10;;;9909:36;;;9925:18;;:::i;9956:343::-;10158:2;10140:21;;;10197:2;10177:18;;;10170:30;-1:-1:-1;;;10231:2:1;10216:18;;10209:49;10290:2;10275:18;;9956:343::o;11344:128::-;11411:9;;;11432:11;;;11429:37;;;11446:18;;:::i;12746:127::-;12807:10;12802:3;12798:20;12795:1;12788:31;12838:4;12835:1;12828:15;12862:4;12859:1;12852:15;15776:135;15815:3;15836:17;;;15833:43;;15856:18;;:::i;:::-;-1:-1:-1;15903:1:1;15892:13;;15776:135::o;15916:251::-;15986:6;16039:2;16027:9;16018:7;16014:23;16010:32;16007:52;;;16055:1;16052;16045:12;16007:52;16087:9;16081:16;16106:31;16131:5;16106:31;:::i;16172:980::-;16434:4;16482:3;16471:9;16467:19;16513:6;16502:9;16495:25;16539:2;16577:6;16572:2;16561:9;16557:18;16550:34;16620:3;16615:2;16604:9;16600:18;16593:31;16644:6;16679;16673:13;16710:6;16702;16695:22;16748:3;16737:9;16733:19;16726:26;;16787:2;16779:6;16775:15;16761:29;;16808:1;16818:195;16832:6;16829:1;16826:13;16818:195;;;16897:13;;-1:-1:-1;;;;;16893:39:1;16881:52;;16988:15;;;;16953:12;;;;16929:1;16847:9;16818:195;;;-1:-1:-1;;;;;;;17069:32:1;;;;17064:2;17049:18;;17042:60;-1:-1:-1;;;17133:3:1;17118:19;17111:35;17030:3;16172:980;-1:-1:-1;;;16172:980:1:o;17769:306::-;17857:6;17865;17873;17926:2;17914:9;17905:7;17901:23;17897:32;17894:52;;;17942:1;17939;17932:12;17894:52;17971:9;17965:16;17955:26;;18021:2;18010:9;18006:18;18000:25;17990:35;;18065:2;18054:9;18050:18;18044:25;18034:35;;17769:306;;;;;:::o

Swarm Source

ipfs://2a40c812159a60f14070f7bb6fee76d51a1ab2742925d6ff6759aa325d763bf1
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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