ETH Price: $2,283.27 (-3.77%)

Token

Nanokoverse (NANOKO)
 

Overview

Max Total Supply

78 NANOKO

Holders

33

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
agiao.eth
Balance
3 NANOKO
0xbb6bfe5568ca7e6e34bef93f7772ab2333addf70
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

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-15
*/

// 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.sol





pragma solidity ^0.8.0;

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





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


  bool public revealed = false;
  string public notRevealedUri = "";

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

  bool public isMintActive = false;
  bool public isWhitelistMintActive = false;

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

  constructor()
    ERC721T("Nanokoverse", "NANOKO"){
  }

//-------------------------------------------------------------------------------------------
//  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) external 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 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(isMintActive, "Nanoko: Minting needs to be enabled");
    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 whitelistMint(uint quantity) external payable nonReentrant {
    require(isWhitelistMintActive, "Nanoko: Whitelist needs to be enabled");
    require(quantity <= whitelistCount[msg.sender],"Nanoko: You do not have enough whitelist access");
    uint price = isOG[msg.sender] ? 0.05 ether : 0.07 ether;
    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++ );
    }

    whitelistCount[msg.sender] -= quantity;
  }

//-------------------------------------------------------------------------------------------
//  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/Delegate sets holder list and access list.
  */
  function setWhitelistCount(address[] calldata accounts, uint[] calldata quantities) external onlyOwner{
    require(accounts.length == quantities.length);
    for(uint i; i < accounts.length; ++i){
      whitelistCount[ accounts[i] ] = quantities[i];
    }
  }

  function setOGList(address[] calldata accounts) external onlyOwner{
    for(uint i; i < accounts.length; ++i){
      isOG[ accounts[i] ] = true;
    }
  }

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

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

