ETH Price: $3,258.15 (-0.78%)
Gas: 1 Gwei

NanokoVerse (NANOKO)
 

Overview

TokenID

104

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
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:
Nanoko_update

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-19
*/

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: Contract test/ERC721T/IERC721Batch.sol



pragma solidity ^0.8.0;

interface IERC721Batch {
  function isOwnerOf( address account, uint[] calldata tokenIds ) external view returns( bool );
  function transferBatch( address from, address to, uint[] calldata tokenIds, bytes calldata data ) external;
  function walletOfOwner( address account ) external view returns( uint[] memory );
}
// File: Contract test/ERC721T/Address.sol



pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
// File: Contract test/ERC721T/IERC721Receiver.sol



pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}
// File: Contract test/ERC721T/IERC165.sol



pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: Contract test/ERC721T/ERC165.sol



pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}
// File: Contract test/ERC721T/IERC721.sol



pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}
// File: Contract test/ERC721T/IERC721Enumerable.sol



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}
// File: Contract test/ERC721T/IERC721Metadata.sol



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}
// File: Contract test/ERC721T/Context.sol



pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
// File: Contract test/ERC721T/ERC721T.sol



pragma solidity ^0.8.0;

/****************************************
 * @author: squeebo_nft                 *
 * @team:   GoldenX                     *
 ****************************************
 *   Blimpie-ERC721 provides low-gas    *
 *           mints + transfers          *
 ****************************************/







