ETH Price: $3,228.44 (+1.06%)

Token

WONDER SECRET CLUB (WSC)
 

Overview

Max Total Supply

2,000 WSC

Holders

1,025

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 WSC
0xd448905ef32b90c2d5bee343b5c56b13ccdd6873
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:
Token

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-02
*/

// SPDX-License-Identifier: MIT
pragma solidity >=0.8.7 <0.9.0;



//import "../../utils/Strings.sol";
/**
 * @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);
    }
}

//import "../../utils/Context.sol";
/**
 * @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;
    }
}


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

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

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

    /**
     * @dev 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 {
        _transferOwnership(address(0));
    }

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

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

//import "../../utils/introspection/IERC165.sol";
/**
 * @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);
}

//import "./IERC721.sol";
/**
 * @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`.
     *
     * 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;

    /**
     * @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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

//import "./IERC721Receiver.sol";
/**
 * @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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}



//import "./extensions/IERC721Metadata.sol";
/**
 * @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);
}


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

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://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);
            }
        }
    }
}



//import "../../utils/introspection/ERC165.sol";
/**
 * @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;
    }
}


/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.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);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 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);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 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;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}


//import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
/**
 * @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;
    }
}


//import "./Common/IAirdrop.sol";
//--------------------------------------------
// AIRDROP intterface
//--------------------------------------------
interface IAirdrop {
    //--------------------
    // function
    //--------------------
    function getTotal() external view returns (uint256);
    function getAt( uint256 at ) external view returns (address);
}

//import "./Common/IWhiteList.sol";
//--------------------------------------------
// WHITELIST intterface
//--------------------------------------------
interface IWhiteList {
    //--------------------
    // function
    //--------------------
    function check( address target ) external view returns (bool);
}


//--------------------------------------------------------
// Token: WONDER SECRET CLUB
//--------------------------------------------------------
contract Token is Ownable, ERC721, ReentrancyGuard {
    //--------------------------------------------------------
    // constant
    //--------------------------------------------------------
    string constant private TOKEN_NAME = "WONDER SECRET CLUB";
    string constant private TOKEN_SYMBOL = "WSC";
    uint256 constant private BLOCK_SEC_MARGIN = 30;

    //-----------------------------------------
    // mainnet
    //-----------------------------------------
    address constant private OWNER_ADDRESS = 0x8ee348062160811cba1c1A51E66c6A73214655F8;
    uint256 constant private RESERVED_TOKEN = 120;
    uint256 constant private AIRDROP_ADDRESS = 49;
    uint256 constant private AIRDROP_TOKEN_PER_ADDRESS = 2;
    uint256 constant private AIRDROP_TOKEN = AIRDROP_ADDRESS*AIRDROP_TOKEN_PER_ADDRESS;

    // enum
    uint256 constant private INFO_SALE_SUSPENDED = 0;
    uint256 constant private INFO_SALE_START = 1;
    uint256 constant private INFO_SALE_END = 2;
    uint256 constant private INFO_SALE_PRICE = 3;
    uint256 constant private INFO_SALE_WHITELISTED = 4;
    uint256 constant private INFO_SALE_MAX_MINT = 5;
    uint256 constant private INFO_SALE_USER_MINTED = 6;
    uint256 constant private INFO_MAX = 7;
    uint256 constant private USER_INFO_SALE = INFO_MAX;
    uint256 constant private USER_INFO_SUPPLY = INFO_MAX + 1;
    uint256 constant private USER_INFO_TOTAL = INFO_MAX + 2;
    uint256 constant private USER_INFO_MAX = INFO_MAX + 3;

    //--------------------------------------------------------
    // storage
    //--------------------------------------------------------
    address private _manager;
    string private _baseUriForHidden;
    string private _baseUriForRevealed;
    uint256 private _tokenMax;
    uint256 private _totalSupply;

    // AIRDROP
    IAirdrop private _AIRDROP_list;

    // MINTED
    IWhiteList private _MINTED_list;

    // WONDERLIST SALE
    bool private _WONDERLIST_SALE_isSuspended;
    uint256 private _WONDERLIST_SALE_start;
    uint256 private _WONDERLIST_SALE_end;
    uint256 private _WONDERLIST_SALE_price;
    uint256 private _WONDERLIST_SALE_quantity;
    IWhiteList[] private _WONDERLIST_SALE_arrWhiteList;
    mapping( address => uint256 ) private _WONDERLIST_SALE_mapMinted;

    // WONDERKIDS SALE
    bool private _WONDERKIDS_SALE_isSuspended;
    uint256 private _WONDERKIDS_SALE_start;
    uint256 private _WONDERKIDS_SALE_end;
    uint256 private _WONDERKIDS_SALE_price;
    uint256 private _WONDERKIDS_SALE_quantity;
    IWhiteList[] private _WONDERKIDS_SALE_arrWhiteList;
    mapping( address => uint256 ) private _WONDERKIDS_SALE_mapMinted;

    // PUBLIC SALE
    bool private _PUBLIC_SALE_isSuspended;
    uint256 private _PUBLIC_SALE_start;
    uint256 private _PUBLIC_SALE_end;
    uint256 private _PUBLIC_SALE_price;
    uint256 private _PUBLIC_SALE_quantity;
    IWhiteList[] private _PUBLIC_SALE_arrWhiteList;
    mapping( address => uint256 ) private _PUBLIC_SALE_mapMinted;

    // FINAL SALE
    bool private _FINAL_SALE_isSuspended;
    uint256 private _FINAL_SALE_start;
    uint256 private _FINAL_SALE_end;
    uint256 private _FINAL_SALE_price;
    uint256 private _FINAL_SALE_quantity;
    mapping( address => uint256 ) private _FINAL_SALE_mapMinted;

    //--------------------------------------------------------
    // [modifier] onlyOwnerOrManager
    //--------------------------------------------------------
    modifier onlyOwnerOrManager() {
        require( msg.sender == owner() || msg.sender == manager(), "caller is not the owner neither manager" );
        _;
    }

    //--------------------------------------------------------
    // constructor
    //--------------------------------------------------------
    constructor() Ownable() ERC721( TOKEN_NAME, TOKEN_SYMBOL ) {
        transferOwnership( OWNER_ADDRESS );
        _manager = msg.sender;

        //-----------------------
        // mainnet
        //-----------------------
        _baseUriForHidden = "ipfs://QmZkJocmGRFCef9t2q2MGUQ4Z7kNH9KPASwEeD2kx11URw/";
        _tokenMax = 5555;

        _AIRDROP_list = IAirdrop(0x2D44980Dda803827E756B5E4F4B0e1A3a824766E);   // additional
        _MINTED_list = IWhiteList(0x801de38D7F3cF2f2f5B23814541C3351189951B5);  // additional

        //=======================
        // WONDERLIST SALE
        //=======================
        _WONDERLIST_SALE_start = 1656946800;            // 2022-07-04 15:00:00(UTC)
        _WONDERLIST_SALE_end   = 1656954000;            // 2022-07-04 17:00:00(UTC)
        _WONDERLIST_SALE_price = 40000000000000000;     // 0.04 ETH
        _WONDERLIST_SALE_quantity = 1;
        _WONDERLIST_SALE_arrWhiteList.push( IWhiteList(0x582b680e1b1c8aCAA9442E80b12CD0efAf1f3bd1) );   // fixed: 6/13
        _WONDERLIST_SALE_arrWhiteList.push( IWhiteList(0x632ae52C10159fDb8f191F778f1aE9cA2ABFEeb3) );   // fixed: 6/13
        _WONDERLIST_SALE_arrWhiteList.push( IWhiteList(0x7e72b15Cd97F08F7aE7a32C06Cca732eeb08C98c) );   // fixed: 6/13
        _WONDERLIST_SALE_arrWhiteList.push( IWhiteList(0x06Dccb6EE7a900759CE426ef713120508f9C5036) );   // fixed: 6/13
        _WONDERLIST_SALE_arrWhiteList.push( IWhiteList(0xe1bAD705EC6710800B3fe507c66a20cbd895Fe8E) );   // fixed: 6/13
        _WONDERLIST_SALE_arrWhiteList.push( IWhiteList(0x6B9cC7A4c3e7A4eB56f29D3B3556FeB9318D1446) );   // fixed: 6/13
        _WONDERLIST_SALE_arrWhiteList.push( IWhiteList(0x174fF1E0136a1bd578D8e27f6C430963b342F59F) );   // fixed: 6/13
        _WONDERLIST_SALE_arrWhiteList.push( IWhiteList(0xD94e994c032fa5132f070D899703c19E686cFE3a) );   // fixed: 6/13
        _WONDERLIST_SALE_arrWhiteList.push( IWhiteList(0x9be8f83f81291aacdB12f37a80A464d7Bfe4B8A1) );   // fixed: 6/13
        _WONDERLIST_SALE_arrWhiteList.push( IWhiteList(0xB2ec8cde166f57a4E0D871d59610aa9ff30A6096) );   // additional

        //+++++++++++++++++++++++
        // WONDERKIDS SALE
        //+++++++++++++++++++++++
        _WONDERKIDS_SALE_start = 1656946800;            // 2022-07-04 15:00:00(UTC)
        _WONDERKIDS_SALE_end   = 1656954000;            // 2022-07-04 17:00:00(UTC)
        _WONDERKIDS_SALE_price = 40000000000000000;     // 0.04 ETH
        _WONDERKIDS_SALE_quantity = 2;
        _WONDERKIDS_SALE_arrWhiteList.push( IWhiteList(0x6452EBc37A790d8A5614bB3E30cf544eB5555796) );   // fixed: 6/13
        _WONDERKIDS_SALE_arrWhiteList.push( IWhiteList(0x2B56E26E85a552Eaa2C8C332C96EE4A11B7B4cac) );   // additional

        //***********************
        // PUBLIC SALE
        //***********************
        _PUBLIC_SALE_start = 1656954000;                // 2022-07-04 17:00:00(UTC)
        _PUBLIC_SALE_end   = 1656961200;                // 2022-07-04 19:00:00(UTC)
        _PUBLIC_SALE_price = 50000000000000000;         // 0.05 ETH
        _PUBLIC_SALE_quantity = 1;
        _PUBLIC_SALE_arrWhiteList.push( IWhiteList(0x2821Dbf2685fCda10C64907637aF56c7f92C4dd6) );       // fixed: 6/13
        _PUBLIC_SALE_arrWhiteList.push( IWhiteList(0x55E25eb0DbB1AA8a9b47e44fD27438B827D4A986) );       // fixed: 6/13
        _PUBLIC_SALE_arrWhiteList.push( IWhiteList(0x62a2CC3889d65666A669533fE8f92a323FE2c9A8) );       // fixed: 6/13
        _PUBLIC_SALE_arrWhiteList.push( IWhiteList(0x904f99D3646660096752e0Bc2fd5458962788F7B) );       // fixed: 6/13
        _PUBLIC_SALE_arrWhiteList.push( IWhiteList(0x8336f23513c25c52775DB44624BA5B731C8BAE18) );       // fixed: 6/13

        //~~~~~~~~~~~~~~~~~~~~~~~
        // FINAL SALE
        //~~~~~~~~~~~~~~~~~~~~~~~
        _FINAL_SALE_start = 1656961200;                 // 2022-07-04 19:00:00(UTC)
        _FINAL_SALE_end   = 0;                          // no period
        _FINAL_SALE_price = 50000000000000000;          // 0.05 ETH
        _FINAL_SALE_quantity = 2;
    }

    //--------------------------------------------------------
    // [public] manager
    //--------------------------------------------------------
    function manager() public view returns (address) {
        return( _manager );
    }

    //--------------------------------------------------------
    // [external/onlyOwner] setManager
    //--------------------------------------------------------
    function setManager( address target ) external onlyOwner {
        _manager = target;
    }

    //--------------------------------------------------------
    // [external] get
    //--------------------------------------------------------
    function baseUriForHidden() external view returns (string memory) { return( _baseUriForHidden ); }
    function baseUriForRevealed() external view returns (string memory) { return( _baseUriForRevealed ); }
    function tokenMax() external view returns (uint256) { return( _tokenMax ); }
    function totalSupply() external view returns (uint256) { return( _totalSupply ); }

    //--------------------------------------------------------
    // [external/onlyOwnerOrManager] set
    //--------------------------------------------------------
    function setBaseUriForHidden( string calldata uri ) external onlyOwnerOrManager { _baseUriForHidden = uri; }
    function setBaseUriForRevealed( string calldata uri ) external onlyOwnerOrManager { _baseUriForRevealed = uri; }
    function setTokenMax( uint256 max ) external onlyOwnerOrManager { _tokenMax = max; }

    //--------------------------------------------------------
    // [public/override] tokenURI
    //--------------------------------------------------------
    function tokenURI( uint256 tokenId ) public view override returns (string memory) {
        require( _exists( tokenId ), "nonexistent token" );

        if( bytes(_baseUriForRevealed).length > 0 ){
            return( string( abi.encodePacked( _baseUriForRevealed, Strings.toString( tokenId ) ) ) );            
        }

        return( string( abi.encodePacked( _baseUriForHidden, Strings.toString( tokenId ) ) ) );
    }

    //--------------------------------------------------------
    // [external/onlyOwnerOrManager] write - AIRDROP
    //--------------------------------------------------------
    function AIRDROP_setList( address list ) external onlyOwnerOrManager {
        require( list != address(0), "AIRDROP: invalid list" );
        _AIRDROP_list = IAirdrop(list);
    }

    //--------------------------------------------------------
    // [external/onlyOwnerOrManager] write - MINTED
    //--------------------------------------------------------
    function MINTED_setList( address list ) external onlyOwnerOrManager {
        require( list != address(0), "MINTED: invalid list" );
        _MINTED_list = IWhiteList(list);
    }

    //========================================================
    // [public] getInfo - WONDERLIST SALE
    //========================================================
    function WONDERLIST_SALE_getInfo( address target ) public view returns (uint256[INFO_MAX] memory) {
        uint256[INFO_MAX] memory arrRet;

        if( _WONDERLIST_SALE_isSuspended ){ arrRet[INFO_SALE_SUSPENDED] = 1; }
        arrRet[INFO_SALE_START] = _WONDERLIST_SALE_start;
        arrRet[INFO_SALE_END] = _WONDERLIST_SALE_end;
        arrRet[INFO_SALE_PRICE] = _WONDERLIST_SALE_price;
        if( _checkWhitelist( _WONDERLIST_SALE_arrWhiteList, target, true ) ){ arrRet[INFO_SALE_WHITELISTED] = 1; }
        arrRet[INFO_SALE_MAX_MINT] = _WONDERLIST_SALE_quantity;
        arrRet[INFO_SALE_USER_MINTED] = _WONDERLIST_SALE_mapMinted[target];

        return( arrRet );
    }

    //========================================================
    // [external/onlyOwnerOrManager] write - WONDERLIST SALE
    //========================================================
    // isSuspended
    function WONDERLIST_SALE_suspend( bool flag ) external onlyOwnerOrManager {
        _WONDERLIST_SALE_isSuspended = flag;
    }

    // start-end
    function WONDERLIST_SALE_setStartEnd( uint256 start, uint256 end ) external onlyOwnerOrManager {
        _WONDERLIST_SALE_start = start;
        _WONDERLIST_SALE_end = end;
    }

    // price
    function WONDERLIST_SALE_setPrice( uint256 price ) external onlyOwnerOrManager {
        _WONDERLIST_SALE_price = price;
    }

    // quantity
    function WONDERLIST_SALE_setQuantity( uint256 quantity ) external onlyOwnerOrManager {
        _WONDERLIST_SALE_quantity = quantity;
    }

    // whitelist
    function WONDERLIST_SALE_setWhiteList( address[] calldata lists ) external onlyOwnerOrManager {
        delete _WONDERLIST_SALE_arrWhiteList;

        for( uint256 i=0; i<lists.length; i++ ){
            require( lists[i] != address(0), "WONDERLIST SALE: invalid list"  );
            _WONDERLIST_SALE_arrWhiteList.push( IWhiteList(lists[i]) );
        }
    }

    //========================================================
    // [external/payable] mint - WONDERLIST SALE
    //========================================================
    function WONDERLIST_SALE_mint( uint256 num ) external payable nonReentrant {
        uint256[INFO_MAX] memory arrInfo = WONDERLIST_SALE_getInfo( msg.sender );

        require( arrInfo[INFO_SALE_SUSPENDED] == 0, "WONDERLIST SALE: suspended" );
        require( arrInfo[INFO_SALE_START] == 0 || arrInfo[INFO_SALE_START] <= (block.timestamp+BLOCK_SEC_MARGIN), "WONDERLIST SALE: not opend" );
        require( arrInfo[INFO_SALE_END] == 0 || arrInfo[INFO_SALE_END] > (block.timestamp-BLOCK_SEC_MARGIN), "WONDERLIST SALE: finished" );
        require( arrInfo[INFO_SALE_WHITELISTED] == 1, "WONDERLIST SALE: not whitelisted" );
        require( arrInfo[INFO_SALE_MAX_MINT] >= (arrInfo[INFO_SALE_USER_MINTED]+num), "WONDERLIST SALE: reached the limit" );

        _checkPayment( msg.sender, arrInfo[INFO_SALE_PRICE]*num, msg.value );

        _mintTokens( msg.sender, num );
        _WONDERLIST_SALE_mapMinted[msg.sender] += num;
    }

    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    // [public] getInfo - WONDERKIDS SALE
    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    function WONDERKIDS_SALE_getInfo( address target ) public view returns (uint256[INFO_MAX] memory) {
        uint256[INFO_MAX] memory arrRet;

        if( _WONDERKIDS_SALE_isSuspended ){ arrRet[INFO_SALE_SUSPENDED] = 1; }
        arrRet[INFO_SALE_START] = _WONDERKIDS_SALE_start;
        arrRet[INFO_SALE_END] = _WONDERKIDS_SALE_end;
        arrRet[INFO_SALE_PRICE] = _WONDERKIDS_SALE_price;
        if( _checkWhitelist( _WONDERKIDS_SALE_arrWhiteList, target, true ) ){ arrRet[INFO_SALE_WHITELISTED] = 1; }
        arrRet[INFO_SALE_MAX_MINT] = _WONDERKIDS_SALE_quantity;
        arrRet[INFO_SALE_USER_MINTED] = _WONDERKIDS_SALE_mapMinted[target];

        return( arrRet );
    }

    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    // [external/onlyOwnerOrManager] write - WONDERKIDS SALE
    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    // isSuspended
    function WONDERKIDS_SALE_suspend( bool flag ) external onlyOwnerOrManager {
        _WONDERKIDS_SALE_isSuspended = flag;
    }

    // start-end
    function WONDERKIDS_SALE_setStartEnd( uint256 start, uint256 end ) external onlyOwnerOrManager {
        _WONDERKIDS_SALE_start = start;
        _WONDERKIDS_SALE_end = end;
    }

    // price
    function WONDERKIDS_SALE_setPrice( uint256 price ) external onlyOwnerOrManager {
        _WONDERKIDS_SALE_price = price;
    }

    // quantity
    function WONDERKIDS_SALE_setQuantity( uint256 quantity ) external onlyOwnerOrManager {
        _WONDERKIDS_SALE_quantity = quantity;
    }

    // whitelist
    function WONDERKIDS_SALE_setWhiteList( address[] calldata lists ) external onlyOwnerOrManager {
        delete _WONDERKIDS_SALE_arrWhiteList;

        for( uint256 i=0; i<lists.length; i++ ){
            require( lists[i] != address(0), "WONDERKIDS SALE: invalid list"  );
            _WONDERKIDS_SALE_arrWhiteList.push( IWhiteList(lists[i]) );
        }
    }

    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    // [external/payable] mint - WONDERKIDS SALE
    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    function WONDERKIDS_SALE_mint( uint256 num ) external payable nonReentrant {
        uint256[INFO_MAX] memory arrInfo = WONDERKIDS_SALE_getInfo( msg.sender );

        require( arrInfo[INFO_SALE_SUSPENDED] == 0, "WONDERKIDS SALE: suspended" );
        require( arrInfo[INFO_SALE_START] == 0 || arrInfo[INFO_SALE_START] <= (block.timestamp+BLOCK_SEC_MARGIN), "WONDERKIDS SALE: not opend" );
        require( arrInfo[INFO_SALE_END] == 0 || arrInfo[INFO_SALE_END] > (block.timestamp-BLOCK_SEC_MARGIN), "WONDERKIDS SALE: finished" );
        require( arrInfo[INFO_SALE_WHITELISTED] == 1, "WONDERKIDS SALE: not whitelisted" );
        require( arrInfo[INFO_SALE_MAX_MINT] >= (arrInfo[INFO_SALE_USER_MINTED]+num), "WONDERKIDS SALE: reached the limit" );

        _checkPayment( msg.sender, arrInfo[INFO_SALE_PRICE]*num, msg.value );

        _mintTokens( msg.sender, num );
        _WONDERKIDS_SALE_mapMinted[msg.sender] += num;
    }

    //********************************************************
    // [public] getInfo - PUBLIC SALE
    //********************************************************
    function PUBLIC_SALE_getInfo( address target ) public view returns (uint256[INFO_MAX] memory) {
        uint256[INFO_MAX] memory arrRet;

        if( _PUBLIC_SALE_isSuspended ){ arrRet[INFO_SALE_SUSPENDED] = 1; }
        arrRet[INFO_SALE_START] = _PUBLIC_SALE_start;
        arrRet[INFO_SALE_END] = _PUBLIC_SALE_end;
        arrRet[INFO_SALE_PRICE] = _PUBLIC_SALE_price;
        if( _checkWhitelist( _PUBLIC_SALE_arrWhiteList, target, false ) ){ arrRet[INFO_SALE_WHITELISTED] = 1; }
        arrRet[INFO_SALE_MAX_MINT] = _PUBLIC_SALE_quantity;
        arrRet[INFO_SALE_USER_MINTED] = _PUBLIC_SALE_mapMinted[target];

        return( arrRet );
    }

    //********************************************************
    // [external/onlyOwnerOrManager] write - PUBLIC SALE
    //********************************************************
    // isSuspended
    function PUBLIC_SALE_suspend( bool flag ) external onlyOwnerOrManager {
        _PUBLIC_SALE_isSuspended = flag;
    }

    // start-end
    function PUBLIC_SALE_setStartEnd( uint256 start, uint256 end ) external onlyOwnerOrManager {
        _PUBLIC_SALE_start = start;
        _PUBLIC_SALE_end = end;
    }

    // price
    function PUBLIC_SALE_setPrice( uint256 price ) external onlyOwnerOrManager {
        _PUBLIC_SALE_price = price;
    }

    // quantity
    function PUBLIC_SALE_setQuantity( uint256 quantity ) external onlyOwnerOrManager {
        _PUBLIC_SALE_quantity = quantity;
    }

    // whitelist
    function PUBLIC_SALE_setWhiteList( address[] calldata lists ) external onlyOwnerOrManager {
        delete _PUBLIC_SALE_arrWhiteList;

        for( uint256 i=0; i<lists.length; i++ ){
            require( lists[i] != address(0), "PUBLIC SALE: invalid list"  );
            _PUBLIC_SALE_arrWhiteList.push( IWhiteList(lists[i]) );
        }
    }

    //********************************************************
    // [external/payable] mint - PUBLIC SALE
    //********************************************************
    function PUBLIC_SALE_mint( uint256 num ) external payable nonReentrant {
        uint256[INFO_MAX] memory arrInfo = PUBLIC_SALE_getInfo( msg.sender );

        require( arrInfo[INFO_SALE_SUSPENDED] == 0, "PUBLIC SALE: suspended" );
        require( arrInfo[INFO_SALE_START] == 0 || arrInfo[INFO_SALE_START] <= (block.timestamp+BLOCK_SEC_MARGIN), "PUBLIC SALE: not opend" );
        require( arrInfo[INFO_SALE_END] == 0 || arrInfo[INFO_SALE_END] > (block.timestamp-BLOCK_SEC_MARGIN), "PUBLIC SALE: finished" );
        require( arrInfo[INFO_SALE_WHITELISTED] == 1, "PUBLIC SALE: not whitelisted" );
        require( arrInfo[INFO_SALE_MAX_MINT] >= (arrInfo[INFO_SALE_USER_MINTED]+num), "PUBLIC SALE: reached the limit" );

        _checkPayment( msg.sender, arrInfo[INFO_SALE_PRICE]*num, msg.value );

        _mintTokens( msg.sender, num );
        _PUBLIC_SALE_mapMinted[msg.sender] += num;
    }

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // [public] getInfo - FINAL SALE
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    function FINAL_SALE_getInfo( address target ) public view returns (uint256[INFO_MAX] memory) {
        uint256[INFO_MAX] memory arrRet;

        if( _FINAL_SALE_isSuspended ){ arrRet[INFO_SALE_SUSPENDED] = 1; }
        arrRet[INFO_SALE_START] = _FINAL_SALE_start;
        arrRet[INFO_SALE_END] = _FINAL_SALE_end;
        arrRet[INFO_SALE_PRICE] = _FINAL_SALE_price;
        arrRet[INFO_SALE_WHITELISTED] = 1;
        arrRet[INFO_SALE_MAX_MINT] = _FINAL_SALE_quantity;
        arrRet[INFO_SALE_USER_MINTED] = _FINAL_SALE_mapMinted[target];

        return( arrRet );
    }

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // [external/onlyOwnerOrManager] write - FINAL SALE
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // isSuspended
    function FINAL_SALE_suspend( bool flag ) external onlyOwnerOrManager {
        _FINAL_SALE_isSuspended = flag;
    }

    // start-end
    function FINAL_SALE_setStartEnd( uint256 start, uint256 end ) external onlyOwnerOrManager {
        _FINAL_SALE_start = start;
        _FINAL_SALE_end = end;
    }

    // price
    function FINAL_SALE_setPrice( uint256 price ) external onlyOwnerOrManager {
        _FINAL_SALE_price = price;
    }

    // quantity
    function FINAL_SALE_setQuantity( uint256 quantity ) external onlyOwnerOrManager {
        _FINAL_SALE_quantity = quantity;
    }

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // [external/payable] mint - FINAL SALE
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    function FINAL_SALE_mint( uint256 num ) external payable nonReentrant {
        uint256[INFO_MAX] memory arrInfo = FINAL_SALE_getInfo( msg.sender );

        require( arrInfo[INFO_SALE_SUSPENDED] == 0, "FINAL SALE: suspended" );
        require( arrInfo[INFO_SALE_START] == 0 || arrInfo[INFO_SALE_START] <= (block.timestamp+BLOCK_SEC_MARGIN), "FINAL SALE: not opend" );
        require( arrInfo[INFO_SALE_END] == 0 || arrInfo[INFO_SALE_END] > (block.timestamp-BLOCK_SEC_MARGIN), "FINAL SALE: finished" );
        require( arrInfo[INFO_SALE_MAX_MINT] >= (arrInfo[INFO_SALE_USER_MINTED]+num), "FINAL SALE: reached the limit" );

        _checkPayment( msg.sender, arrInfo[INFO_SALE_PRICE]*num, msg.value );

        _mintTokens( msg.sender, num );
        _FINAL_SALE_mapMinted[msg.sender] += num;
    }

    //--------------------------------------------------------
    // [internal] _checkWhitelist
    //--------------------------------------------------------
    function _checkWhitelist( IWhiteList[] storage lists, address target, bool checkMinted ) internal view returns (bool) {
        if( checkMinted ){
            if( _MINTED_list.check( target ) ){
                return( false );
            }
        }

        for( uint256 i=0; i<lists.length; i++ ){
            if( lists[i].check(target) ){
                return( true);
            }
        }

        return( false );        
    }

    //--------------------------------------------------------
    // [internal] _checkPayment
    //--------------------------------------------------------
    function _checkPayment( address msgSender, uint256 price, uint256 payment ) internal {
        require( price <= payment, "insufficient value" );

        // refund if overpaymented
        if( price < payment ){
            uint256 change = payment - price;
            address payable target = payable( msgSender );
            target.transfer( change );
        }
    }

    //--------------------------------------------------------
    // [internal] _mintTokens
    //--------------------------------------------------------
    function _mintTokens( address to, uint256 num ) internal {
        require( _totalSupply >= (RESERVED_TOKEN+AIRDROP_TOKEN), "airdrop not finished" );
        require( (_totalSupply+num) <= _tokenMax, "exceeded the supply range" );

        for( uint256 i=0; i<num; i++ ){
            _mint( to, _totalSupply+(i+1) );
        }
        _totalSupply += num;
    }

    //--------------------------------------------------------
    // [external/onlyOwnerOrManager] reserveTokens
    //--------------------------------------------------------
    function reserveTokens( uint256 num ) external onlyOwnerOrManager {
        require( (_totalSupply+num) <= RESERVED_TOKEN, "exceeded the reservation range" );

        for( uint256 i=0; i<num; i++ ){
            _mint( owner(), _totalSupply+(i+1) );
        }
        _totalSupply += num;
    }

    //--------------------------------------------------------
    // [external/onlyOwnerOrManager] airdropTokens
    //--------------------------------------------------------
    function airdropTokens() external onlyOwnerOrManager {
        require( _totalSupply == RESERVED_TOKEN, "could not airdrop" );

        uint256 num = _AIRDROP_list.getTotal();
        require( num == AIRDROP_ADDRESS, "invalid airdrop list" );

        for( uint256 i=0; i<AIRDROP_ADDRESS; i++ ){
            address target = _AIRDROP_list.getAt( i );
            for( uint256 j=0; j<AIRDROP_TOKEN_PER_ADDRESS; j++ ){
                _mint( target, _totalSupply+(1+AIRDROP_TOKEN_PER_ADDRESS*i+j) );
            }
        }
        _totalSupply += AIRDROP_TOKEN;
    }

    //--------------------------------------------------------
    // [external] getUserInfo
    //--------------------------------------------------------
    function getUserInfo( address target ) external view returns (uint256[USER_INFO_MAX] memory) {
        uint256[USER_INFO_MAX] memory userInfo;
        uint256[INFO_MAX] memory info;

        // WONDERLIST
        if( _checkWhitelist( _WONDERLIST_SALE_arrWhiteList, target, true ) && (_WONDERLIST_SALE_end == 0 || _WONDERLIST_SALE_end > block.timestamp) ){
            userInfo[USER_INFO_SALE] = 1;
            info = WONDERLIST_SALE_getInfo( target );
        }
        // WONDERKIDS
        else if( _checkWhitelist( _WONDERKIDS_SALE_arrWhiteList, target , true ) && (_WONDERKIDS_SALE_end == 0 || _WONDERKIDS_SALE_end > block.timestamp) ){
            userInfo[USER_INFO_SALE] = 2;
            info = WONDERKIDS_SALE_getInfo( target );
        }
        // PUBLIC
        else if( _checkWhitelist( _PUBLIC_SALE_arrWhiteList, target, false  ) && (_PUBLIC_SALE_end == 0 || _PUBLIC_SALE_end > block.timestamp) ){
            userInfo[USER_INFO_SALE] = 3;
            info = PUBLIC_SALE_getInfo( target );
        }
        // FINAL
        else{
            userInfo[USER_INFO_SALE] = 4;
            info = FINAL_SALE_getInfo( target );
        }

        for( uint256 i=0; i<INFO_MAX; i++ ){
            userInfo[i] = info[i];
        }

        userInfo[USER_INFO_SUPPLY] = _totalSupply;
        userInfo[USER_INFO_TOTAL] = _tokenMax;

        return( userInfo );
    }

    //--------------------------------------------------------
    // [external] checkBalance
    //--------------------------------------------------------
    function checkBalance() external view returns (uint256) {
        return( address(this).balance );
    }

    //--------------------------------------------------------
    // [external/onlyOwnerOrManager] withdraw
    //--------------------------------------------------------
    function withdraw( uint256 amount ) external onlyOwnerOrManager nonReentrant {
        require( amount <= address(this).balance, "insufficient balance" );

        address payable target = payable( owner() );
        target.transfer( amount );
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"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":[{"internalType":"address","name":"list","type":"address"}],"name":"AIRDROP_setList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"FINAL_SALE_getInfo","outputs":[{"internalType":"uint256[7]","name":"","type":"uint256[7]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"FINAL_SALE_mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"FINAL_SALE_setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"FINAL_SALE_setQuantity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"FINAL_SALE_setStartEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"FINAL_SALE_suspend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"list","type":"address"}],"name":"MINTED_setList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"PUBLIC_SALE_getInfo","outputs":[{"internalType":"uint256[7]","name":"","type":"uint256[7]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"PUBLIC_SALE_mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"PUBLIC_SALE_setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"PUBLIC_SALE_setQuantity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"PUBLIC_SALE_setStartEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"lists","type":"address[]"}],"name":"PUBLIC_SALE_setWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"PUBLIC_SALE_suspend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"WONDERKIDS_SALE_getInfo","outputs":[{"internalType":"uint256[7]","name":"","type":"uint256[7]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"WONDERKIDS_SALE_mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"WONDERKIDS_SALE_setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"WONDERKIDS_SALE_setQuantity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"WONDERKIDS_SALE_setStartEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"lists","type":"address[]"}],"name":"WONDERKIDS_SALE_setWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"WONDERKIDS_SALE_suspend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"WONDERLIST_SALE_getInfo","outputs":[{"internalType":"uint256[7]","name":"","type":"uint256[7]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"WONDERLIST_SALE_mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"WONDERLIST_SALE_setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"WONDERLIST_SALE_setQuantity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"WONDERLIST_SALE_setStartEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"lists","type":"address[]"}],"name":"WONDERLIST_SALE_setWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"WONDERLIST_SALE_suspend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"airdropTokens","outputs":[],"stateMutability":"nonpayable","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":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUriForHidden","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUriForRevealed","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"getUserInfo","outputs":[{"internalType":"uint256[10]","name":"","type":"uint256[10]"}],"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":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"reserveTokens","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":"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":"uri","type":"string"}],"name":"setBaseUriForHidden","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseUriForRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"setManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"max","type":"uint256"}],"name":"setTokenMax","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":[],"name":"tokenMax","outputs":[{"internalType":"uint256","name":"","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":"","type":"uint256"}],"stateMutability":"view","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":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604051806040016040528060128152602001712ba7a72222a91029a2a1a922aa1021a62aa160711b8152506040518060400160405280600381526020016257534360e81b815250620000736200006d620004b660201b60201c565b620004ba565b815162000088906001906020850190620005df565b5080516200009e906002906020840190620005df565b5050600160075550620000c5738ee348062160811cba1c1a51e66c6a73214655f86200050a565b600880546001600160a01b0319163317905560408051606081019091526036808252620046b9602083013980516200010691600991602090910190620005df565b506115b3600b55600d80546001600160a01b0319908116732d44980dda803827e756b5e4f4b0e1a3a824766e17909155600e8054821673801de38d7f3cf2f2f5b23814541c3351189951b51790556362c30070600f8190556362c31c906010819055668e1bc9bf0400006011819055600160128190556013805480830182557f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0909081018054881673582b680e1b1c8acaa9442e80b12cd0efaf1f3bd11790558154808401835581018054881673632ae52c10159fdb8f191f778f1ae9ca2abfeeb317905581548084018355810180548816737e72b15cd97f08f7ae7a32c06cca732eeb08c98c179055815480840183558101805488167306dccb6ee7a900759ce426ef713120508f9c50361790558154808401835581018054881673e1bad705ec6710800b3fe507c66a20cbd895fe8e17905581548084018355810180548816736b9cc7a4c3e7a4eb56f29d3b3556feb9318d14461790558154808401835581018054881673174ff1e0136a1bd578d8e27f6c430963b342f59f1790558154808401835581018054881673d94e994c032fa5132f070d899703c19e686cfe3a17905581548084018355810180548816739be8f83f81291aacdb12f37a80a464d7bfe4b8a11790558154808401909255018054861673b2ec8cde166f57a4e0d871d59610aa9ff30a6096179055601693909355601782905560185560026019819055601a805480850182557f057c384a7d1c54f3a1b2e5e67b2617b8224fdfd1ea7234eea573a6ff665ff63e90810180548716736452ebc37a790d8a5614bb3e30cf544eb555579617905581548086019092550180548516732b56e26e85a552eaa2c8c332c96ee4a11b7b4cac179055601d919091556362c338b0601e81905566b1a2bc2ec50000601f819055602084905560218054808601825560008281527f3a6357012c1a3ae0a17d304c9920310382d968ebcc4b1771f41c6b304205b57091820180548916732821dbf2685fcda10c64907637af56c7f92c4dd6179055825480880184558201805489167355e25eb0dbb1aa8a9b47e44fd27438b827d4a986179055825480880184558201805489167362a2cc3889d65666a669533fe8f92a323fe2c9a81790558254808801845582018054891673904f99d3646660096752e0bc2fd5458962788f7b1790558254968701909255949094018054909516738336f23513c25c52775db44624ba5b731c8bae1817909455602455602591909155602691909155602755620006c2565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000546001600160a01b031633146200056a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b038116620005d15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000561565b620005dc81620004ba565b50565b828054620005ed9062000685565b90600052602060002090601f0160209004810192826200061157600085556200065c565b82601f106200062c57805160ff19168380011785556200065c565b828001600101855582156200065c579182015b828111156200065c5782518255916020019190600101906200063f565b506200066a9291506200066e565b5090565b5b808211156200066a57600081556001016200066f565b600181811c908216806200069a57607f821691505b60208210811415620006bc57634e487b7160e01b600052602260045260246000fd5b50919050565b613fe780620006d26000396000f3fe60806040526004361061038c5760003560e01c8063715018a6116101dc578063c71daccb11610102578063e2257266116100a0578063f2fde38b1161006f578063f2fde38b14610a68578063f34e1ea114610a88578063f7ee706814610aa8578063ff4b629e14610abd57600080fd5b8063e2257266146109bf578063e3c61b02146109df578063e985e9c5146109ff578063ecb8dbac14610a4857600080fd5b8063d0ebdbe7116100dc578063d0ebdbe71461093f578063d7bec63d1461095f578063dd5db3aa1461097f578063de3bc79f1461099f57600080fd5b8063c71daccb146108ec578063c87b56dd146108ff578063d031370b1461091f57600080fd5b8063a22cb4651161017a578063b88d4fde11610149578063b88d4fde1461086c578063be900d401461088c578063c0ca970f146108ac578063c555fd64146108cc57600080fd5b8063a22cb465146107f9578063a3df2a0114610819578063a47cd7761461082c578063ac1349a11461084c57600080fd5b806391152c5c116101b657806391152c5c1461079a57806393b76bce146107af57806395d89b41146107cf578063a04e5f7f146107e457600080fd5b8063715018a614610747578063808312bc1461075c5780638da5cb5b1461077c57600080fd5b806337592618116102c157806352c0295f1161025f5780635e59da6b1161022e5780635e59da6b146106c75780636352211e146106da5780636386c1c7146106fa57806370a082311461072757600080fd5b806352c0295f1461065257806353db2af214610667578063568489c8146106875780635d8ceea9146106a757600080fd5b806342842e0e1161029b57806342842e0e146105d4578063481c6a75146105f45780634a213d2a14610612578063502ece241461063257600080fd5b806337592618146105815780633abe69b2146105a15780633b353842146105c157600080fd5b80631c58eec51161032e578063279b8b5a11610308578063279b8b5a146105015780632e1a7d4d146105215780632e4318101461054157806336e517dd1461055457600080fd5b80631c58eec5146104a157806322a42799146104c157806323b872dd146104e157600080fd5b8063095ea7b31161036a578063095ea7b3146104205780630ff4231014610442578063138cfadc1461046257806318160ddd1461048257600080fd5b806301ffc9a71461039157806306fdde03146103c6578063081812fc146103e8575b600080fd5b34801561039d57600080fd5b506103b16103ac366004613a4b565b610add565b60405190151581526020015b60405180910390f35b3480156103d257600080fd5b506103db610b2f565b6040516103bd9190613cbf565b3480156103f457600080fd5b50610408610403366004613ae5565b610bc1565b6040516001600160a01b0390911681526020016103bd565b34801561042c57600080fd5b5061044061043b366004613970565b610c5b565b005b34801561044e57600080fd5b5061044061045d36600461399c565b610d71565b34801561046e57600080fd5b5061044061047d366004613b17565b610eb4565b34801561048e57600080fd5b50600c545b6040519081526020016103bd565b3480156104ad57600080fd5b506104406104bc366004613b17565b610efe565b3480156104cd57600080fd5b506104406104dc3660046137ae565b610f48565b3480156104ed57600080fd5b506104406104fc366004613821565b610ff6565b34801561050d57600080fd5b5061044061051c36600461399c565b611027565b34801561052d57600080fd5b5061044061053c366004613ae5565b61116a565b61044061054f366004613ae5565b61125e565b34801561056057600080fd5b5061057461056f3660046137ae565b6114cf565b6040516103bd9190613c97565b34801561058d57600080fd5b5061044061059c366004613ae5565b611544565b3480156105ad57600080fd5b506105746105bc3660046137ae565b611588565b6104406105cf366004613ae5565b61160a565b3480156105e057600080fd5b506104406105ef366004613821565b6117e4565b34801561060057600080fd5b506008546001600160a01b0316610408565b34801561061e57600080fd5b5061044061062d366004613b17565b6117ff565b34801561063e57600080fd5b5061044061064d366004613b17565b611849565b34801561065e57600080fd5b506103db611893565b34801561067357600080fd5b50610440610682366004613ae5565b6118a2565b34801561069357600080fd5b506104406106a2366004613ae5565b6118e6565b3480156106b357600080fd5b506104406106c2366004613a85565b61192a565b6104406106d5366004613ae5565b611975565b3480156106e657600080fd5b506104086106f5366004613ae5565b611ba6565b34801561070657600080fd5b5061071a6107153660046137ae565b611c1d565b6040516103bd9190613c65565b34801561073357600080fd5b506104936107423660046137ae565b611d98565b34801561075357600080fd5b50610440611e1f565b34801561076857600080fd5b50610440610777366004613a11565b611e55565b34801561078857600080fd5b506000546001600160a01b0316610408565b3480156107a657600080fd5b50610440611ea7565b3480156107bb57600080fd5b506104406107ca366004613ae5565b61210d565b3480156107db57600080fd5b506103db612151565b3480156107f057600080fd5b506103db612160565b34801561080557600080fd5b50610440610814366004613942565b61216f565b610440610827366004613ae5565b61217e565b34801561083857600080fd5b506104406108473660046137ae565b6123d0565b34801561085857600080fd5b50610440610867366004613a85565b61247f565b34801561087857600080fd5b50610440610887366004613862565b6124ca565b34801561089857600080fd5b506104406108a7366004613ae5565b612502565b3480156108b857600080fd5b506104406108c736600461399c565b612546565b3480156108d857600080fd5b506104406108e7366004613ae5565b612689565b3480156108f857600080fd5b5047610493565b34801561090b57600080fd5b506103db61091a366004613ae5565b6126cd565b34801561092b57600080fd5b5061044061093a366004613ae5565b61277c565b34801561094b57600080fd5b5061044061095a3660046137ae565b612869565b34801561096b57600080fd5b5061044061097a366004613ae5565b6128b5565b34801561098b57600080fd5b5061044061099a366004613ae5565b6128f9565b3480156109ab57600080fd5b506104406109ba366004613a11565b61293d565b3480156109cb57600080fd5b506105746109da3660046137ae565b61299a565b3480156109eb57600080fd5b506104406109fa366004613a11565b612a15565b348015610a0b57600080fd5b506103b1610a1a3660046137e8565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610a5457600080fd5b50610440610a63366004613ae5565b612a67565b348015610a7457600080fd5b50610440610a833660046137ae565b612aab565b348015610a9457600080fd5b50610440610aa3366004613a11565b612b46565b348015610ab457600080fd5b50600b54610493565b348015610ac957600080fd5b50610574610ad83660046137ae565b612b98565b60006001600160e01b031982166380ac58cd60e01b1480610b0e57506001600160e01b03198216635b5e139f60e01b145b80610b2957506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060018054610b3e90613eb6565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6a90613eb6565b8015610bb75780601f10610b8c57610100808354040283529160200191610bb7565b820191906000526020600020905b815481529060010190602001808311610b9a57829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610c3f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6000610c6682611ba6565b9050806001600160a01b0316836001600160a01b03161415610cd45760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c36565b336001600160a01b0382161480610cf05750610cf08133610a1a565b610d625760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c36565b610d6c8383612c14565b505050565b6000546001600160a01b0316331480610d9457506008546001600160a01b031633145b610db05760405162461bcd60e51b8152600401610c3690613daa565b610dbc601360006136ba565b60005b81811015610d6c576000838383818110610ddb57610ddb613f4c565b9050602002016020810190610df091906137ae565b6001600160a01b03161415610e475760405162461bcd60e51b815260206004820152601d60248201527f574f4e4445524c4953542053414c453a20696e76616c6964206c6973740000006044820152606401610c36565b6013838383818110610e5b57610e5b613f4c565b9050602002016020810190610e7091906137ae565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b0390921691909117905580610eac81613ef1565b915050610dbf565b6000546001600160a01b0316331480610ed757506008546001600160a01b031633145b610ef35760405162461bcd60e51b8152600401610c3690613daa565b602491909155602555565b6000546001600160a01b0316331480610f2157506008546001600160a01b031633145b610f3d5760405162461bcd60e51b8152600401610c3690613daa565b601d91909155601e55565b6000546001600160a01b0316331480610f6b57506008546001600160a01b031633145b610f875760405162461bcd60e51b8152600401610c3690613daa565b6001600160a01b038116610fd45760405162461bcd60e51b81526020600482015260146024820152731352539511510e881a5b9d985b1a59081b1a5cdd60621b6044820152606401610c36565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6110003382612c82565b61101c5760405162461bcd60e51b8152600401610c3690613d59565b610d6c838383612d79565b6000546001600160a01b031633148061104a57506008546001600160a01b031633145b6110665760405162461bcd60e51b8152600401610c3690613daa565b611072601a60006136ba565b60005b81811015610d6c57600083838381811061109157611091613f4c565b90506020020160208101906110a691906137ae565b6001600160a01b031614156110fd5760405162461bcd60e51b815260206004820152601d60248201527f574f4e4445524b4944532053414c453a20696e76616c6964206c6973740000006044820152606401610c36565b601a83838381811061111157611111613f4c565b905060200201602081019061112691906137ae565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b039092169190911790558061116281613ef1565b915050611075565b6000546001600160a01b031633148061118d57506008546001600160a01b031633145b6111a95760405162461bcd60e51b8152600401610c3690613daa565b600260075414156111cc5760405162461bcd60e51b8152600401610c3690613df1565b6002600755478111156112185760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b6044820152606401610c36565b600080546040516001600160a01b039091169182916108fc85150291859190818181858888f19350505050158015611254573d6000803e3d6000fd5b5050600160075550565b600260075414156112815760405162461bcd60e51b8152600401610c3690613df1565b6002600755600061129133611588565b8051909150156112e35760405162461bcd60e51b815260206004820152601a60248201527f574f4e4445524c4953542053414c453a2073757370656e6465640000000000006044820152606401610c36565b6020810151158061130257506112fa601e42613e28565b602082015111155b61134e5760405162461bcd60e51b815260206004820152601a60248201527f574f4e4445524c4953542053414c453a206e6f74206f70656e640000000000006044820152606401610c36565b6040810151158061136c5750611365601e42613e73565b6040820151115b6113b85760405162461bcd60e51b815260206004820152601960248201527f574f4e4445524c4953542053414c453a2066696e6973686564000000000000006044820152606401610c36565b608081015160011461140c5760405162461bcd60e51b815260206004820181905260248201527f574f4e4445524c4953542053414c453a206e6f742077686974656c69737465646044820152606401610c36565b60c081015161141c908390613e28565b60a0820151101561147a5760405162461bcd60e51b815260206004820152602260248201527f574f4e4445524c4953542053414c453a207265616368656420746865206c696d6044820152611a5d60f21b6064820152608401610c36565b61149833838360035b60200201516114929190613e54565b34612f15565b6114a23383612fb1565b33600090815260146020526040812080548492906114c1908490613e28565b909155505060016007555050565b6114d76136d8565b6114df6136d8565b60235460ff16156114ef57600181525b60245460208083019190915260255460408084019190915260265460608401526001608084015260275460a08401526001600160a01b038516600090815260289092529020548160065b602002015292915050565b6000546001600160a01b031633148061156757506008546001600160a01b031633145b6115835760405162461bcd60e51b8152600401610c3690613daa565b600b55565b6115906136d8565b6115986136d8565b600e54600160a01b900460ff16156115af57600181525b600f546020820152601054604082015260115460608201526115d460138460016130b7565b156115e157600160808201525b60125460a08201526001600160a01b038316600090815260146020526040902054816006611539565b6002600754141561162d5760405162461bcd60e51b8152600401610c3690613df1565b6002600755600061163d336114cf565b8051909150156116875760405162461bcd60e51b815260206004820152601560248201527411925390530814d053114e881cdd5cdc195b991959605a1b6044820152606401610c36565b602081015115806116a6575061169e601e42613e28565b602082015111155b6116ea5760405162461bcd60e51b815260206004820152601560248201527411925390530814d053114e881b9bdd081bdc195b99605a1b6044820152606401610c36565b604081015115806117085750611701601e42613e73565b6040820151115b61174b5760405162461bcd60e51b815260206004820152601460248201527311925390530814d053114e88199a5b9a5cda195960621b6044820152606401610c36565b60c081015161175b908390613e28565b60a082015110156117ae5760405162461bcd60e51b815260206004820152601d60248201527f46494e414c2053414c453a207265616368656420746865206c696d69740000006044820152606401610c36565b6117bb3383836003611483565b6117c53383612fb1565b33600090815260286020526040812080548492906114c1908490613e28565b610d6c838383604051806020016040528060008152506124ca565b6000546001600160a01b031633148061182257506008546001600160a01b031633145b61183e5760405162461bcd60e51b8152600401610c3690613daa565b600f91909155601055565b6000546001600160a01b031633148061186c57506008546001600160a01b031633145b6118885760405162461bcd60e51b8152600401610c3690613daa565b601691909155601755565b606060098054610b3e90613eb6565b6000546001600160a01b03163314806118c557506008546001600160a01b031633145b6118e15760405162461bcd60e51b8152600401610c3690613daa565b602755565b6000546001600160a01b031633148061190957506008546001600160a01b031633145b6119255760405162461bcd60e51b8152600401610c3690613daa565b601155565b6000546001600160a01b031633148061194d57506008546001600160a01b031633145b6119695760405162461bcd60e51b8152600401610c3690613daa565b610d6c600a83836136f6565b600260075414156119985760405162461bcd60e51b8152600401610c3690613df1565b600260075560006119a833612b98565b8051909150156119f35760405162461bcd60e51b8152602060048201526016602482015275141550931250c814d053114e881cdd5cdc195b99195960521b6044820152606401610c36565b60208101511580611a125750611a0a601e42613e28565b602082015111155b611a575760405162461bcd60e51b8152602060048201526016602482015275141550931250c814d053114e881b9bdd081bdc195b9960521b6044820152606401610c36565b60408101511580611a755750611a6e601e42613e73565b6040820151115b611ab95760405162461bcd60e51b8152602060048201526015602482015274141550931250c814d053114e88199a5b9a5cda1959605a1b6044820152606401610c36565b6080810151600114611b0d5760405162461bcd60e51b815260206004820152601c60248201527f5055424c49432053414c453a206e6f742077686974656c6973746564000000006044820152606401610c36565b60c0810151611b1d908390613e28565b60a08201511015611b705760405162461bcd60e51b815260206004820152601e60248201527f5055424c49432053414c453a207265616368656420746865206c696d697400006044820152606401610c36565b611b7d3383836003611483565b611b873383612fb1565b33600090815260226020526040812080548492906114c1908490613e28565b6000818152600360205260408120546001600160a01b031680610b295760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610c36565b611c2561377a565b611c2d61377a565b611c356136d8565b611c4260138560016130b7565b8015611c5957506010541580611c59575042601054115b15611c7557600160e0830152611c6e84611588565b9050611cfa565b611c82601a8560016130b7565b8015611c9957506017541580611c99575042601754115b15611cae57600260e0830152611c6e8461299a565b611cbb60218560006130b7565b8015611cd25750601e541580611cd2575042601e54115b15611ce757600360e0830152611c6e84612b98565b600460e0830152611cf7846114cf565b90505b60005b6007811015611d4657818160078110611d1857611d18613f4c565b60200201518382600a8110611d2f57611d2f613f4c565b602002015280611d3e81613ef1565b915050611cfd565b50600c5482611d5760076001613e28565b600a8110611d6757611d67613f4c565b6020020152600b5482611d7c60076002613e28565b600a8110611d8c57611d8c613f4c565b60200201525092915050565b60006001600160a01b038216611e035760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610c36565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b03163314611e495760405162461bcd60e51b8152600401610c3690613d24565b611e53600061321b565b565b6000546001600160a01b0316331480611e7857506008546001600160a01b031633145b611e945760405162461bcd60e51b8152600401610c3690613daa565b6023805460ff1916911515919091179055565b6000546001600160a01b0316331480611eca57506008546001600160a01b031633145b611ee65760405162461bcd60e51b8152600401610c3690613daa565b6078600c5414611f2c5760405162461bcd60e51b81526020600482015260116024820152700636f756c64206e6f742061697264726f7607c1b6044820152606401610c36565b600d546040805163775a25e360e01b815290516000926001600160a01b03169163775a25e3916004808301926020929190829003018186803b158015611f7157600080fd5b505afa158015611f85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa99190613afe565b905060318114611ff25760405162461bcd60e51b81526020600482015260146024820152731a5b9d985b1a5908185a5c991c9bdc081b1a5cdd60621b6044820152606401610c36565b60005b60318110156120e757600d5460405163303eaeed60e01b8152600481018390526000916001600160a01b03169063303eaeed9060240160206040518083038186803b15801561204357600080fd5b505afa158015612057573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207b91906137cb565b905060005b60028110156120d2576120c08282612099866002613e54565b6120a4906001613e28565b6120ae9190613e28565b600c546120bb9190613e28565b61326b565b806120ca81613ef1565b915050612080565b505080806120df90613ef1565b915050611ff5565b506120f460026031613e54565b600c60008282546121059190613e28565b909155505050565b6000546001600160a01b031633148061213057506008546001600160a01b031633145b61214c5760405162461bcd60e51b8152600401610c3690613daa565b601255565b606060028054610b3e90613eb6565b6060600a8054610b3e90613eb6565b61217a3383836133ad565b5050565b600260075414156121a15760405162461bcd60e51b8152600401610c3690613df1565b600260075560006121b13361299a565b8051909150156122035760405162461bcd60e51b815260206004820152601a60248201527f574f4e4445524b4944532053414c453a2073757370656e6465640000000000006044820152606401610c36565b60208101511580612222575061221a601e42613e28565b602082015111155b61226e5760405162461bcd60e51b815260206004820152601a60248201527f574f4e4445524b4944532053414c453a206e6f74206f70656e640000000000006044820152606401610c36565b6040810151158061228c5750612285601e42613e73565b6040820151115b6122d85760405162461bcd60e51b815260206004820152601960248201527f574f4e4445524b4944532053414c453a2066696e6973686564000000000000006044820152606401610c36565b608081015160011461232c5760405162461bcd60e51b815260206004820181905260248201527f574f4e4445524b4944532053414c453a206e6f742077686974656c69737465646044820152606401610c36565b60c081015161233c908390613e28565b60a0820151101561239a5760405162461bcd60e51b815260206004820152602260248201527f574f4e4445524b4944532053414c453a207265616368656420746865206c696d6044820152611a5d60f21b6064820152608401610c36565b6123a73383836003611483565b6123b13383612fb1565b336000908152601b6020526040812080548492906114c1908490613e28565b6000546001600160a01b03163314806123f357506008546001600160a01b031633145b61240f5760405162461bcd60e51b8152600401610c3690613daa565b6001600160a01b03811661245d5760405162461bcd60e51b8152602060048201526015602482015274105254911493d40e881a5b9d985b1a59081b1a5cdd605a1b6044820152606401610c36565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314806124a257506008546001600160a01b031633145b6124be5760405162461bcd60e51b8152600401610c3690613daa565b610d6c600983836136f6565b6124d43383612c82565b6124f05760405162461bcd60e51b8152600401610c3690613d59565b6124fc8484848461347c565b50505050565b6000546001600160a01b031633148061252557506008546001600160a01b031633145b6125415760405162461bcd60e51b8152600401610c3690613daa565b601f55565b6000546001600160a01b031633148061256957506008546001600160a01b031633145b6125855760405162461bcd60e51b8152600401610c3690613daa565b612591602160006136ba565b60005b81811015610d6c5760008383838181106125b0576125b0613f4c565b90506020020160208101906125c591906137ae565b6001600160a01b0316141561261c5760405162461bcd60e51b815260206004820152601960248201527f5055424c49432053414c453a20696e76616c6964206c697374000000000000006044820152606401610c36565b602183838381811061263057612630613f4c565b905060200201602081019061264591906137ae565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b039092169190911790558061268181613ef1565b915050612594565b6000546001600160a01b03163314806126ac57506008546001600160a01b031633145b6126c85760405162461bcd60e51b8152600401610c3690613daa565b602655565b6000818152600360205260409020546060906001600160a01b03166127285760405162461bcd60e51b81526020600482015260116024820152703737b732bc34b9ba32b73a103a37b5b2b760791b6044820152606401610c36565b6000600a805461273790613eb6565b9050111561277157600a61274a836134af565b60405160200161275b929190613b81565b6040516020818303038152906040529050919050565b600961274a836134af565b6000546001600160a01b031633148061279f57506008546001600160a01b031633145b6127bb5760405162461bcd60e51b8152600401610c3690613daa565b607881600c546127cb9190613e28565b11156128195760405162461bcd60e51b815260206004820152601e60248201527f657863656564656420746865207265736572766174696f6e2072616e676500006044820152606401610c36565b60005b81811015612856576128446128396000546001600160a01b031690565b6120ae836001613e28565b8061284e81613ef1565b91505061281c565b5080600c60008282546121059190613e28565b6000546001600160a01b031633146128935760405162461bcd60e51b8152600401610c3690613d24565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314806128d857506008546001600160a01b031633145b6128f45760405162461bcd60e51b8152600401610c3690613daa565b602055565b6000546001600160a01b031633148061291c57506008546001600160a01b031633145b6129385760405162461bcd60e51b8152600401610c3690613daa565b601855565b6000546001600160a01b031633148061296057506008546001600160a01b031633145b61297c5760405162461bcd60e51b8152600401610c3690613daa565b600e8054911515600160a01b0260ff60a01b19909216919091179055565b6129a26136d8565b6129aa6136d8565b60155460ff16156129ba57600181525b6016546020820152601754604082015260185460608201526129df601a8460016130b7565b156129ec57600160808201525b60195460a08201526001600160a01b0383166000908152601b6020526040902054816006611539565b6000546001600160a01b0316331480612a3857506008546001600160a01b031633145b612a545760405162461bcd60e51b8152600401610c3690613daa565b6015805460ff1916911515919091179055565b6000546001600160a01b0316331480612a8a57506008546001600160a01b031633145b612aa65760405162461bcd60e51b8152600401610c3690613daa565b601955565b6000546001600160a01b03163314612ad55760405162461bcd60e51b8152600401610c3690613d24565b6001600160a01b038116612b3a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c36565b612b438161321b565b50565b6000546001600160a01b0316331480612b6957506008546001600160a01b031633145b612b855760405162461bcd60e51b8152600401610c3690613daa565b601c805460ff1916911515919091179055565b612ba06136d8565b612ba86136d8565b601c5460ff1615612bb857600181525b601d546020820152601e546040820152601f546060820152612bdd60218460006130b7565b15612bea57600160808201525b6020805460a08301526001600160a01b038416600090815260229091526040902054816006611539565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612c4982611ba6565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b0316612cfb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c36565b6000612d0683611ba6565b9050806001600160a01b0316846001600160a01b03161480612d4d57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b80612d715750836001600160a01b0316612d6684610bc1565b6001600160a01b0316145b949350505050565b826001600160a01b0316612d8c82611ba6565b6001600160a01b031614612df05760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610c36565b6001600160a01b038216612e525760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610c36565b612e5d600082612c14565b6001600160a01b0383166000908152600460205260408120805460019290612e86908490613e73565b90915550506001600160a01b0382166000908152600460205260408120805460019290612eb4908490613e28565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b80821115612f5a5760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742076616c756560701b6044820152606401610c36565b80821015610d6c576000612f6e8383613e73565b60405190915084906001600160a01b0382169083156108fc029084906000818181858888f19350505050158015612fa9573d6000803e3d6000fd5b505050505050565b612fbd60026031613e54565b612fc8906078613e28565b600c5410156130105760405162461bcd60e51b8152602060048201526014602482015273185a5c991c9bdc081b9bdd08199a5b9a5cda195960621b6044820152606401610c36565b600b5481600c546130219190613e28565b111561306f5760405162461bcd60e51b815260206004820152601960248201527f65786365656465642074686520737570706c792072616e6765000000000000006044820152606401610c36565b60005b8181101561309b57613089836120ae836001613e28565b8061309381613ef1565b915050613072565b5080600c60008282546130ae9190613e28565b90915550505050565b6000811561314957600e54604051631846d2f560e31b81526001600160a01b0385811660048301529091169063c23697a89060240160206040518083038186803b15801561310457600080fd5b505afa158015613118573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061313c9190613a2e565b1561314957506000613214565b60005b845481101561320e5784818154811061316757613167613f4c565b600091825260209091200154604051631846d2f560e31b81526001600160a01b0386811660048301529091169063c23697a89060240160206040518083038186803b1580156131b557600080fd5b505afa1580156131c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ed9190613a2e565b156131fc576001915050613214565b8061320681613ef1565b91505061314c565b50600090505b9392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382166132c15760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c36565b6000818152600360205260409020546001600160a01b0316156133265760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c36565b6001600160a01b038216600090815260046020526040812080546001929061334f908490613e28565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b816001600160a01b0316836001600160a01b0316141561340f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c36565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613487848484612d79565b613493848484846135ad565b6124fc5760405162461bcd60e51b8152600401610c3690613cd2565b6060816134d35750506040805180820190915260018152600360fc1b602082015290565b8160005b81156134fd57806134e781613ef1565b91506134f69050600a83613e40565b91506134d7565b60008167ffffffffffffffff81111561351857613518613f62565b6040519080825280601f01601f191660200182016040528015613542576020820181803683370190505b5090505b8415612d7157613557600183613e73565b9150613564600a86613f0c565b61356f906030613e28565b60f81b81838151811061358457613584613f4c565b60200101906001600160f81b031916908160001a9053506135a6600a86613e40565b9450613546565b60006001600160a01b0384163b156136af57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906135f1903390899088908890600401613c28565b602060405180830381600087803b15801561360b57600080fd5b505af192505050801561363b575060408051601f3d908101601f1916820190925261363891810190613a68565b60015b613695573d808015613669576040519150601f19603f3d011682016040523d82523d6000602084013e61366e565b606091505b50805161368d5760405162461bcd60e51b8152600401610c3690613cd2565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612d71565b506001949350505050565b5080546000825590600052602060002090810190612b439190613799565b6040518060e001604052806007906020820280368337509192915050565b82805461370290613eb6565b90600052602060002090601f016020900481019282613724576000855561376a565b82601f1061373d5782800160ff1982351617855561376a565b8280016001018555821561376a579182015b8281111561376a57823582559160200191906001019061374f565b50613776929150613799565b5090565b604051806101400160405280600a906020820280368337509192915050565b5b80821115613776576000815560010161379a565b6000602082840312156137c057600080fd5b813561321481613f78565b6000602082840312156137dd57600080fd5b815161321481613f78565b600080604083850312156137fb57600080fd5b823561380681613f78565b9150602083013561381681613f78565b809150509250929050565b60008060006060848603121561383657600080fd5b833561384181613f78565b9250602084013561385181613f78565b929592945050506040919091013590565b6000806000806080858703121561387857600080fd5b843561388381613f78565b9350602085013561389381613f78565b925060408501359150606085013567ffffffffffffffff808211156138b757600080fd5b818701915087601f8301126138cb57600080fd5b8135818111156138dd576138dd613f62565b604051601f8201601f19908116603f0116810190838211818310171561390557613905613f62565b816040528281528a602084870101111561391e57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561395557600080fd5b823561396081613f78565b9150602083013561381681613f8d565b6000806040838503121561398357600080fd5b823561398e81613f78565b946020939093013593505050565b600080602083850312156139af57600080fd5b823567ffffffffffffffff808211156139c757600080fd5b818501915085601f8301126139db57600080fd5b8135818111156139ea57600080fd5b8660208260051b85010111156139ff57600080fd5b60209290920196919550909350505050565b600060208284031215613a2357600080fd5b813561321481613f8d565b600060208284031215613a4057600080fd5b815161321481613f8d565b600060208284031215613a5d57600080fd5b813561321481613f9b565b600060208284031215613a7a57600080fd5b815161321481613f9b565b60008060208385031215613a9857600080fd5b823567ffffffffffffffff80821115613ab057600080fd5b818501915085601f830112613ac457600080fd5b813581811115613ad357600080fd5b8660208285010111156139ff57600080fd5b600060208284031215613af757600080fd5b5035919050565b600060208284031215613b1057600080fd5b5051919050565b60008060408385031215613b2a57600080fd5b50508035926020909101359150565b60008151808452613b51816020860160208601613e8a565b601f01601f19169290920160200192915050565b60008151613b77818560208601613e8a565b9290920192915050565b600080845481600182811c915080831680613b9d57607f831692505b6020808410821415613bbd57634e487b7160e01b86526022600452602486fd5b818015613bd15760018114613be257613c0f565b60ff19861689528489019650613c0f565b60008b81526020902060005b86811015613c075781548b820152908501908301613bee565b505084890196505b505050505050613c1f8185613b65565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613c5b90830184613b39565b9695505050505050565b6101408101818360005b600a811015613c8e578151835260209283019290910190600101613c6f565b50505092915050565b60e08101818360005b6007811015613c8e578151835260209283019290910190600101613ca0565b6020815260006132146020830184613b39565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526027908201527f63616c6c6572206973206e6f7420746865206f776e6572206e6569746865722060408201526636b0b730b3b2b960c91b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008219821115613e3b57613e3b613f20565b500190565b600082613e4f57613e4f613f36565b500490565b6000816000190483118215151615613e6e57613e6e613f20565b500290565b600082821015613e8557613e85613f20565b500390565b60005b83811015613ea5578181015183820152602001613e8d565b838111156124fc5750506000910152565b600181811c90821680613eca57607f821691505b60208210811415613eeb57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613f0557613f05613f20565b5060010190565b600082613f1b57613f1b613f36565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114612b4357600080fd5b8015158114612b4357600080fd5b6001600160e01b031981168114612b4357600080fdfea26469706673582212208dd508cea19243cd269fa3f8389ff8ef979b5b1066f9a087a43f224222b33e3c64736f6c63430008070033697066733a2f2f516d5a6b4a6f636d47524643656639743271324d475551345a376b4e48394b50415377456544326b7831315552772f

Deployed Bytecode

0x60806040526004361061038c5760003560e01c8063715018a6116101dc578063c71daccb11610102578063e2257266116100a0578063f2fde38b1161006f578063f2fde38b14610a68578063f34e1ea114610a88578063f7ee706814610aa8578063ff4b629e14610abd57600080fd5b8063e2257266146109bf578063e3c61b02146109df578063e985e9c5146109ff578063ecb8dbac14610a4857600080fd5b8063d0ebdbe7116100dc578063d0ebdbe71461093f578063d7bec63d1461095f578063dd5db3aa1461097f578063de3bc79f1461099f57600080fd5b8063c71daccb146108ec578063c87b56dd146108ff578063d031370b1461091f57600080fd5b8063a22cb4651161017a578063b88d4fde11610149578063b88d4fde1461086c578063be900d401461088c578063c0ca970f146108ac578063c555fd64146108cc57600080fd5b8063a22cb465146107f9578063a3df2a0114610819578063a47cd7761461082c578063ac1349a11461084c57600080fd5b806391152c5c116101b657806391152c5c1461079a57806393b76bce146107af57806395d89b41146107cf578063a04e5f7f146107e457600080fd5b8063715018a614610747578063808312bc1461075c5780638da5cb5b1461077c57600080fd5b806337592618116102c157806352c0295f1161025f5780635e59da6b1161022e5780635e59da6b146106c75780636352211e146106da5780636386c1c7146106fa57806370a082311461072757600080fd5b806352c0295f1461065257806353db2af214610667578063568489c8146106875780635d8ceea9146106a757600080fd5b806342842e0e1161029b57806342842e0e146105d4578063481c6a75146105f45780634a213d2a14610612578063502ece241461063257600080fd5b806337592618146105815780633abe69b2146105a15780633b353842146105c157600080fd5b80631c58eec51161032e578063279b8b5a11610308578063279b8b5a146105015780632e1a7d4d146105215780632e4318101461054157806336e517dd1461055457600080fd5b80631c58eec5146104a157806322a42799146104c157806323b872dd146104e157600080fd5b8063095ea7b31161036a578063095ea7b3146104205780630ff4231014610442578063138cfadc1461046257806318160ddd1461048257600080fd5b806301ffc9a71461039157806306fdde03146103c6578063081812fc146103e8575b600080fd5b34801561039d57600080fd5b506103b16103ac366004613a4b565b610add565b60405190151581526020015b60405180910390f35b3480156103d257600080fd5b506103db610b2f565b6040516103bd9190613cbf565b3480156103f457600080fd5b50610408610403366004613ae5565b610bc1565b6040516001600160a01b0390911681526020016103bd565b34801561042c57600080fd5b5061044061043b366004613970565b610c5b565b005b34801561044e57600080fd5b5061044061045d36600461399c565b610d71565b34801561046e57600080fd5b5061044061047d366004613b17565b610eb4565b34801561048e57600080fd5b50600c545b6040519081526020016103bd565b3480156104ad57600080fd5b506104406104bc366004613b17565b610efe565b3480156104cd57600080fd5b506104406104dc3660046137ae565b610f48565b3480156104ed57600080fd5b506104406104fc366004613821565b610ff6565b34801561050d57600080fd5b5061044061051c36600461399c565b611027565b34801561052d57600080fd5b5061044061053c366004613ae5565b61116a565b61044061054f366004613ae5565b61125e565b34801561056057600080fd5b5061057461056f3660046137ae565b6114cf565b6040516103bd9190613c97565b34801561058d57600080fd5b5061044061059c366004613ae5565b611544565b3480156105ad57600080fd5b506105746105bc3660046137ae565b611588565b6104406105cf366004613ae5565b61160a565b3480156105e057600080fd5b506104406105ef366004613821565b6117e4565b34801561060057600080fd5b506008546001600160a01b0316610408565b34801561061e57600080fd5b5061044061062d366004613b17565b6117ff565b34801561063e57600080fd5b5061044061064d366004613b17565b611849565b34801561065e57600080fd5b506103db611893565b34801561067357600080fd5b50610440610682366004613ae5565b6118a2565b34801561069357600080fd5b506104406106a2366004613ae5565b6118e6565b3480156106b357600080fd5b506104406106c2366004613a85565b61192a565b6104406106d5366004613ae5565b611975565b3480156106e657600080fd5b506104086106f5366004613ae5565b611ba6565b34801561070657600080fd5b5061071a6107153660046137ae565b611c1d565b6040516103bd9190613c65565b34801561073357600080fd5b506104936107423660046137ae565b611d98565b34801561075357600080fd5b50610440611e1f565b34801561076857600080fd5b50610440610777366004613a11565b611e55565b34801561078857600080fd5b506000546001600160a01b0316610408565b3480156107a657600080fd5b50610440611ea7565b3480156107bb57600080fd5b506104406107ca366004613ae5565b61210d565b3480156107db57600080fd5b506103db612151565b3480156107f057600080fd5b506103db612160565b34801561080557600080fd5b50610440610814366004613942565b61216f565b610440610827366004613ae5565b61217e565b34801561083857600080fd5b506104406108473660046137ae565b6123d0565b34801561085857600080fd5b50610440610867366004613a85565b61247f565b34801561087857600080fd5b50610440610887366004613862565b6124ca565b34801561089857600080fd5b506104406108a7366004613ae5565b612502565b3480156108b857600080fd5b506104406108c736600461399c565b612546565b3480156108d857600080fd5b506104406108e7366004613ae5565b612689565b3480156108f857600080fd5b5047610493565b34801561090b57600080fd5b506103db61091a366004613ae5565b6126cd565b34801561092b57600080fd5b5061044061093a366004613ae5565b61277c565b34801561094b57600080fd5b5061044061095a3660046137ae565b612869565b34801561096b57600080fd5b5061044061097a366004613ae5565b6128b5565b34801561098b57600080fd5b5061044061099a366004613ae5565b6128f9565b3480156109ab57600080fd5b506104406109ba366004613a11565b61293d565b3480156109cb57600080fd5b506105746109da3660046137ae565b61299a565b3480156109eb57600080fd5b506104406109fa366004613a11565b612a15565b348015610a0b57600080fd5b506103b1610a1a3660046137e8565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610a5457600080fd5b50610440610a63366004613ae5565b612a67565b348015610a7457600080fd5b50610440610a833660046137ae565b612aab565b348015610a9457600080fd5b50610440610aa3366004613a11565b612b46565b348015610ab457600080fd5b50600b54610493565b348015610ac957600080fd5b50610574610ad83660046137ae565b612b98565b60006001600160e01b031982166380ac58cd60e01b1480610b0e57506001600160e01b03198216635b5e139f60e01b145b80610b2957506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060018054610b3e90613eb6565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6a90613eb6565b8015610bb75780601f10610b8c57610100808354040283529160200191610bb7565b820191906000526020600020905b815481529060010190602001808311610b9a57829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610c3f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6000610c6682611ba6565b9050806001600160a01b0316836001600160a01b03161415610cd45760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c36565b336001600160a01b0382161480610cf05750610cf08133610a1a565b610d625760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c36565b610d6c8383612c14565b505050565b6000546001600160a01b0316331480610d9457506008546001600160a01b031633145b610db05760405162461bcd60e51b8152600401610c3690613daa565b610dbc601360006136ba565b60005b81811015610d6c576000838383818110610ddb57610ddb613f4c565b9050602002016020810190610df091906137ae565b6001600160a01b03161415610e475760405162461bcd60e51b815260206004820152601d60248201527f574f4e4445524c4953542053414c453a20696e76616c6964206c6973740000006044820152606401610c36565b6013838383818110610e5b57610e5b613f4c565b9050602002016020810190610e7091906137ae565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b0390921691909117905580610eac81613ef1565b915050610dbf565b6000546001600160a01b0316331480610ed757506008546001600160a01b031633145b610ef35760405162461bcd60e51b8152600401610c3690613daa565b602491909155602555565b6000546001600160a01b0316331480610f2157506008546001600160a01b031633145b610f3d5760405162461bcd60e51b8152600401610c3690613daa565b601d91909155601e55565b6000546001600160a01b0316331480610f6b57506008546001600160a01b031633145b610f875760405162461bcd60e51b8152600401610c3690613daa565b6001600160a01b038116610fd45760405162461bcd60e51b81526020600482015260146024820152731352539511510e881a5b9d985b1a59081b1a5cdd60621b6044820152606401610c36565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6110003382612c82565b61101c5760405162461bcd60e51b8152600401610c3690613d59565b610d6c838383612d79565b6000546001600160a01b031633148061104a57506008546001600160a01b031633145b6110665760405162461bcd60e51b8152600401610c3690613daa565b611072601a60006136ba565b60005b81811015610d6c57600083838381811061109157611091613f4c565b90506020020160208101906110a691906137ae565b6001600160a01b031614156110fd5760405162461bcd60e51b815260206004820152601d60248201527f574f4e4445524b4944532053414c453a20696e76616c6964206c6973740000006044820152606401610c36565b601a83838381811061111157611111613f4c565b905060200201602081019061112691906137ae565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b039092169190911790558061116281613ef1565b915050611075565b6000546001600160a01b031633148061118d57506008546001600160a01b031633145b6111a95760405162461bcd60e51b8152600401610c3690613daa565b600260075414156111cc5760405162461bcd60e51b8152600401610c3690613df1565b6002600755478111156112185760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b6044820152606401610c36565b600080546040516001600160a01b039091169182916108fc85150291859190818181858888f19350505050158015611254573d6000803e3d6000fd5b5050600160075550565b600260075414156112815760405162461bcd60e51b8152600401610c3690613df1565b6002600755600061129133611588565b8051909150156112e35760405162461bcd60e51b815260206004820152601a60248201527f574f4e4445524c4953542053414c453a2073757370656e6465640000000000006044820152606401610c36565b6020810151158061130257506112fa601e42613e28565b602082015111155b61134e5760405162461bcd60e51b815260206004820152601a60248201527f574f4e4445524c4953542053414c453a206e6f74206f70656e640000000000006044820152606401610c36565b6040810151158061136c5750611365601e42613e73565b6040820151115b6113b85760405162461bcd60e51b815260206004820152601960248201527f574f4e4445524c4953542053414c453a2066696e6973686564000000000000006044820152606401610c36565b608081015160011461140c5760405162461bcd60e51b815260206004820181905260248201527f574f4e4445524c4953542053414c453a206e6f742077686974656c69737465646044820152606401610c36565b60c081015161141c908390613e28565b60a0820151101561147a5760405162461bcd60e51b815260206004820152602260248201527f574f4e4445524c4953542053414c453a207265616368656420746865206c696d6044820152611a5d60f21b6064820152608401610c36565b61149833838360035b60200201516114929190613e54565b34612f15565b6114a23383612fb1565b33600090815260146020526040812080548492906114c1908490613e28565b909155505060016007555050565b6114d76136d8565b6114df6136d8565b60235460ff16156114ef57600181525b60245460208083019190915260255460408084019190915260265460608401526001608084015260275460a08401526001600160a01b038516600090815260289092529020548160065b602002015292915050565b6000546001600160a01b031633148061156757506008546001600160a01b031633145b6115835760405162461bcd60e51b8152600401610c3690613daa565b600b55565b6115906136d8565b6115986136d8565b600e54600160a01b900460ff16156115af57600181525b600f546020820152601054604082015260115460608201526115d460138460016130b7565b156115e157600160808201525b60125460a08201526001600160a01b038316600090815260146020526040902054816006611539565b6002600754141561162d5760405162461bcd60e51b8152600401610c3690613df1565b6002600755600061163d336114cf565b8051909150156116875760405162461bcd60e51b815260206004820152601560248201527411925390530814d053114e881cdd5cdc195b991959605a1b6044820152606401610c36565b602081015115806116a6575061169e601e42613e28565b602082015111155b6116ea5760405162461bcd60e51b815260206004820152601560248201527411925390530814d053114e881b9bdd081bdc195b99605a1b6044820152606401610c36565b604081015115806117085750611701601e42613e73565b6040820151115b61174b5760405162461bcd60e51b815260206004820152601460248201527311925390530814d053114e88199a5b9a5cda195960621b6044820152606401610c36565b60c081015161175b908390613e28565b60a082015110156117ae5760405162461bcd60e51b815260206004820152601d60248201527f46494e414c2053414c453a207265616368656420746865206c696d69740000006044820152606401610c36565b6117bb3383836003611483565b6117c53383612fb1565b33600090815260286020526040812080548492906114c1908490613e28565b610d6c838383604051806020016040528060008152506124ca565b6000546001600160a01b031633148061182257506008546001600160a01b031633145b61183e5760405162461bcd60e51b8152600401610c3690613daa565b600f91909155601055565b6000546001600160a01b031633148061186c57506008546001600160a01b031633145b6118885760405162461bcd60e51b8152600401610c3690613daa565b601691909155601755565b606060098054610b3e90613eb6565b6000546001600160a01b03163314806118c557506008546001600160a01b031633145b6118e15760405162461bcd60e51b8152600401610c3690613daa565b602755565b6000546001600160a01b031633148061190957506008546001600160a01b031633145b6119255760405162461bcd60e51b8152600401610c3690613daa565b601155565b6000546001600160a01b031633148061194d57506008546001600160a01b031633145b6119695760405162461bcd60e51b8152600401610c3690613daa565b610d6c600a83836136f6565b600260075414156119985760405162461bcd60e51b8152600401610c3690613df1565b600260075560006119a833612b98565b8051909150156119f35760405162461bcd60e51b8152602060048201526016602482015275141550931250c814d053114e881cdd5cdc195b99195960521b6044820152606401610c36565b60208101511580611a125750611a0a601e42613e28565b602082015111155b611a575760405162461bcd60e51b8152602060048201526016602482015275141550931250c814d053114e881b9bdd081bdc195b9960521b6044820152606401610c36565b60408101511580611a755750611a6e601e42613e73565b6040820151115b611ab95760405162461bcd60e51b8152602060048201526015602482015274141550931250c814d053114e88199a5b9a5cda1959605a1b6044820152606401610c36565b6080810151600114611b0d5760405162461bcd60e51b815260206004820152601c60248201527f5055424c49432053414c453a206e6f742077686974656c6973746564000000006044820152606401610c36565b60c0810151611b1d908390613e28565b60a08201511015611b705760405162461bcd60e51b815260206004820152601e60248201527f5055424c49432053414c453a207265616368656420746865206c696d697400006044820152606401610c36565b611b7d3383836003611483565b611b873383612fb1565b33600090815260226020526040812080548492906114c1908490613e28565b6000818152600360205260408120546001600160a01b031680610b295760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610c36565b611c2561377a565b611c2d61377a565b611c356136d8565b611c4260138560016130b7565b8015611c5957506010541580611c59575042601054115b15611c7557600160e0830152611c6e84611588565b9050611cfa565b611c82601a8560016130b7565b8015611c9957506017541580611c99575042601754115b15611cae57600260e0830152611c6e8461299a565b611cbb60218560006130b7565b8015611cd25750601e541580611cd2575042601e54115b15611ce757600360e0830152611c6e84612b98565b600460e0830152611cf7846114cf565b90505b60005b6007811015611d4657818160078110611d1857611d18613f4c565b60200201518382600a8110611d2f57611d2f613f4c565b602002015280611d3e81613ef1565b915050611cfd565b50600c5482611d5760076001613e28565b600a8110611d6757611d67613f4c565b6020020152600b5482611d7c60076002613e28565b600a8110611d8c57611d8c613f4c565b60200201525092915050565b60006001600160a01b038216611e035760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610c36565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b03163314611e495760405162461bcd60e51b8152600401610c3690613d24565b611e53600061321b565b565b6000546001600160a01b0316331480611e7857506008546001600160a01b031633145b611e945760405162461bcd60e51b8152600401610c3690613daa565b6023805460ff1916911515919091179055565b6000546001600160a01b0316331480611eca57506008546001600160a01b031633145b611ee65760405162461bcd60e51b8152600401610c3690613daa565b6078600c5414611f2c5760405162461bcd60e51b81526020600482015260116024820152700636f756c64206e6f742061697264726f7607c1b6044820152606401610c36565b600d546040805163775a25e360e01b815290516000926001600160a01b03169163775a25e3916004808301926020929190829003018186803b158015611f7157600080fd5b505afa158015611f85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa99190613afe565b905060318114611ff25760405162461bcd60e51b81526020600482015260146024820152731a5b9d985b1a5908185a5c991c9bdc081b1a5cdd60621b6044820152606401610c36565b60005b60318110156120e757600d5460405163303eaeed60e01b8152600481018390526000916001600160a01b03169063303eaeed9060240160206040518083038186803b15801561204357600080fd5b505afa158015612057573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207b91906137cb565b905060005b60028110156120d2576120c08282612099866002613e54565b6120a4906001613e28565b6120ae9190613e28565b600c546120bb9190613e28565b61326b565b806120ca81613ef1565b915050612080565b505080806120df90613ef1565b915050611ff5565b506120f460026031613e54565b600c60008282546121059190613e28565b909155505050565b6000546001600160a01b031633148061213057506008546001600160a01b031633145b61214c5760405162461bcd60e51b8152600401610c3690613daa565b601255565b606060028054610b3e90613eb6565b6060600a8054610b3e90613eb6565b61217a3383836133ad565b5050565b600260075414156121a15760405162461bcd60e51b8152600401610c3690613df1565b600260075560006121b13361299a565b8051909150156122035760405162461bcd60e51b815260206004820152601a60248201527f574f4e4445524b4944532053414c453a2073757370656e6465640000000000006044820152606401610c36565b60208101511580612222575061221a601e42613e28565b602082015111155b61226e5760405162461bcd60e51b815260206004820152601a60248201527f574f4e4445524b4944532053414c453a206e6f74206f70656e640000000000006044820152606401610c36565b6040810151158061228c5750612285601e42613e73565b6040820151115b6122d85760405162461bcd60e51b815260206004820152601960248201527f574f4e4445524b4944532053414c453a2066696e6973686564000000000000006044820152606401610c36565b608081015160011461232c5760405162461bcd60e51b815260206004820181905260248201527f574f4e4445524b4944532053414c453a206e6f742077686974656c69737465646044820152606401610c36565b60c081015161233c908390613e28565b60a0820151101561239a5760405162461bcd60e51b815260206004820152602260248201527f574f4e4445524b4944532053414c453a207265616368656420746865206c696d6044820152611a5d60f21b6064820152608401610c36565b6123a73383836003611483565b6123b13383612fb1565b336000908152601b6020526040812080548492906114c1908490613e28565b6000546001600160a01b03163314806123f357506008546001600160a01b031633145b61240f5760405162461bcd60e51b8152600401610c3690613daa565b6001600160a01b03811661245d5760405162461bcd60e51b8152602060048201526015602482015274105254911493d40e881a5b9d985b1a59081b1a5cdd605a1b6044820152606401610c36565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314806124a257506008546001600160a01b031633145b6124be5760405162461bcd60e51b8152600401610c3690613daa565b610d6c600983836136f6565b6124d43383612c82565b6124f05760405162461bcd60e51b8152600401610c3690613d59565b6124fc8484848461347c565b50505050565b6000546001600160a01b031633148061252557506008546001600160a01b031633145b6125415760405162461bcd60e51b8152600401610c3690613daa565b601f55565b6000546001600160a01b031633148061256957506008546001600160a01b031633145b6125855760405162461bcd60e51b8152600401610c3690613daa565b612591602160006136ba565b60005b81811015610d6c5760008383838181106125b0576125b0613f4c565b90506020020160208101906125c591906137ae565b6001600160a01b0316141561261c5760405162461bcd60e51b815260206004820152601960248201527f5055424c49432053414c453a20696e76616c6964206c697374000000000000006044820152606401610c36565b602183838381811061263057612630613f4c565b905060200201602081019061264591906137ae565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b039092169190911790558061268181613ef1565b915050612594565b6000546001600160a01b03163314806126ac57506008546001600160a01b031633145b6126c85760405162461bcd60e51b8152600401610c3690613daa565b602655565b6000818152600360205260409020546060906001600160a01b03166127285760405162461bcd60e51b81526020600482015260116024820152703737b732bc34b9ba32b73a103a37b5b2b760791b6044820152606401610c36565b6000600a805461273790613eb6565b9050111561277157600a61274a836134af565b60405160200161275b929190613b81565b6040516020818303038152906040529050919050565b600961274a836134af565b6000546001600160a01b031633148061279f57506008546001600160a01b031633145b6127bb5760405162461bcd60e51b8152600401610c3690613daa565b607881600c546127cb9190613e28565b11156128195760405162461bcd60e51b815260206004820152601e60248201527f657863656564656420746865207265736572766174696f6e2072616e676500006044820152606401610c36565b60005b81811015612856576128446128396000546001600160a01b031690565b6120ae836001613e28565b8061284e81613ef1565b91505061281c565b5080600c60008282546121059190613e28565b6000546001600160a01b031633146128935760405162461bcd60e51b8152600401610c3690613d24565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314806128d857506008546001600160a01b031633145b6128f45760405162461bcd60e51b8152600401610c3690613daa565b602055565b6000546001600160a01b031633148061291c57506008546001600160a01b031633145b6129385760405162461bcd60e51b8152600401610c3690613daa565b601855565b6000546001600160a01b031633148061296057506008546001600160a01b031633145b61297c5760405162461bcd60e51b8152600401610c3690613daa565b600e8054911515600160a01b0260ff60a01b19909216919091179055565b6129a26136d8565b6129aa6136d8565b60155460ff16156129ba57600181525b6016546020820152601754604082015260185460608201526129df601a8460016130b7565b156129ec57600160808201525b60195460a08201526001600160a01b0383166000908152601b6020526040902054816006611539565b6000546001600160a01b0316331480612a3857506008546001600160a01b031633145b612a545760405162461bcd60e51b8152600401610c3690613daa565b6015805460ff1916911515919091179055565b6000546001600160a01b0316331480612a8a57506008546001600160a01b031633145b612aa65760405162461bcd60e51b8152600401610c3690613daa565b601955565b6000546001600160a01b03163314612ad55760405162461bcd60e51b8152600401610c3690613d24565b6001600160a01b038116612b3a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c36565b612b438161321b565b50565b6000546001600160a01b0316331480612b6957506008546001600160a01b031633145b612b855760405162461bcd60e51b8152600401610c3690613daa565b601c805460ff1916911515919091179055565b612ba06136d8565b612ba86136d8565b601c5460ff1615612bb857600181525b601d546020820152601e546040820152601f546060820152612bdd60218460006130b7565b15612bea57600160808201525b6020805460a08301526001600160a01b038416600090815260229091526040902054816006611539565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612c4982611ba6565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b0316612cfb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c36565b6000612d0683611ba6565b9050806001600160a01b0316846001600160a01b03161480612d4d57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b80612d715750836001600160a01b0316612d6684610bc1565b6001600160a01b0316145b949350505050565b826001600160a01b0316612d8c82611ba6565b6001600160a01b031614612df05760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610c36565b6001600160a01b038216612e525760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610c36565b612e5d600082612c14565b6001600160a01b0383166000908152600460205260408120805460019290612e86908490613e73565b90915550506001600160a01b0382166000908152600460205260408120805460019290612eb4908490613e28565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b80821115612f5a5760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742076616c756560701b6044820152606401610c36565b80821015610d6c576000612f6e8383613e73565b60405190915084906001600160a01b0382169083156108fc029084906000818181858888f19350505050158015612fa9573d6000803e3d6000fd5b505050505050565b612fbd60026031613e54565b612fc8906078613e28565b600c5410156130105760405162461bcd60e51b8152602060048201526014602482015273185a5c991c9bdc081b9bdd08199a5b9a5cda195960621b6044820152606401610c36565b600b5481600c546130219190613e28565b111561306f5760405162461bcd60e51b815260206004820152601960248201527f65786365656465642074686520737570706c792072616e6765000000000000006044820152606401610c36565b60005b8181101561309b57613089836120ae836001613e28565b8061309381613ef1565b915050613072565b5080600c60008282546130ae9190613e28565b90915550505050565b6000811561314957600e54604051631846d2f560e31b81526001600160a01b0385811660048301529091169063c23697a89060240160206040518083038186803b15801561310457600080fd5b505afa158015613118573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061313c9190613a2e565b1561314957506000613214565b60005b845481101561320e5784818154811061316757613167613f4c565b600091825260209091200154604051631846d2f560e31b81526001600160a01b0386811660048301529091169063c23697a89060240160206040518083038186803b1580156131b557600080fd5b505afa1580156131c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ed9190613a2e565b156131fc576001915050613214565b8061320681613ef1565b91505061314c565b50600090505b9392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382166132c15760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c36565b6000818152600360205260409020546001600160a01b0316156133265760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c36565b6001600160a01b038216600090815260046020526040812080546001929061334f908490613e28565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b816001600160a01b0316836001600160a01b0316141561340f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c36565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613487848484612d79565b613493848484846135ad565b6124fc5760405162461bcd60e51b8152600401610c3690613cd2565b6060816134d35750506040805180820190915260018152600360fc1b602082015290565b8160005b81156134fd57806134e781613ef1565b91506134f69050600a83613e40565b91506134d7565b60008167ffffffffffffffff81111561351857613518613f62565b6040519080825280601f01601f191660200182016040528015613542576020820181803683370190505b5090505b8415612d7157613557600183613e73565b9150613564600a86613f0c565b61356f906030613e28565b60f81b81838151811061358457613584613f4c565b60200101906001600160f81b031916908160001a9053506135a6600a86613e40565b9450613546565b60006001600160a01b0384163b156136af57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906135f1903390899088908890600401613c28565b602060405180830381600087803b15801561360b57600080fd5b505af192505050801561363b575060408051601f3d908101601f1916820190925261363891810190613a68565b60015b613695573d808015613669576040519150601f19603f3d011682016040523d82523d6000602084013e61366e565b606091505b50805161368d5760405162461bcd60e51b8152600401610c3690613cd2565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612d71565b506001949350505050565b5080546000825590600052602060002090810190612b439190613799565b6040518060e001604052806007906020820280368337509192915050565b82805461370290613eb6565b90600052602060002090601f016020900481019282613724576000855561376a565b82601f1061373d5782800160ff1982351617855561376a565b8280016001018555821561376a579182015b8281111561376a57823582559160200191906001019061374f565b50613776929150613799565b5090565b604051806101400160405280600a906020820280368337509192915050565b5b80821115613776576000815560010161379a565b6000602082840312156137c057600080fd5b813561321481613f78565b6000602082840312156137dd57600080fd5b815161321481613f78565b600080604083850312156137fb57600080fd5b823561380681613f78565b9150602083013561381681613f78565b809150509250929050565b60008060006060848603121561383657600080fd5b833561384181613f78565b9250602084013561385181613f78565b929592945050506040919091013590565b6000806000806080858703121561387857600080fd5b843561388381613f78565b9350602085013561389381613f78565b925060408501359150606085013567ffffffffffffffff808211156138b757600080fd5b818701915087601f8301126138cb57600080fd5b8135818111156138dd576138dd613f62565b604051601f8201601f19908116603f0116810190838211818310171561390557613905613f62565b816040528281528a602084870101111561391e57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561395557600080fd5b823561396081613f78565b9150602083013561381681613f8d565b6000806040838503121561398357600080fd5b823561398e81613f78565b946020939093013593505050565b600080602083850312156139af57600080fd5b823567ffffffffffffffff808211156139c757600080fd5b818501915085601f8301126139db57600080fd5b8135818111156139ea57600080fd5b8660208260051b85010111156139ff57600080fd5b60209290920196919550909350505050565b600060208284031215613a2357600080fd5b813561321481613f8d565b600060208284031215613a4057600080fd5b815161321481613f8d565b600060208284031215613a5d57600080fd5b813561321481613f9b565b600060208284031215613a7a57600080fd5b815161321481613f9b565b60008060208385031215613a9857600080fd5b823567ffffffffffffffff80821115613ab057600080fd5b818501915085601f830112613ac457600080fd5b813581811115613ad357600080fd5b8660208285010111156139ff57600080fd5b600060208284031215613af757600080fd5b5035919050565b600060208284031215613b1057600080fd5b5051919050565b60008060408385031215613b2a57600080fd5b50508035926020909101359150565b60008151808452613b51816020860160208601613e8a565b601f01601f19169290920160200192915050565b60008151613b77818560208601613e8a565b9290920192915050565b600080845481600182811c915080831680613b9d57607f831692505b6020808410821415613bbd57634e487b7160e01b86526022600452602486fd5b818015613bd15760018114613be257613c0f565b60ff19861689528489019650613c0f565b60008b81526020902060005b86811015613c075781548b820152908501908301613bee565b505084890196505b505050505050613c1f8185613b65565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613c5b90830184613b39565b9695505050505050565b6101408101818360005b600a811015613c8e578151835260209283019290910190600101613c6f565b50505092915050565b60e08101818360005b6007811015613c8e578151835260209283019290910190600101613ca0565b6020815260006132146020830184613b39565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526027908201527f63616c6c6572206973206e6f7420746865206f776e6572206e6569746865722060408201526636b0b730b3b2b960c91b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008219821115613e3b57613e3b613f20565b500190565b600082613e4f57613e4f613f36565b500490565b6000816000190483118215151615613e6e57613e6e613f20565b500290565b600082821015613e8557613e85613f20565b500390565b60005b83811015613ea5578181015183820152602001613e8d565b838111156124fc5750506000910152565b600181811c90821680613eca57607f821691505b60208210811415613eeb57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613f0557613f05613f20565b5060010190565b600082613f1b57613f1b613f36565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114612b4357600080fd5b8015158114612b4357600080fd5b6001600160e01b031981168114612b4357600080fdfea26469706673582212208dd508cea19243cd269fa3f8389ff8ef979b5b1066f9a087a43f224222b33e3c64736f6c63430008070033

Deployed Bytecode Sourcemap

39615:28253:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22973:305;;;;;;;;;;-1:-1:-1;22973:305:0;;;;;:::i;:::-;;:::i;:::-;;;9697:14:1;;9690:22;9672:41;;9660:2;9645:18;22973:305:0;;;;;;;;23918:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25478:221::-;;;;;;;;;;-1:-1:-1;25478:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7993:32:1;;;7975:51;;7963:2;7948:18;25478:221:0;7829:203:1;25001:411:0;;;;;;;;;;-1:-1:-1;25001:411:0;;;;;:::i;:::-;;:::i;:::-;;52168:367;;;;;;;;;;-1:-1:-1;52168:367:0;;;;;:::i;:::-;;:::i;61163:166::-;;;;;;;;;;-1:-1:-1;61163:166:0;;;;;:::i;:::-;;:::i;48482:82::-;;;;;;;;;;-1:-1:-1;48547:12:0;;48482:82;;;28223:25:1;;;28211:2;28196:18;48482:82:0;28077:177:1;58113:169:0;;;;;;;;;;-1:-1:-1;58113:169:0;;;;;:::i;:::-;;:::i;50223:182::-;;;;;;;;;;-1:-1:-1;50223:182:0;;;;;:::i;:::-;;:::i;26228:339::-;;;;;;;;;;-1:-1:-1;26228:339:0;;;;;:::i;:::-;;:::i;55425:367::-;;;;;;;;;;-1:-1:-1;55425:367:0;;;;;:::i;:::-;;:::i;67609:254::-;;;;;;;;;;-1:-1:-1;67609:254:0;;;;;:::i;:::-;;:::i;52721:941::-;;;;;;:::i;:::-;;:::i;60223:583::-;;;;;;;;;;-1:-1:-1;60223:583:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;48974:84::-;;;;;;;;;;-1:-1:-1;48974:84:0;;;;;:::i;:::-;;:::i;50584:690::-;;;;;;;;;;-1:-1:-1;50584:690:0;;;;;:::i;:::-;;:::i;61805:813::-;;;;;;:::i;:::-;;:::i;26638:185::-;;;;;;;;;;-1:-1:-1;26638:185:0;;;;;:::i;:::-;;:::i;47674:86::-;;;;;;;;;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;47674:86;;51646:181;;;;;;;;;;-1:-1:-1;51646:181:0;;;;;:::i;:::-;;:::i;54903:::-;;;;;;;;;;-1:-1:-1;54903:181:0;;;;;:::i;:::-;;:::i;48188:98::-;;;;;;;;;;;;;:::i;61494:130::-;;;;;;;;;;-1:-1:-1;61494:130:0;;;;;:::i;:::-;;:::i;51849:128::-;;;;;;;;;;-1:-1:-1;51849:128:0;;;;;:::i;:::-;;:::i;48856:112::-;;;;;;;;;;-1:-1:-1;48856:112:0;;;;;:::i;:::-;;:::i;59140:909::-;;;;;;:::i;:::-;;:::i;23612:239::-;;;;;;;;;;-1:-1:-1;23612:239:0;;;;;:::i;:::-;;:::i;65750:1402::-;;;;;;;;;;-1:-1:-1;65750:1402:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;23342:208::-;;;;;;;;;;-1:-1:-1;23342:208:0;;;;;:::i;:::-;;:::i;4513:103::-;;;;;;;;;;;;;:::i;61019:118::-;;;;;;;;;;-1:-1:-1;61019:118:0;;;;;:::i;:::-;;:::i;3862:87::-;;;;;;;;;;-1:-1:-1;3908:7:0;3935:6;-1:-1:-1;;;;;3935:6:0;3862:87;;65004:579;;;;;;;;;;;;;:::i;52002:140::-;;;;;;;;;;-1:-1:-1;52002:140:0;;;;;:::i;:::-;;:::i;24087:104::-;;;;;;;;;;;;;:::i;48292:102::-;;;;;;;;;;;;;:::i;25771:155::-;;;;;;;;;;-1:-1:-1;25771:155:0;;;;;:::i;:::-;;:::i;55978:941::-;;;;;;:::i;:::-;;:::i;49851:183::-;;;;;;;;;;-1:-1:-1;49851:183:0;;;;;:::i;:::-;;:::i;48742:108::-;;;;;;;;;;-1:-1:-1;48742:108:0;;;;;:::i;:::-;;:::i;26894:328::-;;;;;;;;;;-1:-1:-1;26894:328:0;;;;;:::i;:::-;;:::i;58304:120::-;;;;;;;;;;-1:-1:-1;58304:120:0;;;;;:::i;:::-;;:::i;58607:351::-;;;;;;;;;;-1:-1:-1;58607:351:0;;;;;:::i;:::-;;:::i;61351:118::-;;;;;;;;;;-1:-1:-1;61351:118:0;;;;;:::i;:::-;;:::i;67320:106::-;;;;;;;;;;-1:-1:-1;67395:21:0;67320:106;;49229:432;;;;;;;;;;-1:-1:-1;49229:432:0;;;;;:::i;:::-;;:::i;64515:301::-;;;;;;;;;;-1:-1:-1;64515:301:0;;;;;:::i;:::-;;:::i;47936:93::-;;;;;;;;;;-1:-1:-1;47936:93:0;;;;;:::i;:::-;;:::i;58449:132::-;;;;;;;;;;-1:-1:-1;58449:132:0;;;;;:::i;:::-;;:::i;55106:128::-;;;;;;;;;;-1:-1:-1;55106:128:0;;;;;:::i;:::-;;:::i;51492:::-;;;;;;;;;;-1:-1:-1;51492:128:0;;;;;:::i;:::-;;:::i;53841:690::-;;;;;;;;;;-1:-1:-1;53841:690:0;;;;;:::i;:::-;;:::i;54749:128::-;;;;;;;;;;-1:-1:-1;54749:128:0;;;;;:::i;:::-;;:::i;25997:164::-;;;;;;;;;;-1:-1:-1;25997:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;26118:25:0;;;26094:4;26118:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25997:164;55259:140;;;;;;;;;;-1:-1:-1;55259:140:0;;;;;:::i;:::-;;:::i;4771:201::-;;;;;;;;;;-1:-1:-1;4771:201:0;;;;;:::i;:::-;;:::i;57967:120::-;;;;;;;;;;-1:-1:-1;57967:120:0;;;;;:::i;:::-;;:::i;48400:76::-;;;;;;;;;;-1:-1:-1;48462:9:0;;48400:76;;57094:659;;;;;;;;;;-1:-1:-1;57094:659:0;;;;;:::i;:::-;;:::i;22973:305::-;23075:4;-1:-1:-1;;;;;;23112:40:0;;-1:-1:-1;;;23112:40:0;;:105;;-1:-1:-1;;;;;;;23169:48:0;;-1:-1:-1;;;23169:48:0;23112:105;:158;;;-1:-1:-1;;;;;;;;;;21689:40:0;;;23234:36;23092:178;22973:305;-1:-1:-1;;22973:305:0:o;23918:100::-;23972:13;24005:5;23998:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23918:100;:::o;25478:221::-;25554:7;28821:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28821:16:0;25574:73;;;;-1:-1:-1;;;25574:73:0;;20628:2:1;25574:73:0;;;20610:21:1;20667:2;20647:18;;;20640:30;20706:34;20686:18;;;20679:62;-1:-1:-1;;;20757:18:1;;;20750:42;20809:19;;25574:73:0;;;;;;;;;-1:-1:-1;25667:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25667:24:0;;25478:221::o;25001:411::-;25082:13;25098:23;25113:7;25098:14;:23::i;:::-;25082:39;;25146:5;-1:-1:-1;;;;;25140:11:0;:2;-1:-1:-1;;;;;25140:11:0;;;25132:57;;;;-1:-1:-1;;;25132:57:0;;23866:2:1;25132:57:0;;;23848:21:1;23905:2;23885:18;;;23878:30;23944:34;23924:18;;;23917:62;-1:-1:-1;;;23995:18:1;;;23988:31;24036:19;;25132:57:0;23664:397:1;25132:57:0;2751:10;-1:-1:-1;;;;;25224:21:0;;;;:62;;-1:-1:-1;25249:37:0;25266:5;2751:10;25997:164;:::i;25249:37::-;25202:168;;;;-1:-1:-1;;;25202:168:0;;16897:2:1;25202:168:0;;;16879:21:1;16936:2;16916:18;;;16909:30;16975:34;16955:18;;;16948:62;17046:26;17026:18;;;17019:54;17090:19;;25202:168:0;16695:420:1;25202:168:0;25383:21;25392:2;25396:7;25383:8;:21::i;:::-;25071:341;25001:411;;:::o;52168:367::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;52273:36:::1;52280:29;;52273:36;:::i;:::-;52327:9;52322:206;52340:14:::0;;::::1;52322:206;;;52405:1;52385:5:::0;;52391:1;52385:8;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;52385:22:0::1;;;52376:67;;;::::0;-1:-1:-1;;;52376:67:0;;27212:2:1;52376:67:0::1;::::0;::::1;27194:21:1::0;27251:2;27231:18;;;27224:30;27290:31;27270:18;;;27263:59;27339:18;;52376:67:0::1;27010:353:1::0;52376:67:0::1;52458:29;52505:5;;52511:1;52505:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;52458:58:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;52458:58:0;;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;52458:58:0::1;-1:-1:-1::0;;;;;52458:58:0;;::::1;::::0;;;::::1;::::0;;52356:3;::::1;::::0;::::1;:::i;:::-;;;;52322:206;;61163:166:::0;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;61264:17:::1;:25:::0;;;;61300:15:::1;:21:::0;61163:166::o;58113:169::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;58215:18:::1;:26:::0;;;;58252:16:::1;:22:::0;58113:169::o;50223:182::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50311:18:0;::::1;50302:53;;;::::0;-1:-1:-1;;;50302:53:0;;19210:2:1;50302:53:0::1;::::0;::::1;19192:21:1::0;19249:2;19229:18;;;19222:30;-1:-1:-1;;;19268:18:1;;;19261:50;19328:18;;50302:53:0::1;19008:344:1::0;50302:53:0::1;50366:12;:31:::0;;-1:-1:-1;;;;;;50366:31:0::1;-1:-1:-1::0;;;;;50366:31:0;;;::::1;::::0;;;::::1;::::0;;50223:182::o;26228:339::-;26423:41;2751:10;26456:7;26423:18;:41::i;:::-;26415:103;;;;-1:-1:-1;;;26415:103:0;;;;;;;:::i;:::-;26531:28;26541:4;26547:2;26551:7;26531:9;:28::i;55425:367::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;55530:36:::1;55537:29;;55530:36;:::i;:::-;55584:9;55579:206;55597:14:::0;;::::1;55579:206;;;55662:1;55642:5:::0;;55648:1;55642:8;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;55642:22:0::1;;;55633:67;;;::::0;-1:-1:-1;;;55633:67:0;;22097:2:1;55633:67:0::1;::::0;::::1;22079:21:1::0;22136:2;22116:18;;;22109:30;22175:31;22155:18;;;22148:59;22224:18;;55633:67:0::1;21895:353:1::0;55633:67:0::1;55715:29;55762:5;;55768:1;55762:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;55715:58:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;55715:58:0;;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;55715:58:0::1;-1:-1:-1::0;;;;;55715:58:0;;::::1;::::0;;;::::1;::::0;;55613:3;::::1;::::0;::::1;:::i;:::-;;;;55579:206;;67609:254:::0;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;37807:1:::1;38405:7;;:19;;38397:63;;;;-1:-1:-1::0;;;38397:63:0::1;;;;;;;:::i;:::-;37807:1;38538:7;:18:::0;67716:21:::2;67706:31:::0;::::2;;67697:66;;;::::0;-1:-1:-1;;;67697:66:0;;21748:2:1;67697:66:0::2;::::0;::::2;21730:21:1::0;21787:2;21767:18;;;21760:30;-1:-1:-1;;;21806:18:1;;;21799:50;21866:18;;67697:66:0::2;21546:344:1::0;67697:66:0::2;67776:22;3935:6:::0;;67830:25:::2;::::0;-1:-1:-1;;;;;3935:6:0;;;;;;67830:25:::2;::::0;::::2;;::::0;;;;;67776:22;67830:25;;3935:6;67830:25;::::2;;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;37763:1:0::1;38717:7;:22:::0;-1:-1:-1;67609:254:0:o;52721:941::-;37807:1;38405:7;;:19;;38397:63;;;;-1:-1:-1;;;38397:63:0;;;;;;;:::i;:::-;37807:1;38538:7;:18;52807:32:::1;52842:37;52867:10;52842:23;:37::i;:::-;52901:28:::0;;52807:72;;-1:-1:-1;52901:33:0;52892:74:::1;;;::::0;-1:-1:-1;;;52892:74:0;;11562:2:1;52892:74:0::1;::::0;::::1;11544:21:1::0;11601:2;11581:18;;;11574:30;11640:28;11620:18;;;11613:56;11686:18;;52892:74:0::1;11360:350:1::0;52892:74:0::1;52986:24;::::0;::::1;::::0;:29;;:95:::1;;-1:-1:-1::0;53048:32:0::1;39977:2;53048:15;:32;:::i;:::-;53019:24;::::0;::::1;::::0;:62:::1;;52986:95;52977:136;;;::::0;-1:-1:-1;;;52977:136:0;;24268:2:1;52977:136:0::1;::::0;::::1;24250:21:1::0;24307:2;24287:18;;;24280:30;24346:28;24326:18;;;24319:56;24392:18;;52977:136:0::1;24066:350:1::0;52977:136:0::1;53133:22:::0;;::::1;::::0;:27;;:90:::1;;-1:-1:-1::0;53190:32:0::1;39977:2;53190:15;:32;:::i;:::-;53164:22:::0;;::::1;::::0;:59:::1;53133:90;53124:130;;;::::0;-1:-1:-1;;;53124:130:0;;13867:2:1;53124:130:0::1;::::0;::::1;13849:21:1::0;13906:2;13886:18;;;13879:30;13945:27;13925:18;;;13918:55;13990:18;;53124:130:0::1;13665:349:1::0;53124:130:0::1;53274:30:::0;;::::1;::::0;53308:1:::1;53274:35;53265:82;;;::::0;-1:-1:-1;;;53265:82:0;;13149:2:1;53265:82:0::1;::::0;::::1;13131:21:1::0;;;13168:18;;;13161:30;13227:34;13207:18;;;13200:62;13279:18;;53265:82:0::1;12947:356:1::0;53265:82:0::1;53399:30:::0;;::::1;::::0;:34:::1;::::0;53430:3;;53399:34:::1;:::i;:::-;53367:27:::0;;::::1;::::0;:67:::1;;53358:116;;;::::0;-1:-1:-1;;;53358:116:0;;15678:2:1;53358:116:0::1;::::0;::::1;15660:21:1::0;15717:2;15697:18;;;15690:30;15756:34;15736:18;;;15729:62;-1:-1:-1;;;15807:18:1;;;15800:32;15849:19;;53358:116:0::1;15476:398:1::0;53358:116:0::1;53487:68;53502:10;53539:3:::0;53514:7;40659:1:::1;53514:24;;;;;:28;;;;:::i;:::-;53544:9;53487:13;:68::i;:::-;53568:30;53581:10;53593:3;53568:11;:30::i;:::-;53636:10;53609:38;::::0;;;:26:::1;:38;::::0;;;;:45;;53651:3;;53609:38;:45:::1;::::0;53651:3;;53609:45:::1;:::i;:::-;::::0;;;-1:-1:-1;;37763:1:0;38717:7;:22;-1:-1:-1;;52721:941:0:o;60223:583::-;60290:24;;:::i;:::-;60327:31;;:::i;:::-;60375:23;;;;60371:65;;;60432:1;60402:31;;60371:65;60472:17;;60446:23;;;;:43;;;;60524:15;;60500:21;;;;:39;;;;60576:17;;60550:23;;;:43;40559:1;60604:29;;;:33;60677:20;;60648:26;;;:49;-1:-1:-1;;;;;60740:29:0;;-1:-1:-1;60740:29:0;;;:21;:29;;;;;;60446:6;40827:1;60708:29;;;;:61;60790:6;60223:583;-1:-1:-1;;60223:583:0:o;48974:84::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;49040:9:::1;:15:::0;48974:84::o;50584:690::-;50656:24;;:::i;:::-;50693:31;;:::i;:::-;50741:28;;-1:-1:-1;;;50741:28:0;;;;50737:70;;;50803:1;50773:31;;50737:70;50843:22;;50817:23;;;:48;50900:20;;50876:21;;;:44;50957:22;;50931:23;;;:48;50994:62;51011:29;51042:6;40559:1;50994:15;:62::i;:::-;50990:106;;;51092:1;51060:29;;;:33;50990:106;51135:25;;51106:26;;;:54;-1:-1:-1;;;;;51203:34:0;;;;;;:26;51106;51203:34;;;;;51106:6;40827:1;51171:29;;61805:813;37807:1;38405:7;;:19;;38397:63;;;;-1:-1:-1;;;38397:63:0;;;;;;;:::i;:::-;37807:1;38538:7;:18;61886:32:::1;61921;61941:10;61921:18;:32::i;:::-;61975:28:::0;;61886:67;;-1:-1:-1;61975:33:0;61966:69:::1;;;::::0;-1:-1:-1;;;61966:69:0;;24623:2:1;61966:69:0::1;::::0;::::1;24605:21:1::0;24662:2;24642:18;;;24635:30;-1:-1:-1;;;24681:18:1;;;24674:51;24742:18;;61966:69:0::1;24421:345:1::0;61966:69:0::1;62055:24;::::0;::::1;::::0;:29;;:95:::1;;-1:-1:-1::0;62117:32:0::1;39977:2;62117:15;:32;:::i;:::-;62088:24;::::0;::::1;::::0;:62:::1;;62055:95;62046:131;;;::::0;-1:-1:-1;;;62046:131:0;;23159:2:1;62046:131:0::1;::::0;::::1;23141:21:1::0;23198:2;23178:18;;;23171:30;-1:-1:-1;;;23217:18:1;;;23210:51;23278:18;;62046:131:0::1;22957:345:1::0;62046:131:0::1;62197:22:::0;;::::1;::::0;:27;;:90:::1;;-1:-1:-1::0;62254:32:0::1;39977:2;62254:15;:32;:::i;:::-;62228:22:::0;;::::1;::::0;:59:::1;62197:90;62188:125;;;::::0;-1:-1:-1;;;62188:125:0;;26154:2:1;62188:125:0::1;::::0;::::1;26136:21:1::0;26193:2;26173:18;;;26166:30;-1:-1:-1;;;26212:18:1;;;26205:50;26272:18;;62188:125:0::1;25952:344:1::0;62188:125:0::1;62365:30:::0;;::::1;::::0;:34:::1;::::0;62396:3;;62365:34:::1;:::i;:::-;62333:27:::0;;::::1;::::0;:67:::1;;62324:111;;;::::0;-1:-1:-1;;;62324:111:0;;19559:2:1;62324:111:0::1;::::0;::::1;19541:21:1::0;19598:2;19578:18;;;19571:30;19637:31;19617:18;;;19610:59;19686:18;;62324:111:0::1;19357:353:1::0;62324:111:0::1;62448:68;62463:10;62500:3:::0;62475:7;40659:1:::1;62475:24;::::0;62448:68:::1;62529:30;62542:10;62554:3;62529:11;:30::i;:::-;62592:10;62570:33;::::0;;;:21:::1;:33;::::0;;;;:40;;62607:3;;62570:33;:40:::1;::::0;62607:3;;62570:40:::1;:::i;26638:185::-:0;26776:39;26793:4;26799:2;26803:7;26776:39;;;;;;;;;;;;:16;:39::i;51646:181::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;51752:22:::1;:30:::0;;;;51793:20:::1;:26:::0;51646:181::o;54903:::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;55009:22:::1;:30:::0;;;;55050:20:::1;:26:::0;54903:181::o;48188:98::-;48239:13;48264:17;48256:27;;;;;:::i;61494:130::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;61585:20:::1;:31:::0;61494:130::o;51849:128::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;51939:22:::1;:30:::0;51849:128::o;48856:112::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;48940:25:::1;:19;48962:3:::0;;48940:25:::1;:::i;59140:909::-:0;37807:1;38405:7;;:19;;38397:63;;;;-1:-1:-1;;;38397:63:0;;;;;;;:::i;:::-;37807:1;38538:7;:18;59222:32:::1;59257:33;59278:10;59257:19;:33::i;:::-;59312:28:::0;;59222:68;;-1:-1:-1;59312:33:0;59303:70:::1;;;::::0;-1:-1:-1;;;59303:70:0;;15327:2:1;59303:70:0::1;::::0;::::1;15309:21:1::0;15366:2;15346:18;;;15339:30;-1:-1:-1;;;15385:18:1;;;15378:52;15447:18;;59303:70:0::1;15125:346:1::0;59303:70:0::1;59393:24;::::0;::::1;::::0;:29;;:95:::1;;-1:-1:-1::0;59455:32:0::1;39977:2;59455:15;:32;:::i;:::-;59426:24;::::0;::::1;::::0;:62:::1;;59393:95;59384:132;;;::::0;-1:-1:-1;;;59384:132:0;;10504:2:1;59384:132:0::1;::::0;::::1;10486:21:1::0;10543:2;10523:18;;;10516:30;-1:-1:-1;;;10562:18:1;;;10555:52;10624:18;;59384:132:0::1;10302:346:1::0;59384:132:0::1;59536:22:::0;;::::1;::::0;:27;;:90:::1;;-1:-1:-1::0;59593:32:0::1;39977:2;59593:15;:32;:::i;:::-;59567:22:::0;;::::1;::::0;:59:::1;59536:90;59527:126;;;::::0;-1:-1:-1;;;59527:126:0;;26862:2:1;59527:126:0::1;::::0;::::1;26844:21:1::0;26901:2;26881:18;;;26874:30;-1:-1:-1;;;26920:18:1;;;26913:51;26981:18;;59527:126:0::1;26660:345:1::0;59527:126:0::1;59673:30:::0;;::::1;::::0;59707:1:::1;59673:35;59664:78;;;::::0;-1:-1:-1;;;59664:78:0;;23509:2:1;59664:78:0::1;::::0;::::1;23491:21:1::0;23548:2;23528:18;;;23521:30;23587;23567:18;;;23560:58;23635:18;;59664:78:0::1;23307:352:1::0;59664:78:0::1;59794:30:::0;;::::1;::::0;:34:::1;::::0;59825:3;;59794:34:::1;:::i;:::-;59762:27:::0;;::::1;::::0;:67:::1;;59753:112;;;::::0;-1:-1:-1;;;59753:112:0;;26503:2:1;59753:112:0::1;::::0;::::1;26485:21:1::0;26542:2;26522:18;;;26515:30;26581:32;26561:18;;;26554:60;26631:18;;59753:112:0::1;26301:354:1::0;59753:112:0::1;59878:68;59893:10;59930:3:::0;59905:7;40659:1:::1;59905:24;::::0;59878:68:::1;59959:30;59972:10;59984:3;59959:11;:30::i;:::-;60023:10;60000:34;::::0;;;:22:::1;:34;::::0;;;;:41;;60038:3;;60000:34;:41:::1;::::0;60038:3;;60000:41:::1;:::i;23612:239::-:0;23684:7;23720:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23720:16:0;23755:19;23747:73;;;;-1:-1:-1;;;23747:73:0;;18800:2:1;23747:73:0;;;18782:21:1;18839:2;18819:18;;;18812:30;18878:34;18858:18;;;18851:62;-1:-1:-1;;;18929:18:1;;;18922:39;18978:19;;23747:73:0;18598:405:1;65750:1402:0;65812:29;;:::i;:::-;65854:38;;:::i;:::-;65903:29;;:::i;:::-;65972:62;65989:29;66020:6;66028:4;65972:15;:62::i;:::-;:135;;;;-1:-1:-1;66039:20:0;;:25;;:67;;;66091:15;66068:20;;:38;66039:67;65968:949;;;66151:1;66124:24;;;:28;66174:33;66199:6;66174:23;:33::i;:::-;66167:40;;65968:949;;;66261:63;66278:29;66309:6;66318:4;66261:15;:63::i;:::-;:136;;;;-1:-1:-1;66329:20:0;;:25;;:67;;;66381:15;66358:20;;:38;66329:67;66257:660;;;66441:1;66414:24;;;:28;66464:33;66489:6;66464:23;:33::i;66257:660::-;66547:60;66564:25;66591:6;66599:5;66547:15;:60::i;:::-;:125;;;;-1:-1:-1;66612:16:0;;:21;;:59;;;66656:15;66637:16;;:34;66612:59;66543:374;;;66716:1;66689:24;;;:28;66739:29;66760:6;66739:19;:29::i;66543:374::-;66854:1;66827:24;;;:28;66877;66897:6;66877:18;:28::i;:::-;66870:35;;66543:374;66934:9;66929:83;40871:1;66947;:10;66929:83;;;66993:4;66998:1;66993:7;;;;;;;:::i;:::-;;;;;66979:8;66988:1;66979:11;;;;;;;:::i;:::-;;;;:21;66959:3;;;;:::i;:::-;;;;66929:83;;;-1:-1:-1;67053:12:0;;67024:8;40980:12;40871:1;40991;40980:12;:::i;:::-;67024:26;;;;;;;:::i;:::-;;;;:41;67104:9;;67076:8;41042:12;40871:1;41053;41042:12;:::i;:::-;67076:25;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;67134:8:0;65750:1402;-1:-1:-1;;65750:1402:0:o;23342:208::-;23414:7;-1:-1:-1;;;;;23442:19:0;;23434:74;;;;-1:-1:-1;;;23434:74:0;;18389:2:1;23434:74:0;;;18371:21:1;18428:2;18408:18;;;18401:30;18467:34;18447:18;;;18440:62;-1:-1:-1;;;18518:18:1;;;18511:40;18568:19;;23434:74:0;18187:406:1;23434:74:0;-1:-1:-1;;;;;;23526:16:0;;;;;:9;:16;;;;;;;23342:208::o;4513:103::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;2751:10;4082:23;4074:68;;;;-1:-1:-1;;;4074:68:0;;;;;;;:::i;:::-;4578:30:::1;4605:1;4578:18;:30::i;:::-;4513:103::o:0;61019:118::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;61099:23:::1;:30:::0;;-1:-1:-1;;61099:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;61019:118::o;65004:579::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;40234:3:::1;65077:12;;:30;65068:62;;;::::0;-1:-1:-1;;;65068:62:0;;11216:2:1;65068:62:0::1;::::0;::::1;11198:21:1::0;11255:2;11235:18;;;11228:30;-1:-1:-1;;;11274:18:1;;;11267:47;11331:18;;65068:62:0::1;11014:341:1::0;65068:62:0::1;65157:13;::::0;:24:::1;::::0;;-1:-1:-1;;;65157:24:0;;;;65143:11:::1;::::0;-1:-1:-1;;;;;65157:13:0::1;::::0;:22:::1;::::0;:24:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:13;:24;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65143:38;;40287:2;65201:3;:22;65192:57;;;::::0;-1:-1:-1;;;65192:57:0;;27930:2:1;65192:57:0::1;::::0;::::1;27912:21:1::0;27969:2;27949:18;;;27942:30;-1:-1:-1;;;27988:18:1;;;27981:50;28048:18;;65192:57:0::1;27728:344:1::0;65192:57:0::1;65267:9;65262:274;40287:2;65280:1;:17;65262:274;;;65336:13;::::0;:24:::1;::::0;-1:-1:-1;;;65336:24:0;;::::1;::::0;::::1;28223:25:1::0;;;65319:14:0::1;::::0;-1:-1:-1;;;;;65336:13:0::1;::::0;:19:::1;::::0;28196:18:1;;65336:24:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65319:41;;65380:9;65375:150;40349:1;65393;:27;65375:150;;;65446:63;65453:6:::0;65505:1;65477:27:::1;65503:1:::0;40349::::1;65477:27;:::i;:::-;65475:29;::::0;:1:::1;:29;:::i;:::-;:31;;;;:::i;:::-;65461:12;;:46;;;;:::i;:::-;65446:5;:63::i;:::-;65422:3:::0;::::1;::::0;::::1;:::i;:::-;;;;65375:150;;;;65304:232;65299:3;;;;;:::i;:::-;;;;65262:274;;;-1:-1:-1::0;40398:41:0::1;40349:1;40287:2;40398:41;:::i;:::-;65546:12;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;65004:579:0:o;52002:140::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;52098:25:::1;:36:::0;52002:140::o;24087:104::-;24143:13;24176:7;24169:14;;;;;:::i;48292:102::-;48345:13;48370:19;48362:29;;;;;:::i;25771:155::-;25866:52;2751:10;25899:8;25909;25866:18;:52::i;:::-;25771:155;;:::o;55978:941::-;37807:1;38405:7;;:19;;38397:63;;;;-1:-1:-1;;;38397:63:0;;;;;;;:::i;:::-;37807:1;38538:7;:18;56064:32:::1;56099:37;56124:10;56099:23;:37::i;:::-;56158:28:::0;;56064:72;;-1:-1:-1;56158:33:0;56149:74:::1;;;::::0;-1:-1:-1;;;56149:74:0;;24973:2:1;56149:74:0::1;::::0;::::1;24955:21:1::0;25012:2;24992:18;;;24985:30;25051:28;25031:18;;;25024:56;25097:18;;56149:74:0::1;24771:350:1::0;56149:74:0::1;56243:24;::::0;::::1;::::0;:29;;:95:::1;;-1:-1:-1::0;56305:32:0::1;39977:2;56305:15;:32;:::i;:::-;56276:24;::::0;::::1;::::0;:62:::1;;56243:95;56234:136;;;::::0;-1:-1:-1;;;56234:136:0;;22455:2:1;56234:136:0::1;::::0;::::1;22437:21:1::0;22494:2;22474:18;;;22467:30;22533:28;22513:18;;;22506:56;22579:18;;56234:136:0::1;22253:350:1::0;56234:136:0::1;56390:22:::0;;::::1;::::0;:27;;:90:::1;;-1:-1:-1::0;56447:32:0::1;39977:2;56447:15;:32;:::i;:::-;56421:22:::0;;::::1;::::0;:59:::1;56390:90;56381:130;;;::::0;-1:-1:-1;;;56381:130:0;;18035:2:1;56381:130:0::1;::::0;::::1;18017:21:1::0;18074:2;18054:18;;;18047:30;18113:27;18093:18;;;18086:55;18158:18;;56381:130:0::1;17833:349:1::0;56381:130:0::1;56531:30:::0;;::::1;::::0;56565:1:::1;56531:35;56522:82;;;::::0;-1:-1:-1;;;56522:82:0;;10855:2:1;56522:82:0::1;::::0;::::1;10837:21:1::0;;;10874:18;;;10867:30;10933:34;10913:18;;;10906:62;10985:18;;56522:82:0::1;10653:356:1::0;56522:82:0::1;56656:30:::0;;::::1;::::0;:34:::1;::::0;56687:3;;56656:34:::1;:::i;:::-;56624:27:::0;;::::1;::::0;:67:::1;;56615:116;;;::::0;-1:-1:-1;;;56615:116:0;;16494:2:1;56615:116:0::1;::::0;::::1;16476:21:1::0;16533:2;16513:18;;;16506:30;16572:34;16552:18;;;16545:62;-1:-1:-1;;;16623:18:1;;;16616:32;16665:19;;56615:116:0::1;16292:398:1::0;56615:116:0::1;56744:68;56759:10;56796:3:::0;56771:7;40659:1:::1;56771:24;::::0;56744:68:::1;56825:30;56838:10;56850:3;56825:11;:30::i;:::-;56893:10;56866:38;::::0;;;:26:::1;:38;::::0;;;;:45;;56908:3;;56866:38;:45:::1;::::0;56908:3;;56866:45:::1;:::i;49851:183::-:0;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49940:18:0;::::1;49931:54;;;::::0;-1:-1:-1;;;49931:54:0;;19917:2:1;49931:54:0::1;::::0;::::1;19899:21:1::0;19956:2;19936:18;;;19929:30;-1:-1:-1;;;19975:18:1;;;19968:51;20036:18;;49931:54:0::1;19715:345:1::0;49931:54:0::1;49996:13;:30:::0;;-1:-1:-1;;;;;;49996:30:0::1;-1:-1:-1::0;;;;;49996:30:0;;;::::1;::::0;;;::::1;::::0;;49851:183::o;48742:108::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;48824:23:::1;:17;48844:3:::0;;48824:23:::1;:::i;26894:328::-:0;27069:41;2751:10;27102:7;27069:18;:41::i;:::-;27061:103;;;;-1:-1:-1;;;27061:103:0;;;;;;;:::i;:::-;27175:39;27189:4;27195:2;27199:7;27208:5;27175:13;:39::i;:::-;26894:328;;;;:::o;58304:120::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;58390:18:::1;:26:::0;58304:120::o;58607:351::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;58708:32:::1;58715:25;;58708:32;:::i;:::-;58758:9;58753:198;58771:14:::0;;::::1;58753:198;;;58836:1;58816:5:::0;;58822:1;58816:8;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;58816:22:0::1;;;58807:63;;;::::0;-1:-1:-1;;;58807:63:0;;17322:2:1;58807:63:0::1;::::0;::::1;17304:21:1::0;17361:2;17341:18;;;17334:30;17400:27;17380:18;;;17373:55;17445:18;;58807:63:0::1;17120:349:1::0;58807:63:0::1;58885:25;58928:5;;58934:1;58928:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;58885:54:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;58885:54:0;;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;58885:54:0::1;-1:-1:-1::0;;;;;58885:54:0;;::::1;::::0;;;::::1;::::0;;58787:3;::::1;::::0;::::1;:::i;:::-;;;;58753:198;;61351:118:::0;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;61436:17:::1;:25:::0;61351:118::o;49229:432::-;28797:4;28821:16;;;:7;:16;;;;;;49296:13;;-1:-1:-1;;;;;28821:16:0;49322:50;;;;-1:-1:-1;;;49322:50:0;;21041:2:1;49322:50:0;;;21023:21:1;21080:2;21060:18;;;21053:30;-1:-1:-1;;;21099:18:1;;;21092:47;21156:18;;49322:50:0;20839:341:1;49322:50:0;49425:1;49395:19;49389:33;;;;;:::i;:::-;;;:37;49385:170;;;49477:19;49498:27;49516:7;49498:16;:27::i;:::-;49459:68;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49443:88;;49229:432;;;:::o;49385:170::-;49601:17;49620:27;49638:7;49620:16;:27::i;64515:301::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;40234:3:::1;64615;64602:12;;:16;;;;:::i;:::-;64601:36;;64592:81;;;::::0;-1:-1:-1;;;64592:81:0;;17676:2:1;64592:81:0::1;::::0;::::1;17658:21:1::0;17715:2;17695:18;;;17688:30;17754:32;17734:18;;;17727:60;17804:18;;64592:81:0::1;17474:354:1::0;64592:81:0::1;64691:9;64686:93;64706:3;64704:1;:5;64686:93;;;64731:36;64738:7;3908::::0;3935:6;-1:-1:-1;;;;;3935:6:0;;3862:87;64738:7:::1;64761:3;:1:::0;64763::::1;64761:3;:::i;64731:36::-;64711:3:::0;::::1;::::0;::::1;:::i;:::-;;;;64686:93;;;;64805:3;64789:12;;:19;;;;;;;:::i;47936:93::-:0;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;2751:10;4082:23;4074:68;;;;-1:-1:-1;;;4074:68:0;;;;;;;:::i;:::-;48004:8:::1;:17:::0;;-1:-1:-1;;;;;;48004:17:0::1;-1:-1:-1::0;;;;;48004:17:0;;;::::1;::::0;;;::::1;::::0;;47936:93::o;58449:132::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;58541:21:::1;:32:::0;58449:132::o;55106:128::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;55196:22:::1;:30:::0;55106:128::o;51492:::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;51577:28:::1;:35:::0;;;::::1;;-1:-1:-1::0;;;51577:35:0::1;-1:-1:-1::0;;;;51577:35:0;;::::1;::::0;;;::::1;::::0;;51492:128::o;53841:690::-;53913:24;;:::i;:::-;53950:31;;:::i;:::-;53998:28;;;;53994:70;;;54060:1;54030:31;;53994:70;54100:22;;54074:23;;;:48;54157:20;;54133:21;;;:44;54214:22;;54188:23;;;:48;54251:62;54268:29;54299:6;40559:1;54251:15;:62::i;:::-;54247:106;;;54349:1;54317:29;;;:33;54247:106;54392:25;;54363:26;;;:54;-1:-1:-1;;;;;54460:34:0;;;;;;:26;54363;54460:34;;;;;54363:6;40827:1;54428:29;;54749:128;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;54834:28:::1;:35:::0;;-1:-1:-1;;54834:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;54749:128::o;55259:140::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;55355:25:::1;:36:::0;55259:140::o;4771:201::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;2751:10;4082:23;4074:68;;;;-1:-1:-1;;;4074:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4860:22:0;::::1;4852:73;;;::::0;-1:-1:-1;;;4852:73:0;;12336:2:1;4852:73:0::1;::::0;::::1;12318:21:1::0;12375:2;12355:18;;;12348:30;12414:34;12394:18;;;12387:62;-1:-1:-1;;;12465:18:1;;;12458:36;12511:19;;4852:73:0::1;12134:402:1::0;4852:73:0::1;4936:28;4955:8;4936:18;:28::i;:::-;4771:201:::0;:::o;57967:120::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;43181:10;:21;;:48;;-1:-1:-1;47742:8:0;;-1:-1:-1;;;;;47742:8:0;43206:10;:23;43181:48;43172:102;;;;-1:-1:-1;;;43172:102:0;;;;;;;:::i;:::-;58048:24:::1;:31:::0;;-1:-1:-1;;58048:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;57967:120::o;57094:659::-;57162:24;;:::i;:::-;57199:31;;:::i;:::-;57247:24;;;;57243:66;;;57305:1;57275:31;;57243:66;57345:18;;57319:23;;;:44;57398:16;;57374:21;;;:40;57451:18;;57425:23;;;:44;57484:59;57501:25;57528:6;-1:-1:-1;57484:15:0;:59::i;:::-;57480:103;;;57579:1;57547:29;;;:33;57480:103;57622:21;;;57593:26;;;:50;-1:-1:-1;;;;;57686:30:0;;;;;;:22;:30;;;;;;;57593:6;40827:1;57654:29;;32878:174;32953:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32953:29:0;-1:-1:-1;;;;;32953:29:0;;;;;;;;:24;;33007:23;32953:24;33007:14;:23::i;:::-;-1:-1:-1;;;;;32998:46:0;;;;;;;;;;;32878:174;;:::o;29026:348::-;29119:4;28821:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28821:16:0;29136:73;;;;-1:-1:-1;;;29136:73:0;;16081:2:1;29136:73:0;;;16063:21:1;16120:2;16100:18;;;16093:30;16159:34;16139:18;;;16132:62;-1:-1:-1;;;16210:18:1;;;16203:42;16262:19;;29136:73:0;15879:408:1;29136:73:0;29220:13;29236:23;29251:7;29236:14;:23::i;:::-;29220:39;;29289:5;-1:-1:-1;;;;;29278:16:0;:7;-1:-1:-1;;;;;29278:16:0;;:52;;;-1:-1:-1;;;;;;26118:25:0;;;26094:4;26118:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;29298:32;29278:87;;;;29358:7;-1:-1:-1;;;;;29334:31:0;:20;29346:7;29334:11;:20::i;:::-;-1:-1:-1;;;;;29334:31:0;;29278:87;29270:96;29026:348;-1:-1:-1;;;;29026:348:0:o;32135:625::-;32294:4;-1:-1:-1;;;;;32267:31:0;:23;32282:7;32267:14;:23::i;:::-;-1:-1:-1;;;;;32267:31:0;;32259:81;;;;-1:-1:-1;;;32259:81:0;;12743:2:1;32259:81:0;;;12725:21:1;12782:2;12762:18;;;12755:30;12821:34;12801:18;;;12794:62;-1:-1:-1;;;12872:18:1;;;12865:35;12917:19;;32259:81:0;12541:401:1;32259:81:0;-1:-1:-1;;;;;32359:16:0;;32351:65;;;;-1:-1:-1;;;32351:65:0;;14568:2:1;32351:65:0;;;14550:21:1;14607:2;14587:18;;;14580:30;14646:34;14626:18;;;14619:62;-1:-1:-1;;;14697:18:1;;;14690:34;14741:19;;32351:65:0;14366:400:1;32351:65:0;32533:29;32550:1;32554:7;32533:8;:29::i;:::-;-1:-1:-1;;;;;32575:15:0;;;;;;:9;:15;;;;;:20;;32594:1;;32575:15;:20;;32594:1;;32575:20;:::i;:::-;;;;-1:-1:-1;;;;;;;32606:13:0;;;;;;:9;:13;;;;;:18;;32623:1;;32606:13;:18;;32623:1;;32606:18;:::i;:::-;;;;-1:-1:-1;;32635:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32635:21:0;-1:-1:-1;;;;;32635:21:0;;;;;;;;;32674:27;;32635:16;;32674:27;;;;;;;25071:341;25001:411;;:::o;63410:381::-;63524:7;63515:5;:16;;63506:49;;;;-1:-1:-1;;;63506:49:0;;14221:2:1;63506:49:0;;;14203:21:1;14260:2;14240:18;;;14233:30;-1:-1:-1;;;14279:18:1;;;14272:48;14337:18;;63506:49:0;14019:342:1;63506:49:0;63616:7;63608:5;:15;63604:180;;;63640:14;63657:15;63667:5;63657:7;:15;:::i;:::-;63747:25;;63640:32;;-1:-1:-1;63721:9:0;;-1:-1:-1;;;;;63747:15:0;;;:25;;;;;63640:32;;63687:22;63747:25;63687:22;63747:25;63640:32;63747:15;:25;;;;;;;;;;;;;;;;;;;;;63625:159;;63410:381;;;:::o;63958:369::-;40398:41;40349:1;40287:2;40398:41;:::i;:::-;64052:28;;40234:3;64052:28;:::i;:::-;64035:12;;:46;;64026:81;;;;-1:-1:-1;;;64026:81:0;;22810:2:1;64026:81:0;;;22792:21:1;22849:2;22829:18;;;22822:30;-1:-1:-1;;;22868:18:1;;;22861:50;22928:18;;64026:81:0;22608:344:1;64026:81:0;64149:9;;64141:3;64128:12;;:16;;;;:::i;:::-;64127:31;;64118:71;;;;-1:-1:-1;;;64118:71:0;;10150:2:1;64118:71:0;;;10132:21:1;10189:2;10169:18;;;10162:30;10228:27;10208:18;;;10201:55;10273:18;;64118:71:0;9948:349:1;64118:71:0;64207:9;64202:88;64222:3;64220:1;:5;64202:88;;;64247:31;64254:2;64272:3;:1;64274;64272:3;:::i;64247:31::-;64227:3;;;;:::i;:::-;;;;64202:88;;;;64316:3;64300:12;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;63958:369:0:o;62789:452::-;62901:4;62922:11;62918:127;;;62954:12;;:28;;-1:-1:-1;;;62954:28:0;;-1:-1:-1;;;;;7993:32:1;;;62954:28:0;;;7975:51:1;62954:12:0;;;;:18;;7948::1;;62954:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62950:84;;;-1:-1:-1;63011:5:0;63003:15;;62950:84;63062:9;63057:141;63077:12;;63075:14;;63057:141;;;63115:5;63121:1;63115:8;;;;;;;;:::i;:::-;;;;;;;;;;;:22;;-1:-1:-1;;;63115:22:0;;-1:-1:-1;;;;;7993:32:1;;;63115:22:0;;;7975:51:1;63115:8:0;;;;:14;;7948:18:1;;63115:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63111:76;;;63166:4;63158:13;;;;;63111:76;63091:3;;;;:::i;:::-;;;;63057:141;;;;63218:5;63210:15;;62789:452;;;;;;:::o;5132:191::-;5206:16;5225:6;;-1:-1:-1;;;;;5242:17:0;;;-1:-1:-1;;;;;;5242:17:0;;;;;;5275:40;;5225:6;;;;;;;5275:40;;5206:16;5275:40;5195:128;5132:191;:::o;30710:439::-;-1:-1:-1;;;;;30790:16:0;;30782:61;;;;-1:-1:-1;;;30782:61:0;;20267:2:1;30782:61:0;;;20249:21:1;;;20286:18;;;20279:30;20345:34;20325:18;;;20318:62;20397:18;;30782:61:0;20065:356:1;30782:61:0;28797:4;28821:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28821:16:0;:30;30854:58;;;;-1:-1:-1;;;30854:58:0;;13510:2:1;30854:58:0;;;13492:21:1;13549:2;13529:18;;;13522:30;13588;13568:18;;;13561:58;13636:18;;30854:58:0;13308:352:1;30854:58:0;-1:-1:-1;;;;;30983:13:0;;;;;;:9;:13;;;;;:18;;31000:1;;30983:13;:18;;31000:1;;30983:18;:::i;:::-;;;;-1:-1:-1;;31012:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31012:21:0;-1:-1:-1;;;;;31012:21:0;;;;;;;;31051:33;;31012:16;;;31051:33;;31012:16;;31051:33;25771:155;;:::o;33194:315::-;33349:8;-1:-1:-1;;;;;33340:17:0;:5;-1:-1:-1;;;;;33340:17:0;;;33332:55;;;;-1:-1:-1;;;33332:55:0;;14973:2:1;33332:55:0;;;14955:21:1;15012:2;14992:18;;;14985:30;15051:27;15031:18;;;15024:55;15096:18;;33332:55:0;14771:349:1;33332:55:0;-1:-1:-1;;;;;33398:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;33398:46:0;;;;;;;;;;33460:41;;9672::1;;;33460::0;;9645:18:1;33460:41:0;;;;;;;33194:315;;;:::o;28104:::-;28261:28;28271:4;28277:2;28281:7;28261:9;:28::i;:::-;28308:48;28331:4;28337:2;28341:7;28350:5;28308:22;:48::i;:::-;28300:111;;;;-1:-1:-1;;;28300:111:0;;;;;;;:::i;335:723::-;391:13;612:10;608:53;;-1:-1:-1;;639:10:0;;;;;;;;;;;;-1:-1:-1;;;639:10:0;;;;;335:723::o;608:53::-;686:5;671:12;727:78;734:9;;727:78;;760:8;;;;:::i;:::-;;-1:-1:-1;783:10:0;;-1:-1:-1;791:2:0;783:10;;:::i;:::-;;;727:78;;;815:19;847:6;837:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;837:17:0;;815:39;;865:154;872:10;;865:154;;899:11;909:1;899:11;;:::i;:::-;;-1:-1:-1;968:10:0;976:2;968:5;:10;:::i;:::-;955:24;;:2;:24;:::i;:::-;942:39;;925:6;932;925:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;925:56:0;;;;;;;;-1:-1:-1;996:11:0;1005:2;996:11;;:::i;:::-;;;865:154;;34074:799;34229:4;-1:-1:-1;;;;;34250:13:0;;13853:19;:23;34246:620;;34286:72;;-1:-1:-1;;;34286:72:0;;-1:-1:-1;;;;;34286:36:0;;;;;:72;;2751:10;;34337:4;;34343:7;;34352:5;;34286:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34286:72:0;;;;;;;;-1:-1:-1;;34286:72:0;;;;;;;;;;;;:::i;:::-;;;34282:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34528:13:0;;34524:272;;34571:60;;-1:-1:-1;;;34571:60:0;;;;;;;:::i;34524:272::-;34746:6;34740:13;34731:6;34727:2;34723:15;34716:38;34282:529;-1:-1:-1;;;;;;34409:51:0;-1:-1:-1;;;34409:51:0;;-1:-1:-1;34402:58:0;;34246:620;-1:-1:-1;34850:4:0;34074:799;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:247:1;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;266:251::-;336:6;389:2;377:9;368:7;364:23;360:32;357:52;;;405:1;402;395:12;357:52;437:9;431:16;456:31;481:5;456:31;:::i;522:388::-;590:6;598;651:2;639:9;630:7;626:23;622:32;619:52;;;667:1;664;657:12;619:52;706:9;693:23;725:31;750:5;725:31;:::i;:::-;775:5;-1:-1:-1;832:2:1;817:18;;804:32;845:33;804:32;845:33;:::i;:::-;897:7;887:17;;;522:388;;;;;:::o;915:456::-;992:6;1000;1008;1061:2;1049:9;1040:7;1036:23;1032:32;1029:52;;;1077:1;1074;1067:12;1029:52;1116:9;1103:23;1135:31;1160:5;1135:31;:::i;:::-;1185:5;-1:-1:-1;1242:2:1;1227:18;;1214:32;1255:33;1214:32;1255:33;:::i;:::-;915:456;;1307:7;;-1:-1:-1;;;1361:2:1;1346:18;;;;1333:32;;915:456::o;1376:1266::-;1471:6;1479;1487;1495;1548:3;1536:9;1527:7;1523:23;1519:33;1516:53;;;1565:1;1562;1555:12;1516:53;1604:9;1591:23;1623:31;1648:5;1623:31;:::i;:::-;1673:5;-1:-1:-1;1730:2:1;1715:18;;1702:32;1743:33;1702:32;1743:33;:::i;:::-;1795:7;-1:-1:-1;1849:2:1;1834:18;;1821:32;;-1:-1:-1;1904:2:1;1889:18;;1876:32;1927:18;1957:14;;;1954:34;;;1984:1;1981;1974:12;1954:34;2022:6;2011:9;2007:22;1997:32;;2067:7;2060:4;2056:2;2052:13;2048:27;2038:55;;2089:1;2086;2079:12;2038:55;2125:2;2112:16;2147:2;2143;2140:10;2137:36;;;2153:18;;:::i;:::-;2228:2;2222:9;2196:2;2282:13;;-1:-1:-1;;2278:22:1;;;2302:2;2274:31;2270:40;2258:53;;;2326:18;;;2346:22;;;2323:46;2320:72;;;2372:18;;:::i;:::-;2412:10;2408:2;2401:22;2447:2;2439:6;2432:18;2487:7;2482:2;2477;2473;2469:11;2465:20;2462:33;2459:53;;;2508:1;2505;2498:12;2459:53;2564:2;2559;2555;2551:11;2546:2;2538:6;2534:15;2521:46;2609:1;2604:2;2599;2591:6;2587:15;2583:24;2576:35;2630:6;2620:16;;;;;;;1376:1266;;;;;;;:::o;2647:382::-;2712:6;2720;2773:2;2761:9;2752:7;2748:23;2744:32;2741:52;;;2789:1;2786;2779:12;2741:52;2828:9;2815:23;2847:31;2872:5;2847:31;:::i;:::-;2897:5;-1:-1:-1;2954:2:1;2939:18;;2926:32;2967:30;2926:32;2967:30;:::i;3034:315::-;3102:6;3110;3163:2;3151:9;3142:7;3138:23;3134:32;3131:52;;;3179:1;3176;3169:12;3131:52;3218:9;3205:23;3237:31;3262:5;3237:31;:::i;:::-;3287:5;3339:2;3324:18;;;;3311:32;;-1:-1:-1;;;3034:315:1:o;3354:615::-;3440:6;3448;3501:2;3489:9;3480:7;3476:23;3472:32;3469:52;;;3517:1;3514;3507:12;3469:52;3557:9;3544:23;3586:18;3627:2;3619:6;3616:14;3613:34;;;3643:1;3640;3633:12;3613:34;3681:6;3670:9;3666:22;3656:32;;3726:7;3719:4;3715:2;3711:13;3707:27;3697:55;;3748:1;3745;3738:12;3697:55;3788:2;3775:16;3814:2;3806:6;3803:14;3800:34;;;3830:1;3827;3820:12;3800:34;3883:7;3878:2;3868:6;3865:1;3861:14;3857:2;3853:23;3849:32;3846:45;3843:65;;;3904:1;3901;3894:12;3843:65;3935:2;3927:11;;;;;3957:6;;-1:-1:-1;3354:615:1;;-1:-1:-1;;;;3354:615:1:o;3974:241::-;4030:6;4083:2;4071:9;4062:7;4058:23;4054:32;4051:52;;;4099:1;4096;4089:12;4051:52;4138:9;4125:23;4157:28;4179:5;4157:28;:::i;4220:245::-;4287:6;4340:2;4328:9;4319:7;4315:23;4311:32;4308:52;;;4356:1;4353;4346:12;4308:52;4388:9;4382:16;4407:28;4429:5;4407:28;:::i;4470:245::-;4528:6;4581:2;4569:9;4560:7;4556:23;4552:32;4549:52;;;4597:1;4594;4587:12;4549:52;4636:9;4623:23;4655:30;4679:5;4655:30;:::i;4720:249::-;4789:6;4842:2;4830:9;4821:7;4817:23;4813:32;4810:52;;;4858:1;4855;4848:12;4810:52;4890:9;4884:16;4909:30;4933:5;4909:30;:::i;4974:592::-;5045:6;5053;5106:2;5094:9;5085:7;5081:23;5077:32;5074:52;;;5122:1;5119;5112:12;5074:52;5162:9;5149:23;5191:18;5232:2;5224:6;5221:14;5218:34;;;5248:1;5245;5238:12;5218:34;5286:6;5275:9;5271:22;5261:32;;5331:7;5324:4;5320:2;5316:13;5312:27;5302:55;;5353:1;5350;5343:12;5302:55;5393:2;5380:16;5419:2;5411:6;5408:14;5405:34;;;5435:1;5432;5425:12;5405:34;5480:7;5475:2;5466:6;5462:2;5458:15;5454:24;5451:37;5448:57;;;5501:1;5498;5491:12;5571:180;5630:6;5683:2;5671:9;5662:7;5658:23;5654:32;5651:52;;;5699:1;5696;5689:12;5651:52;-1:-1:-1;5722:23:1;;5571:180;-1:-1:-1;5571:180:1:o;5756:184::-;5826:6;5879:2;5867:9;5858:7;5854:23;5850:32;5847:52;;;5895:1;5892;5885:12;5847:52;-1:-1:-1;5918:16:1;;5756:184;-1:-1:-1;5756:184:1:o;5945:248::-;6013:6;6021;6074:2;6062:9;6053:7;6049:23;6045:32;6042:52;;;6090:1;6087;6080:12;6042:52;-1:-1:-1;;6113:23:1;;;6183:2;6168:18;;;6155:32;;-1:-1:-1;5945:248:1:o;6198:257::-;6239:3;6277:5;6271:12;6304:6;6299:3;6292:19;6320:63;6376:6;6369:4;6364:3;6360:14;6353:4;6346:5;6342:16;6320:63;:::i;:::-;6437:2;6416:15;-1:-1:-1;;6412:29:1;6403:39;;;;6444:4;6399:50;;6198:257;-1:-1:-1;;6198:257:1:o;6460:185::-;6502:3;6540:5;6534:12;6555:52;6600:6;6595:3;6588:4;6581:5;6577:16;6555:52;:::i;:::-;6623:16;;;;;6460:185;-1:-1:-1;;6460:185:1:o;6650:1174::-;6826:3;6855:1;6888:6;6882:13;6918:3;6940:1;6968:9;6964:2;6960:18;6950:28;;7028:2;7017:9;7013:18;7050;7040:61;;7094:4;7086:6;7082:17;7072:27;;7040:61;7120:2;7168;7160:6;7157:14;7137:18;7134:38;7131:165;;;-1:-1:-1;;;7195:33:1;;7251:4;7248:1;7241:15;7281:4;7202:3;7269:17;7131:165;7312:18;7339:104;;;;7457:1;7452:320;;;;7305:467;;7339:104;-1:-1:-1;;7372:24:1;;7360:37;;7417:16;;;;-1:-1:-1;7339:104:1;;7452:320;28332:1;28325:14;;;28369:4;28356:18;;7547:1;7561:165;7575:6;7572:1;7569:13;7561:165;;;7653:14;;7640:11;;;7633:35;7696:16;;;;7590:10;;7561:165;;;7565:3;;7755:6;7750:3;7746:16;7739:23;;7305:467;;;;;;;7788:30;7814:3;7806:6;7788:30;:::i;:::-;7781:37;6650:1174;-1:-1:-1;;;;;6650:1174:1:o;8037:488::-;-1:-1:-1;;;;;8306:15:1;;;8288:34;;8358:15;;8353:2;8338:18;;8331:43;8405:2;8390:18;;8383:34;;;8453:3;8448:2;8433:18;;8426:31;;;8231:4;;8474:45;;8499:19;;8491:6;8474:45;:::i;:::-;8466:53;8037:488;-1:-1:-1;;;;;;8037:488:1:o;8530:497::-;8712:3;8697:19;;8701:9;8793:6;8670:4;8827:194;8841:4;8838:1;8835:11;8827:194;;;8900:13;;8888:26;;8937:4;8961:12;;;;8996:15;;;;8861:1;8854:9;8827:194;;;8831:3;;;8530:497;;;;:::o;9032:495::-;9212:3;9197:19;;9201:9;9293:6;9170:4;9327:194;9341:4;9338:1;9335:11;9327:194;;;9400:13;;9388:26;;9437:4;9461:12;;;;9496:15;;;;9361:1;9354:9;9327:194;;9724:219;9873:2;9862:9;9855:21;9836:4;9893:44;9933:2;9922:9;9918:18;9910:6;9893:44;:::i;11715:414::-;11917:2;11899:21;;;11956:2;11936:18;;;11929:30;11995:34;11990:2;11975:18;;11968:62;-1:-1:-1;;;12061:2:1;12046:18;;12039:48;12119:3;12104:19;;11715:414::o;21185:356::-;21387:2;21369:21;;;21406:18;;;21399:30;21465:34;21460:2;21445:18;;21438:62;21532:2;21517:18;;21185:356::o;25126:413::-;25328:2;25310:21;;;25367:2;25347:18;;;25340:30;25406:34;25401:2;25386:18;;25379:62;-1:-1:-1;;;25472:2:1;25457:18;;25450:47;25529:3;25514:19;;25126:413::o;25544:403::-;25746:2;25728:21;;;25785:2;25765:18;;;25758:30;25824:34;25819:2;25804:18;;25797:62;-1:-1:-1;;;25890:2:1;25875:18;;25868:37;25937:3;25922:19;;25544:403::o;27368:355::-;27570:2;27552:21;;;27609:2;27589:18;;;27582:30;27648:33;27643:2;27628:18;;27621:61;27714:2;27699:18;;27368:355::o;28385:128::-;28425:3;28456:1;28452:6;28449:1;28446:13;28443:39;;;28462:18;;:::i;:::-;-1:-1:-1;28498:9:1;;28385:128::o;28518:120::-;28558:1;28584;28574:35;;28589:18;;:::i;:::-;-1:-1:-1;28623:9:1;;28518:120::o;28643:168::-;28683:7;28749:1;28745;28741:6;28737:14;28734:1;28731:21;28726:1;28719:9;28712:17;28708:45;28705:71;;;28756:18;;:::i;:::-;-1:-1:-1;28796:9:1;;28643:168::o;28816:125::-;28856:4;28884:1;28881;28878:8;28875:34;;;28889:18;;:::i;:::-;-1:-1:-1;28926:9:1;;28816:125::o;28946:258::-;29018:1;29028:113;29042:6;29039:1;29036:13;29028:113;;;29118:11;;;29112:18;29099:11;;;29092:39;29064:2;29057:10;29028:113;;;29159:6;29156:1;29153:13;29150:48;;;-1:-1:-1;;29194:1:1;29176:16;;29169:27;28946:258::o;29209:380::-;29288:1;29284:12;;;;29331;;;29352:61;;29406:4;29398:6;29394:17;29384:27;;29352:61;29459:2;29451:6;29448:14;29428:18;29425:38;29422:161;;;29505:10;29500:3;29496:20;29493:1;29486:31;29540:4;29537:1;29530:15;29568:4;29565:1;29558:15;29422:161;;29209:380;;;:::o;29594:135::-;29633:3;-1:-1:-1;;29654:17:1;;29651:43;;;29674:18;;:::i;:::-;-1:-1:-1;29721:1:1;29710:13;;29594:135::o;29734:112::-;29766:1;29792;29782:35;;29797:18;;:::i;:::-;-1:-1:-1;29831:9:1;;29734:112::o;29851:127::-;29912:10;29907:3;29903:20;29900:1;29893:31;29943:4;29940:1;29933:15;29967:4;29964:1;29957:15;29983:127;30044:10;30039:3;30035:20;30032:1;30025:31;30075:4;30072:1;30065:15;30099:4;30096:1;30089:15;30115:127;30176:10;30171:3;30167:20;30164:1;30157:31;30207:4;30204:1;30197:15;30231:4;30228:1;30221:15;30247:127;30308:10;30303:3;30299:20;30296:1;30289:31;30339:4;30336:1;30329:15;30363:4;30360:1;30353:15;30379:131;-1:-1:-1;;;;;30454:31:1;;30444:42;;30434:70;;30500:1;30497;30490:12;30515:118;30601:5;30594:13;30587:21;30580:5;30577:32;30567:60;;30623:1;30620;30613:12;30638:131;-1:-1:-1;;;;;;30712:32:1;;30702:43;;30692:71;;30759:1;30756;30749:12

Swarm Source

ipfs://8dd508cea19243cd269fa3f8389ff8ef979b5b1066f9a087a43f224222b33e3c
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.