/**
  * @dev Owner/Delegate flip the Minting flag.
  */
  function flipMintState() external onlyDelegates {
    isMintActive = !isMintActive;
  }

  function flipWhitelistState() external onlyDelegates{
    isWhitelistMintActive = !isWhitelistMintActive;
  }

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


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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"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":"flipMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipRevealState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipWhitelistState","outputs":[],"stateMutability":"nonpayable","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":[],"name":"isMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isOG","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":[],"name":"isWhitelistMintActive","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":"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":"address[]","name":"accounts","type":"address[]"}],"name":"setOGList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"notRevealUri_","type":"string"}],"name":"setUnrevealURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"quantities","type":"uint256[]"}],"name":"setWhitelistCount","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":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6007805460ff1916905560a06040819052600060808190526200002591600891620001ac565b50611e6160095567016345785d8a0000600a556005600b819055600d805461ffff191690556040805180820190915281815264173539b7b760d91b6020909101908152620000779160139190620001ac565b503480156200008557600080fd5b50604080518082018252600b81526a4e616e6f6b6f766572736560a81b6020808301918252835180850190945260068452654e414e4f4b4f60d01b908401528151919291620000d791600091620001ac565b508051620000ed906001906020840190620001ac565b5050506200010a620001046200015660201b60201c565b6200015a565b600160056000620001236004546001600160a01b031690565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905560016006556200028f565b3390565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001ba9062000252565b90600052602060002090601f016020900481019282620001de576000855562000229565b82601f10620001f957805160ff191683800117855562000229565b8280016001018555821562000229579182015b82811115620002295782518255916020019190600101906200020c565b50620002379291506200023b565b5090565b5b808211156200023757600081556001016200023c565b600181811c908216806200026757607f821691505b602082108114156200028957634e487b7160e01b600052602260045260246000fd5b50919050565b61374f806200029f6000396000f3fe6080604052600436106103085760003560e01c80636790a9de1161019a578063a22cb465116100e1578063e985e9c51161008a578063f6fa26ab11610064578063f6fa26ab14610888578063fa72de451461089d578063fabd1d2d146108bd57600080fd5b8063e985e9c5146107f2578063ed9ec8881461083b578063f2fde38b1461086857600080fd5b8063c83271f5116100bb578063c83271f514610775578063c87b56dd146107a5578063def87272146107c557600080fd5b8063a22cb46514610715578063b534a5c414610735578063b88d4fde1461075557600080fd5b80638d859f3e1161014357806397bc411c1161011d57806397bc411c146106c25780639a882570146106e2578063a0712d681461070257600080fd5b80638d859f3e146106795780638da5cb5b1461068f57806395d89b41146106ad57600080fd5b806372b0f6261161017457806372b0f62614610631578063853828b614610651578063868ff4a21461066657600080fd5b80636790a9de146105dc57806370a08231146105fc578063715018a61461061c57600080fd5b80632714ce921161025e5780634d44660c1161020757806359c74f29116101e157806359c74f291461058d5780635b92ac0d146105a25780636352211e146105bc57600080fd5b80634d44660c146105335780634f6ccce714610553578063518302271461057357600080fd5b806342842e0e1161023857806342842e0e146104c6578063438b6300146104e65780634a994eef1461051357600080fd5b80632714ce921461047b5780632f745c591461049057806332cb6b0c146104b057600080fd5b8063095ea7b3116102c0578063229688851161029a578063229688851461042857806323b872dd1461043b5780632533c7cd1461045b57600080fd5b8063095ea7b3146103d157806318160ddd146103f35780631c96cae91461041257600080fd5b806307779627116102f15780630777962714610364578063081812fc14610384578063081c8c44146103bc57600080fd5b806301ffc9a71461030d57806306fdde0314610342575b600080fd5b34801561031957600080fd5b5061032d610328366004613201565b6108dc565b60405190151581526020015b60405180910390f35b34801561034e57600080fd5b50610357610938565b604051610339919061349a565b34801561037057600080fd5b5061032d61037f366004612e85565b6109ca565b34801561039057600080fd5b506103a461039f3660046132d1565b610a4f565b6040516001600160a01b039091168152602001610339565b3480156103c857600080fd5b50610357610ae8565b3480156103dd57600080fd5b506103f16103ec366004613129565b610b76565b005b3480156103ff57600080fd5b50600c545b604051908152602001610339565b34801561041e57600080fd5b50610404600b5481565b34801561043457600080fd5b5047610404565b34801561044757600080fd5b506103f1610456366004612f64565b610ca8565b34801561046757600080fd5b506103f1610476366004613195565b610d2f565b34801561048757600080fd5b506103f1610f5e565b34801561049c57600080fd5b506104046104ab366004613129565b610fd1565b3480156104bc57600080fd5b5061040460095481565b3480156104d257600080fd5b506103f16104e1366004612f64565b6110af565b3480156104f257600080fd5b50610506610501366004612e85565b6110ca565b6040516103399190613456565b34801561051f57600080fd5b506103f161052e3660046130ed565b61116a565b34801561053f57600080fd5b5061032d61054e36600461309a565b6111ef565b34801561055f57600080fd5b5061040461056e3660046132d1565b611271565b34801561057f57600080fd5b5060075461032d9060ff1681565b34801561059957600080fd5b506103f16112f4565b3480156105ae57600080fd5b50600d5461032d9060ff1681565b3480156105c857600080fd5b506103a46105d73660046132d1565b611367565b3480156105e857600080fd5b506103f16105f7366004613271565b611407565b34801561060857600080fd5b50610404610617366004612e85565b611486565b34801561062857600080fd5b506103f1611520565b34801561063d57600080fd5b506103f161064c366004613195565b611586565b34801561065d57600080fd5b506103f1611665565b6103f16106743660046132d1565b611885565b34801561068557600080fd5b50610404600a5481565b34801561069b57600080fd5b506004546001600160a01b03166103a4565b3480156106b957600080fd5b50610357611b5e565b3480156106ce57600080fd5b506103f16106dd36600461323b565b611b6d565b3480156106ee57600080fd5b506103f16106fd366004613153565b611bd8565b6103f16107103660046132d1565b611ca2565b34801561072157600080fd5b506103f16107303660046130ed565b611f20565b34801561074157600080fd5b506103f1610750366004612ed3565b611fe5565b34801561076157600080fd5b506103f1610770366004612fa0565b61205a565b34801561078157600080fd5b5061032d610790366004612e85565b60116020526000908152604090205460ff1681565b3480156107b157600080fd5b506103576107c03660046132d1565b6120e2565b3480156107d157600080fd5b506104046107e0366004612e85565b600e6020526000908152604090205481565b3480156107fe57600080fd5b5061032d61080d366004612ea0565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205460ff1690565b34801561084757600080fd5b50610404610856366004612e85565b60106020526000908152604090205481565b34801561087457600080fd5b506103f1610883366004612e85565b612230565b34801561089457600080fd5b506103f16122b9565b3480156108a957600080fd5b506103a46108b83660046132d1565b612352565b3480156108c957600080fd5b50600d5461032d90610100900460ff1681565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d6300000000000000000000000000000000000000000000000000000000148061093257506109328261237c565b92915050565b6060600080546109479061358e565b80601f01602080910402602001604051908101604052809291908181526020018280546109739061358e565b80156109c05780601f10610995576101008083540402835291602001916109c0565b820191906000526020600020905b8154815290600101906020018083116109a357829003601f168201915b5050505050905090565b6004546000906001600160a01b03163314610a2c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b506001600160a01b03811660009081526005602052604090205460ff165b919050565b6000610a5a8261245f565b610acc5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610a23565b506000908152600260205260409020546001600160a01b031690565b60088054610af59061358e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b219061358e565b8015610b6e5780601f10610b4357610100808354040283529160200191610b6e565b820191906000526020600020905b815481529060010190602001808311610b5157829003601f168201915b505050505081565b6000610b8182611367565b9050806001600160a01b0316836001600160a01b03161415610c0b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610a23565b336001600160a01b0382161480610c275750610c27813361080d565b610c995760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a23565b610ca383836124a9565b505050565b610cb2338261252f565b610d245760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a23565b610ca383838361262a565b6004546001600160a01b03163314610d895760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a23565b828114610dfe5760405162461bcd60e51b815260206004820152603460248201527f4e616e6f6b6f3a204d7573742070726f7669646520657175616c207175616e7460448201527f697469657320616e6420726563697069656e74730000000000000000000000006064820152608401610a23565b600c54600090815b85811015610e4457868682818110610e2057610e2061368d565b9050602002013583610e3291906134ad565b9250610e3d816135e2565b9050610e06565b50600954610e5283836134ad565b10610ec55760405162461bcd60e51b815260206004820152602160248201527f4e616e6f6b6f3a204d696e742f6f72646572206578636565647320737570706c60448201527f79000000000000000000000000000000000000000000000000000000000000006064820152608401610a23565b60005b83811015610f555760005b878783818110610ee557610ee561368d565b90506020020135811015610f4457600083610eff816135e2565b94509050610f33878785818110610f1857610f1861368d565b9050602002016020810190610f2d9190612e85565b8261276a565b50610f3d816135e2565b9050610ed3565b50610f4e816135e2565b9050610ec8565b50505050505050565b3360009081526005602052604090205460ff16610fbd5760405162461bcd60e51b815260206004820152601060248201527f496e76616c69642064656c6567617465000000000000000000000000000000006044820152606401610a23565b6007805460ff19811660ff90911615179055565b60008060005b600c5481101561104057600c8181548110610ff457610ff461368d565b6000918252602090912001546001600160a01b038681169116141561103057838214156110245791506109329050565b61102d826135e2565b91505b611039816135e2565b9050610fd7565b5060405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610a23565b610ca38383836040518060200160405280600081525061205a565b606060006110d783611486565b905060008167ffffffffffffffff8111156110f4576110f46136bc565b60405190808252806020026020018201604052801561111d578160200160208202803683370190505b50905060005b82811015611162576111358582610fd1565b8282815181106111475761114761368d565b602090810291909101015261115b816135e2565b9050611123565b509392505050565b6004546001600160a01b031633146111c45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a23565b6001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b6000805b8281101561126457846001600160a01b0316600c8585848181106112195761121961368d565b90506020020135815481106112305761123061368d565b6000918252602090912001546001600160a01b03161461125457600091505061126a565b61125d816135e2565b90506111f3565b50600190505b9392505050565b600061127c600c5490565b82106112f05760405162461bcd60e51b815260206004820152602260248201527f4e616e6f6b6f3a20676c6f62616c20696e646578206f7574206f6620626f756e60448201527f64730000000000000000000000000000000000000000000000000000000000006064820152608401610a23565b5090565b3360009081526005602052604090205460ff166113535760405162461bcd60e51b815260206004820152601060248201527f496e76616c69642064656c6567617465000000000000000000000000000000006044820152606401610a23565b600d805460ff19811660ff90911615179055565b600080600c838154811061137d5761137d61368d565b6000918252602090912001546001600160a01b03169050806109325760405162461bcd60e51b815260206004820152602360248201527f4e616e6f6b6f3a20717565727920666f72206e6f6e6578697374656e7420746f60448201527f6b656e00000000000000000000000000000000000000000000000000000000006064820152608401610a23565b3360009081526005602052604090205460ff166114665760405162461bcd60e51b815260206004820152601060248201527f496e76616c69642064656c6567617465000000000000000000000000000000006044820152606401610a23565b61147260128585612d50565b5061147f60138383612d50565b5050505050565b60006001600160a01b0382166115045760405162461bcd60e51b815260206004820152602a60248201527f4e616e6f6b6f3a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610a23565b506001600160a01b03166000908152600f602052604090205490565b6004546001600160a01b0316331461157a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a23565b6115846000612809565b565b6004546001600160a01b031633146115e05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a23565b8281146115ec57600080fd5b60005b8381101561147f578282828181106116095761160961368d565b90506020020135600e60008787858181106116265761162661368d565b905060200201602081019061163b9190612e85565b6001600160a01b0316815260208101919091526040016000205561165e816135e2565b90506115ef565b6004546001600160a01b031633146116bf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a23565b4773a2800c3d21948e22315e573b8ec582606cbfc8e06116e06064836134c5565b6116eb9060176134d9565b604051600081818185875af1925050503d8060008114611727576040519150601f19603f3d011682016040523d82523d6000602084013e61172c565b606091505b50730ed819ccaecfc5527b606f00fd3c3b640146977d915061175190506064836134c5565b61175c9060246134d9565b604051600081818185875af1925050503d8060008114611798576040519150601f19603f3d011682016040523d82523d6000602084013e61179d565b606091505b50732e8931a6a02ec56eef941e29bb0b5121de3fa12891506117c2905060c8836134c5565b6117cd9060476134d9565b604051600081818185875af1925050503d8060008114611809576040519150601f19603f3d011682016040523d82523d6000602084013e61180e565b606091505b50733744d9468f991e110a16be720484fe53c7fe9b739150611833905060c8836134c5565b61183e90600b6134d9565b604051600081818185875af1925050503d806000811461187a576040519150601f19603f3d011682016040523d82523d6000602084013e61187f565b606091505b50505050565b600260065414156118d85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a23565b6002600655600d54610100900460ff1661195a5760405162461bcd60e51b815260206004820152602560248201527f4e616e6f6b6f3a2057686974656c697374206e6565647320746f20626520656e60448201527f61626c65640000000000000000000000000000000000000000000000000000006064820152608401610a23565b336000908152600e60205260409020548111156119df5760405162461bcd60e51b815260206004820152602f60248201527f4e616e6f6b6f3a20596f7520646f206e6f74206861766520656e6f756768207760448201527f686974656c6973742061636365737300000000000000000000000000000000006064820152608401610a23565b3360009081526011602052604081205460ff16611a035766f8b0a10e470000611a0c565b66b1a2bc2ec500005b66ffffffffffffff169050611a2182826134d9565b341015611a965760405162461bcd60e51b815260206004820152602160248201527f4e616e6f6b6f3a2045746865722073656e74206973206e6f7420636f7272656360448201527f74000000000000000000000000000000000000000000000000000000000000006064820152608401610a23565b6000611aa1600c5490565b600954909150611ab184836134ad565b1115611aff5760405162461bcd60e51b815260206004820152601b60248201527f4e616e6f6b6f3a204d696e74206578636565647320737570706c7900000000006044820152606401610a23565b60005b83811015611b2f57611b1f3383611b18816135e2565b945061276a565b611b28816135e2565b9050611b02565b50336000908152600e602052604081208054859290611b4f908490613516565b90915550506001600655505050565b6060600180546109479061358e565b3360009081526005602052604090205460ff16611bcc5760405162461bcd60e51b815260206004820152601060248201527f496e76616c69642064656c6567617465000000000000000000000000000000006044820152606401610a23565b610ca360088383612d50565b6004546001600160a01b03163314611c325760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a23565b60005b81811015610ca357600160116000858585818110611c5557611c5561368d565b9050602002016020810190611c6a9190612e85565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055611c9b816135e2565b9050611c35565b60026006541415611cf55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a23565b6002600655600d5460ff16611d725760405162461bcd60e51b815260206004820152602360248201527f4e616e6f6b6f3a204d696e74696e67206e6565647320746f20626520656e616260448201527f6c656400000000000000000000000000000000000000000000000000000000006064820152608401610a23565b600b5433600090815260106020526040902054611d8f90836134ad565b1115611ddd5760405162461bcd60e51b815260206004820181905260248201527f4e616e6f6b6f3a20596f752063616e2774206d696e742074686174206d7563686044820152606401610a23565b80600a54611deb91906134d9565b341015611e605760405162461bcd60e51b815260206004820152602160248201527f4e616e6f6b6f3a2045746865722073656e74206973206e6f7420636f7272656360448201527f74000000000000000000000000000000000000000000000000000000000000006064820152608401610a23565b6000611e6b600c5490565b600954909150611e7b83836134ad565b1115611ec95760405162461bcd60e51b815260206004820152601b60248201527f4e616e6f6b6f3a204d696e74206578636565647320737570706c7900000000006044820152606401610a23565b60005b82811015611ef257611ee23383611b18816135e2565b611eeb816135e2565b9050611ecc565b503360009081526010602052604081208054849290611f129084906134ad565b909155505060016006555050565b6001600160a01b038216331415611f795760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a23565b3360008181526003602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60005b83811015610f555761204a87878787858181106120075761200761368d565b9050602002013586868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061205a92505050565b612053816135e2565b9050611fe8565b612064338361252f565b6120d65760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a23565b61187f84848484612873565b60606120ed8261245f565b61215f5760405162461bcd60e51b815260206004820152602760248201527f4e616e6f6b6f3a2055524920717565727920666f72206e6f6e6578697374656e60448201527f7420746f6b656e000000000000000000000000000000000000000000000000006064820152608401610a23565b60075460ff166121fb57600880546121769061358e565b80601f01602080910402602001604051908101604052809291908181526020018280546121a29061358e565b80156121ef5780601f106121c4576101008083540402835291602001916121ef565b820191906000526020600020905b8154815290600101906020018083116121d257829003601f168201915b50505050509050919050565b6012612206836128fc565b601360405160200161221a939291906133e7565b6040516020818303038152906040529050919050565b6004546001600160a01b0316331461228a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a23565b6001600160a01b0381166000908152600560205260409020805460ff191660011790556122b681612a2e565b50565b3360009081526005602052604090205460ff166123185760405162461bcd60e51b815260206004820152601060248201527f496e76616c69642064656c6567617465000000000000000000000000000000006044820152606401610a23565b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff81166101009182900460ff1615909102179055565b600c818154811061236257600080fd5b6000918252602090912001546001600160a01b0316905081565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061240f57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061093257507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610932565b600c5460009082108015610932575060006001600160a01b0316600c838154811061248c5761248c61368d565b6000918252602090912001546001600160a01b0316141592915050565b600081815260026020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03841690811790915581906124f682611367565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061253a8261245f565b6125ac5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610a23565b60006125b783611367565b9050806001600160a01b0316846001600160a01b031614806125f25750836001600160a01b03166125e784610a4f565b6001600160a01b0316145b8061262257506001600160a01b0380821660009081526003602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316600c82815481106126475761264761368d565b6000918252602090912001546001600160a01b0316146126cf5760405162461bcd60e51b815260206004820152602b60248201527f4e616e6f6b6f3a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e65640000000000000000000000000000000000000000006064820152608401610a23565b6126da6000826124a9565b6126e48383612b0d565b81600c82815481106126f8576126f861368d565b6000918252602082200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b612775600083612b0d565b600c805460018101825560009182527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600480546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61287e84848461262a565b61288a84848484612b85565b61187f5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a23565b60608161293c57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156129665780612950816135e2565b915061295f9050600a836134c5565b9150612940565b60008167ffffffffffffffff811115612981576129816136bc565b6040519080825280601f01601f1916602001820160405280156129ab576020820181803683370190505b5090505b8415612622576129c0600183613516565b91506129cd600a8661361b565b6129d89060306134ad565b60f81b8183815181106129ed576129ed61368d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612a27600a866134c5565b94506129af565b6004546001600160a01b03163314612a885760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a23565b6001600160a01b038116612b045760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a23565b6122b681612809565b6001600160a01b03821615612b47576001600160a01b0382166000908152600f602052604081208054909190612b4290613559565b909155505b6001600160a01b03811615612b81576001600160a01b0381166000908152600f602052604081208054909190612b7c906135e2565b909155505b5050565b60006001600160a01b0384163b15612d45576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290612be290339089908890889060040161341a565b602060405180830381600087803b158015612bfc57600080fd5b505af1925050508015612c4a575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612c479181019061321e565b60015b612cfa573d808015612c78576040519150601f19603f3d011682016040523d82523d6000602084013e612c7d565b606091505b508051612cf25760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a23565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612622565b506001949350505050565b828054612d5c9061358e565b90600052602060002090601f016020900481019282612d7e5760008555612dc4565b82601f10612d975782800160ff19823516178555612dc4565b82800160010185558215612dc4579182015b82811115612dc4578235825591602001919060010190612da9565b506112f09291505b808211156112f05760008155600101612dcc565b80356001600160a01b0381168114610a4a57600080fd5b60008083601f840112612e0957600080fd5b50813567ffffffffffffffff811115612e2157600080fd5b6020830191508360208260051b8501011115612e3c57600080fd5b9250929050565b60008083601f840112612e5557600080fd5b50813567ffffffffffffffff811115612e6d57600080fd5b602083019150836020828501011115612e3c57600080fd5b600060208284031215612e9757600080fd5b61126a82612de0565b60008060408385031215612eb357600080fd5b612ebc83612de0565b9150612eca60208401612de0565b90509250929050565b60008060008060008060808789031215612eec57600080fd5b612ef587612de0565b9550612f0360208801612de0565b9450604087013567ffffffffffffffff80821115612f2057600080fd5b612f2c8a838b01612df7565b90965094506060890135915080821115612f4557600080fd5b50612f5289828a01612e43565b979a9699509497509295939492505050565b600080600060608486031215612f7957600080fd5b612f8284612de0565b9250612f9060208501612de0565b9150604084013590509250925092565b60008060008060808587031215612fb657600080fd5b612fbf85612de0565b9350612fcd60208601612de0565b925060408501359150606085013567ffffffffffffffff80821115612ff157600080fd5b818701915087601f83011261300557600080fd5b813581811115613017576130176136bc565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561305d5761305d6136bc565b816040528281528a602084870101111561307657600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806000604084860312156130af57600080fd5b6130b884612de0565b9250602084013567ffffffffffffffff8111156130d457600080fd5b6130e086828701612df7565b9497909650939450505050565b6000806040838503121561310057600080fd5b61310983612de0565b91506020830135801515811461311e57600080fd5b809150509250929050565b6000806040838503121561313c57600080fd5b61314583612de0565b946020939093013593505050565b6000806020838503121561316657600080fd5b823567ffffffffffffffff81111561317d57600080fd5b61318985828601612df7565b90969095509350505050565b600080600080604085870312156131ab57600080fd5b843567ffffffffffffffff808211156131c357600080fd5b6131cf88838901612df7565b909650945060208701359150808211156131e857600080fd5b506131f587828801612df7565b95989497509550505050565b60006020828403121561321357600080fd5b813561126a816136eb565b60006020828403121561323057600080fd5b815161126a816136eb565b6000806020838503121561324e57600080fd5b823567ffffffffffffffff81111561326557600080fd5b61318985828601612e43565b6000806000806040858703121561328757600080fd5b843567ffffffffffffffff8082111561329f57600080fd5b6132ab88838901612e43565b909650945060208701359150808211156132c457600080fd5b506131f587828801612e43565b6000602082840312156132e357600080fd5b5035919050565b6000815180845261330281602086016020860161352d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b8054600090600181811c908083168061334e57607f831692505b6020808410821415613389577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b81801561339d57600181146133ae576133db565b60ff198616895284890196506133db565b60008881526020902060005b868110156133d35781548b8201529085019083016133ba565b505084890196505b50505050505092915050565b60006133f38286613334565b845161340381836020890161352d565b61340f81830186613334565b979650505050505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261344c60808301846132ea565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561348e57835183529284019291840191600101613472565b50909695505050505050565b60208152600061126a60208301846132ea565b600082198211156134c0576134c061362f565b500190565b6000826134d4576134d461365e565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156135115761351161362f565b500290565b6000828210156135285761352861362f565b500390565b60005b83811015613548578181015183820152602001613530565b8381111561187f5750506000910152565b6000816135685761356861362f565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600181811c908216806135a257607f821691505b602082108114156135dc577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156136145761361461362f565b5060010190565b60008261362a5761362a61365e565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7fffffffff00000000000000000000000000000000000000000000000000000000811681146122b657600080fdfea2646970667358221220de36d23f95df564c19ef90ebb23c743f1de1a5b32fc916afbdcd1dd8b254faad64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106103085760003560e01c80636790a9de1161019a578063a22cb465116100e1578063e985e9c51161008a578063f6fa26ab11610064578063f6fa26ab14610888578063fa72de451461089d578063fabd1d2d146108bd57600080fd5b8063e985e9c5146107f2578063ed9ec8881461083b578063f2fde38b1461086857600080fd5b8063c83271f5116100bb578063c83271f514610775578063c87b56dd146107a5578063def87272146107c557600080fd5b8063a22cb46514610715578063b534a5c414610735578063b88d4fde1461075557600080fd5b80638d859f3e1161014357806397bc411c1161011d57806397bc411c146106c25780639a882570146106e2578063a0712d681461070257600080fd5b80638d859f3e146106795780638da5cb5b1461068f57806395d89b41146106ad57600080fd5b806372b0f6261161017457806372b0f62614610631578063853828b614610651578063868ff4a21461066657600080fd5b80636790a9de146105dc57806370a08231146105fc578063715018a61461061c57600080fd5b80632714ce921161025e5780634d44660c1161020757806359c74f29116101e157806359c74f291461058d5780635b92ac0d146105a25780636352211e146105bc57600080fd5b80634d44660c146105335780634f6ccce714610553578063518302271461057357600080fd5b806342842e0e1161023857806342842e0e146104c6578063438b6300146104e65780634a994eef1461051357600080fd5b80632714ce921461047b5780632f745c591461049057806332cb6b0c146104b057600080fd5b8063095ea7b3116102c0578063229688851161029a578063229688851461042857806323b872dd1461043b5780632533c7cd1461045b57600080fd5b8063095ea7b3146103d157806318160ddd146103f35780631c96cae91461041257600080fd5b806307779627116102f15780630777962714610364578063081812fc14610384578063081c8c44146103bc57600080fd5b806301ffc9a71461030d57806306fdde0314610342575b600080fd5b34801561031957600080fd5b5061032d610328366004613201565b6108dc565b60405190151581526020015b60405180910390f35b34801561034e57600080fd5b50610357610938565b604051610339919061349a565b34801561037057600080fd5b5061032d61037f366004612e85565b6109ca565b34801561039057600080fd5b506103a461039f3660046132d1565b610a4f565b6040516001600160a01b039091168152602001610339565b3480156103c857600080fd5b50610357610ae8565b3480156103dd57600080fd5b506103f16103ec366004613129565b610b76565b005b3480156103ff57600080fd5b50600c545b604051908152602001610339565b34801561041e57600080fd5b50610404600b5481565b34801561043457600080fd5b5047610404565b34801561044757600080fd5b506103f1610456366004612f64565b610ca8565b34801561046757600080fd5b506103f1610476366004613195565b610d2f565b34801561048757600080fd5b506103f1610f5e565b34801561049c57600080fd5b506104046104ab366004613129565b610fd1565b3480156104bc57600080fd5b5061040460095481565b3480156104d257600080fd5b506103f16104e1366004612f64565b6110af565b3480156104f257600080fd5b50610506610501366004612e85565b6110ca565b6040516103399190613456565b34801561051f57600080fd5b506103f161052e3660046130ed565b61116a565b34801561053f57600080fd5b5061032d61054e36600461309a565b6111ef565b34801561055f57600080fd5b5061040461056e3660046132d1565b611271565b34801561057f57600080fd5b5060075461032d9060ff1681565b34801561059957600080fd5b506103f16112f4565b3480156105ae57600080fd5b50600d5461032d9060ff1681565b3480156105c857600080fd5b506103a46105d73660046132d1565b611367565b3480156105e857600080fd5b506103f16105f7366004613271565b611407565b34801561060857600080fd5b50610404610617366004612e85565b611486565b34801561062857600080fd5b506103f1611520565b34801561063d57600080fd5b506103f161064c366004613195565b611586565b34801561065d57600080fd5b506103f1611665565b6103f16106743660046132d1565b611885565b34801561068557600080fd5b50610404600a5481565b34801561069b57600080fd5b506004546001600160a01b03166103a4565b3480156106b957600080fd5b50610357611b5e565b3480156106ce57600080fd5b506103f16106dd36600461323b565b611b6d565b3480156106ee57600080fd5b506103f16106fd366004613153565b611bd8565b6103f16107103660046132d1565b611ca2565b34801561072157600080fd5b506103f16107303660046130ed565b611f20565b34801561074157600080fd5b506103f1610750366004612ed3565b611fe5565b34801561076157600080fd5b506103f1610770366004612fa0565b61205a565b34801561078157600080fd5b5061032d610790366004612e85565b60116020526000908152604090205460ff1681565b3480156107b157600080fd5b506103576107c03660046132d1565b6120e2565b3480156107d157600080fd5b506104046107e0366004612e85565b600e6020526000908152604090205481565b3480156107fe57600080fd5b5061032d61080d366004612ea0565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205460ff1690565b34801561084757600080fd5b50610404610856366004612e85565b60106020526000908152604090205481565b34801561087457600080fd5b506103f1610883366004612e85565b612230565b34801561089457600080fd5b506103f16122b9565b3480156108a957600080fd5b506103a46108b83660046132d1565b612352565b3480156108c957600080fd5b50600d5461032d90610100900460ff1681565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d6300000000000000000000000000000000000000000000000000000000148061093257506109328261237c565b92915050565b6060600080546109479061358e565b80601f01602080910402602001604051908101604052809291908181526020018280546109739061358e565b80156109c05780601f10610995576101008083540402835291602001916109c0565b820191906000526020600020905b8154815290600101906020018083116109a357829003601f168201915b5050505050905090565b6004546000906001600160a01b03163314610a2c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b506001600160a01b03811660009081526005602052604090205460ff165b919050565b6000610a5a8261245f565b610acc5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610a23565b506000908152600260205260409020546001600160a01b031690565b60088054610af59061358e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b219061358e565b8015610b6e5780601f10610b4357610100808354040283529160200191610b6e565b820191906000526020600020905b815481529060010190602001808311610b5157829003601f168201915b505050505081565b6000610b8182611367565b9050806001600160a01b0316836001600160a01b03161415610c0b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610a23565b336001600160a01b0382161480610c275750610c27813361080d565b610c995760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a23565b610ca383836124a9565b505050565b610cb2338261252f565b610d245760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a23565b610ca383838361262a565b6004546001600160a01b03163314610d895760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a23565b828114610dfe5760405162461bcd60e51b815260206004820152603460248201527f4e616e6f6b6f3a204d7573742070726f7669646520657175616c207175616e7460448201527f697469657320616e6420726563697069656e74730000000000000000000000006064820152608401610a23565b600c54600090815b85811015610e4457868682818110610e2057610e2061368d565b9050602002013583610e3291906134ad565b9250610e3d816135e2565b9050610e06565b50600954610e5283836134ad565b10610ec55760405162461bcd60e51b815260206004820152602160248201527f4e616e6f6b6f3a204d696e742f6f72646572206578636565647320737570706c60448201527f79000000000000000000000000000000000000000000000000000000000000006064820152608401610a23565b60005b83811015610f555760005b878783818110610ee557610ee561368d565b90506020020135811015610f4457600083610eff816135e2565b94509050610f33878785818110610f1857610f1861368d565b9050602002016020810190610f2d9190612e85565b8261276a565b50610f3d816135e2565b9050610ed3565b50610f4e816135e2565b9050610ec8565b50505050505050565b3360009081526005602052604090205460ff16610fbd5760405162461bcd60e51b815260206004820152601060248201527f496e76616c69642064656c6567617465000000000000000000000000000000006044820152606401610a23565b6007805460ff19811660ff90911615179055565b60008060005b600c5481101561104057600c8181548110610ff457610ff461368d565b6000918252602090912001546001600160a01b038681169116141561103057838214156110245791506109329050565b61102d826135e2565b91505b611039816135e2565b9050610fd7565b5060405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610a23565b610ca38383836040518060200160405280600081525061205a565b606060006110d783611486565b905060008167ffffffffffffffff8111156110f4576110f46136bc565b60405190808252806020026020018201604052801561111d578160200160208202803683370190505b50905060005b82811015611162576111358582610fd1565b8282815181106111475761114761368d565b602090810291909101015261115b816135e2565b9050611123565b509392505050565b6004546001600160a01b031633146111c45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a23565b6001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b6000805b8281101561126457846001600160a01b0316600c8585848181106112195761121961368d565b90506020020135815481106112305761123061368d565b6000918252602090912001546001600160a01b03161461125457600091505061126a565b61125d816135e2565b90506111f3565b50600190505b9392505050565b600061127c600c5490565b82106112f05760405162461bcd60e51b815260206004820152602260248201527f4e616e6f6b6f3a20676c6f62616c20696e646578206f7574206f6620626f756e60448201527f64730000000000000000000000000000000000000000000000000000000000006064820152608401610a23565b5090565b3360009081526005602052604090205460ff166113535760405162461bcd60e51b815260206004820152601060248201527f496e76616c69642064656c6567617465000000000000000000000000000000006044820152606401610a23565b600d805460ff19811660ff90911615179055565b600080600c838154811061137d5761137d61368d565b6000918252602090912001546001600160a01b03169050806109325760405162461bcd60e51b815260206004820152602360248201527f4e616e6f6b6f3a20717565727920666f72206e6f6e6578697374656e7420746f60448201527f6b656e00000000000000000000000000000000000000000000000000000000006064820152608401610a23565b3360009081526005602052604090205460ff166114665760405162461bcd60e51b815260206004820152601060248201527f496e76616c69642064656c6567617465000000000000000000000000000000006044820152606401610a23565b61147260128585612d50565b5061147f60138383612d50565b5050505050565b60006001600160a01b0382166115045760405162461bcd60e51b815260206004820152602a60248201527f4e616e6f6b6f3a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610a23565b506001600160a01b03166000908152600f602052604090205490565b6004546001600160a01b0316331461157a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a23565b6115846000612809565b565b6004546001600160a01b031633146115e05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a23565b8281146115ec57600080fd5b60005b8381101561147f578282828181106116095761160961368d565b90506020020135600e60008787858181106116265761162661368d565b905060200201602081019061163b9190612e85565b6001600160a01b0316815260208101919091526040016000205561165e816135e2565b90506115ef565b6004546001600160a01b031633146116bf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a23565b4773a2800c3d21948e22315e573b8ec582606cbfc8e06116e06064836134c5565b6116eb9060176134d9565b604051600081818185875af1925050503d8060008114611727576040519150601f19603f3d011682016040523d82523d6000602084013e61172c565b606091505b50730ed819ccaecfc5527b606f00fd3c3b640146977d915061175190506064836134c5565b61175c9060246134d9565b604051600081818185875af1925050503d8060008114611798576040519150601f19603f3d011682016040523d82523d6000602084013e61179d565b606091505b50732e8931a6a02ec56eef941e29bb0b5121de3fa12891506117c2905060c8836134c5565b6117cd9060476134d9565b604051600081818185875af1925050503d8060008114611809576040519150601f19603f3d011682016040523d82523d6000602084013e61180e565b606091505b50733744d9468f991e110a16be720484fe53c7fe9b739150611833905060c8836134c5565b61183e90600b6134d9565b604051600081818185875af1925050503d806000811461187a576040519150601f19603f3d011682016040523d82523d6000602084013e61187f565b606091505b50505050565b600260065414156118d85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a23565b6002600655600d54610100900460ff1661195a5760405162461bcd60e51b815260206004820152602560248201527f4e616e6f6b6f3a2057686974656c697374206e6565647320746f20626520656e60448201527f61626c65640000000000000000000000000000000000000000000000000000006064820152608401610a23565b336000908152600e60205260409020548111156119df5760405162461bcd60e51b815260206004820152602f60248201527f4e616e6f6b6f3a20596f7520646f206e6f74206861766520656e6f756768207760448201527f686974656c6973742061636365737300000000000000000000000000000000006064820152608401610a23565b3360009081526011602052604081205460ff16611a035766f8b0a10e470000611a0c565b66b1a2bc2ec500005b66ffffffffffffff169050611a2182826134d9565b341015611a965760405162461bcd60e51b815260206004820152602160248201527f4e616e6f6b6f3a2045746865722073656e74206973206e6f7420636f7272656360448201527f74000000000000000000000000000000000000000000000000000000000000006064820152608401610a23565b6000611aa1600c5490565b600954909150611ab184836134ad565b1115611aff5760405162461bcd60e51b815260206004820152601b60248201527f4e616e6f6b6f3a204d696e74206578636565647320737570706c7900000000006044820152606401610a23565b60005b83811015611b2f57611b1f3383611b18816135e2565b945061276a565b611b28816135e2565b9050611b02565b50336000908152600e602052604081208054859290611b4f908490613516565b90915550506001600655505050565b6060600180546109479061358e565b3360009081526005602052604090205460ff16611bcc5760405162461bcd60e51b815260206004820152601060248201527f496e76616c69642064656c6567617465000000000000000000000000000000006044820152606401610a23565b610ca360088383612d50565b6004546001600160a01b03163314611c325760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a23565b60005b81811015610ca357600160116000858585818110611c5557611c5561368d565b9050602002016020810190611c6a9190612e85565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055611c9b816135e2565b9050611c35565b60026006541415611cf55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a23565b6002600655600d5460ff16611d725760405162461bcd60e51b815260206004820152602360248201527f4e616e6f6b6f3a204d696e74696e67206e6565647320746f20626520656e616260448201527f6c656400000000000000000000000000000000000000000000000000000000006064820152608401610a23565b600b5433600090815260106020526040902054611d8f90836134ad565b1115611ddd5760405162461bcd60e51b815260206004820181905260248201527f4e616e6f6b6f3a20596f752063616e2774206d696e742074686174206d7563686044820152606401610a23565b80600a54611deb91906134d9565b341015611e605760405162461bcd60e51b815260206004820152602160248201527f4e616e6f6b6f3a2045746865722073656e74206973206e6f7420636f7272656360448201527f74000000000000000000000000000000000000000000000000000000000000006064820152608401610a23565b6000611e6b600c5490565b600954909150611e7b83836134ad565b1115611ec95760405162461bcd60e51b815260206004820152601b60248201527f4e616e6f6b6f3a204d696e74206578636565647320737570706c7900000000006044820152606401610a23565b60005b82811015611ef257611ee23383611b18816135e2565b611eeb816135e2565b9050611ecc565b503360009081526010602052604081208054849290611f129084906134ad565b909155505060016006555050565b6001600160a01b038216331415611f795760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a23565b3360008181526003602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60005b83811015610f555761204a87878787858181106120075761200761368d565b9050602002013586868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061205a92505050565b612053816135e2565b9050611fe8565b612064338361252f565b6120d65760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a23565b61187f84848484612873565b60606120ed8261245f565b61215f5760405162461bcd60e51b815260206004820152602760248201527f4e616e6f6b6f3a2055524920717565727920666f72206e6f6e6578697374656e60448201527f7420746f6b656e000000000000000000000000000000000000000000000000006064820152608401610a23565b60075460ff166121fb57600880546121769061358e565b80601f01602080910402602001604051908101604052809291908181526020018280546121a29061358e565b80156121ef5780601f106121c4576101008083540402835291602001916121ef565b820191906000526020600020905b8154815290600101906020018083116121d257829003601f168201915b50505050509050919050565b6012612206836128fc565b601360405160200161221a939291906133e7565b6040516020818303038152906040529050919050565b6004546001600160a01b0316331461228a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a23565b6001600160a01b0381166000908152600560205260409020805460ff191660011790556122b681612a2e565b50565b3360009081526005602052604090205460ff166123185760405162461bcd60e51b815260206004820152601060248201527f496e76616c69642064656c6567617465000000000000000000000000000000006044820152606401610a23565b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff81166101009182900460ff1615909102179055565b600c818154811061236257600080fd5b6000918252602090912001546001600160a01b0316905081565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061240f57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061093257507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610932565b600c5460009082108015610932575060006001600160a01b0316600c838154811061248c5761248c61368d565b6000918252602090912001546001600160a01b0316141592915050565b600081815260026020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03841690811790915581906124f682611367565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061253a8261245f565b6125ac5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610a23565b60006125b783611367565b9050806001600160a01b0316846001600160a01b031614806125f25750836001600160a01b03166125e784610a4f565b6001600160a01b0316145b8061262257506001600160a01b0380821660009081526003602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316600c82815481106126475761264761368d565b6000918252602090912001546001600160a01b0316146126cf5760405162461bcd60e51b815260206004820152602b60248201527f4e616e6f6b6f3a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e65640000000000000000000000000000000000000000006064820152608401610a23565b6126da6000826124a9565b6126e48383612b0d565b81600c82815481106126f8576126f861368d565b6000918252602082200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b612775600083612b0d565b600c805460018101825560009182527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600480546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61287e84848461262a565b61288a84848484612b85565b61187f5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a23565b60608161293c57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156129665780612950816135e2565b915061295f9050600a836134c5565b9150612940565b60008167ffffffffffffffff811115612981576129816136bc565b6040519080825280601f01601f1916602001820160405280156129ab576020820181803683370190505b5090505b8415612622576129c0600183613516565b91506129cd600a8661361b565b6129d89060306134ad565b60f81b8183815181106129ed576129ed61368d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612a27600a866134c5565b94506129af565b6004546001600160a01b03163314612a885760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a23565b6001600160a01b038116612b045760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a23565b6122b681612809565b6001600160a01b03821615612b47576001600160a01b0382166000908152600f602052604081208054909190612b4290613559565b909155505b6001600160a01b03811615612b81576001600160a01b0381166000908152600f602052604081208054909190612b7c906135e2565b909155505b5050565b60006001600160a01b0384163b15612d45576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290612be290339089908890889060040161341a565b602060405180830381600087803b158015612bfc57600080fd5b505af1925050508015612c4a575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612c479181019061321e565b60015b612cfa573d808015612c78576040519150601f19603f3d011682016040523d82523d6000602084013e612c7d565b606091505b508051612cf25760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a23565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612622565b506001949350505050565b828054612d5c9061358e565b90600052602060002090601f016020900481019282612d7e5760008555612dc4565b82601f10612d975782800160ff19823516178555612dc4565b82800160010185558215612dc4579182015b82811115612dc4578235825591602001919060010190612da9565b506112f09291505b808211156112f05760008155600101612dcc565b80356001600160a01b0381168114610a4a57600080fd5b60008083601f840112612e0957600080fd5b50813567ffffffffffffffff811115612e2157600080fd5b6020830191508360208260051b8501011115612e3c57600080fd5b9250929050565b60008083601f840112612e5557600080fd5b50813567ffffffffffffffff811115612e6d57600080fd5b602083019150836020828501011115612e3c57600080fd5b600060208284031215612e9757600080fd5b61126a82612de0565b60008060408385031215612eb357600080fd5b612ebc83612de0565b9150612eca60208401612de0565b90509250929050565b60008060008060008060808789031215612eec57600080fd5b612ef587612de0565b9550612f0360208801612de0565b9450604087013567ffffffffffffffff80821115612f2057600080fd5b612f2c8a838b01612df7565b90965094506060890135915080821115612f4557600080fd5b50612f5289828a01612e43565b979a9699509497509295939492505050565b600080600060608486031215612f7957600080fd5b612f8284612de0565b9250612f9060208501612de0565b9150604084013590509250925092565b60008060008060808587031215612fb657600080fd5b612fbf85612de0565b9350612fcd60208601612de0565b925060408501359150606085013567ffffffffffffffff80821115612ff157600080fd5b818701915087601f83011261300557600080fd5b813581811115613017576130176136bc565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561305d5761305d6136bc565b816040528281528a602084870101111561307657600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806000604084860312156130af57600080fd5b6130b884612de0565b9250602084013567ffffffffffffffff8111156130d457600080fd5b6130e086828701612df7565b9497909650939450505050565b6000806040838503121561310057600080fd5b61310983612de0565b91506020830135801515811461311e57600080fd5b809150509250929050565b6000806040838503121561313c57600080fd5b61314583612de0565b946020939093013593505050565b6000806020838503121561316657600080fd5b823567ffffffffffffffff81111561317d57600080fd5b61318985828601612df7565b90969095509350505050565b600080600080604085870312156131ab57600080fd5b843567ffffffffffffffff808211156131c357600080fd5b6131cf88838901612df7565b909650945060208701359150808211156131e857600080fd5b506131f587828801612df7565b95989497509550505050565b60006020828403121561321357600080fd5b813561126a816136eb565b60006020828403121561323057600080fd5b815161126a816136eb565b6000806020838503121561324e57600080fd5b823567ffffffffffffffff81111561326557600080fd5b61318985828601612e43565b6000806000806040858703121561328757600080fd5b843567ffffffffffffffff8082111561329f57600080fd5b6132ab88838901612e43565b909650945060208701359150808211156132c457600080fd5b506131f587828801612e43565b6000602082840312156132e357600080fd5b5035919050565b6000815180845261330281602086016020860161352d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b8054600090600181811c908083168061334e57607f831692505b6020808410821415613389577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b81801561339d57600181146133ae576133db565b60ff198616895284890196506133db565b60008881526020902060005b868110156133d35781548b8201529085019083016133ba565b505084890196505b50505050505092915050565b60006133f38286613334565b845161340381836020890161352d565b61340f81830186613334565b979650505050505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261344c60808301846132ea565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561348e57835183529284019291840191600101613472565b50909695505050505050565b60208152600061126a60208301846132ea565b600082198211156134c0576134c061362f565b500190565b6000826134d4576134d461365e565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156135115761351161362f565b500290565b6000828210156135285761352861362f565b500390565b60005b83811015613548578181015183820152602001613530565b8381111561187f5750506000910152565b6000816135685761356861362f565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600181811c908216806135a257607f821691505b602082108114156135dc577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156136145761361461362f565b5060010190565b60008261362a5761362a61365e565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7fffffffff00000000000000000000000000000000000000000000000000000000811681146122b657600080fdfea2646970667358221220de36d23f95df564c19ef90ebb23c743f1de1a5b32fc916afbdcd1dd8b254faad64736f6c63430008070033