abstract contract ERC721T is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;

    string private _name;
    string private _symbol;

    mapping(uint => address) internal _tokenApprovals;
    mapping(address => mapping(address => bool)) internal _operatorApprovals;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    //public
    function balanceOf(address owner) public view virtual override returns( uint );

    function name() external view virtual override returns (string memory) {
        return _name;
    }

    function ownerOf(uint tokenId) public view virtual override returns (address);

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    function symbol() external view virtual override returns (string memory) {
        return _symbol;
    }

    /*
    function totalSupply() public view virtual returns (uint) {
        return _owners.length - (_offset + _burned);
    }
    */


    function approve(address to, uint tokenId) external virtual override {
        address owner = ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    function getApproved(uint tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");
        return _tokenApprovals[tokenId];
    }

    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function setApprovalForAll(address operator, bool approved) external virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");
        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    function transferFrom(
        address from,
        address to,
        uint tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint tokenId
    ) external virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    function safeTransferFrom(
        address from,
        address to,
        uint tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }


    //internal
    function _approve(address to, uint tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ownerOf(tokenId), to, tokenId);
    }

    function _checkOnERC721Received(
        address from,
        address to,
        uint tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    function _exists(uint tokenId) internal view virtual returns (bool);

    function _isApprovedOrOwner(address spender, uint tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    function _safeTransfer(
        address from,
        address to,
        uint tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    function _transfer(address from, address to, uint tokenId) internal virtual;
}
// File: Contract test/ERC721T/ERC721EnumerableT.sol



pragma solidity ^0.8.0;

/****************************************
 * @author: squeebo_nft                 *
 ****************************************
 *   Blimpie-ERC721 provides low-gas    *
 *           mints + transfers          *
 ****************************************/




abstract contract ERC721EnumerableT is ERC721T, IERC721Batch, IERC721Enumerable {
    function balanceOf( address owner ) public view virtual override( IERC721, ERC721T ) returns( uint );

    function isOwnerOf( address account, uint[] calldata tokenIds ) external view virtual override returns( bool );

    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721T) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    function tokenOfOwnerByIndex(address owner, uint index) public view virtual override returns( uint tokenId );

    function tokenByIndex(uint index) external view virtual override returns (uint) {
        require(index < totalSupply(), "ERC721Enumerable: global index out of bounds");
        return index;
    }

    function totalSupply() public view virtual override returns( uint );

    function transferBatch( address from, address to, uint[] calldata tokenIds, bytes calldata data ) external override{
        for(uint i; i < tokenIds.length; ++i ){
            safeTransferFrom( from, to, tokenIds[i], data );
        }
    }

    function walletOfOwner( address account ) external view virtual override returns( uint[] memory ){
        uint quantity = balanceOf( account );
        uint[] memory wallet = new uint[]( quantity );
        for( uint i; i < quantity; ++i ){
            wallet[i] = tokenOfOwnerByIndex( account, i );
        }
        return wallet;
    }
}
// File: Contract test/ERC721T/Ownable.sol



pragma solidity ^0.8.0;


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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
// File: Contract test/ERC721T/Delegated.sol



pragma solidity ^0.8.0;

/***********************
* @author: squeebo_nft *
************************/


contract Delegated is Ownable {
  mapping(address => bool) internal _delegates;

  constructor(){
    _delegates[owner()] = true;
  }

  modifier onlyDelegates {
    require(_delegates[msg.sender], "Invalid delegate" );
    _;
  }

  //onlyOwner
  function isDelegate( address addr ) external view onlyOwner returns ( bool ){
    return _delegates[addr];
  }

  function setDelegate( address addr, bool isDelegate_ ) external onlyOwner{
    _delegates[addr] = isDelegate_;
  }

  function transferOwnership(address newOwner) public virtual override onlyOwner {
    _delegates[newOwner] = true;
    super.transferOwnership( newOwner );
  }
}
// File: Contract test/ERC721T/Nanoko_new.sol





pragma solidity ^0.8.0;

/****************************************
 *   TOS-ERC721 provides low-gas    *
 *           mints + transfers          *
 ****************************************/





contract Nanoko_update is ERC721EnumerableT, Delegated, ReentrancyGuard {
  using Strings for uint;

  bool public revealed = false;
  string public notRevealedUri = "ipfs://Qma5M8iyJp4bewV4aVNHbUnu1MxG8Rk26McNPwrYt3iypG";

  uint public MAX_SUPPLY   = 7777;
  uint public PRICE        = 0.02 ether;
  uint public MAX_QTY      = 5; // Max mint amount per wallet
  uint public mintStartTime = 1647792000;
  
  address[] public nanokos;

  mapping(address => uint) private _balances;
  mapping(address => uint) public  mintCount;
  mapping(address => bool) private _isFreeMinted;
  string private _tokenURIPrefix;
  string private _tokenURISuffix =  ".json";

  nanokoOld private _nanokoOld;

  constructor(address old)
    ERC721T("NanokoVerse", "NANOKO"){
      _nanokoOld = nanokoOld(old);
      _dropForPreviousOwner();
  }

//-------------------------------------------------------------------------------------------
//  View Parts


/**
  * @dev Returns the number of tokens in ``owners``'s account.
  */
  function balanceOf(address account) public view override returns (uint) {
    require(account != address(0), "Nanoko: balance query for the zero address");
    return _balances[account];
  }

/**
  * @dev Returns the bool of tokens if``owner``'s account contains the tokenIds.
  */
  function isOwnerOf( address account, uint[] calldata tokenIds ) external view override returns( bool ){
    for(uint i; i < tokenIds.length; ++i ){
      if( nanokos[ tokenIds[i] ] != account )
        return false;
    }

    return true;
  }

/**
  * @dev Returns the owner of the `tokenId` token.
  */
  function ownerOf( uint tokenId ) public override view returns( address owner_ ){
    address owner = nanokos[tokenId];
    require(owner != address(0), "Nanoko: query for nonexistent token");
    return owner;
  }

/**
  * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
  * Use along with {totalSupply} to enumerate all tokens.
  */
  function tokenByIndex(uint index) public view override returns (uint index_) {
    require(index < totalSupply(), "Nanoko: global index out of bounds");
    return index;
  }

/**
  * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
  * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
  */
  function tokenOfOwnerByIndex(address owner, uint index) public view override returns (uint tokenId_) {
    uint count;
    for(uint i; i < nanokos.length; ++i){
      if(owner == nanokos[i]){
        if( count == index )
          return i;
        else
          ++count;
      }
    }
    revert("ERC721Enumerable: owner index out of bounds");
  }

 /**
  * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
  */
  function tokenURI(uint tokenId) external view override returns (string memory) {
    require(_exists(tokenId), "Nanoko: URI query for nonexistent token");

    if(revealed == false) {
        return notRevealedUri;
    }
    return string(abi.encodePacked(_tokenURIPrefix, tokenId.toString(), _tokenURISuffix));
  }

/**
  * @dev Returns the total amount of tokens stored by the contract.
  */
  function totalSupply() public view override returns( uint totalSupply_ ){
    return nanokos.length;
  }

/**
  * @dev Returns the list of tokenIds stored by the owner's account.
  */
  function walletOfOwner( address account ) external view override returns( uint[] memory ){
    uint quantity = balanceOf( account );
    uint[] memory wallet = new uint[]( quantity );
    for( uint i; i < quantity; ++i ){
        wallet[i] = tokenOfOwnerByIndex( account, i );
    }
    return wallet;
  }

/**
  * @dev Returns is WL or OG of old contract.
  */

 function isEligibleForFreeMint( address account ) public view returns(bool){
   return( !_isFreeMinted[account] && (_nanokoOld.whitelistCount(account) > 0 || _nanokoOld.isOG(account))  );
 }

/**
  * @dev Returns the balance amount of the Contract address.
  */
  function getBalanceOfContract() external view returns (uint256) {
    return address(this).balance;
  }


//-------------------------------------------------------------------------------------------
//  Mint Part


 /**
  * @dev mints token based on the number of qty specified.
  */
  function mint( uint quantity ) external payable nonReentrant {
    require(block.timestamp >= mintStartTime, "Nanoko: Minting is not start yet");
    require(quantity + mintCount[msg.sender] <= MAX_QTY, "Nanoko: You can't mint that much");
    require (msg.value >= PRICE * quantity, "Nanoko: Ether sent is not correct");
    uint supply = totalSupply();
    require(supply + quantity <= MAX_SUPPLY, "Nanoko: Mint exceeds supply" );
    for(uint i; i < quantity; ++i){
      _mint( msg.sender, supply++ );
    }
    mintCount[msg.sender] += quantity;
  }

  function freeMint() external payable nonReentrant {
    require(block.timestamp >= mintStartTime, "Nanoko: Minting is not start yet");
    require( isEligibleForFreeMint(msg.sender), "Nanoko: You are not eligable for free mint");
    uint supply = totalSupply();
    require(supply < MAX_SUPPLY, "Nanoko: Mint exceeds supply" );
    _isFreeMinted[msg.sender] = true;
    _mint( msg.sender, supply );
  }

//-------------------------------------------------------------------------------------------
//  OnlyOwner/Delegate Parts


/**
  * @dev Withdraws an amount from the contract balance.
  */
  function withdrawAll() public onlyOwner {

    // This will payout the owner 100% of the contract balance.
    // Do not remove this otherwise you will not be able to withdraw the funds.
    // =============================================================================
    uint amount = address(this).balance;
    
    payable(0xa2800c3D21948e22315e573B8Ec582606CbfC8E0).call{value: amount / 100 * 23}("");
    payable(0x0ed819ccaECFc5527B606f00fD3c3b640146977d).call{value: amount / 100 * 36}("");
    payable(0x2e8931A6A02eC56eEf941E29bb0b5121dE3FA128).call{value: amount / 200 * 71}("");
    payable(0x3744D9468F991E110A16BE720484FE53c7fe9b73).call{value: amount / 200 * 11}("");

    // require(os);
    // =============================================================================
  }//


  /**
  * @dev Allows team to mint the token without restriction.
  */
  function teamMint(uint[] calldata quantity, address[] calldata recipient) external onlyOwner{
    require(quantity.length == recipient.length, "Nanoko: Must provide equal quantities and recipients" );

    uint totalQuantity;
    uint supply = nanokos.length;
    for(uint i; i < quantity.length; ++i){
      totalQuantity += quantity[i];
    }
    require( supply + totalQuantity < MAX_SUPPLY, "Nanoko: Mint/order exceeds supply" );

    for(uint i; i < recipient.length; ++i){
      for(uint j; j < quantity[i]; ++j){
        uint tokenId = supply++;
        _mint( recipient[i], tokenId);
      }
    }
  }

/**
  * @dev Owner sets the Staking contract address.
  */
  function flipRevealState() external onlyOwner {
    revealed = !revealed;
  }

  /**
  * @dev Owner sets the Staking contract address.
  */
  function setUnrevealURI(string calldata notRevealUri_) external onlyOwner {
    notRevealedUri = notRevealUri_;
  }

  function setStartTime(uint newTimeStamp_) external onlyOwner {
    mintStartTime = newTimeStamp_;
  }


/**
  * @dev Owner/Delegates sets the BaseURI of IPFS.
  */
  function setBaseURI(string calldata prefix, string calldata suffix) external onlyOwner{
    _tokenURIPrefix = prefix;
    _tokenURISuffix = suffix;
  }

  function setPrice(uint _price) external onlyOwner{
    PRICE = _price;
  }


//-------------------------------------------------------------------------------------------
//  Internal Parts


/**
  * @dev increment and decrement balances based on address from and to.
  */
  function _beforeTokenTransfer(address from, address to) internal {
    if( from != address(0) )
      --_balances[ from ];

    if( to != address(0) )
      ++_balances[ to ];
  }

/**
  * @dev returns bool if the tokenId exist.
  */
  function _exists(uint tokenId) internal view override returns (bool) {
    return tokenId < nanokos.length && nanokos[tokenId] != address(0);
  }

/**
  * @dev mints token based address and tokenId
  */
  function _mint(address to, uint tokenId) internal {
    _beforeTokenTransfer(address(0), to);
    nanokos.push(to);
    emit Transfer(address(0), to, tokenId);
  }

/**
  * @dev transfer tokenId to other address.
  */
  function _transfer(address from, address to, uint tokenId) internal override {
    require(nanokos[tokenId] == from, "Nanoko: transfer of token that is not owned");

    // Clear approvals from the previous owner
    _approve(address(0), tokenId);
    _beforeTokenTransfer(from, to);

    nanokos[tokenId] = to;
    emit Transfer(from, to, tokenId);
  }


  function _dropForPreviousOwner() internal {
    uint amount = _nanokoOld.totalSupply();
    for(uint i; i < amount; ++i){
      _mint(_nanokoOld.ownerOf(i), i);
    }
  }
}

interface nanokoOld{
  function isOG (address account) external view returns(bool);
  function whitelistCount (address account) external view returns(uint);
  function totalSupply() external view returns(uint);
  function ownerOf(uint tokenId) external view returns(address);
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"old","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_QTY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipRevealState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalanceOfContract","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isDelegate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isEligibleForFreeMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"isOwnerOf","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nanokos","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","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":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"prefix","type":"string"},{"internalType":"string","name":"suffix","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"isDelegate_","type":"bool"}],"name":"setDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTimeStamp_","type":"uint256"}],"name":"setStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"notRevealUri_","type":"string"}],"name":"setUnrevealURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"quantity","type":"uint256[]"},{"internalType":"address[]","name":"recipient","type":"address[]"}],"name":"teamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"index_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"totalSupply_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"transferBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6007805460ff1916905560e0604052603560808181529062003a6060a0398051620000339160089160209091019062000433565b50611e6160095566470de4df820000600a556005600b8190556362374f80600c556040805180820190915281815264173539b7b760d91b602090910190815262000081916012919062000433565b503480156200008f57600080fd5b5060405162003a9538038062003a95833981016040819052620000b291620004d9565b604080518082018252600b81526a4e616e6f6b6f566572736560a81b6020808301918252835180850190945260068452654e414e4f4b4f60d01b908401528151919291620001039160009162000433565b5080516200011990600190602084019062000433565b5050506200013662000130620001a760201b60201c565b620001ab565b6001600560006200014f6004546001600160a01b031690565b6001600160a01b0390811682526020820192909252604001600020805460ff1916921515929092179091556001600655601380546001600160a01b031916918316919091179055620001a0620001fd565b50620005b0565b3390565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b601354604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b1580156200024357600080fd5b505afa15801562000258573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200027e91906200050b565b905060005b8181101562000329576013546040516331a9108f60e11b81526004810183905262000316916001600160a01b031690636352211e9060240160206040518083038186803b158015620002d457600080fd5b505afa158015620002e9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200030f9190620004d9565b826200032d565b62000321816200057c565b905062000283565b5050565b6200033a600083620003b6565b600d805460018101825560009182527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b03821615620003f3576001600160a01b0382166000908152600e602052604081208054909190620003ee9062000525565b909155505b6001600160a01b0381161562000329576001600160a01b0381166000908152600e6020526040812080549091906200042b906200057c565b909155505050565b82805462000441906200053f565b90600052602060002090601f016020900481019282620004655760008555620004b0565b82601f106200048057805160ff1916838001178555620004b0565b82800160010185558215620004b0579182015b82811115620004b057825182559160200191906001019062000493565b50620004be929150620004c2565b5090565b5b80821115620004be5760008155600101620004c3565b600060208284031215620004ec57600080fd5b81516001600160a01b03811681146200050457600080fd5b9392505050565b6000602082840312156200051e57600080fd5b5051919050565b6000816200053757620005376200059a565b506000190190565b600181811c908216806200055457607f821691505b602082108114156200057657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156200059357620005936200059a565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6134a080620005c06000396000f3fe6080604052600436106102dc5760003560e01c80635b70ea9f1161018457806397bc411c116100d6578063c0e05d0b1161008a578063ed9ec88811610064578063ed9ec888146107ae578063f2fde38b146107db578063fa72de45146107fb57600080fd5b8063c0e05d0b14610725578063c87b56dd14610745578063e985e9c51461076557600080fd5b8063a22cb465116100bb578063a22cb465146106c5578063b534a5c4146106e5578063b88d4fde1461070557600080fd5b806397bc411c14610692578063a0712d68146106b257600080fd5b8063853828b61161013857806391b7f5ed1161011257806391b7f5ed14610647578063931e2e491461066757806395d89b411461067d57600080fd5b8063853828b6146105fe5780638d859f3e146106135780638da5cb5b1461062957600080fd5b80636790a9de116101695780636790a9de146105a957806370a08231146105c9578063715018a6146105e957600080fd5b80635b70ea9f146105815780636352211e1461058957600080fd5b80632533c7cd1161023d57806342842e0e116101f15780634d44660c116101cb5780634d44660c146105275780634f6ccce714610547578063518302271461056757600080fd5b806342842e0e146104ba578063438b6300146104da5780634a994eef1461050757600080fd5b80632f745c59116102225780632f745c591461046457806332cb6b0c146104845780633e0a322d1461049a57600080fd5b80632533c7cd1461042f5780632714ce921461044f57600080fd5b8063095ea7b3116102945780631c96cae9116102795780631c96cae9146103e657806322968885146103fc57806323b872dd1461040f57600080fd5b8063095ea7b3146103a557806318160ddd146103c757600080fd5b806307779627116102c55780630777962714610338578063081812fc14610358578063081c8c441461039057600080fd5b806301ffc9a7146102e157806306fdde0314610316575b600080fd5b3480156102ed57600080fd5b506103016102fc366004612f1f565b61081b565b60405190151581526020015b60405180910390f35b34801561032257600080fd5b5061032b610877565b60405161030d91906131dd565b34801561034457600080fd5b50610301610353366004612bcd565b610909565b34801561036457600080fd5b50610378610373366004612ffb565b61098e565b6040516001600160a01b03909116815260200161030d565b34801561039c57600080fd5b5061032b610a27565b3480156103b157600080fd5b506103c56103c0366004612e6c565b610ab5565b005b3480156103d357600080fd5b50600d545b60405190815260200161030d565b3480156103f257600080fd5b506103d8600b5481565b34801561040857600080fd5b50476103d8565b34801561041b57600080fd5b506103c561042a366004612cac565b610be7565b34801561043b57600080fd5b506103c561044a366004612e96565b610c6e565b34801561045b57600080fd5b506103c5610e9d565b34801561047057600080fd5b506103d861047f366004612e6c565b610f0b565b34801561049057600080fd5b506103d860095481565b3480156104a657600080fd5b506103c56104b5366004612ffb565b610fe9565b3480156104c657600080fd5b506103c56104d5366004612cac565b611048565b3480156104e657600080fd5b506104fa6104f5366004612bcd565b611063565b60405161030d9190613199565b34801561051357600080fd5b506103c5610522366004612e35565b611103565b34801561053357600080fd5b50610301610542366004612de2565b611188565b34801561055357600080fd5b506103d8610562366004612ffb565b61120a565b34801561057357600080fd5b506007546103019060ff1681565b6103c561128d565b34801561059557600080fd5b506103786105a4366004612ffb565b61143c565b3480156105b557600080fd5b506103c56105c4366004612f9b565b6114dc565b3480156105d557600080fd5b506103d86105e4366004612bcd565b611556565b3480156105f557600080fd5b506103c56115f0565b34801561060a57600080fd5b506103c5611656565b34801561061f57600080fd5b506103d8600a5481565b34801561063557600080fd5b506004546001600160a01b0316610378565b34801561065357600080fd5b506103c5610662366004612ffb565b611876565b34801561067357600080fd5b506103d8600c5481565b34801561068957600080fd5b5061032b6118d5565b34801561069e57600080fd5b506103c56106ad366004612f59565b6118e4565b6103c56106c0366004612ffb565b61194a565b3480156106d157600080fd5b506103c56106e0366004612e35565b611ba9565b3480156106f157600080fd5b506103c5610700366004612c1b565b611c6e565b34801561071157600080fd5b506103c5610720366004612ce8565b611ce3565b34801561073157600080fd5b50610301610740366004612bcd565b611d6b565b34801561075157600080fd5b5061032b610760366004612ffb565b611ec3565b34801561077157600080fd5b50610301610780366004612be8565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205460ff1690565b3480156107ba57600080fd5b506103d86107c9366004612bcd565b600f6020526000908152604090205481565b3480156107e757600080fd5b506103c56107f6366004612bcd565b612011565b34801561080757600080fd5b50610378610816366004612ffb565b61209a565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806108715750610871826120c4565b92915050565b606060008054610886906132d1565b80601f01602080910402602001604051908101604052809291908181526020018280546108b2906132d1565b80156108ff5780601f106108d4576101008083540402835291602001916108ff565b820191906000526020600020905b8154815290600101906020018083116108e257829003601f168201915b5050505050905090565b6004546000906001600160a01b0316331461096b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b506001600160a01b03811660009081526005602052604090205460ff165b919050565b6000610999826121a7565b610a0b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610962565b506000908152600260205260409020546001600160a01b031690565b60088054610a34906132d1565b80601f0160208091040260200160405190810160405280929190818152602001828054610a60906132d1565b8015610aad5780601f10610a8257610100808354040283529160200191610aad565b820191906000526020600020905b815481529060010190602001808311610a9057829003601f168201915b505050505081565b6000610ac08261143c565b9050806001600160a01b0316836001600160a01b03161415610b4a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610962565b336001600160a01b0382161480610b665750610b668133610780565b610bd85760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610962565b610be283836121f1565b505050565b610bf13382612277565b610c635760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610962565b610be2838383612372565b6004546001600160a01b03163314610cc85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610962565b828114610d3d5760405162461bcd60e51b815260206004820152603460248201527f4e616e6f6b6f3a204d7573742070726f7669646520657175616c207175616e7460448201527f697469657320616e6420726563697069656e74730000000000000000000000006064820152608401610962565b600d54600090815b85811015610d8357868682818110610d5f57610d5f6133d0565b9050602002013583610d7191906131f0565b9250610d7c81613325565b9050610d45565b50600954610d9183836131f0565b10610e045760405162461bcd60e51b815260206004820152602160248201527f4e616e6f6b6f3a204d696e742f6f72646572206578636565647320737570706c60448201527f79000000000000000000000000000000000000000000000000000000000000006064820152608401610962565b60005b83811015610e945760005b878783818110610e2457610e246133d0565b90506020020135811015610e8357600083610e3e81613325565b94509050610e72878785818110610e5757610e576133d0565b9050602002016020810190610e6c9190612bcd565b826124b2565b50610e7c81613325565b9050610e12565b50610e8d81613325565b9050610e07565b50505050505050565b6004546001600160a01b03163314610ef75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610962565b6007805460ff19811660ff90911615179055565b60008060005b600d54811015610f7a57600d8181548110610f2e57610f2e6133d0565b6000918252602090912001546001600160a01b0386811691161415610f6a5783821415610f5e5791506108719050565b610f6782613325565b91505b610f7381613325565b9050610f11565b5060405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610962565b6004546001600160a01b031633146110435760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610962565b600c55565b610be283838360405180602001604052806000815250611ce3565b6060600061107083611556565b905060008167ffffffffffffffff81111561108d5761108d6133ff565b6040519080825280602002602001820160405280156110b6578160200160208202803683370190505b50905060005b828110156110fb576110ce8582610f0b565b8282815181106110e0576110e06133d0565b60209081029190910101526110f481613325565b90506110bc565b509392505050565b6004546001600160a01b0316331461115d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610962565b6001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b6000805b828110156111fd57846001600160a01b0316600d8585848181106111b2576111b26133d0565b90506020020135815481106111c9576111c96133d0565b6000918252602090912001546001600160a01b0316146111ed576000915050611203565b6111f681613325565b905061118c565b50600190505b9392505050565b6000611215600d5490565b82106112895760405162461bcd60e51b815260206004820152602260248201527f4e616e6f6b6f3a20676c6f62616c20696e646578206f7574206f6620626f756e60448201527f64730000000000000000000000000000000000000000000000000000000000006064820152608401610962565b5090565b600260065414156112e05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610962565b6002600655600c544210156113375760405162461bcd60e51b815260206004820181905260248201527f4e616e6f6b6f3a204d696e74696e67206973206e6f74207374617274207965746044820152606401610962565b61134033611d6b565b6113b25760405162461bcd60e51b815260206004820152602a60248201527f4e616e6f6b6f3a20596f7520617265206e6f7420656c696761626c6520666f7260448201527f2066726565206d696e74000000000000000000000000000000000000000000006064820152608401610962565b60006113bd600d5490565b905060095481106114105760405162461bcd60e51b815260206004820152601b60248201527f4e616e6f6b6f3a204d696e74206578636565647320737570706c7900000000006044820152606401610962565b336000818152601060205260409020805460ff1916600117905561143490826124b2565b506001600655565b600080600d8381548110611452576114526133d0565b6000918252602090912001546001600160a01b03169050806108715760405162461bcd60e51b815260206004820152602360248201527f4e616e6f6b6f3a20717565727920666f72206e6f6e6578697374656e7420746f60448201527f6b656e00000000000000000000000000000000000000000000000000000000006064820152608401610962565b6004546001600160a01b031633146115365760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610962565b61154260118585612a98565b5061154f60128383612a98565b5050505050565b60006001600160a01b0382166115d45760405162461bcd60e51b815260206004820152602a60248201527f4e616e6f6b6f3a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610962565b506001600160a01b03166000908152600e602052604090205490565b6004546001600160a01b0316331461164a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610962565b6116546000612551565b565b6004546001600160a01b031633146116b05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610962565b4773a2800c3d21948e22315e573b8ec582606cbfc8e06116d1606483613208565b6116dc90601761321c565b604051600081818185875af1925050503d8060008114611718576040519150601f19603f3d011682016040523d82523d6000602084013e61171d565b606091505b50730ed819ccaecfc5527b606f00fd3c3b640146977d91506117429050606483613208565b61174d90602461321c565b604051600081818185875af1925050503d8060008114611789576040519150601f19603f3d011682016040523d82523d6000602084013e61178e565b606091505b50732e8931a6a02ec56eef941e29bb0b5121de3fa12891506117b3905060c883613208565b6117be90604761321c565b604051600081818185875af1925050503d80600081146117fa576040519150601f19603f3d011682016040523d82523d6000602084013e6117ff565b606091505b50733744d9468f991e110a16be720484fe53c7fe9b739150611824905060c883613208565b61182f90600b61321c565b604051600081818185875af1925050503d806000811461186b576040519150601f19603f3d011682016040523d82523d6000602084013e611870565b606091505b50505050565b6004546001600160a01b031633146118d05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610962565b600a55565b606060018054610886906132d1565b6004546001600160a01b0316331461193e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610962565b610be260088383612a98565b6002600654141561199d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610962565b6002600655600c544210156119f45760405162461bcd60e51b815260206004820181905260248201527f4e616e6f6b6f3a204d696e74696e67206973206e6f74207374617274207965746044820152606401610962565b600b54336000908152600f6020526040902054611a1190836131f0565b1115611a5f5760405162461bcd60e51b815260206004820181905260248201527f4e616e6f6b6f3a20596f752063616e2774206d696e742074686174206d7563686044820152606401610962565b80600a54611a6d919061321c565b341015611ae25760405162461bcd60e51b815260206004820152602160248201527f4e616e6f6b6f3a2045746865722073656e74206973206e6f7420636f7272656360448201527f74000000000000000000000000000000000000000000000000000000000000006064820152608401610962565b6000611aed600d5490565b600954909150611afd83836131f0565b1115611b4b5760405162461bcd60e51b815260206004820152601b60248201527f4e616e6f6b6f3a204d696e74206578636565647320737570706c7900000000006044820152606401610962565b60005b82811015611b7b57611b6b3383611b6481613325565b94506124b2565b611b7481613325565b9050611b4e565b50336000908152600f602052604081208054849290611b9b9084906131f0565b909155505060016006555050565b6001600160a01b038216331415611c025760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610962565b3360008181526003602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60005b83811015610e9457611cd38787878785818110611c9057611c906133d0565b9050602002013586868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611ce392505050565b611cdc81613325565b9050611c71565b611ced3383612277565b611d5f5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610962565b611870848484846125bb565b6001600160a01b03811660009081526010602052604081205460ff1615801561087157506013546040517fdef872720000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152600092169063def872729060240160206040518083038186803b158015611dee57600080fd5b505afa158015611e02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e269190613014565b118061087157506013546040517fc83271f50000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301529091169063c83271f59060240160206040518083038186803b158015611e8b57600080fd5b505afa158015611e9f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108719190612f02565b6060611ece826121a7565b611f405760405162461bcd60e51b815260206004820152602760248201527f4e616e6f6b6f3a2055524920717565727920666f72206e6f6e6578697374656e60448201527f7420746f6b656e000000000000000000000000000000000000000000000000006064820152608401610962565b60075460ff16611fdc5760088054611f57906132d1565b80601f0160208091040260200160405190810160405280929190818152602001828054611f83906132d1565b8015611fd05780601f10611fa557610100808354040283529160200191611fd0565b820191906000526020600020905b815481529060010190602001808311611fb357829003601f168201915b50505050509050919050565b6011611fe783612644565b6012604051602001611ffb9392919061312a565b6040516020818303038152906040529050919050565b6004546001600160a01b0316331461206b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610962565b6001600160a01b0381166000908152600560205260409020805460ff1916600117905561209781612776565b50565b600d81815481106120aa57600080fd5b6000918252602090912001546001600160a01b0316905081565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061215757507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061087157507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610871565b600d5460009082108015610871575060006001600160a01b0316600d83815481106121d4576121d46133d0565b6000918252602090912001546001600160a01b0316141592915050565b600081815260026020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038416908117909155819061223e8261143c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612282826121a7565b6122f45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610962565b60006122ff8361143c565b9050806001600160a01b0316846001600160a01b0316148061233a5750836001600160a01b031661232f8461098e565b6001600160a01b0316145b8061236a57506001600160a01b0380821660009081526003602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316600d828154811061238f5761238f6133d0565b6000918252602090912001546001600160a01b0316146124175760405162461bcd60e51b815260206004820152602b60248201527f4e616e6f6b6f3a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e65640000000000000000000000000000000000000000006064820152608401610962565b6124226000826121f1565b61242c8383612855565b81600d8281548110612440576124406133d0565b6000918252602082200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b6124bd600083612855565b600d805460018101825560009182527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600480546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6125c6848484612372565b6125d2848484846128cd565b6118705760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610962565b60608161268457505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156126ae578061269881613325565b91506126a79050600a83613208565b9150612688565b60008167ffffffffffffffff8111156126c9576126c96133ff565b6040519080825280601f01601f1916602001820160405280156126f3576020820181803683370190505b5090505b841561236a57612708600183613259565b9150612715600a8661335e565b6127209060306131f0565b60f81b818381518110612735576127356133d0565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061276f600a86613208565b94506126f7565b6004546001600160a01b031633146127d05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610962565b6001600160a01b03811661284c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610962565b61209781612551565b6001600160a01b0382161561288f576001600160a01b0382166000908152600e60205260408120805490919061288a9061329c565b909155505b6001600160a01b038116156128c9576001600160a01b0381166000908152600e6020526040812080549091906128c490613325565b909155505b5050565b60006001600160a01b0384163b15612a8d576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a029061292a90339089908890889060040161315d565b602060405180830381600087803b15801561294457600080fd5b505af1925050508015612992575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261298f91810190612f3c565b60015b612a42573d8080156129c0576040519150601f19603f3d011682016040523d82523d6000602084013e6129c5565b606091505b508051612a3a5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610962565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a020000000000000000000000000000000000000000000000000000000014905061236a565b506001949350505050565b828054612aa4906132d1565b90600052602060002090601f016020900481019282612ac65760008555612b0c565b82601f10612adf5782800160ff19823516178555612b0c565b82800160010185558215612b0c579182015b82811115612b0c578235825591602001919060010190612af1565b506112899291505b808211156112895760008155600101612b14565b80356001600160a01b038116811461098957600080fd5b60008083601f840112612b5157600080fd5b50813567ffffffffffffffff811115612b6957600080fd5b6020830191508360208260051b8501011115612b8457600080fd5b9250929050565b60008083601f840112612b9d57600080fd5b50813567ffffffffffffffff811115612bb557600080fd5b602083019150836020828501011115612b8457600080fd5b600060208284031215612bdf57600080fd5b61120382612b28565b60008060408385031215612bfb57600080fd5b612c0483612b28565b9150612c1260208401612b28565b90509250929050565b60008060008060008060808789031215612c3457600080fd5b612c3d87612b28565b9550612c4b60208801612b28565b9450604087013567ffffffffffffffff80821115612c6857600080fd5b612c748a838b01612b3f565b90965094506060890135915080821115612c8d57600080fd5b50612c9a89828a01612b8b565b979a9699509497509295939492505050565b600080600060608486031215612cc157600080fd5b612cca84612b28565b9250612cd860208501612b28565b9150604084013590509250925092565b60008060008060808587031215612cfe57600080fd5b612d0785612b28565b9350612d1560208601612b28565b925060408501359150606085013567ffffffffffffffff80821115612d3957600080fd5b818701915087601f830112612d4d57600080fd5b813581811115612d5f57612d5f6133ff565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715612da557612da56133ff565b816040528281528a6020848701011115612dbe57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080600060408486031215612df757600080fd5b612e0084612b28565b9250602084013567ffffffffffffffff811115612e1c57600080fd5b612e2886828701612b3f565b9497909650939450505050565b60008060408385031215612e4857600080fd5b612e5183612b28565b91506020830135612e618161342e565b809150509250929050565b60008060408385031215612e7f57600080fd5b612e8883612b28565b946020939093013593505050565b60008060008060408587031215612eac57600080fd5b843567ffffffffffffffff80821115612ec457600080fd5b612ed088838901612b3f565b90965094506020870135915080821115612ee957600080fd5b50612ef687828801612b3f565b95989497509550505050565b600060208284031215612f1457600080fd5b81516112038161342e565b600060208284031215612f3157600080fd5b81356112038161343c565b600060208284031215612f4e57600080fd5b81516112038161343c565b60008060208385031215612f6c57600080fd5b823567ffffffffffffffff811115612f8357600080fd5b612f8f85828601612b8b565b90969095509350505050565b60008060008060408587031215612fb157600080fd5b843567ffffffffffffffff80821115612fc957600080fd5b612fd588838901612b8b565b90965094506020870135915080821115612fee57600080fd5b50612ef687828801612b8b565b60006020828403121561300d57600080fd5b5035919050565b60006020828403121561302657600080fd5b5051919050565b60008151808452613045816020860160208601613270565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b8054600090600181811c908083168061309157607f831692505b60208084108214156130cc577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b8180156130e057600181146130f15761311e565b60ff1986168952848901965061311e565b60008881526020902060005b868110156131165781548b8201529085019083016130fd565b505084890196505b50505050505092915050565b60006131368286613077565b8451613146818360208901613270565b61315281830186613077565b979650505050505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261318f608083018461302d565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156131d1578351835292840192918401916001016131b5565b50909695505050505050565b602081526000611203602083018461302d565b6000821982111561320357613203613372565b500190565b600082613217576132176133a1565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561325457613254613372565b500290565b60008282101561326b5761326b613372565b500390565b60005b8381101561328b578181015183820152602001613273565b838111156118705750506000910152565b6000816132ab576132ab613372565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600181811c908216806132e557607f821691505b6020821081141561331f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561335757613357613372565b5060010190565b60008261336d5761336d6133a1565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b801515811461209757600080fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461209757600080fdfea2646970667358221220e1ed29c10fa9a7f610fea00c6e70bed89470827e781d39820a81609348d318fb64736f6c63430008070033697066733a2f2f516d61354d3869794a7034626577563461564e4862556e75314d784738526b32364d634e50777259743369797047000000000000000000000000983862d7408edc9749d45f222bd578d6b5374399

Deployed Bytecode

0x6080604052600436106102dc5760003560e01c80635b70ea9f1161018457806397bc411c116100d6578063c0e05d0b1161008a578063ed9ec88811610064578063ed9ec888146107ae578063f2fde38b146107db578063fa72de45146107fb57600080fd5b8063c0e05d0b14610725578063c87b56dd14610745578063e985e9c51461076557600080fd5b8063a22cb465116100bb578063a22cb465146106c5578063b534a5c4146106e5578063b88d4fde1461070557600080fd5b806397bc411c14610692578063a0712d68146106b257600080fd5b8063853828b61161013857806391b7f5ed1161011257806391b7f5ed14610647578063931e2e491461066757806395d89b411461067d57600080fd5b8063853828b6146105fe5780638d859f3e146106135780638da5cb5b1461062957600080fd5b80636790a9de116101695780636790a9de146105a957806370a08231146105c9578063715018a6146105e957600080fd5b80635b70ea9f146105815780636352211e1461058957600080fd5b80632533c7cd1161023d57806342842e0e116101f15780634d44660c116101cb5780634d44660c146105275780634f6ccce714610547578063518302271461056757600080fd5b806342842e0e146104ba578063438b6300146104da5780634a994eef1461050757600080fd5b80632f745c59116102225780632f745c591461046457806332cb6b0c146104845780633e0a322d1461049a57600080fd5b80632533c7cd1461042f5780632714ce921461044f57600080fd5b8063095ea7b3116102945780631c96cae9116102795780631c96cae9146103e657806322968885146103fc57806323b872dd1461040f57600080fd5b8063095ea7b3146103a557806318160ddd146103c757600080fd5b806307779627116102c55780630777962714610338578063081812fc14610358578063081c8c441461039057600080fd5b806301ffc9a7146102e157806306fdde0314610316575b600080fd5b3480156102ed57600080fd5b506103016102fc366004612f1f565b61081b565b60405190151581526020015b60405180910390f35b34801561032257600080fd5b5061032b610877565b60405161030d91906131dd565b34801561034457600080fd5b50610301610353366004612bcd565b610909565b34801561036457600080fd5b50610378610373366004612ffb565b61098e565b6040516001600160a01b03909116815260200161030d565b34801561039c57600080fd5b5061032b610a27565b3480156103b157600080fd5b506103c56103c0366004612e6c565b610ab5565b005b3480156103d357600080fd5b50600d545b60405190815260200161030d565b3480156103f257600080fd5b506103d8600b5481565b34801561040857600080fd5b50476103d8565b34801561041b57600080fd5b506103c561042a366004612cac565b610be7565b34801561043b57600080fd5b506103c561044a366004612e96565b610c6e565b34801561045b57600080fd5b506103c5610e9d565b34801561047057600080fd5b506103d861047f366004612e6c565b610f0b565b34801561049057600080fd5b506103d860095481565b3480156104a657600080fd5b506103c56104b5366004612ffb565b610fe9565b3480156104c657600080fd5b506103c56104d5366004612cac565b611048565b3480156104e657600080fd5b506104fa6104f5366004612bcd565b611063565b60405161030d9190613199565b34801561051357600080fd5b506103c5610522366004612e35565b611103565b34801561053357600080fd5b50610301610542366004612de2565b611188565b34801561055357600080fd5b506103d8610562366004612ffb565b61120a565b34801561057357600080fd5b506007546103019060ff1681565b6103c561128d565b34801561059557600080fd5b506103786105a4366004612ffb565b61143c565b3480156105b557600080fd5b506103c56105c4366004612f9b565b6114dc565b3480156105d557600080fd5b506103d86105e4366004612bcd565b611556565b3480156105f557600080fd5b506103c56115f0565b34801561060a57600080fd5b506103c5611656565b34801561061f57600080fd5b506103d8600a5481565b34801561063557600080fd5b506004546001600160a01b0316610378565b34801561065357600080fd5b506103c5610662366004612ffb565b611876565b34801561067357600080fd5b506103d8600c5481565b34801561068957600080fd5b5061032b6118d5565b34801561069e57600080fd5b506103c56106ad366004612f59565b6118e4565b6103c56106c0366004612ffb565b61194a565b3480156106d157600080fd5b506103c56106e0366004612e35565b611ba9565b3480156106f157600080fd5b506103c5610700366004612c1b565b611c6e565b34801561071157600080fd5b506103c5610720366004612ce8565b611ce3565b34801561073157600080fd5b50610301610740366004612bcd565b611d6b565b34801561075157600080fd5b5061032b610760366004612ffb565b611ec3565b34801561077157600080fd5b50610301610780366004612be8565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205460ff1690565b3480156107ba57600080fd5b506103d86107c9366004612bcd565b600f6020526000908152604090205481565b3480156107e757600080fd5b506103c56107f6366004612bcd565b612011565b34801561080757600080fd5b50610378610816366004612ffb565b61209a565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806108715750610871826120c4565b92915050565b606060008054610886906132d1565b80601f01602080910402602001604051908101604052809291908181526020018280546108b2906132d1565b80156108ff5780601f106108d4576101008083540402835291602001916108ff565b820191906000526020600020905b8154815290600101906020018083116108e257829003601f168201915b5050505050905090565b6004546000906001600160a01b0316331461096b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b506001600160a01b03811660009081526005602052604090205460ff165b919050565b6000610999826121a7565b610a0b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610962565b506000908152600260205260409020546001600160a01b031690565b60088054610a34906132d1565b80601f0160208091040260200160405190810160405280929190818152602001828054610a60906132d1565b8015610aad5780601f10610a8257610100808354040283529160200191610aad565b820191906000526020600020905b815481529060010190602001808311610a9057829003601f168201915b505050505081565b6000610ac08261143c565b9050806001600160a01b0316836001600160a01b03161415610b4a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610962565b336001600160a01b0382161480610b665750610b668133610780565b610bd85760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610962565b610be283836121f1565b505050565b610bf13382612277565b610c635760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610962565b610be2838383612372565b6004546001600160a01b03163314610cc85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610962565b828114610d3d5760405162461bcd60e51b815260206004820152603460248201527f4e616e6f6b6f3a204d7573742070726f7669646520657175616c207175616e7460448201527f697469657320616e6420726563697069656e74730000000000000000000000006064820152608401610962565b600d54600090815b85811015610d8357868682818110610d5f57610d5f6133d0565b9050602002013583610d7191906131f0565b9250610d7c81613325565b9050610d45565b50600954610d9183836131f0565b10610e045760405162461bcd60e51b815260206004820152602160248201527f4e616e6f6b6f3a204d696e742f6f72646572206578636565647320737570706c60448201527f79000000000000000000000000000000000000000000000000000000000000006064820152608401610962565b60005b83811015610e945760005b878783818110610e2457610e246133d0565b90506020020135811015610e8357600083610e3e81613325565b94509050610e72878785818110610e5757610e576133d0565b9050602002016020810190610e6c9190612bcd565b826124b2565b50610e7c81613325565b9050610e12565b50610e8d81613325565b9050610e07565b50505050505050565b6004546001600160a01b03163314610ef75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610962565b6007805460ff19811660ff90911615179055565b60008060005b600d54811015610f7a57600d8181548110610f2e57610f2e6133d0565b6000918252602090912001546001600160a01b0386811691161415610f6a5783821415610f5e5791506108719050565b610f6782613325565b91505b610f7381613325565b9050610f11565b5060405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610962565b6004546001600160a01b031633146110435760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610962565b600c55565b610be283838360405180602001604052806000815250611ce3565b6060600061107083611556565b905060008167ffffffffffffffff81111561108d5761108d6133ff565b6040519080825280602002602001820160405280156110b6578160200160208202803683370190505b50905060005b828110156110fb576110ce8582610f0b565b8282815181106110e0576110e06133d0565b60209081029190910101526110f481613325565b90506110bc565b509392505050565b6004546001600160a01b0316331461115d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610962565b6001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b6000805b828110156111fd57846001600160a01b0316600d8585848181106111b2576111b26133d0565b90506020020135815481106111c9576111c96133d0565b6000918252602090912001546001600160a01b0316146111ed576000915050611203565b6111f681613325565b905061118c565b50600190505b9392505050565b6000611215600d5490565b82106112895760405162461bcd60e51b815260206004820152602260248201527f4e616e6f6b6f3a20676c6f62616c20696e646578206f7574206f6620626f756e60448201527f64730000000000000000000000000000000000000000000000000000000000006064820152608401610962565b5090565b600260065414156112e05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610962565b6002600655600c544210156113375760405162461bcd60e51b815260206004820181905260248201527f4e616e6f6b6f3a204d696e74696e67206973206e6f74207374617274207965746044820152606401610962565b61134033611d6b565b6113b25760405162461bcd60e51b815260206004820152602a60248201527f4e616e6f6b6f3a20596f7520617265206e6f7420656c696761626c6520666f7260448201527f2066726565206d696e74000000000000000000000000000000000000000000006064820152608401610962565b60006113bd600d5490565b905060095481106114105760405162461bcd60e51b815260206004820152601b60248201527f4e616e6f6b6f3a204d696e74206578636565647320737570706c7900000000006044820152606401610962565b336000818152601060205260409020805460ff1916600117905561143490826124b2565b506001600655565b600080600d8381548110611452576114526133d0565b6000918252602090912001546001600160a01b03169050806108715760405162461bcd60e51b815260206004820152602360248201527f4e616e6f6b6f3a20717565727920666f72206e6f6e6578697374656e7420746f60448201527f6b656e00000000000000000000000000000000000000000000000000000000006064820152608401610962565b6004546001600160a01b031633146115365760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610962565b61154260118585612a98565b5061154f60128383612a98565b5050505050565b60006001600160a01b0382166115d45760405162461bcd60e51b815260206004820152602a60248201527f4e616e6f6b6f3a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610962565b506001600160a01b03166000908152600e602052604090205490565b6004546001600160a01b0316331461164a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610962565b6116546000612551565b565b6004546001600160a01b031633146116b05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610962565b4773a2800c3d21948e22315e573b8ec582606cbfc8e06116d1606483613208565b6116dc90601761321c565b604051600081818185875af1925050503d8060008114611718576040519150601f19603f3d011682016040523d82523d6000602084013e61171d565b606091505b50730ed819ccaecfc5527b606f00fd3c3b640146977d91506117429050606483613208565b61174d90602461321c565b604051600081818185875af1925050503d8060008114611789576040519150601f19603f3d011682016040523d82523d6000602084013e61178e565b606091505b50732e8931a6a02ec56eef941e29bb0b5121de3fa12891506117b3905060c883613208565b6117be90604761321c565b604051600081818185875af1925050503d80600081146117fa576040519150601f19603f3d011682016040523d82523d6000602084013e6117ff565b606091505b50733744d9468f991e110a16be720484fe53c7fe9b739150611824905060c883613208565b61182f90600b61321c565b604051600081818185875af1925050503d806000811461186b576040519150601f19603f3d011682016040523d82523d6000602084013e611870565b606091505b50505050565b6004546001600160a01b031633146118d05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610962565b600a55565b606060018054610886906132d1565b6004546001600160a01b0316331461193e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610962565b610be260088383612a98565b6002600654141561199d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610962565b6002600655600c544210156119f45760405162461bcd60e51b815260206004820181905260248201527f4e616e6f6b6f3a204d696e74696e67206973206e6f74207374617274207965746044820152606401610962565b600b54336000908152600f6020526040902054611a1190836131f0565b1115611a5f5760405162461bcd60e51b815260206004820181905260248201527f4e616e6f6b6f3a20596f752063616e2774206d696e742074686174206d7563686044820152606401610962565b80600a54611a6d919061321c565b341015611ae25760405162461bcd60e51b815260206004820152602160248201527f4e616e6f6b6f3a2045746865722073656e74206973206e6f7420636f7272656360448201527f74000000000000000000000000000000000000000000000000000000000000006064820152608401610962565b6000611aed600d5490565b600954909150611afd83836131f0565b1115611b4b5760405162461bcd60e51b815260206004820152601b60248201527f4e616e6f6b6f3a204d696e74206578636565647320737570706c7900000000006044820152606401610962565b60005b82811015611b7b57611b6b3383611b6481613325565b94506124b2565b611b7481613325565b9050611b4e565b50336000908152600f602052604081208054849290611b9b9084906131f0565b909155505060016006555050565b6001600160a01b038216331415611c025760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610962565b3360008181526003602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60005b83811015610e9457611cd38787878785818110611c9057611c906133d0565b9050602002013586868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611ce392505050565b611cdc81613325565b9050611c71565b611ced3383612277565b611d5f5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610962565b611870848484846125bb565b6001600160a01b03811660009081526010602052604081205460ff1615801561087157506013546040517fdef872720000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152600092169063def872729060240160206040518083038186803b158015611dee57600080fd5b505afa158015611e02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e269190613014565b118061087157506013546040517fc83271f50000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301529091169063c83271f59060240160206040518083038186803b158015611e8b57600080fd5b505afa158015611e9f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108719190612f02565b6060611ece826121a7565b611f405760405162461bcd60e51b815260206004820152602760248201527f4e616e6f6b6f3a2055524920717565727920666f72206e6f6e6578697374656e60448201527f7420746f6b656e000000000000000000000000000000000000000000000000006064820152608401610962565b60075460ff16611fdc5760088054611f57906132d1565b80601f0160208091040260200160405190810160405280929190818152602001828054611f83906132d1565b8015611fd05780601f10611fa557610100808354040283529160200191611fd0565b820191906000526020600020905b815481529060010190602001808311611fb357829003601f168201915b50505050509050919050565b6011611fe783612644565b6012604051602001611ffb9392919061312a565b6040516020818303038152906040529050919050565b6004546001600160a01b0316331461206b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610962565b6001600160a01b0381166000908152600560205260409020805460ff1916600117905561209781612776565b50565b600d81815481106120aa57600080fd5b6000918252602090912001546001600160a01b0316905081565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061215757507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061087157507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610871565b600d5460009082108015610871575060006001600160a01b0316600d83815481106121d4576121d46133d0565b6000918252602090912001546001600160a01b0316141592915050565b600081815260026020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038416908117909155819061223e8261143c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612282826121a7565b6122f45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610962565b60006122ff8361143c565b9050806001600160a01b0316846001600160a01b0316148061233a5750836001600160a01b031661232f8461098e565b6001600160a01b0316145b8061236a57506001600160a01b0380821660009081526003602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316600d828154811061238f5761238f6133d0565b6000918252602090912001546001600160a01b0316146124175760405162461bcd60e51b815260206004820152602b60248201527f4e616e6f6b6f3a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e65640000000000000000000000000000000000000000006064820152608401610962565b6124226000826121f1565b61242c8383612855565b81600d8281548110612440576124406133d0565b6000918252602082200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b6124bd600083612855565b600d805460018101825560009182527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600480546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6125c6848484612372565b6125d2848484846128cd565b6118705760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610962565b60608161268457505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156126ae578061269881613325565b91506126a79050600a83613208565b9150612688565b60008167ffffffffffffffff8111156126c9576126c96133ff565b6040519080825280601f01601f1916602001820160405280156126f3576020820181803683370190505b5090505b841561236a57612708600183613259565b9150612715600a8661335e565b6127209060306131f0565b60f81b818381518110612735576127356133d0565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061276f600a86613208565b94506126f7565b6004546001600160a01b031633146127d05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610962565b6001600160a01b03811661284c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610962565b61209781612551565b6001600160a01b0382161561288f576001600160a01b0382166000908152600e60205260408120805490919061288a9061329c565b909155505b6001600160a01b038116156128c9576001600160a01b0381166000908152600e6020526040812080549091906128c490613325565b909155505b5050565b60006001600160a01b0384163b15612a8d576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a029061292a90339089908890889060040161315d565b602060405180830381600087803b15801561294457600080fd5b505af1925050508015612992575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261298f91810190612f3c565b60015b612a42573d8080156129c0576040519150601f19603f3d011682016040523d82523d6000602084013e6129c5565b606091505b508051612a3a5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610962565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a020000000000000000000000000000000000000000000000000000000014905061236a565b506001949350505050565b828054612aa4906132d1565b90600052602060002090601f016020900481019282612ac65760008555612b0c565b82601f10612adf5782800160ff19823516178555612b0c565b82800160010185558215612b0c579182015b82811115612b0c578235825591602001919060010190612af1565b506112899291505b808211156112895760008155600101612b14565b80356001600160a01b038116811461098957600080fd5b60008083601f840112612b5157600080fd5b50813567ffffffffffffffff811115612b6957600080fd5b6020830191508360208260051b8501011115612b8457600080fd5b9250929050565b60008083601f840112612b9d57600080fd5b50813567ffffffffffffffff811115612bb557600080fd5b602083019150836020828501011115612b8457600080fd5b600060208284031215612bdf57600080fd5b61120382612b28565b60008060408385031215612bfb57600080fd5b612c0483612b28565b9150612c1260208401612b28565b90509250929050565b60008060008060008060808789031215612c3457600080fd5b612c3d87612b28565b9550612c4b60208801612b28565b9450604087013567ffffffffffffffff80821115612c6857600080fd5b612c748a838b01612b3f565b90965094506060890135915080821115612c8d57600080fd5b50612c9a89828a01612b8b565b979a9699509497509295939492505050565b600080600060608486031215612cc157600080fd5b612cca84612b28565b9250612cd860208501612b28565b9150604084013590509250925092565b60008060008060808587031215612cfe57600080fd5b612d0785612b28565b9350612d1560208601612b28565b925060408501359150606085013567ffffffffffffffff80821115612d3957600080fd5b818701915087601f830112612d4d57600080fd5b813581811115612d5f57612d5f6133ff565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715612da557612da56133ff565b816040528281528a6020848701011115612dbe57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080600060408486031215612df757600080fd5b612e0084612b28565b9250602084013567ffffffffffffffff811115612e1c57600080fd5b612e2886828701612b3f565b9497909650939450505050565b60008060408385031215612e4857600080fd5b612e5183612b28565b91506020830135612e618161342e565b809150509250929050565b60008060408385031215612e7f57600080fd5b612e8883612b28565b946020939093013593505050565b60008060008060408587031215612eac57600080fd5b843567ffffffffffffffff80821115612ec457600080fd5b612ed088838901612b3f565b90965094506020870135915080821115612ee957600080fd5b50612ef687828801612b3f565b95989497509550505050565b600060208284031215612f1457600080fd5b81516112038161342e565b600060208284031215612f3157600080fd5b81356112038161343c565b600060208284031215612f4e57600080fd5b81516112038161343c565b60008060208385031215612f6c57600080fd5b823567ffffffffffffffff811115612f8357600080fd5b612f8f85828601612b8b565b90969095509350505050565b60008060008060408587031215612fb157600080fd5b843567ffffffffffffffff80821115612fc957600080fd5b612fd588838901612b8b565b90965094506020870135915080821115612fee57600080fd5b50612ef687828801612b8b565b60006020828403121561300d57600080fd5b5035919050565b60006020828403121561302657600080fd5b5051919050565b60008151808452613045816020860160208601613270565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b8054600090600181811c908083168061309157607f831692505b60208084108214156130cc577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b8180156130e057600181146130f15761311e565b60ff1986168952848901965061311e565b60008881526020902060005b868110156131165781548b8201529085019083016130fd565b505084890196505b50505050505092915050565b60006131368286613077565b8451613146818360208901613270565b61315281830186613077565b979650505050505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261318f608083018461302d565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156131d1578351835292840192918401916001016131b5565b50909695505050505050565b602081526000611203602083018461302d565b6000821982111561320357613203613372565b500190565b600082613217576132176133a1565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561325457613254613372565b500290565b60008282101561326b5761326b613372565b500390565b60005b8381101561328b578181015183820152602001613273565b838111156118705750506000910152565b6000816132ab576132ab613372565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600181811c908216806132e557607f821691505b6020821081141561331f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561335757613357613372565b5060010190565b60008261336d5761336d6133a1565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b801515811461209757600080fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461209757600080fdfea2646970667358221220e1ed29c10fa9a7f610fea00c6e70bed89470827e781d39820a81609348d318fb64736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000983862d7408edc9749d45f222bd578d6b5374399