Deployed Bytecode Sourcemap

34114:9583:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29521:225;;;;;;;;;;-1:-1:-1;29521:225:0;;;;;:::i;:::-;;:::i;:::-;;;12416:14:1;;12409:22;12391:41;;12379:2;12364: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;;;;;11031:55:1;;;11013:74;;11001:2;10986:18;25469:216:0;10867:226:1;34248:33:0;;;;;;;;;;;;;:::i;25058:403::-;;;;;;;;;;-1:-1:-1;25058:403:0;;;;;:::i;:::-;;:::i;:::-;;37278:106;;;;;;;;;;-1:-1:-1;37364:7:0;:14;37278:106;;;22748:25:1;;;22736:2;22721:18;37278:106:0;22602:177:1;34365:28:0;;;;;;;;;;;;;;;;37862:105;;;;;;;;;;-1:-1:-1;37940:21:0;37862:105;;26168:334;;;;;;;;;;-1:-1:-1;26168:334:0;;;;;:::i;:::-;;:::i;40457:625::-;;;;;;;;;;-1:-1:-1;40457:625:0;;;;;:::i;:::-;;:::i;41657:85::-;;;;;;;;;;;;;:::i;36415:360::-;;;;;;;;;;-1:-1:-1;36415:360:0;;;;;:::i;:::-;;:::i;34288:31::-;;;;;;;;;;;;;;;;26510:184;;;;;;;;;;-1:-1:-1;26510:184:0;;;;;:::i;:::-;;:::i;37471:312::-;;;;;;;;;;-1:-1:-1;37471:312:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;33567:116::-;;;;;;;;;;-1:-1:-1;33567:116:0;;;;;:::i;:::-;;:::i;35361:250::-;;;;;;;;;;-1:-1:-1;35361:250:0;;;;;:::i;:::-;;:::i;36063:179::-;;;;;;;;;;-1:-1:-1;36063:179:0;;;;;:::i;:::-;;:::i;34215:28::-;;;;;;;;;;-1:-1:-1;34215:28:0;;;;;;;;42000:89;;;;;;;;;;;;;:::i;34463:32::-;;;;;;;;;;-1:-1:-1;34463:32:0;;;;;;;;35680:217;;;;;;;;;;-1:-1:-1;35680:217:0;;;;;:::i;:::-;;:::i;42275:158::-;;;;;;;;;;-1:-1:-1;42275:158:0;;;;;:::i;:::-;;:::i;35069:193::-;;;;;;;;;;-1:-1:-1;35069:193:0;;;;;:::i;:::-;;:::i;32399:94::-;;;;;;;;;;;;;:::i;41160:265::-;;;;;;;;;;-1:-1:-1;41160:265:0;;;;;:::i;:::-;;:::i;39564:809::-;;;;;;;;;;;;;:::i;38716:645::-;;;;;;:::i;:::-;;:::i;34324:36::-;;;;;;;;;;;;;;;;31748:87;;;;;;;;;;-1:-1:-1;31821:6:0;;-1:-1:-1;;;;;31821:6:0;31748:87;;24798:106;;;;;;;;;;;;;:::i;41812:123::-;;;;;;;;;;-1:-1:-1;41812:123:0;;;;;:::i;:::-;;:::i;41431:158::-;;;;;;;;;;-1:-1:-1;41431:158:0;;;;;:::i;:::-;;:::i;38161:549::-;;;;;;:::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;34692:36::-;;;;;;;;;;-1:-1:-1;34692:36:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;36870:322;;;;;;;;;;-1:-1:-1;36870:322:0;;;;;:::i;:::-;;:::i;34548:46::-;;;;;;;;;;-1:-1:-1;34548:46:0;;;;;:::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;34646:41;;;;;;;;;;-1:-1:-1;34646:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;33689:161;;;;;;;;;;-1:-1:-1;33689:161:0;;;;;:::i;:::-;;:::i;42095:111::-;;;;;;;;;;;;;:::i;34432:24::-;;;;;;;;;;-1:-1:-1;34432:24:0;;;;;:::i;:::-;;:::i;34500:41::-;;;;;;;;;;-1:-1:-1;34500:41:0;;;;;;;;;;;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;;19680:2:1;31960:68:0;;;19662:21:1;;;19699:18;;;19692:30;19758:34;19738:18;;;19731:62;19810: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;;19267:2:1;25562:73:0;;;19249:21:1;19306:2;19286:18;;;19279:30;19345:34;19325:18;;;19318:62;19416:14;19396:18;;;19389:42;19448:19;;25562:73:0;19065:408:1;25562:73:0;-1:-1:-1;25653:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25653:24:0;;25469:216::o;34248:33::-;;;;;;;:::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;;20041:2:1;25181:57:0;;;20023:21:1;20080:2;20060:18;;;20053:30;20119:34;20099:18;;;20092:62;20190:3;20170:18;;;20163:31;20211:19;;25181:57:0;19839: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;;18036:2:1;25251:168:0;;;18018:21:1;18075:2;18055:18;;;18048:30;18114:34;18094:18;;;18087:62;18185:26;18165:18;;;18158:54;18229:19;;25251:168:0;17834: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;;20443:2:1;26352:103:0;;;20425:21:1;20482:2;20462:18;;;20455:30;20521:34;20501:18;;;20494:62;20592:19;20572:18;;;20565:47;20629:19;;26352:103:0;20241:413:1;26352:103:0;26466:28;26476:4;26482:2;26486:7;26466:9;:28::i;40457:625::-;31821:6;;-1:-1:-1;;;;;31821:6:0;23232:10;31968:23;31960:68;;;;-1:-1:-1;;;31960:68:0;;19680:2:1;31960:68:0;;;19662:21:1;;;19699:18;;;19692:30;19758:34;19738:18;;;19731:62;19810:18;;31960:68:0;19478:356:1;31960:68:0;40564:35;;::::1;40556:101;;;::::0;-1:-1:-1;;;40556:101:0;;16492:2:1;40556:101:0::1;::::0;::::1;16474:21:1::0;16531:2;16511:18;;;16504:30;16570:34;16550:18;;;16543:62;16641:22;16621:18;;;16614:50;16681:19;;40556:101:0::1;16290:416:1::0;40556:101:0::1;40705:7;:14:::0;40666:18:::1;::::0;;40726:82:::1;40738:19:::0;;::::1;40726:82;;;40789:8;;40798:1;40789:11;;;;;;;:::i;:::-;;;;;;;40772:28;;;;;:::i;:::-;::::0;-1:-1:-1;40759:3:0::1;::::0;::::1;:::i;:::-;;;40726:82;;;-1:-1:-1::0;40848:10:0::1;::::0;40823:22:::1;40832:13:::0;40823:6;:22:::1;:::i;:::-;:35;40814:83;;;::::0;-1:-1:-1;;;40814:83:0;;18461:2:1;40814:83:0::1;::::0;::::1;18443:21:1::0;18500:2;18480:18;;;18473:30;18539:34;18519:18;;;18512:62;18610:3;18590:18;;;18583:31;18631:19;;40814:83:0::1;18259:397:1::0;40814:83:0::1;40910:6;40906:171;40918:20:::0;;::::1;40906:171;;;40957:6;40953:117;40969:8;;40978:1;40969:11;;;;;;;:::i;:::-;;;;;;;40965:1;:15;40953:117;;;40997:12;41012:8:::0;::::1;::::0;::::1;:::i;:::-;;;40997:23;;41031:29;41038:9;;41048:1;41038:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;41052:7;41031:5;:29::i;:::-;-1:-1:-1::0;40982:3:0::1;::::0;::::1;:::i;:::-;;;40953:117;;;-1:-1:-1::0;40940:3:0::1;::::0;::::1;:::i;:::-;;;40906:171;;;;40549:533;;40457:625:::0;;;;:::o;41657:85::-;33381:10;33370:22;;;;:10;:22;;;;;;;;33362:52;;;;-1:-1:-1;;;33362:52:0;;13271:2:1;33362:52:0;;;13253:21:1;13310:2;13290:18;;;13283:30;13349:18;13329;;;13322:46;13385:18;;33362:52:0;13069:340:1;33362:52:0;41728:8:::1;::::0;;-1:-1:-1;;41716:20:0;::::1;41728:8;::::0;;::::1;41727:9;41716:20;::::0;;41657:85::o;36415:360::-;36501:13;36523:10;36544:6;36540:170;36556:7;:14;36552:18;;36540:170;;;36597:7;36605:1;36597:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;36588:19:0;;;36597:10;;36588:19;36585:118;;;36632:5;36623;:14;36619:74;;;36658:1;-1:-1:-1;36651:8:0;;-1:-1:-1;36651:8:0;36619:74;36686:7;;;:::i;:::-;;;36619:74;36572:3;;;:::i;:::-;;;36540:170;;;-1:-1:-1;36716:53:0;;-1:-1:-1;;;36716:53:0;;13616:2:1;36716:53:0;;;13598:21:1;13655:2;13635:18;;;13628:30;13694:34;13674:18;;;13667:62;13765:13;13745:18;;;13738:41;13796:19;;36716:53:0;13414:407:1;26510:184:0;26647:39;26664:4;26670:2;26674:7;26647:39;;;;;;;;;;;;:16;:39::i;37471:312::-;37545:13;37567;37583:20;37594:7;37583:9;:20::i;:::-;37567:36;;37610:20;37645:8;37633:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37633:22:0;;37610:45;;37667:6;37662:96;37679:8;37675:1;:12;37662:96;;;37717:33;37738:7;37747:1;37717:19;:33::i;:::-;37705:6;37712:1;37705:9;;;;;;;;:::i;:::-;;;;;;;;;;:45;37689:3;;;:::i;:::-;;;37662:96;;;-1:-1:-1;37771:6:0;37471:312;-1:-1:-1;;;37471: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;;19680:2:1;31960:68:0;;;19662:21:1;;;19699:18;;;19692:30;19758:34;19738:18;;;19731:62;19810:18;;31960:68:0;19478: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;35361:250::-;35457:4;35474:6;35470:116;35482:19;;;35470:116;;;35547:7;-1:-1:-1;;;;;35521:33:0;:7;35530:8;;35539:1;35530:11;;;;;;;:::i;:::-;;;;;;;35521:22;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;35521:22:0;:33;35517:61;;35573:5;35566:12;;;;;35517:61;35503:3;;;:::i;:::-;;;35470:116;;;;35601:4;35594:11;;35361:250;;;;;;:::o;36063:179::-;36129:11;36165:13;37364:7;:14;;37278:106;36165:13;36157:5;:21;36149:68;;;;-1:-1:-1;;;36149:68:0;;21993:2:1;36149:68:0;;;21975:21:1;22032:2;22012:18;;;22005:30;22071:34;22051:18;;;22044:62;22142:4;22122:18;;;22115:32;22164:19;;36149:68:0;21791:398:1;36149:68:0;-1:-1:-1;36231:5:0;36063:179::o;42000:89::-;33381:10;33370:22;;;;:10;:22;;;;;;;;33362:52;;;;-1:-1:-1;;;33362:52:0;;13271:2:1;33362:52:0;;;13253:21:1;13310:2;13290:18;;;13283:30;13349:18;13329;;;13322:46;13385:18;;33362:52:0;13069:340:1;33362:52:0;42071:12:::1;::::0;;-1:-1:-1;;42055:28:0;::::1;42071:12;::::0;;::::1;42070:13;42055:28;::::0;;42000:89::o;35680:217::-;35743:14;35766:13;35782:7;35790;35782:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;35782:16:0;;-1:-1:-1;35813:19:0;35805:67;;;;-1:-1:-1;;;35805:67:0;;15260:2:1;35805:67:0;;;15242:21:1;15299:2;15279:18;;;15272:30;15338:34;15318:18;;;15311:62;15409:5;15389:18;;;15382:33;15432:19;;35805:67:0;15058:399:1;42275:158:0;33381:10;33370:22;;;;:10;:22;;;;;;;;33362:52;;;;-1:-1:-1;;;33362:52:0;;13271:2:1;33362:52:0;;;13253:21:1;13310:2;13290:18;;;13283:30;13349:18;13329;;;13322:46;13385:18;;33362:52:0;13069:340:1;33362:52:0;42372:24:::1;:15;42390:6:::0;;42372:24:::1;:::i;:::-;-1:-1:-1::0;42403:24:0::1;:15;42421:6:::0;;42403:24:::1;:::i;:::-;;42275:158:::0;;;;:::o;35069:193::-;35135:4;-1:-1:-1;;;;;35156:21:0;;35148:76;;;;-1:-1:-1;;;35148:76:0;;21222:2:1;35148:76:0;;;21204:21:1;21261:2;21241:18;;;21234:30;21300:34;21280:18;;;21273:62;21371:12;21351:18;;;21344:40;21401:19;;35148:76:0;21020:406:1;35148:76:0;-1:-1:-1;;;;;;35238:18:0;;;;;:9;:18;;;;;;;35069:193::o;32399:94::-;31821:6;;-1:-1:-1;;;;;31821:6:0;23232:10;31968:23;31960:68;;;;-1:-1:-1;;;31960:68:0;;19680:2:1;31960:68:0;;;19662:21:1;;;19699:18;;;19692:30;19758:34;19738:18;;;19731:62;19810:18;;31960:68:0;19478:356:1;31960:68:0;32464:21:::1;32482:1;32464:9;:21::i;:::-;32399:94::o:0;41160:265::-;31821:6;;-1:-1:-1;;;;;31821:6:0;23232:10;31968:23;31960:68;;;;-1:-1:-1;;;31960:68:0;;19680:2:1;31960:68:0;;;19662:21:1;;;19699:18;;;19692:30;19758:34;19738:18;;;19731:62;19810:18;;31960:68:0;19478:356:1;31960:68:0;41277:36;;::::1;41269:45;;;::::0;::::1;;41325:6;41321:99;41333:19:::0;;::::1;41321:99;;;41399:10;;41410:1;41399:13;;;;;;;:::i;:::-;;;;;;;41367:14;:29;41383:8;;41392:1;41383:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;41367:29:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;41367:29:0;:45;41354:3:::1;::::0;::::1;:::i;:::-;;;41321:99;;39564:809:::0;31821:6;;-1:-1:-1;;;;;31821:6:0;23232:10;31968:23;31960:68;;;;-1:-1:-1;;;31960:68:0;;19680:2:1;31960:68:0;;;19662:21:1;;;19699:18;;;19692:30;19758:34;19738:18;;;19731:62;19810:18;;31960:68:0;19478:356:1;31960:68:0;39859:21:::1;39901:42;39957:12;39966:3;39859:21:::0;39957:12:::1;:::i;:::-;:17;::::0;39972:2:::1;39957:17;:::i;:::-;39893:86;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;39994:42:0::1;::::0;-1:-1:-1;40050:12:0::1;::::0;-1:-1:-1;40059:3:0::1;40050:6:::0;:12:::1;:::i;:::-;:17;::::0;40065:2:::1;40050:17;:::i;:::-;39986:86;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;40087:42:0::1;::::0;-1:-1:-1;40143:12:0::1;::::0;-1:-1:-1;40152:3:0::1;40143:6:::0;:12:::1;:::i;:::-;:17;::::0;40158:2:::1;40143:17;:::i;:::-;40079:86;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;40180:42:0::1;::::0;-1:-1:-1;40236:12:0::1;::::0;-1:-1:-1;40245:3:0::1;40236:6:::0;:12:::1;:::i;:::-;:17;::::0;40251:2:::1;40236:17;:::i;:::-;40172:86;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39604:769;39564:809::o:0;38716:645::-;1812:1;2410:7;;:19;;2402:63;;;;-1:-1:-1;;;2402:63:0;;21633:2:1;2402:63:0;;;21615:21:1;21672:2;21652:18;;;21645:30;21711:33;21691:18;;;21684:61;21762:18;;2402:63:0;21431:355:1;2402:63:0;1812:1;2543:7;:18;38799:21:::1;::::0;::::1;::::0;::::1;;;38791:71;;;::::0;-1:-1:-1;;;38791:71:0;;14854:2:1;38791:71:0::1;::::0;::::1;14836:21:1::0;14893:2;14873:18;;;14866:30;14932:34;14912:18;;;14905:62;15003:7;14983:18;;;14976:35;15028:19;;38791:71:0::1;14652:401:1::0;38791:71:0::1;38904:10;38889:26;::::0;;;:14:::1;:26;::::0;;;;;38877:38;::::1;;38869:97;;;::::0;-1:-1:-1;;;38869:97:0;;16076:2:1;38869:97:0::1;::::0;::::1;16058:21:1::0;16115:2;16095:18;;;16088:30;16154:34;16134:18;;;16127:62;16225:17;16205:18;;;16198:45;16260:19;;38869:97:0::1;15874:411:1::0;38869:97:0::1;38991:10;38973;38986:16:::0;;;:4:::1;:16;::::0;;;;;::::1;;:42;;39018:10;38986:42;;;39005:10;38986:42;38973:55;;::::0;-1:-1:-1;39057:16:0::1;39065:8:::0;38973:55;39057:16:::1;:::i;:::-;39044:9;:29;;39035:76;;;::::0;-1:-1:-1;;;39035:76:0;;12869:2:1;39035:76:0::1;::::0;::::1;12851:21:1::0;12908:2;12888:18;;;12881:30;12947:34;12927:18;;;12920:62;13018:3;12998:18;;;12991:31;13039:19;;39035:76:0::1;12667:397:1::0;39035:76:0::1;39118:11;39132:13;37364:7:::0;:14;;37278:106;39132:13:::1;39181:10;::::0;39118:27;;-1:-1:-1;39160:17:0::1;39169:8:::0;39118:27;39160:17:::1;:::i;:::-;:31;;39152:72;;;::::0;-1:-1:-1;;;39152:72:0;;17680:2:1;39152:72:0::1;::::0;::::1;17662:21:1::0;17719:2;17699:18;;;17692:30;17758:29;17738:18;;;17731:57;17805:18;;39152:72:0::1;17478:351:1::0;39152:72:0::1;39237:6;39233:76;39249:8;39245:1;:12;39233:76;;;39272:29;39279:10;39291:8:::0;::::1;::::0;::::1;:::i;:::-;;;39272:5;:29::i;:::-;39259:3;::::0;::::1;:::i;:::-;;;39233:76;;;-1:-1:-1::0;39332:10:0::1;39317:26;::::0;;;:14:::1;:26;::::0;;;;:38;;39347:8;;39317:26;:38:::1;::::0;39347:8;;39317:38:::1;:::i;:::-;::::0;;;-1:-1:-1;;1768:1:0;2722:7;:22;-1:-1:-1;;;38716:645:0:o;24798:106::-;24856:13;24889:7;24882:14;;;;;:::i;41812:123::-;33381:10;33370:22;;;;:10;:22;;;;;;;;33362:52;;;;-1:-1:-1;;;33362:52:0;;13271:2:1;33362:52:0;;;13253:21:1;13310:2;13290:18;;;13283:30;13349:18;13329;;;13322:46;13385:18;;33362:52:0;13069:340:1;33362:52:0;41899:30:::1;:14;41916:13:::0;;41899:30:::1;:::i;41431:158::-:0;31821:6;;-1:-1:-1;;;;;31821:6:0;23232:10;31968:23;31960:68;;;;-1:-1:-1;;;31960:68:0;;19680:2:1;31960:68:0;;;19662:21:1;;;19699:18;;;19692:30;19758:34;19738:18;;;19731:62;19810:18;;31960:68:0;19478:356:1;31960:68:0;41508:6:::1;41504:80;41516:19:::0;;::::1;41504:80;;;41572:4;41550;:19;41556:8;;41565:1;41556:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;41550:19:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;41550:19:0;:26;;-1:-1:-1;;41550:26:0::1;::::0;::::1;;::::0;;;::::1;::::0;;41537:3:::1;::::0;::::1;:::i;:::-;;;41504:80;;38161:549:::0;1812:1;2410:7;;:19;;2402:63;;;;-1:-1:-1;;;2402:63:0;;21633:2:1;2402:63:0;;;21615:21:1;21672:2;21652:18;;;21645:30;21711:33;21691:18;;;21684:61;21762:18;;2402:63:0;21431:355:1;2402:63:0;1812:1;2543:7;:18;38237:12:::1;::::0;::::1;;38229:60;;;::::0;-1:-1:-1;;;38229:60:0;;18863:2:1;38229:60:0::1;::::0;::::1;18845:21:1::0;18902:2;18882:18;;;18875:30;18941:34;18921:18;;;18914:62;19012:5;18992:18;;;18985:33;19035:19;;38229:60:0::1;18661:399:1::0;38229:60:0::1;38340:7;::::0;38325:10:::1;38315:21;::::0;;;:9:::1;:21;::::0;;;;;38304:32:::1;::::0;:8;:32:::1;:::i;:::-;:43;;38296:88;;;::::0;-1:-1:-1;;;38296:88:0;;20861:2:1;38296:88:0::1;::::0;::::1;20843:21:1::0;;;20880:18;;;20873:30;20939:34;20919:18;;;20912:62;20991:18;;38296:88:0::1;20659:356:1::0;38296:88:0::1;38421:8;38413:5;;:16;;;;:::i;:::-;38400:9;:29;;38391:76;;;::::0;-1:-1:-1;;;38391:76:0;;12869:2:1;38391:76:0::1;::::0;::::1;12851:21:1::0;12908:2;12888:18;;;12881:30;12947:34;12927:18;;;12920:62;13018:3;12998:18;;;12991:31;13039:19;;38391:76:0::1;12667:397:1::0;38391:76:0::1;38476:11;38490:13;37364:7:::0;:14;;37278:106;38490:13:::1;38539:10;::::0;38476:27;;-1:-1:-1;38518:17:0::1;38527:8:::0;38476:27;38518:17:::1;:::i;:::-;:31;;38510:72;;;::::0;-1:-1:-1;;;38510:72:0;;17680:2:1;38510:72:0::1;::::0;::::1;17662:21:1::0;17719:2;17699:18;;;17692:30;17758:29;17738:18;;;17731:57;17805:18;;38510:72:0::1;17478:351:1::0;38510:72:0::1;38593:6;38589:76;38605:8;38601:1;:12;38589:76;;;38628:29;38635:10;38647:8:::0;::::1;::::0;::::1;:::i;38628:29::-;38615:3;::::0;::::1;:::i;:::-;;;38589:76;;;-1:-1:-1::0;38681:10:0::1;38671:21;::::0;;;:9:::1;:21;::::0;;;;:33;;38696:8;;38671:21;:33:::1;::::0;38696:8;;38671:33:::1;:::i;:::-;::::0;;;-1:-1:-1;;1768:1:0;2722:7;:22;-1:-1:-1;;38161:549:0:o;25865:295::-;-1:-1:-1;;;;;25970:24:0;;23232:10;25970:24;;25962:62;;;;-1:-1:-1;;;25962:62:0;;16913:2:1;25962:62:0;;;16895:21:1;16952:2;16932:18;;;16925:30;16991:27;16971:18;;;16964:55;17036:18;;25962:62:0;16711: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;;12391:41:1;;;26035:42:0;;23232:10;26104:48;;12364: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;;20443:2:1;26866:103:0;;;20425:21:1;20482:2;20462:18;;;20455:30;20521:34;20501:18;;;20494:62;20592:19;20572:18;;;20565:47;20629:19;;26866:103:0;20241:413:1;26866:103:0;26980:39;26994:4;27000:2;27004:7;27013:5;26980:13;:39::i;36870:322::-;36934:13;36964:16;36972:7;36964;:16::i;:::-;36956:68;;;;-1:-1:-1;;;36956:68:0;;22396:2:1;36956:68:0;;;22378:21:1;22435:2;22415:18;;;22408:30;22474:34;22454:18;;;22447:62;22545:9;22525:18;;;22518:37;22572:19;;36956:68:0;22194:403:1;36956:68:0;37036:8;;;;37033:62;;37073:14;37066:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36870:322;;;:::o;37033:62::-;37132:15;37149:18;:7;:16;:18::i;:::-;37169:15;37115:70;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37101:85;;36870:322;;;:::o;33689:161::-;31821:6;;-1:-1:-1;;;;;31821:6:0;23232:10;31968:23;31960:68;;;;-1:-1:-1;;;31960:68:0;;19680:2:1;31960:68:0;;;19662:21:1;;;19699:18;;;19692:30;19758:34;19738:18;;;19731:62;19810:18;;31960:68:0;19478: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;42095:111::-;33381:10;33370:22;;;;:10;:22;;;;;;;;33362:52;;;;-1:-1:-1;;;33362:52:0;;13271:2:1;33362:52:0;;;13253:21:1;13310:2;13290:18;;;13283:30;13349:18;13329;;;13322:46;13385:18;;33362:52:0;13069:340:1;33362:52:0;42179:21:::1;::::0;;42154:46;;::::1;42179:21;::::0;;;::::1;;;42178:22;42154:46:::0;;::::1;;::::0;;42095:111::o;34432:24::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34432:24:0;;-1:-1:-1;34432: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;42891:147;42984:7;:14;42954:4;;42974:24;;:58;;;;;43030:1;-1:-1:-1;;;;;43002:30:0;:7;43010;43002:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;43002:16:0;:30;;42967:65;42891:147;-1:-1:-1;;42891: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;;17267:2:1;28212:73:0;;;17249:21:1;17306:2;17286:18;;;17279:30;17345:34;17325:18;;;17318:62;17416:14;17396:18;;;17389:42;17448:19;;28212:73:0;17065: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;43332:362::-;43444:4;-1:-1:-1;;;;;43424:24:0;:7;43432;43424:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;43424:16:0;:24;43416:80;;;;-1:-1:-1;;;43416:80:0;;15664:2:1;43416:80:0;;;15646:21:1;15703:2;15683:18;;;15676:30;15742:34;15722:18;;;15715:62;15813:13;15793:18;;;15786:41;15844:19;;43416:80:0;15462:407:1;43416:80:0;43553:29;43570:1;43574:7;43553:8;:29::i;:::-;43589:30;43610:4;43616:2;43589:20;:30::i;:::-;43647:2;43628:7;43636;43628:16;;;;;;;;:::i;:::-;;;;;;;;;:21;;;;-1:-1:-1;;;;;43628:21:0;;;;;;43661:27;;43680:7;;43661:27;;;;;;;;;;43628:16;43661:27;43332:362;;;:::o;43103:167::-;43160:36;43189:1;43193:2;43160:20;:36::i;:::-;43203:7;:16;;;;;;;-1:-1:-1;43203:16:0;;;;;;;;;-1:-1:-1;;;;;43203:16:0;;;;;;;;43231:33;;43256:7;;-1:-1:-1;43231:33:0;;-1:-1:-1;;43231:33:0;43103: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;;14028:2:1;28644:111:0;;;14010:21:1;14067:2;14047:18;;;14040:30;14106:34;14086:18;;;14079:62;14177:20;14157:18;;;14150:48;14215:19;;28644:111:0;13826: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;;19680:2:1;31960:68:0;;;19662:21:1;;;19699:18;;;19692:30;19758:34;19738:18;;;19731:62;19810:18;;31960:68:0;19478:356:1;31960:68:0;-1:-1:-1;;;;;32737:22:0;::::1;32729:73;;;::::0;-1:-1:-1;;;32729:73:0;;14447:2:1;32729:73:0::1;::::0;::::1;14429:21:1::0;14486:2;14466:18;;;14459:30;14525:34;14505:18;;;14498:62;14596:8;14576:18;;;14569:36;14622:19;;32729:73:0::1;14245:402:1::0;32729:73:0::1;32813:19;32823:8;32813:9;:19::i;42644:185::-:0;-1:-1:-1;;;;;42720:18:0;;;42716:51;;-1:-1:-1;;;;;42750:17:0;;;;;;:9;:17;;;;;42748:19;;42750:17;;;42748:19;;;:::i;:::-;;;;-1:-1:-1;42716:51:0;-1:-1:-1;;;;;42780:16:0;;;42776:47;;-1:-1:-1;;;;;42808:15:0;;;;;;:9;:15;;;;;42806:17;;42808:15;;;42806:17;;;:::i;:::-;;;;-1:-1:-1;42776:47:0;42644: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;;14028:2:1;27719:60:0;;;14010:21:1;14067:2;14047:18;;;14040:30;14106:34;14086:18;;;14079:62;14177:20;14157:18;;;14150:48;14215:19;;27719:60:0;13826: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:347::-;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;4636:5;4629:13;4622:21;4615:5;4612:32;4602:60;;4658:1;4655;4648:12;4602:60;4681:5;4671:15;;;4345:347;;;;;:::o;4697:254::-;4765:6;4773;4826:2;4814:9;4805:7;4801:23;4797:32;4794:52;;;4842:1;4839;4832:12;4794:52;4865:29;4884:9;4865:29;:::i;:::-;4855:39;4941:2;4926:18;;;;4913:32;;-1:-1:-1;;;4697:254:1:o;4956:437::-;5042:6;5050;5103:2;5091:9;5082:7;5078:23;5074:32;5071:52;;;5119:1;5116;5109:12;5071:52;5159:9;5146:23;5192:18;5184:6;5181:30;5178:50;;;5224:1;5221;5214:12;5178:50;5263:70;5325:7;5316:6;5305:9;5301:22;5263:70;:::i;:::-;5352:8;;5237:96;;-1:-1:-1;4956:437:1;-1:-1:-1;;;;4956:437:1:o;5398:773::-;5520:6;5528;5536;5544;5597:2;5585:9;5576:7;5572:23;5568:32;5565:52;;;5613:1;5610;5603:12;5565:52;5653:9;5640:23;5682:18;5723:2;5715:6;5712:14;5709:34;;;5739:1;5736;5729:12;5709:34;5778:70;5840:7;5831:6;5820:9;5816:22;5778:70;:::i;:::-;5867:8;;-1:-1:-1;5752:96:1;-1:-1:-1;5955:2:1;5940:18;;5927:32;;-1:-1:-1;5971:16:1;;;5968:36;;;6000:1;5997;5990:12;5968:36;;6039:72;6103:7;6092:8;6081:9;6077:24;6039:72;:::i;:::-;5398:773;;;;-1:-1:-1;6130:8:1;-1:-1:-1;;;;5398:773:1:o;6954:245::-;7012:6;7065:2;7053:9;7044:7;7040:23;7036:32;7033:52;;;7081:1;7078;7071:12;7033:52;7120:9;7107:23;7139:30;7163:5;7139:30;:::i;7204:249::-;7273:6;7326:2;7314:9;7305:7;7301:23;7297:32;7294:52;;;7342:1;7339;7332:12;7294:52;7374:9;7368:16;7393:30;7417:5;7393:30;:::i;7458:410::-;7529:6;7537;7590:2;7578:9;7569:7;7565:23;7561:32;7558:52;;;7606:1;7603;7596:12;7558:52;7646:9;7633:23;7679:18;7671:6;7668:30;7665:50;;;7711:1;7708;7701:12;7665:50;7750:58;7800:7;7791:6;7780:9;7776:22;7750:58;:::i;7873:719::-;7965:6;7973;7981;7989;8042:2;8030:9;8021:7;8017:23;8013:32;8010:52;;;8058:1;8055;8048:12;8010:52;8098:9;8085:23;8127:18;8168:2;8160:6;8157:14;8154:34;;;8184:1;8181;8174:12;8154:34;8223:58;8273:7;8264:6;8253:9;8249:22;8223:58;:::i;:::-;8300:8;;-1:-1:-1;8197:84:1;-1:-1:-1;8388:2:1;8373:18;;8360:32;;-1:-1:-1;8404:16:1;;;8401:36;;;8433:1;8430;8423:12;8401:36;;8472:60;8524:7;8513:8;8502:9;8498:24;8472:60;:::i;8597:180::-;8656:6;8709:2;8697:9;8688:7;8684:23;8680:32;8677:52;;;8725:1;8722;8715:12;8677:52;-1:-1:-1;8748:23:1;;8597:180;-1:-1:-1;8597:180:1:o;8782:316::-;8823:3;8861:5;8855:12;8888:6;8883:3;8876:19;8904:63;8960:6;8953:4;8948:3;8944:14;8937:4;8930:5;8926:16;8904:63;:::i;:::-;9012:2;9000:15;9017:66;8996:88;8987:98;;;;9087:4;8983:109;;8782:316;-1:-1:-1;;8782:316:1:o;9103:1088::-;9188:12;;9153:3;;9243:1;9263:18;;;;9316;;;;9343:61;;9397:4;9389:6;9385:17;9375:27;;9343:61;9423:2;9471;9463:6;9460:14;9440:18;9437:38;9434:218;;;9508:77;9505:1;9498:88;9609:4;9606:1;9599:15;9637:4;9634:1;9627:15;9434:218;9668:18;9695:162;;;;9871:1;9866:319;;;;9661:524;;9695:162;-1:-1:-1;;9732:9:1;9728:82;9723:3;9716:95;9840:6;9835:3;9831:16;9824:23;;9695:162;;9866:319;22857:1;22850:14;;;22894:4;22881:18;;9960:1;9974:165;9988:6;9985:1;9982:13;9974:165;;;10066:14;;10053:11;;;10046:35;10109:16;;;;10003:10;;9974:165;;;9978:3;;10168:6;10163:3;10159:16;10152:23;;9661:524;;;;;;;9103:1088;;;;:::o;10196:456::-;10417:3;10445:38;10479:3;10471:6;10445:38;:::i;:::-;10512:6;10506:13;10528:52;10573:6;10569:2;10562:4;10554:6;10550:17;10528:52;:::i;:::-;10596:50;10638:6;10634:2;10630:15;10622:6;10596:50;:::i;:::-;10589:57;10196:456;-1:-1:-1;;;;;;;10196:456:1:o;11098:511::-;11292:4;-1:-1:-1;;;;;11402:2:1;11394:6;11390:15;11379:9;11372:34;11454:2;11446:6;11442:15;11437:2;11426:9;11422:18;11415:43;;11494:6;11489:2;11478:9;11474:18;11467:34;11537:3;11532:2;11521:9;11517:18;11510:31;11558:45;11598:3;11587:9;11583:19;11575:6;11558:45;:::i;:::-;11550:53;11098:511;-1:-1:-1;;;;;;11098:511:1:o;11614:632::-;11785:2;11837:21;;;11907:13;;11810:18;;;11929:22;;;11756:4;;11785:2;12008:15;;;;11982:2;11967:18;;;11756:4;12051:169;12065:6;12062:1;12059:13;12051:169;;;12126:13;;12114:26;;12195:15;;;;12160:12;;;;12087:1;12080:9;12051:169;;;-1:-1:-1;12237:3:1;;11614:632;-1:-1:-1;;;;;;11614:632:1:o;12443:219::-;12592:2;12581:9;12574:21;12555:4;12612:44;12652:2;12641:9;12637:18;12629:6;12612:44;:::i;22910:128::-;22950:3;22981:1;22977:6;22974:1;22971:13;22968:39;;;22987:18;;:::i;:::-;-1:-1:-1;23023:9:1;;22910:128::o;23043:120::-;23083:1;23109;23099:35;;23114:18;;:::i;:::-;-1:-1:-1;23148:9:1;;23043:120::o;23168:228::-;23208:7;23334:1;23266:66;23262:74;23259:1;23256:81;23251:1;23244:9;23237:17;23233:105;23230:131;;;23341:18;;:::i;:::-;-1:-1:-1;23381:9:1;;23168:228::o;23401:125::-;23441:4;23469:1;23466;23463:8;23460:34;;;23474:18;;:::i;:::-;-1:-1:-1;23511:9:1;;23401:125::o;23531:258::-;23603:1;23613:113;23627:6;23624:1;23621:13;23613:113;;;23703:11;;;23697:18;23684:11;;;23677:39;23649:2;23642:10;23613:113;;;23744:6;23741:1;23738:13;23735:48;;;-1:-1:-1;;23779:1:1;23761:16;;23754:27;23531:258::o;23794:196::-;23833:3;23861:5;23851:39;;23870:18;;:::i;:::-;-1:-1:-1;23917:66:1;23906:78;;23794:196::o;23995:437::-;24074:1;24070:12;;;;24117;;;24138:61;;24192:4;24184:6;24180:17;24170:27;;24138:61;24245:2;24237:6;24234:14;24214:18;24211:38;24208:218;;;24282:77;24279:1;24272:88;24383:4;24380:1;24373:15;24411:4;24408:1;24401:15;24208:218;;23995:437;;;:::o;24437:195::-;24476:3;24507:66;24500:5;24497:77;24494:103;;;24577:18;;:::i;:::-;-1:-1:-1;24624:1:1;24613:13;;24437:195::o;24637:112::-;24669:1;24695;24685:35;;24700:18;;:::i;:::-;-1:-1:-1;24734:9:1;;24637:112::o;24754:184::-;24806:77;24803:1;24796:88;24903:4;24900:1;24893:15;24927:4;24924:1;24917:15;24943:184;24995:77;24992:1;24985:88;25092:4;25089:1;25082:15;25116:4;25113:1;25106:15;25132:184;25184:77;25181:1;25174:88;25281:4;25278:1;25271:15;25305:4;25302:1;25295:15;25321:184;25373:77;25370:1;25363:88;25470:4;25467:1;25460:15;25494:4;25491:1;25484:15;25510:177;25595:66;25588:5;25584:78;25577:5;25574:89;25564:117;;25677:1;25674;25667:12

Swarm Source

ipfs://de36d23f95df564c19ef90ebb23c743f1de1a5b32fc916afbdcd1dd8b254faad
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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