-----Decoded View---------------
Arg [0] : old (address): 0x983862D7408EdC9749D45f222bD578d6b5374399

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000983862d7408edc9749d45f222bd578d6b5374399


Deployed Bytecode Sourcemap

34118:9291:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29521:225;;;;;;;;;;-1:-1:-1;29521:225:0;;;;;:::i;:::-;;:::i;:::-;;;11603:14:1;;11596:22;11578:41;;11566:2;11551:18;29521:225:0;;;;;;;;24289:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33449:112::-;;;;;;;;;;-1:-1:-1;33449:112:0;;;;;:::i;:::-;;:::i;25469:216::-;;;;;;;;;;-1:-1:-1;25469:216:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;10218:55:1;;;10200:74;;10188:2;10173:18;25469:216:0;10054:226:1;34257:86:0;;;;;;;;;;;;;:::i;25058:403::-;;;;;;;;;;-1:-1:-1;25058:403:0;;;;;:::i;:::-;;:::i;:::-;;37371:106;;;;;;;;;;-1:-1:-1;37457:7:0;:14;37371:106;;;21136:25:1;;;21124:2;21109:18;37371:106:0;20990:177:1;34428:28:0;;;;;;;;;;;;;;;;38212:105;;;;;;;;;;-1:-1:-1;38290:21:0;38212:105;;26168:334;;;;;;;;;;-1:-1:-1;26168:334:0;;;;;:::i;:::-;;:::i;40587:625::-;;;;;;;;;;-1:-1:-1;40587:625:0;;;;;:::i;:::-;;:::i;41280:79::-;;;;;;;;;;;;;:::i;36508:360::-;;;;;;;;;;-1:-1:-1;36508:360:0;;;;;:::i;:::-;;:::i;34350:31::-;;;;;;;;;;;;;;;;41552:103;;;;;;;;;;-1:-1:-1;41552:103:0;;;;;:::i;:::-;;:::i;26510:184::-;;;;;;;;;;-1:-1:-1;26510:184:0;;;;;:::i;:::-;;:::i;37564:312::-;;;;;;;;;;-1:-1:-1;37564:312:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;33567:116::-;;;;;;;;;;-1:-1:-1;33567:116:0;;;;;:::i;:::-;;:::i;35456:250::-;;;;;;;;;;-1:-1:-1;35456:250:0;;;;;:::i;:::-;;:::i;36158:177::-;;;;;;;;;;-1:-1:-1;36158:177:0;;;;;:::i;:::-;;:::i;34224:28::-;;;;;;;;;;-1:-1:-1;34224:28:0;;;;;;;;39081:410;;;:::i;35775:217::-;;;;;;;;;;-1:-1:-1;35775:217:0;;;;;:::i;:::-;;:::i;41726:154::-;;;;;;;;;;-1:-1:-1;41726:154:0;;;;;:::i;:::-;;:::i;35164:193::-;;;;;;;;;;-1:-1:-1;35164:193:0;;;;;:::i;:::-;;:::i;32399:94::-;;;;;;;;;;;;;:::i;39694:809::-;;;;;;;;;;;;;:::i;34386:37::-;;;;;;;;;;;;;;;;31748:87;;;;;;;;;;-1:-1:-1;31821:6:0;;-1:-1:-1;;;;;31821:6:0;31748:87;;41886:76;;;;;;;;;;-1:-1:-1;41886:76:0;;;;;:::i;:::-;;:::i;34491:38::-;;;;;;;;;;;;;;;;24798:106;;;;;;;;;;;;;:::i;41429:117::-;;;;;;;;;;-1:-1:-1;41429:117:0;;;;;:::i;:::-;;:::i;38511:564::-;;;;;;:::i;:::-;;:::i;25865:295::-;;;;;;;;;;-1:-1:-1;25865:295:0;;;;;:::i;:::-;;:::i;30155:245::-;;;;;;;;;;-1:-1:-1;30155:245:0;;;;;:::i;:::-;;:::i;26702:325::-;;;;;;;;;;-1:-1:-1;26702:325:0;;;;;:::i;:::-;;:::i;37941:192::-;;;;;;;;;;-1:-1:-1;37941:192:0;;;;;:::i;:::-;;:::i;36963:322::-;;;;;;;;;;-1:-1:-1;36963:322:0;;;;;:::i;:::-;;:::i;25693:164::-;;;;;;;;;;-1:-1:-1;25693:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;25814:25:0;;;25790:4;25814:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25693:164;34616:42;;;;;;;;;;-1:-1:-1;34616:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;33689:161;;;;;;;;;;-1:-1:-1;33689:161:0;;;;;:::i;:::-;;:::i;34538:24::-;;;;;;;;;;-1:-1:-1;34538:24:0;;;;;:::i;:::-;;:::i;29521:225::-;29624:4;29648:50;;;29663:35;29648:50;;:90;;;29702:36;29726:11;29702:23;:36::i;:::-;29641:97;29521:225;-1:-1:-1;;29521:225:0:o;24289:102::-;24345:13;24378:5;24371:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24289:102;:::o;33449:112::-;31821:6;;33519:4;;-1:-1:-1;;;;;31821:6:0;23232:10;31968:23;31960:68;;;;-1:-1:-1;;;31960:68:0;;17657:2:1;31960:68:0;;;17639:21:1;;;17676:18;;;17669:30;17735:34;17715:18;;;17708:62;17787:18;;31960:68:0;;;;;;;;;-1:-1:-1;;;;;;33539:16:0;::::1;;::::0;;;:10:::1;:16;::::0;;;;;::::1;;32039:1;33449:112:::0;;;:::o;25469:216::-;25542:7;25570:16;25578:7;25570;:16::i;:::-;25562:73;;;;-1:-1:-1;;;25562:73:0;;17244:2:1;25562:73:0;;;17226:21:1;17283:2;17263:18;;;17256:30;17322:34;17302:18;;;17295:62;17393:14;17373:18;;;17366:42;17425:19;;25562:73:0;17042:408:1;25562:73:0;-1:-1:-1;25653:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25653:24:0;;25469:216::o;34257:86::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25058:403::-;25138:13;25154:16;25162:7;25154;:16::i;:::-;25138:32;;25195:5;-1:-1:-1;;;;;25189:11:0;:2;-1:-1:-1;;;;;25189:11:0;;;25181:57;;;;-1:-1:-1;;;25181:57:0;;18018:2:1;25181:57:0;;;18000:21:1;18057:2;18037:18;;;18030:30;18096:34;18076:18;;;18069:62;18167:3;18147:18;;;18140:31;18188:19;;25181:57:0;17816:397:1;25181:57:0;23232:10;-1:-1:-1;;;;;25273:21:0;;;;:62;;-1:-1:-1;25298:37:0;25315:5;23232:10;25693:164;:::i;25298:37::-;25251:168;;;;-1:-1:-1;;;25251:168:0;;16056:2:1;25251:168:0;;;16038:21:1;16095:2;16075:18;;;16068:30;16134:34;16114:18;;;16107:62;16205:26;16185:18;;;16178:54;16249:19;;25251:168:0;15854:420:1;25251:168:0;25432:21;25441:2;25445:7;25432:8;:21::i;:::-;25127:334;25058:403;;:::o;26168:334::-;26360:41;23232:10;26393:7;26360:18;:41::i;:::-;26352:103;;;;-1:-1:-1;;;26352:103:0;;18420:2:1;26352:103:0;;;18402:21:1;18459:2;18439:18;;;18432:30;18498:34;18478:18;;;18471:62;18569:19;18549:18;;;18542:47;18606:19;;26352:103:0;18218:413:1;26352:103:0;26466:28;26476:4;26482:2;26486:7;26466:9;:28::i;40587:625::-;31821:6;;-1:-1:-1;;;;;31821:6:0;23232:10;31968:23;31960:68;;;;-1:-1:-1;;;31960:68:0;;17657:2:1;31960:68:0;;;17639:21:1;;;17676:18;;;17669:30;17735:34;17715:18;;;17708:62;17787:18;;31960:68:0;17455:356:1;31960:68:0;40694:35;;::::1;40686:101;;;::::0;-1:-1:-1;;;40686:101:0;;14512:2:1;40686:101:0::1;::::0;::::1;14494:21:1::0;14551:2;14531:18;;;14524:30;14590:34;14570:18;;;14563:62;14661:22;14641:18;;;14634:50;14701:19;;40686:101:0::1;14310:416:1::0;40686:101:0::1;40835:7;:14:::0;40796:18:::1;::::0;;40856:82:::1;40868:19:::0;;::::1;40856:82;;;40919:8;;40928:1;40919:11;;;;;;;:::i;:::-;;;;;;;40902:28;;;;;:::i;:::-;::::0;-1:-1:-1;40889:3:0::1;::::0;::::1;:::i;:::-;;;40856:82;;;-1:-1:-1::0;40978:10:0::1;::::0;40953:22:::1;40962:13:::0;40953:6;:22:::1;:::i;:::-;:35;40944:83;;;::::0;-1:-1:-1;;;40944:83:0;;16481:2:1;40944:83:0::1;::::0;::::1;16463:21:1::0;16520:2;16500:18;;;16493:30;16559:34;16539:18;;;16532:62;16630:3;16610:18;;;16603:31;16651:19;;40944:83:0::1;16279:397:1::0;40944:83:0::1;41040:6;41036:171;41048:20:::0;;::::1;41036:171;;;41087:6;41083:117;41099:8;;41108:1;41099:11;;;;;;;:::i;:::-;;;;;;;41095:1;:15;41083:117;;;41127:12;41142:8:::0;::::1;::::0;::::1;:::i;:::-;;;41127:23;;41161:29;41168:9;;41178:1;41168:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;41182:7;41161:5;:29::i;:::-;-1:-1:-1::0;41112:3:0::1;::::0;::::1;:::i;:::-;;;41083:117;;;-1:-1:-1::0;41070:3:0::1;::::0;::::1;:::i;:::-;;;41036:171;;;;40679:533;;40587:625:::0;;;;:::o;41280:79::-;31821:6;;-1:-1:-1;;;;;31821:6:0;23232:10;31968:23;31960:68;;;;-1:-1:-1;;;31960:68:0;;17657:2:1;31960:68:0;;;17639:21:1;;;17676:18;;;17669:30;17735:34;17715:18;;;17708:62;17787:18;;31960:68:0;17455:356:1;31960:68:0;41345:8:::1;::::0;;-1:-1:-1;;41333:20:0;::::1;41345:8;::::0;;::::1;41344:9;41333:20;::::0;;41280:79::o;36508:360::-;36594:13;36616:10;36637:6;36633:170;36649:7;:14;36645:18;;36633:170;;;36690:7;36698:1;36690:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;36681:19:0;;;36690:10;;36681:19;36678:118;;;36725:5;36716;:14;36712:74;;;36751:1;-1:-1:-1;36744:8:0;;-1:-1:-1;36744:8:0;36712:74;36779:7;;;:::i;:::-;;;36712:74;36665:3;;;:::i;:::-;;;36633:170;;;-1:-1:-1;36809:53:0;;-1:-1:-1;;;36809:53:0;;12458:2:1;36809:53:0;;;12440:21:1;12497:2;12477:18;;;12470:30;12536:34;12516:18;;;12509:62;12607:13;12587:18;;;12580:41;12638:19;;36809:53:0;12256:407:1;41552:103:0;31821:6;;-1:-1:-1;;;;;31821:6:0;23232:10;31968:23;31960:68;;;;-1:-1:-1;;;31960:68:0;;17657:2:1;31960:68:0;;;17639:21:1;;;17676:18;;;17669:30;17735:34;17715:18;;;17708:62;17787:18;;31960:68:0;17455:356:1;31960:68:0;41620:13:::1;:29:::0;41552:103::o;26510:184::-;26647:39;26664:4;26670:2;26674:7;26647:39;;;;;;;;;;;;:16;:39::i;37564:312::-;37638:13;37660;37676:20;37687:7;37676:9;:20::i;:::-;37660:36;;37703:20;37738:8;37726:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37726:22:0;;37703:45;;37760:6;37755:96;37772:8;37768:1;:12;37755:96;;;37810:33;37831:7;37840:1;37810:19;:33::i;:::-;37798:6;37805:1;37798:9;;;;;;;;:::i;:::-;;;;;;;;;;:45;37782:3;;;:::i;:::-;;;37755:96;;;-1:-1:-1;37864:6:0;37564:312;-1:-1:-1;;;37564:312:0:o;33567:116::-;31821:6;;-1:-1:-1;;;;;31821:6:0;23232:10;31968:23;31960:68;;;;-1:-1:-1;;;31960:68:0;;17657:2:1;31960:68:0;;;17639:21:1;;;17676:18;;;17669:30;17735:34;17715:18;;;17708:62;17787:18;;31960:68:0;17455:356:1;31960:68:0;-1:-1:-1;;;;;33647:16:0;;;::::1;;::::0;;;:10:::1;:16;::::0;;;;:30;;-1:-1:-1;;33647:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;33567:116::o;35456:250::-;35552:4;35569:6;35565:116;35577:19;;;35565:116;;;35642:7;-1:-1:-1;;;;;35616:33:0;:7;35625:8;;35634:1;35625:11;;;;;;;:::i;:::-;;;;;;;35616:22;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;35616:22:0;:33;35612:61;;35668:5;35661:12;;;;;35612:61;35598:3;;;:::i;:::-;;;35565:116;;;;35696:4;35689:11;;35456:250;;;;;;:::o;36158:177::-;36222:11;36258:13;37457:7;:14;;37371:106;36258:13;36250:5;:21;36242:68;;;;-1:-1:-1;;;36242:68:0;;20381:2:1;36242:68:0;;;20363:21:1;20420:2;20400:18;;;20393:30;20459:34;20439:18;;;20432:62;20530:4;20510:18;;;20503:32;20552:19;;36242:68:0;20179:398:1;36242:68:0;-1:-1:-1;36324:5:0;36158:177::o;39081:410::-;1812:1;2410:7;;:19;;2402:63;;;;-1:-1:-1;;;2402:63:0;;20021:2:1;2402:63:0;;;20003:21:1;20060:2;20040:18;;;20033:30;20099:33;20079:18;;;20072:61;20150:18;;2402:63:0;19819:355:1;2402:63:0;1812:1;2543:7;:18;39165:13:::1;::::0;39146:15:::1;:32;;39138:77;;;::::0;-1:-1:-1;;;39138:77:0;;16883:2:1;39138:77:0::1;::::0;::::1;16865:21:1::0;;;16902:18;;;16895:30;16961:34;16941:18;;;16934:62;17013:18;;39138:77:0::1;16681:356:1::0;39138:77:0::1;39231:33;39253:10;39231:21;:33::i;:::-;39222:89;;;::::0;-1:-1:-1;;;39222:89:0;;18838:2:1;39222:89:0::1;::::0;::::1;18820:21:1::0;18877:2;18857:18;;;18850:30;18916:34;18896:18;;;18889:62;18987:12;18967:18;;;18960:40;19017:19;;39222:89:0::1;18636:406:1::0;39222:89:0::1;39318:11;39332:13;37457:7:::0;:14;;37371:106;39332:13:::1;39318:27;;39369:10;;39360:6;:19;39352:60;;;::::0;-1:-1:-1;;;39352:60:0;;15700:2:1;39352:60:0::1;::::0;::::1;15682:21:1::0;15739:2;15719:18;;;15712:30;15778:29;15758:18;;;15751:57;15825:18;;39352:60:0::1;15498:351:1::0;39352:60:0::1;39433:10;39419:25;::::0;;;:13:::1;:25;::::0;;;;:32;;-1:-1:-1;;39419:32:0::1;39447:4;39419:32;::::0;;39458:27:::1;::::0;39477:6;39458:5:::1;:27::i;:::-;-1:-1:-1::0;1768:1:0;2722:7;:22;39081:410::o;35775:217::-;35838:14;35861:13;35877:7;35885;35877:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;35877:16:0;;-1:-1:-1;35908:19:0;35900:67;;;;-1:-1:-1;;;35900:67:0;;13696:2:1;35900:67:0;;;13678:21:1;13735:2;13715:18;;;13708:30;13774:34;13754:18;;;13747:62;13845:5;13825:18;;;13818:33;13868:19;;35900:67:0;13494:399:1;41726:154:0;31821:6;;-1:-1:-1;;;;;31821:6:0;23232:10;31968:23;31960:68;;;;-1:-1:-1;;;31960:68:0;;17657:2:1;31960:68:0;;;17639:21:1;;;17676:18;;;17669:30;17735:34;17715:18;;;17708:62;17787:18;;31960:68:0;17455:356:1;31960:68:0;41819:24:::1;:15;41837:6:::0;;41819:24:::1;:::i;:::-;-1:-1:-1::0;41850:24:0::1;:15;41868:6:::0;;41850:24:::1;:::i;:::-;;41726:154:::0;;;;:::o;35164:193::-;35230:4;-1:-1:-1;;;;;35251:21:0;;35243:76;;;;-1:-1:-1;;;35243:76:0;;19610:2:1;35243:76:0;;;19592:21:1;19649:2;19629:18;;;19622:30;19688:34;19668:18;;;19661:62;19759:12;19739:18;;;19732:40;19789:19;;35243:76:0;19408:406:1;35243:76:0;-1:-1:-1;;;;;;35333:18:0;;;;;:9;:18;;;;;;;35164:193::o;32399:94::-;31821:6;;-1:-1:-1;;;;;31821:6:0;23232:10;31968:23;31960:68;;;;-1:-1:-1;;;31960:68:0;;17657:2:1;31960:68:0;;;17639:21:1;;;17676:18;;;17669:30;17735:34;17715:18;;;17708:62;17787:18;;31960:68:0;17455:356:1;31960:68:0;32464:21:::1;32482:1;32464:9;:21::i;:::-;32399:94::o:0;39694:809::-;31821:6;;-1:-1:-1;;;;;31821:6:0;23232:10;31968:23;31960:68;;;;-1:-1:-1;;;31960:68:0;;17657:2:1;31960:68:0;;;17639:21:1;;;17676:18;;;17669:30;17735:34;17715:18;;;17708:62;17787:18;;31960:68:0;17455:356:1;31960:68:0;39989:21:::1;40031:42;40087:12;40096:3;39989:21:::0;40087:12:::1;:::i;:::-;:17;::::0;40102:2:::1;40087:17;:::i;:::-;40023:86;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;40124:42:0::1;::::0;-1:-1:-1;40180:12:0::1;::::0;-1:-1:-1;40189:3:0::1;40180:6:::0;:12:::1;:::i;:::-;:17;::::0;40195:2:::1;40180:17;:::i;:::-;40116:86;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;40217:42:0::1;::::0;-1:-1:-1;40273:12:0::1;::::0;-1:-1:-1;40282:3:0::1;40273:6:::0;:12:::1;:::i;:::-;:17;::::0;40288:2:::1;40273:17;:::i;:::-;40209:86;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;40310:42:0::1;::::0;-1:-1:-1;40366:12:0::1;::::0;-1:-1:-1;40375:3:0::1;40366:6:::0;:12:::1;:::i;:::-;:17;::::0;40381:2:::1;40366:17;:::i;:::-;40302:86;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39734:769;39694:809::o:0;41886:76::-;31821:6;;-1:-1:-1;;;;;31821:6:0;23232:10;31968:23;31960:68;;;;-1:-1:-1;;;31960:68:0;;17657:2:1;31960:68:0;;;17639:21:1;;;17676:18;;;17669:30;17735:34;17715:18;;;17708:62;17787:18;;31960:68:0;17455:356:1;31960:68:0;41942:5:::1;:14:::0;41886:76::o;24798:106::-;24856:13;24889:7;24882:14;;;;;:::i;41429:117::-;31821:6;;-1:-1:-1;;;;;31821:6:0;23232:10;31968:23;31960:68;;;;-1:-1:-1;;;31960:68:0;;17657:2:1;31960:68:0;;;17639:21:1;;;17676:18;;;17669:30;17735:34;17715:18;;;17708:62;17787:18;;31960:68:0;17455:356:1;31960:68:0;41510:30:::1;:14;41527:13:::0;;41510:30:::1;:::i;38511:564::-:0;1812:1;2410:7;;:19;;2402:63;;;;-1:-1:-1;;;2402:63:0;;20021:2:1;2402:63:0;;;20003:21:1;20060:2;20040:18;;;20033:30;20099:33;20079:18;;;20072:61;20150:18;;2402:63:0;19819:355:1;2402:63:0;1812:1;2543:7;:18;38606:13:::1;::::0;38587:15:::1;:32;;38579:77;;;::::0;-1:-1:-1;;;38579:77:0;;16883:2:1;38579:77:0::1;::::0;::::1;16865:21:1::0;;;16902:18;;;16895:30;16961:34;16941:18;;;16934:62;17013:18;;38579:77:0::1;16681:356:1::0;38579:77:0::1;38707:7;::::0;38692:10:::1;38682:21;::::0;;;:9:::1;:21;::::0;;;;;38671:32:::1;::::0;:8;:32:::1;:::i;:::-;:43;;38663:88;;;::::0;-1:-1:-1;;;38663:88:0;;19249:2:1;38663:88:0::1;::::0;::::1;19231:21:1::0;;;19268:18;;;19261:30;19327:34;19307:18;;;19300:62;19379:18;;38663:88:0::1;19047:356:1::0;38663:88:0::1;38788:8;38780:5;;:16;;;;:::i;:::-;38767:9;:29;;38758:76;;;::::0;-1:-1:-1;;;38758:76:0;;12056:2:1;38758:76:0::1;::::0;::::1;12038:21:1::0;12095:2;12075:18;;;12068:30;12134:34;12114:18;;;12107:62;12205:3;12185:18;;;12178:31;12226:19;;38758:76:0::1;11854:397:1::0;38758:76:0::1;38841:11;38855:13;37457:7:::0;:14;;37371:106;38855:13:::1;38904:10;::::0;38841:27;;-1:-1:-1;38883:17:0::1;38892:8:::0;38841:27;38883:17:::1;:::i;:::-;:31;;38875:72;;;::::0;-1:-1:-1;;;38875:72:0;;15700:2:1;38875:72:0::1;::::0;::::1;15682:21:1::0;15739:2;15719:18;;;15712:30;15778:29;15758:18;;;15751:57;15825:18;;38875:72:0::1;15498:351:1::0;38875:72:0::1;38958:6;38954:76;38970:8;38966:1;:12;38954:76;;;38993:29;39000:10;39012:8:::0;::::1;::::0;::::1;:::i;:::-;;;38993:5;:29::i;:::-;38980:3;::::0;::::1;:::i;:::-;;;38954:76;;;-1:-1:-1::0;39046:10:0::1;39036:21;::::0;;;:9:::1;:21;::::0;;;;:33;;39061:8;;39036:21;:33:::1;::::0;39061:8;;39036:33:::1;:::i;:::-;::::0;;;-1:-1:-1;;1768:1:0;2722:7;:22;-1:-1:-1;;38511:564:0:o;25865:295::-;-1:-1:-1;;;;;25970:24:0;;23232:10;25970:24;;25962:62;;;;-1:-1:-1;;;25962:62:0;;14933:2:1;25962:62:0;;;14915:21:1;14972:2;14952:18;;;14945:30;15011:27;14991:18;;;14984:55;15056:18;;25962:62:0;14731:349:1;25962:62:0;23232:10;26035:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;26035:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;26035:53:0;;;;;;;;;;26104:48;;11578:41:1;;;26035:42:0;;23232:10;26104:48;;11551:18:1;26104:48:0;;;;;;;25865:295;;:::o;30155:245::-;30285:6;30281:112;30293:19;;;30281:112;;;30334:47;30352:4;30358:2;30362:8;;30371:1;30362:11;;;;;;;:::i;:::-;;;;;;;30375:4;;30334:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30334:16:0;;-1:-1:-1;;;30334:47:0:i;:::-;30314:3;;;:::i;:::-;;;30281:112;;26702:325;26874:41;23232:10;26907:7;26874:18;:41::i;:::-;26866:103;;;;-1:-1:-1;;;26866:103:0;;18420:2:1;26866:103:0;;;18402:21:1;18459:2;18439:18;;;18432:30;18498:34;18478:18;;;18471:62;18569:19;18549:18;;;18542:47;18606:19;;26866:103:0;18218:413:1;26866:103:0;26980:39;26994:4;27000:2;27004:7;27013:5;26980:13;:39::i;37941:192::-;-1:-1:-1;;;;;38031:22:0;;38011:4;38031:22;;;:13;:22;;;;;;;;38030:23;:95;;;;-1:-1:-1;38058:10:0;;:34;;;;;-1:-1:-1;;;;;10218:55:1;;;38058:34:0;;;10200:74:1;38095:1:0;;38058:10;;:25;;10173:18:1;;38058:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;:66;;;-1:-1:-1;38100:10:0;;:24;;;;;-1:-1:-1;;;;;10218:55:1;;;38100:24:0;;;10200:74:1;38100:10:0;;;;:15;;10173:18:1;;38100:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;36963:322::-;37027:13;37057:16;37065:7;37057;:16::i;:::-;37049:68;;;;-1:-1:-1;;;37049:68:0;;20784:2:1;37049:68:0;;;20766:21:1;20823:2;20803:18;;;20796:30;20862:34;20842:18;;;20835:62;20933:9;20913:18;;;20906:37;20960:19;;37049:68:0;20582:403:1;37049:68:0;37129:8;;;;37126:62;;37166:14;37159:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36963:322;;;:::o;37126:62::-;37225:15;37242:18;:7;:16;:18::i;:::-;37262:15;37208:70;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37194:85;;36963:322;;;:::o;33689:161::-;31821:6;;-1:-1:-1;;;;;31821:6:0;23232:10;31968:23;31960:68;;;;-1:-1:-1;;;31960:68:0;;17657:2:1;31960:68:0;;;17639:21:1;;;17676:18;;;17669:30;17735:34;17715:18;;;17708:62;17787:18;;31960:68:0;17455:356:1;31960:68:0;-1:-1:-1;;;;;33775:20:0;::::1;;::::0;;;:10:::1;:20;::::0;;;;:27;;-1:-1:-1;;33775:27:0::1;33798:4;33775:27;::::0;;33809:35:::1;33786:8:::0;33809:23:::1;:35::i;:::-;33689:161:::0;:::o;34538:24::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34538:24:0;;-1:-1:-1;34538:24:0;:::o;24485:305::-;24587:4;24624:40;;;24639:25;24624:40;;:105;;-1:-1:-1;24681:48:0;;;24696:33;24681:48;24624:105;:158;;;-1:-1:-1;16045:25:0;16030:40;;;;24746:36;15921:157;42420:147;42513:7;:14;42483:4;;42503:24;;:58;;;;;42559:1;-1:-1:-1;;;;;42531:30:0;:7;42539;42531:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;42531:16:0;:30;;42496:65;42420:147;-1:-1:-1;;42420:147:0:o;27053:164::-;27125:24;;;;:15;:24;;;;;:29;;;;-1:-1:-1;;;;;27125:29:0;;;;;;;;:24;;27179:16;27125:24;27179:7;:16::i;:::-;-1:-1:-1;;;;;27170:39:0;;;;;;;;;;;27053:164;;:::o;28105:338::-;28195:4;28220:16;28228:7;28220;:16::i;:::-;28212:73;;;;-1:-1:-1;;;28212:73:0;;15287:2:1;28212:73:0;;;15269:21:1;15326:2;15306:18;;;15299:30;15365:34;15345:18;;;15338:62;15436:14;15416:18;;;15409:42;15468:19;;28212:73:0;15085:408:1;28212:73:0;28296:13;28312:16;28320:7;28312;:16::i;:::-;28296:32;;28358:5;-1:-1:-1;;;;;28347:16:0;:7;-1:-1:-1;;;;;28347:16:0;;:51;;;;28391:7;-1:-1:-1;;;;;28367:31:0;:20;28379:7;28367:11;:20::i;:::-;-1:-1:-1;;;;;28367:31:0;;28347:51;:87;;;-1:-1:-1;;;;;;25814:25:0;;;25790:4;25814:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;28402:32;28339:96;28105:338;-1:-1:-1;;;;28105:338:0:o;42861:362::-;42973:4;-1:-1:-1;;;;;42953:24:0;:7;42961;42953:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;42953:16:0;:24;42945:80;;;;-1:-1:-1;;;42945:80:0;;14100:2:1;42945:80:0;;;14082:21:1;14139:2;14119:18;;;14112:30;14178:34;14158:18;;;14151:62;14249:13;14229:18;;;14222:41;14280:19;;42945:80:0;13898:407:1;42945:80:0;43082:29;43099:1;43103:7;43082:8;:29::i;:::-;43118:30;43139:4;43145:2;43118:20;:30::i;:::-;43176:2;43157:7;43165;43157:16;;;;;;;;:::i;:::-;;;;;;;;;:21;;;;-1:-1:-1;;;;;43157:21:0;;;;;;43190:27;;43209:7;;43190:27;;;;;;;;;;43157:16;43190:27;42861:362;;;:::o;42632:167::-;42689:36;42718:1;42722:2;42689:20;:36::i;:::-;42732:7;:16;;;;;;;-1:-1:-1;42732:16:0;;;;;;;;;-1:-1:-1;;;;;42732:16:0;;;;;;;;42760:33;;42785:7;;-1:-1:-1;42760:33:0;;-1:-1:-1;;42760:33:0;42632:167;;:::o;32848:173::-;32923:6;;;-1:-1:-1;;;;;32940:17:0;;;;;;;;;;;32973:40;;32923:6;;;32940:17;32923:6;;32973:40;;32904:16;;32973:40;32893:128;32848:173;:::o;28451:312::-;28605:28;28615:4;28621:2;28625:7;28605:9;:28::i;:::-;28652:48;28675:4;28681:2;28685:7;28694:5;28652:22;:48::i;:::-;28644:111;;;;-1:-1:-1;;;28644:111:0;;12870:2:1;28644:111:0;;;12852:21:1;12909:2;12889:18;;;12882:30;12948:34;12928:18;;;12921:62;13019:20;12999:18;;;12992:48;13057:19;;28644:111:0;12668:414:1;3124:723:0;3180:13;3401:10;3397:53;;-1:-1:-1;;3428:10:0;;;;;;;;;;;;;;;;;;3124:723::o;3397:53::-;3475:5;3460:12;3516:78;3523:9;;3516:78;;3549:8;;;;:::i;:::-;;-1:-1:-1;3572:10:0;;-1:-1:-1;3580:2:0;3572:10;;:::i;:::-;;;3516:78;;;3604:19;3636:6;3626:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3626:17:0;;3604:39;;3654:154;3661:10;;3654:154;;3688:11;3698:1;3688:11;;:::i;:::-;;-1:-1:-1;3757:10:0;3765:2;3757:5;:10;:::i;:::-;3744:24;;:2;:24;:::i;:::-;3731:39;;3714:6;3721;3714:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;3785:11:0;3794:2;3785:11;;:::i;:::-;;;3654:154;;32648:192;31821:6;;-1:-1:-1;;;;;31821:6:0;23232:10;31968:23;31960:68;;;;-1:-1:-1;;;31960:68:0;;17657:2:1;31960:68:0;;;17639:21:1;;;17676:18;;;17669:30;17735:34;17715:18;;;17708:62;17787:18;;31960:68:0;17455:356:1;31960:68:0;-1:-1:-1;;;;;32737:22:0;::::1;32729:73;;;::::0;-1:-1:-1;;;32729:73:0;;13289:2:1;32729:73:0::1;::::0;::::1;13271:21:1::0;13328:2;13308:18;;;13301:30;13367:34;13347:18;;;13340:62;13438:8;13418:18;;;13411:36;13464:19;;32729:73:0::1;13087:402:1::0;32729:73:0::1;32813:19;32823:8;32813:9;:19::i;42173:185::-:0;-1:-1:-1;;;;;42249:18:0;;;42245:51;;-1:-1:-1;;;;;42279:17:0;;;;;;:9;:17;;;;;42277:19;;42279:17;;;42277:19;;;:::i;:::-;;;;-1:-1:-1;42245:51:0;-1:-1:-1;;;;;42309:16:0;;;42305:47;;-1:-1:-1;;;;;42337:15:0;;;;;;:9;:15;;;;;42335:17;;42337:15;;;42335:17;;;:::i;:::-;;;;-1:-1:-1;42305:47:0;42173:185;;:::o;27225:796::-;27377:4;-1:-1:-1;;;;;27398:13:0;;6369:20;6417:8;27394:620;;27434:72;;;;;-1:-1:-1;;;;;27434:36:0;;;;;:72;;23232:10;;27485:4;;27491:7;;27500:5;;27434:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27434:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;27430:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27676:13:0;;27672:272;;27719:60;;-1:-1:-1;;;27719:60:0;;12870:2:1;27719:60:0;;;12852:21:1;12909:2;12889:18;;;12882:30;12948:34;12928:18;;;12921:62;13019:20;12999:18;;;12992:48;13057:19;;27719:60:0;12668:414:1;27672:272:0;27894:6;27888:13;27879:6;27875:2;27871:15;27864:38;27430:529;27557:51;;27567:41;27557:51;;-1:-1:-1;27550:58:0;;27394:620;-1:-1:-1;27998:4:0;27225:796;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:196:1;82:20;;-1:-1:-1;;;;;131:54:1;;121:65;;111:93;;200:1;197;190:12;215:367;278:8;288:6;342:3;335:4;327:6;323:17;319:27;309:55;;360:1;357;350:12;309:55;-1:-1:-1;383:20:1;;426:18;415:30;;412:50;;;458:1;455;448:12;412:50;495:4;487:6;483:17;471:29;;555:3;548:4;538:6;535:1;531:14;523:6;519:27;515:38;512:47;509:67;;;572:1;569;562:12;509:67;215:367;;;;;:::o;587:347::-;638:8;648:6;702:3;695:4;687:6;683:17;679:27;669:55;;720:1;717;710:12;669:55;-1:-1:-1;743:20:1;;786:18;775:30;;772:50;;;818:1;815;808:12;772:50;855:4;847:6;843:17;831:29;;907:3;900:4;891:6;883;879:19;875:30;872:39;869:59;;;924:1;921;914:12;939:186;998:6;1051:2;1039:9;1030:7;1026:23;1022:32;1019:52;;;1067:1;1064;1057:12;1019:52;1090:29;1109:9;1090:29;:::i;1130:260::-;1198:6;1206;1259:2;1247:9;1238:7;1234:23;1230:32;1227:52;;;1275:1;1272;1265:12;1227:52;1298:29;1317:9;1298:29;:::i;:::-;1288:39;;1346:38;1380:2;1369:9;1365:18;1346:38;:::i;:::-;1336:48;;1130:260;;;;;:::o;1395:894::-;1519:6;1527;1535;1543;1551;1559;1612:3;1600:9;1591:7;1587:23;1583:33;1580:53;;;1629:1;1626;1619:12;1580:53;1652:29;1671:9;1652:29;:::i;:::-;1642:39;;1700:38;1734:2;1723:9;1719:18;1700:38;:::i;:::-;1690:48;;1789:2;1778:9;1774:18;1761:32;1812:18;1853:2;1845:6;1842:14;1839:34;;;1869:1;1866;1859:12;1839:34;1908:70;1970:7;1961:6;1950:9;1946:22;1908:70;:::i;:::-;1997:8;;-1:-1:-1;1882:96:1;-1:-1:-1;2085:2:1;2070:18;;2057:32;;-1:-1:-1;2101:16:1;;;2098:36;;;2130:1;2127;2120:12;2098:36;;2169:60;2221:7;2210:8;2199:9;2195:24;2169:60;:::i;:::-;1395:894;;;;-1:-1:-1;1395:894:1;;-1:-1:-1;1395:894:1;;2248:8;;1395:894;-1:-1:-1;;;1395:894:1:o;2294:328::-;2371:6;2379;2387;2440:2;2428:9;2419:7;2415:23;2411:32;2408:52;;;2456:1;2453;2446:12;2408:52;2479:29;2498:9;2479:29;:::i;:::-;2469:39;;2527:38;2561:2;2550:9;2546:18;2527:38;:::i;:::-;2517:48;;2612:2;2601:9;2597:18;2584:32;2574:42;;2294:328;;;;;:::o;2627:1197::-;2722:6;2730;2738;2746;2799:3;2787:9;2778:7;2774:23;2770:33;2767:53;;;2816:1;2813;2806:12;2767:53;2839:29;2858:9;2839:29;:::i;:::-;2829:39;;2887:38;2921:2;2910:9;2906:18;2887:38;:::i;:::-;2877:48;;2972:2;2961:9;2957:18;2944:32;2934:42;;3027:2;3016:9;3012:18;2999:32;3050:18;3091:2;3083:6;3080:14;3077:34;;;3107:1;3104;3097:12;3077:34;3145:6;3134:9;3130:22;3120:32;;3190:7;3183:4;3179:2;3175:13;3171:27;3161:55;;3212:1;3209;3202:12;3161:55;3248:2;3235:16;3270:2;3266;3263:10;3260:36;;;3276:18;;:::i;:::-;3410:2;3404:9;3472:4;3464:13;;3315:66;3460:22;;;3484:2;3456:31;3452:40;3440:53;;;3508:18;;;3528:22;;;3505:46;3502:72;;;3554:18;;:::i;:::-;3594:10;3590:2;3583:22;3629:2;3621:6;3614:18;3669:7;3664:2;3659;3655;3651:11;3647:20;3644:33;3641:53;;;3690:1;3687;3680:12;3641:53;3746:2;3741;3737;3733:11;3728:2;3720:6;3716:15;3703:46;3791:1;3786:2;3781;3773:6;3769:15;3765:24;3758:35;3812:6;3802:16;;;;;;;2627:1197;;;;;;;:::o;3829:511::-;3924:6;3932;3940;3993:2;3981:9;3972:7;3968:23;3964:32;3961:52;;;4009:1;4006;3999:12;3961:52;4032:29;4051:9;4032:29;:::i;:::-;4022:39;;4112:2;4101:9;4097:18;4084:32;4139:18;4131:6;4128:30;4125:50;;;4171:1;4168;4161:12;4125:50;4210:70;4272:7;4263:6;4252:9;4248:22;4210:70;:::i;:::-;3829:511;;4299:8;;-1:-1:-1;4184:96:1;;-1:-1:-1;;;;3829:511:1:o;4345:315::-;4410:6;4418;4471:2;4459:9;4450:7;4446:23;4442:32;4439:52;;;4487:1;4484;4477:12;4439:52;4510:29;4529:9;4510:29;:::i;:::-;4500:39;;4589:2;4578:9;4574:18;4561:32;4602:28;4624:5;4602:28;:::i;:::-;4649:5;4639:15;;;4345:315;;;;;:::o;4665:254::-;4733:6;4741;4794:2;4782:9;4773:7;4769:23;4765:32;4762:52;;;4810:1;4807;4800:12;4762:52;4833:29;4852:9;4833:29;:::i;:::-;4823:39;4909:2;4894:18;;;;4881:32;;-1:-1:-1;;;4665:254:1:o;4924:773::-;5046:6;5054;5062;5070;5123:2;5111:9;5102:7;5098:23;5094:32;5091:52;;;5139:1;5136;5129:12;5091:52;5179:9;5166:23;5208:18;5249:2;5241:6;5238:14;5235:34;;;5265:1;5262;5255:12;5235:34;5304:70;5366:7;5357:6;5346:9;5342:22;5304:70;:::i;:::-;5393:8;;-1:-1:-1;5278:96:1;-1:-1:-1;5481:2:1;5466:18;;5453:32;;-1:-1:-1;5497:16:1;;;5494:36;;;5526:1;5523;5516:12;5494:36;;5565:72;5629:7;5618:8;5607:9;5603:24;5565:72;:::i;:::-;4924:773;;;;-1:-1:-1;5656:8:1;-1:-1:-1;;;;4924:773:1:o;5702:245::-;5769:6;5822:2;5810:9;5801:7;5797:23;5793:32;5790:52;;;5838:1;5835;5828:12;5790:52;5870:9;5864:16;5889:28;5911:5;5889:28;:::i;5952:245::-;6010:6;6063:2;6051:9;6042:7;6038:23;6034:32;6031:52;;;6079:1;6076;6069:12;6031:52;6118:9;6105:23;6137:30;6161:5;6137:30;:::i;6202:249::-;6271:6;6324:2;6312:9;6303:7;6299:23;6295:32;6292:52;;;6340:1;6337;6330:12;6292:52;6372:9;6366:16;6391:30;6415:5;6391:30;:::i;6456:410::-;6527:6;6535;6588:2;6576:9;6567:7;6563:23;6559:32;6556:52;;;6604:1;6601;6594:12;6556:52;6644:9;6631:23;6677:18;6669:6;6666:30;6663:50;;;6709:1;6706;6699:12;6663:50;6748:58;6798:7;6789:6;6778:9;6774:22;6748:58;:::i;:::-;6825:8;;6722:84;;-1:-1:-1;6456:410:1;-1:-1:-1;;;;6456:410:1:o;6871:719::-;6963:6;6971;6979;6987;7040:2;7028:9;7019:7;7015:23;7011:32;7008:52;;;7056:1;7053;7046:12;7008:52;7096:9;7083:23;7125:18;7166:2;7158:6;7155:14;7152:34;;;7182:1;7179;7172:12;7152:34;7221:58;7271:7;7262:6;7251:9;7247:22;7221:58;:::i;:::-;7298:8;;-1:-1:-1;7195:84:1;-1:-1:-1;7386:2:1;7371:18;;7358:32;;-1:-1:-1;7402:16:1;;;7399:36;;;7431:1;7428;7421:12;7399:36;;7470:60;7522:7;7511:8;7500:9;7496:24;7470:60;:::i;7595:180::-;7654:6;7707:2;7695:9;7686:7;7682:23;7678:32;7675:52;;;7723:1;7720;7713:12;7675:52;-1:-1:-1;7746:23:1;;7595:180;-1:-1:-1;7595:180:1:o;7780:184::-;7850:6;7903:2;7891:9;7882:7;7878:23;7874:32;7871:52;;;7919:1;7916;7909:12;7871:52;-1:-1:-1;7942:16:1;;7780:184;-1:-1:-1;7780:184:1:o;7969:316::-;8010:3;8048:5;8042:12;8075:6;8070:3;8063:19;8091:63;8147:6;8140:4;8135:3;8131:14;8124:4;8117:5;8113:16;8091:63;:::i;:::-;8199:2;8187:15;8204:66;8183:88;8174:98;;;;8274:4;8170:109;;7969:316;-1:-1:-1;;7969:316:1:o;8290:1088::-;8375:12;;8340:3;;8430:1;8450:18;;;;8503;;;;8530:61;;8584:4;8576:6;8572:17;8562:27;;8530:61;8610:2;8658;8650:6;8647:14;8627:18;8624:38;8621:218;;;8695:77;8692:1;8685:88;8796:4;8793:1;8786:15;8824:4;8821:1;8814:15;8621:218;8855:18;8882:162;;;;9058:1;9053:319;;;;8848:524;;8882:162;-1:-1:-1;;8919:9:1;8915:82;8910:3;8903:95;9027:6;9022:3;9018:16;9011:23;;8882:162;;9053:319;21245:1;21238:14;;;21282:4;21269:18;;9147:1;9161:165;9175:6;9172:1;9169:13;9161:165;;;9253:14;;9240:11;;;9233:35;9296:16;;;;9190:10;;9161:165;;;9165:3;;9355:6;9350:3;9346:16;9339:23;;8848:524;;;;;;;8290:1088;;;;:::o;9383:456::-;9604:3;9632:38;9666:3;9658:6;9632:38;:::i;:::-;9699:6;9693:13;9715:52;9760:6;9756:2;9749:4;9741:6;9737:17;9715:52;:::i;:::-;9783:50;9825:6;9821:2;9817:15;9809:6;9783:50;:::i;:::-;9776:57;9383:456;-1:-1:-1;;;;;;;9383:456:1:o;10285:511::-;10479:4;-1:-1:-1;;;;;10589:2:1;10581:6;10577:15;10566:9;10559:34;10641:2;10633:6;10629:15;10624:2;10613:9;10609:18;10602:43;;10681:6;10676:2;10665:9;10661:18;10654:34;10724:3;10719:2;10708:9;10704:18;10697:31;10745:45;10785:3;10774:9;10770:19;10762:6;10745:45;:::i;:::-;10737:53;10285:511;-1:-1:-1;;;;;;10285:511:1:o;10801:632::-;10972:2;11024:21;;;11094:13;;10997:18;;;11116:22;;;10943:4;;10972:2;11195:15;;;;11169:2;11154:18;;;10943:4;11238:169;11252:6;11249:1;11246:13;11238:169;;;11313:13;;11301:26;;11382:15;;;;11347:12;;;;11274:1;11267:9;11238:169;;;-1:-1:-1;11424:3:1;;10801:632;-1:-1:-1;;;;;;10801:632:1:o;11630:219::-;11779:2;11768:9;11761:21;11742:4;11799:44;11839:2;11828:9;11824:18;11816:6;11799:44;:::i;21298:128::-;21338:3;21369:1;21365:6;21362:1;21359:13;21356:39;;;21375:18;;:::i;:::-;-1:-1:-1;21411:9:1;;21298:128::o;21431:120::-;21471:1;21497;21487:35;;21502:18;;:::i;:::-;-1:-1:-1;21536:9:1;;21431:120::o;21556:228::-;21596:7;21722:1;21654:66;21650:74;21647:1;21644:81;21639:1;21632:9;21625:17;21621:105;21618:131;;;21729:18;;:::i;:::-;-1:-1:-1;21769:9:1;;21556:228::o;21789:125::-;21829:4;21857:1;21854;21851:8;21848:34;;;21862:18;;:::i;:::-;-1:-1:-1;21899:9:1;;21789:125::o;21919:258::-;21991:1;22001:113;22015:6;22012:1;22009:13;22001:113;;;22091:11;;;22085:18;22072:11;;;22065:39;22037:2;22030:10;22001:113;;;22132:6;22129:1;22126:13;22123:48;;;-1:-1:-1;;22167:1:1;22149:16;;22142:27;21919:258::o;22182:196::-;22221:3;22249:5;22239:39;;22258:18;;:::i;:::-;-1:-1:-1;22305:66:1;22294:78;;22182:196::o;22383:437::-;22462:1;22458:12;;;;22505;;;22526:61;;22580:4;22572:6;22568:17;22558:27;;22526:61;22633:2;22625:6;22622:14;22602:18;22599:38;22596:218;;;22670:77;22667:1;22660:88;22771:4;22768:1;22761:15;22799:4;22796:1;22789:15;22596:218;;22383:437;;;:::o;22825:195::-;22864:3;22895:66;22888:5;22885:77;22882:103;;;22965:18;;:::i;:::-;-1:-1:-1;23012:1:1;23001:13;;22825:195::o;23025:112::-;23057:1;23083;23073:35;;23088:18;;:::i;:::-;-1:-1:-1;23122:9:1;;23025:112::o;23142:184::-;23194:77;23191:1;23184:88;23291:4;23288:1;23281:15;23315:4;23312:1;23305:15;23331:184;23383:77;23380:1;23373:88;23480:4;23477:1;23470:15;23504:4;23501:1;23494:15;23520:184;23572:77;23569:1;23562:88;23669:4;23666:1;23659:15;23693:4;23690:1;23683:15;23709:184;23761:77;23758:1;23751:88;23858:4;23855:1;23848:15;23882:4;23879:1;23872:15;23898:118;23984:5;23977:13;23970:21;23963:5;23960:32;23950:60;;24006:1;24003;23996:12;24021:177;24106:66;24099:5;24095:78;24088:5;24085:89;24075:117;;24188:1;24185;24178:12

Swarm Source

ipfs://e1ed29c10fa9a7f610fea00c6e70bed89470827e781d39820a81609348d318fb
Loading...
Loading
Loading...
Loading
[ 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.