ETH Price: $3,093.94 (+1.08%)
Gas: 4 Gwei

Token

GemApeClub (GAC)
 

Overview

Max Total Supply

5,000 GAC

Holders

1,383

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 GAC
0x0A2D6BA3465b582D30C1153c6FD8A39A8894495C
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Alpha group hunting gems. Art NFT with community. Only 1,000 gem ape NFTs in first batch. No roadmap. Company backed.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
NFT

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-06
*/

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _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);
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * 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 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);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


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

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








/**
 * @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: address zero is not a valid owner");
        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: invalid token ID");
        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) {
        _requireMinted(tokenId);

        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 token owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        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: caller is not token 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: caller is not token 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) {
        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 an {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 an {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 Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    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 {}
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

// File: contracts/GemApeClubNFT.sol
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.15;



contract NFT is ERC721, Ownable {
    uint256 private nextTokenId = 1;
    
    
    
    
    uint8 public mintMode = 0; 
    string baseExtension = ".json";
    string baseURI = "ipfs://QmXR6UF1Zc6AzQvBSuDrpw715pXBDScvvAhqVrHmtnbkaQ/";

    
    uint256 public mintCost = 20000000000000000; 

    uint16 public maxSupply = 5000;
    
    
    
    mapping (address => uint8) private whitelistA; 
    
    
    bytes32 public merkleRootWhiteListB = 0x00d62ab26f2f0a248831bf7c127d98c614e1cc774dc7c899a519d682e02c9c14;
    uint8 private freeMintsWithlistB = 2;

    uint8 private freePublicMints = 1; 

    mapping (address => uint8) private minters; 

    
    bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a;
    address private royalties_recipient;
    uint96 private royalties_basepoints;
    constructor() ERC721("GemApeClub", "GAC") {
    
        setRoyalties(msg.sender, 1000);
    }



    function cost(address account, bytes32[] calldata _merkleProof, uint16 nfts) public view returns (uint256) {
        
        uint16 _freeMintsLeft = uint16(freeMintsLeft(account, _merkleProof));

        
        if(_freeMintsLeft >= nfts) {
            return 0; 
        } else {
            return mintCost * (nfts - _freeMintsLeft);
        }
    }


    function isOnWhitelistB(address account, bytes32[] calldata _merkleProof) public view returns (bool) {
        
        bytes32 leaf = keccak256(abi.encodePacked(account));
        bool onWhitelistB = MerkleProof.verify(_merkleProof, merkleRootWhiteListB, leaf);
        return onWhitelistB;
    }
    
    
    function freeMintsLeft(address account, bytes32[] calldata _merkleProof) public view returns (uint8) { 
        uint8 _freeMints = whitelistA[account];
        if(_freeMints == 0 && isOnWhitelistB(account, _merkleProof)) { 
            _freeMints = freeMintsWithlistB;
        }
        if(_freeMints == 0 && mintMode>1) { 
            _freeMints = freePublicMints;
        }

        
        if(minters[account] > 0) {
            if(_freeMints >= minters[account]) {
                _freeMints = _freeMints - minters[account];
            } else {
                _freeMints = 0;
            }
        }
        return _freeMints;
    }

    
    function freeMintsLeftNoWL(address account) public view returns (uint8) { 
        uint8 _freeMints = freePublicMints;

        
        if(minters[account] > 0) {
            if(_freeMints >= minters[account]) {
                _freeMints = _freeMints - minters[account];
            } else {
                _freeMints = 0;
            }
        }
        return _freeMints;
    }    

    
    
    
    
    function mint_free() public { 
        require(mintMode > 1, "Not in public sale yet.");
        uint16 _freeMintsLeft = freeMintsLeftNoWL(msg.sender);
        require(_freeMintsLeft > 0, "ERROR: No free mints left for you");
             
        doMint(msg.sender, _freeMintsLeft);
    }

    
    
    
    
    
    function mint(uint16 _mintAmount, bytes32[] calldata _merkleProof) public payable { 
        require(mintMode > 0, "ERROR: Minting closed.");
        require(isOnWhitelistAOrB(msg.sender, _merkleProof) || mintMode > 1, "ERROR: You are not on the whitelist. Wait for public sale.");

        
        
        
        if (mintCost > 0) {
          require(msg.value >= cost(msg.sender, _merkleProof, _mintAmount), "ERROR: Not enough value sent to cover cost. call cost function to assess the costs.");
        }
        doMint(msg.sender, _mintAmount);
    }

    
    function doMint(address to, uint16 _mintAmount) private { 
        require(_mintAmount > 0, "ERROR: Mint amount must be > 0");
        require(nextTokenId-1 + _mintAmount <= maxSupply, "ERROR: Collection is fully minted!");
    
        for (uint16 i = 1; i <= _mintAmount; i++) {
            _safeMint(to, nextTokenId);
            nextTokenId++; 
            
            minters[to] = minters[to]+1;
        }
    }
    
  
    
    function mintByOwner(address to, uint16 mintAmount) public onlyOwner { 
        doMint(to, mintAmount);
    }

    
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (address receiver, uint256 royaltyAmount) {
        return (royalties_recipient, _salePrice * royalties_basepoints / 10000);
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721) returns (bool) {
        if(interfaceId == _INTERFACE_ID_ERC2981) {
            return true;
        }
        return super.supportsInterface(interfaceId);
    } 

     function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }     
    
    function tokenURI(uint256 _tokenId) public view override(ERC721) returns (string memory) {
        require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
        return string(abi.encodePacked(_baseURI(), Strings.toString(_tokenId), baseExtension));

    }

     
    function totalSupply() public view returns (uint256) {
        return nextTokenId-1;
    }
    
    function walletOfOwner(address _owner) public view returns (uint256[] memory){
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        uint256 counter = 0;
        for (uint256 i=1; i < nextTokenId; i++) {
            if(_exists(i) && ownerOf(i)==_owner)
            tokenIds[counter++] = i;
        }
        return tokenIds;
    }

    function setBaseURI(string memory newbaseURI) public onlyOwner {
        baseURI = newbaseURI;
    }
    
    function setExtension(string memory newbaseExtension) public onlyOwner {
        baseExtension = newbaseExtension;
    }
    
    function setMintCost(uint256 _mintCost) public onlyOwner {
        mintCost = _mintCost;
    }

    
    function setRoyalties(address _recipient, uint96 _basepoints) public onlyOwner {
        require(_basepoints<=10000, "Royalties: basepoint max is 10000 for 100% royalties");
          royalties_recipient = _recipient;
          royalties_basepoints = _basepoints;
    }
    
    
    function setFreeMintAmounts(uint8 _newFreeMintsWithlistB, uint8 _newFreeMintsPublic) public onlyOwner {
        if(freePublicMints != _newFreeMintsPublic) {
            freePublicMints = _newFreeMintsPublic;
        }
        if(freeMintsWithlistB != _newFreeMintsWithlistB) {
            freeMintsWithlistB = _newFreeMintsWithlistB;
        }
    }
    

    function setMaxSupply(uint16 _maxSupply) public onlyOwner {
        maxSupply = _maxSupply;
    }

    
    
    
    function setMintMode(uint8 _mintMode) public onlyOwner {
        mintMode = _mintMode;
    }

    
    function addWhitelistA(address[] memory accounts, uint8 amount) external onlyOwner {
        for (uint256 i = 0; i < accounts.length; i++) {
            whitelistA[accounts[i]] = amount;
        }
    }

   function isOnWhitelistA(address _account) public view returns (uint8) {
        return whitelistA[_account];
    }    

    
    function setMerkleRootWhiteListB(bytes32 _merkleRootWhiteListB) external onlyOwner {
        merkleRootWhiteListB = _merkleRootWhiteListB;
    }


    function getMerkleRootWhiteListB() public view onlyOwner returns (bytes32) {
        return merkleRootWhiteListB;
    }

    function isOnWhitelistAOrB(address _account, bytes32[] calldata _merkleProof) public view returns (bool){
        return whitelistA[_account]>0 || isOnWhitelistB(_account, _merkleProof);
    } 

    
    
    function balance() public view onlyOwner returns (uint256) {
        return address(this).balance;
    }

    function withdraw() public payable onlyOwner {
        (bool os, ) = payable(owner()).call{value: address(this).balance}("");
        require(os);
    }
}

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":"accounts","type":"address[]"},{"internalType":"uint8","name":"amount","type":"uint8"}],"name":"addWhitelistA","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":[],"name":"balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint16","name":"nfts","type":"uint16"}],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"freeMintsLeft","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"freeMintsLeftNoWL","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMerkleRootWhiteListB","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isOnWhitelistA","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"isOnWhitelistAOrB","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"isOnWhitelistB","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRootWhiteListB","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_mintAmount","type":"uint16"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16","name":"mintAmount","type":"uint16"}],"name":"mintByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintMode","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint_free","outputs":[],"stateMutability":"nonpayable","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":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"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":"newbaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newbaseExtension","type":"string"}],"name":"setExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_newFreeMintsWithlistB","type":"uint8"},{"internalType":"uint8","name":"_newFreeMintsPublic","type":"uint8"}],"name":"setFreeMintAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_maxSupply","type":"uint16"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRootWhiteListB","type":"bytes32"}],"name":"setMerkleRootWhiteListB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintCost","type":"uint256"}],"name":"setMintCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintMode","type":"uint8"}],"name":"setMintMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint96","name":"_basepoints","type":"uint96"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_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":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60016007556008805460ff1916905560c06040526005608090815264173539b7b760d91b60a05260099062000035908262000349565b50604051806060016040528060368152602001620030f360369139600a906200005f908262000349565b5066470de4df820000600b55600c805461138861ffff19918216179091557ed62ab26f2f0a248831bf7c127d98c614e1cc774dc7c899a519d682e02c9c14600e55600f8054909116610102179055348015620000ba57600080fd5b506040518060400160405280600a81526020016923b2b6a0b832a1b63ab160b11b8152506040518060400160405280600381526020016247414360e81b81525081600090816200010b919062000349565b5060016200011a828262000349565b50505062000137620001316200014b60201b60201c565b6200014f565b62000145336103e8620001a1565b62000415565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6006546001600160a01b03163314620002015760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b612710816001600160601b03161115620002845760405162461bcd60e51b815260206004820152603460248201527f526f79616c746965733a2062617365706f696e74206d6178206973203130303060448201527f3020666f72203130302520726f79616c746965730000000000000000000000006064820152608401620001f8565b6001600160601b0316600160a01b026001600160a01b0390911617601155565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620002cf57607f821691505b602082108103620002f057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200034457600081815260208120601f850160051c810160208610156200031f5750805b601f850160051c820191505b8181101562000340578281556001016200032b565b5050505b505050565b81516001600160401b03811115620003655762000365620002a4565b6200037d81620003768454620002ba565b84620002f6565b602080601f831160018114620003b557600084156200039c5750858301515b600019600386901b1c1916600185901b17855562000340565b600085815260208120601f198616915b82811015620003e657888601518255948401946001909101908401620003c5565b5085821015620004055787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612cce80620004256000396000f3fe6080604052600436106102675760003560e01c8063788c599911610144578063bdb4b848116100b6578063d5abeb011161007a578063d5abeb011461073d578063d6b5a40d1461076b578063da41bfe1146107a4578063e985e9c5146107b7578063f2fde38b14610800578063fec0a4f81461082057600080fd5b8063bdb4b848146106a7578063c21b471b146106bd578063c67c8902146106dd578063c8752ef3146106fd578063c87b56dd1461071d57600080fd5b806395d89b411161010857806395d89b41146105fd578063963d1286146106125780639c9b6b8314610632578063a22cb46514610652578063b69ef8a814610672578063b88d4fde1461068757600080fd5b8063788c5999146105705780637896bb0a1461058a5780637e2285aa1461059f5780638545f4ea146105bf5780638da5cb5b146105df57600080fd5b80633ccfd60b116101dd5780636352211e116101a15780636352211e146104c65780636d2160e2146104e657806370a0823114610506578063715018a61461052657806372131db31461053b578063778077581461055b57600080fd5b80633ccfd60b1461043157806342842e0e14610439578063438b6300146104595780635005353a1461048657806355f804b3146104a657600080fd5b806313962e3c1161022f57806313962e3c1461033d57806318160ddd1461035d5780631eb5628c1461038057806323b872dd146103a057806324962b41146103c05780632a55205a146103f257600080fd5b806301ffc9a71461026c57806306421c2f146102a157806306fdde03146102c3578063081812fc146102e5578063095ea7b31461031d575b600080fd5b34801561027857600080fd5b5061028c6102873660046121f8565b610836565b60405190151581526020015b60405180910390f35b3480156102ad57600080fd5b506102c16102bc36600461222c565b610867565b005b3480156102cf57600080fd5b506102d86108b2565b604051610298919061229f565b3480156102f157600080fd5b506103056103003660046122b2565b610944565b6040516001600160a01b039091168152602001610298565b34801561032957600080fd5b506102c16103383660046122e2565b61096b565b34801561034957600080fd5b506102c1610358366004612364565b610a80565b34801561036957600080fd5b50610372610b20565b604051908152602001610298565b34801561038c57600080fd5b506102c161039b3660046122b2565b610b36565b3480156103ac57600080fd5b506102c16103bb366004612423565b610b65565b3480156103cc57600080fd5b506103e06103db36600461245f565b610b96565b60405160ff9091168152602001610298565b3480156103fe57600080fd5b5061041261040d36600461247a565b610c21565b604080516001600160a01b039093168352602083019190915201610298565b6102c1610c68565b34801561044557600080fd5b506102c1610454366004612423565b610d06565b34801561046557600080fd5b5061047961047436600461245f565b610d21565b604051610298919061249c565b34801561049257600080fd5b5061028c6104a1366004612525565b610e11565b3480156104b257600080fd5b506102c16104c13660046125d0565b610e9a565b3480156104d257600080fd5b506103056104e13660046122b2565b610ed4565b3480156104f257600080fd5b506102c1610501366004612619565b610f34565b34801561051257600080fd5b5061037261052136600461245f565b610fab565b34801561053257600080fd5b506102c1611031565b34801561054757600080fd5b506102c161055636600461264c565b611067565b34801561056757600080fd5b506103726110a7565b34801561057c57600080fd5b506008546103e09060ff1681565b34801561059657600080fd5b506102c16110db565b3480156105ab57600080fd5b506102c16105ba3660046125d0565b6111a3565b3480156105cb57600080fd5b506102c16105da3660046122b2565b6111d9565b3480156105eb57600080fd5b506006546001600160a01b0316610305565b34801561060957600080fd5b506102d8611208565b34801561061e57600080fd5b5061028c61062d366004612525565b611217565b34801561063e57600080fd5b5061037261064d366004612667565b61124e565b34801561065e57600080fd5b506102c161066d3660046126cc565b611291565b34801561067e57600080fd5b5061037261129c565b34801561069357600080fd5b506102c16106a2366004612708565b6112ce565b3480156106b357600080fd5b50610372600b5481565b3480156106c957600080fd5b506102c16106d8366004612784565b611306565b3480156106e957600080fd5b506102c16106f83660046127bc565b6113c8565b34801561070957600080fd5b506103e0610718366004612525565b6113fc565b34801561072957600080fd5b506102d86107383660046122b2565b6114e2565b34801561074957600080fd5b50600c546107589061ffff1681565b60405161ffff9091168152602001610298565b34801561077757600080fd5b506103e061078636600461245f565b6001600160a01b03166000908152600d602052604090205460ff1690565b6102c16107b23660046127e6565b61159c565b3480156107c357600080fd5b5061028c6107d2366004612804565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561080c57600080fd5b506102c161081b36600461245f565b611725565b34801561082c57600080fd5b50610372600e5481565b6000636ad56fd360e11b6001600160e01b031983160161085857506001919050565b610861826117bd565b92915050565b6006546001600160a01b0316331461089a5760405162461bcd60e51b81526004016108919061282e565b60405180910390fd5b600c805461ffff191661ffff92909216919091179055565b6060600080546108c190612863565b80601f01602080910402602001604051908101604052809291908181526020018280546108ed90612863565b801561093a5780601f1061090f5761010080835404028352916020019161093a565b820191906000526020600020905b81548152906001019060200180831161091d57829003601f168201915b5050505050905090565b600061094f8261180d565b506000908152600460205260409020546001600160a01b031690565b600061097682610ed4565b9050806001600160a01b0316836001600160a01b0316036109e35760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610891565b336001600160a01b03821614806109ff57506109ff81336107d2565b610a715760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610891565b610a7b838361186c565b505050565b6006546001600160a01b03163314610aaa5760405162461bcd60e51b81526004016108919061282e565b60005b8251811015610a7b5781600d6000858481518110610acd57610acd61289d565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508080610b18906128c9565b915050610aad565b60006001600754610b3191906128e2565b905090565b6006546001600160a01b03163314610b605760405162461bcd60e51b81526004016108919061282e565b600e55565b610b6f33826118da565b610b8b5760405162461bcd60e51b8152600401610891906128f9565b610a7b838383611958565b600f546001600160a01b038216600090815260106020526040812054909160ff6101009091048116911615610861576001600160a01b03831660009081526010602052604090205460ff90811690821610610c18576001600160a01b038316600090815260106020526040902054610c119060ff1682612947565b9050610861565b50600092915050565b60115460009081906001600160a01b0381169061271090610c5290600160a01b90046001600160601b03168661296a565b610c5c919061299f565b915091505b9250929050565b6006546001600160a01b03163314610c925760405162461bcd60e51b81526004016108919061282e565b6000610ca66006546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610cf0576040519150601f19603f3d011682016040523d82523d6000602084013e610cf5565b606091505b5050905080610d0357600080fd5b50565b610a7b838383604051806020016040528060008152506112ce565b60606000610d2e83610fab565b905060008167ffffffffffffffff811115610d4b57610d4b61230c565b604051908082528060200260200182016040528015610d74578160200160208202803683370190505b509050600060015b600754811015610e07576000818152600260205260409020546001600160a01b031615158015610dc55750856001600160a01b0316610dba82610ed4565b6001600160a01b0316145b15610df557808383610dd6816128c9565b945081518110610de857610de861289d565b6020026020010181815250505b80610dff816128c9565b915050610d7c565b5090949350505050565b6040516bffffffffffffffffffffffff19606085901b16602082015260009081906034016040516020818303038152906040528051906020012090506000610e9085858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e549150859050611af4565b9695505050505050565b6006546001600160a01b03163314610ec45760405162461bcd60e51b81526004016108919061282e565b600a610ed08282612a01565b5050565b6000818152600260205260408120546001600160a01b0316806108615760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610891565b6006546001600160a01b03163314610f5e5760405162461bcd60e51b81526004016108919061282e565b600f5460ff8281166101009092041614610f8757600f805461ff00191661010060ff8416021790555b600f5460ff838116911614610ed057600f805460ff841660ff199091161790555050565b60006001600160a01b0382166110155760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610891565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b0316331461105b5760405162461bcd60e51b81526004016108919061282e565b6110656000611b0a565b565b6006546001600160a01b031633146110915760405162461bcd60e51b81526004016108919061282e565b6008805460ff191660ff92909216919091179055565b6006546000906001600160a01b031633146110d45760405162461bcd60e51b81526004016108919061282e565b50600e5490565b600854600160ff909116116111325760405162461bcd60e51b815260206004820152601760248201527f4e6f7420696e207075626c69632073616c65207965742e0000000000000000006044820152606401610891565b600061113d33610b96565b60ff169050806111995760405162461bcd60e51b815260206004820152602160248201527f4552524f523a204e6f2066726565206d696e7473206c65667420666f7220796f6044820152607560f81b6064820152608401610891565b610d033382611b5c565b6006546001600160a01b031633146111cd5760405162461bcd60e51b81526004016108919061282e565b6009610ed08282612a01565b6006546001600160a01b031633146112035760405162461bcd60e51b81526004016108919061282e565b600b55565b6060600180546108c190612863565b6001600160a01b0383166000908152600d602052604081205460ff161515806112465750611246848484610e11565b949350505050565b60008061125c8686866113fc565b60ff16905061ffff83168110611276576000915050611246565b6112808184612ac1565b61ffff16600b54610e90919061296a565b610ed0338383611cc5565b6006546000906001600160a01b031633146112c95760405162461bcd60e51b81526004016108919061282e565b504790565b6112d833836118da565b6112f45760405162461bcd60e51b8152600401610891906128f9565b61130084848484611d93565b50505050565b6006546001600160a01b031633146113305760405162461bcd60e51b81526004016108919061282e565b612710816001600160601b031611156113a85760405162461bcd60e51b815260206004820152603460248201527f526f79616c746965733a2062617365706f696e74206d617820697320313030306044820152733020666f72203130302520726f79616c7469657360601b6064820152608401610891565b6001600160601b0316600160a01b026001600160a01b0390911617601155565b6006546001600160a01b031633146113f25760405162461bcd60e51b81526004016108919061282e565b610ed08282611b5c565b6001600160a01b0383166000908152600d602052604081205460ff168015801561142c575061142c858585610e11565b156114395750600f5460ff165b60ff81161580156114515750600854600160ff909116115b156114635750600f54610100900460ff165b6001600160a01b03851660009081526010602052604090205460ff1615611246576001600160a01b03851660009081526010602052604090205460ff908116908216106114d7576001600160a01b0385166000908152601060205260409020546114d09060ff1682612947565b9050611246565b506000949350505050565b6000818152600260205260409020546060906001600160a01b03166115615760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610891565b611569611dc6565b61157283611dd5565b600960405160200161158693929190612ae4565b6040516020818303038152906040529050919050565b60085460ff166115e75760405162461bcd60e51b815260206004820152601660248201527522a92927a91d1026b4b73a34b7339031b637b9b2b21760511b6044820152606401610891565b6115f2338383611217565b806116045750600854600160ff909116115b6116765760405162461bcd60e51b815260206004820152603a60248201527f4552524f523a20596f7520617265206e6f74206f6e207468652077686974656c60448201527f6973742e205761697420666f72207075626c69632073616c652e0000000000006064820152608401610891565b600b541561171b5761168a3383838661124e565b34101561171b5760405162461bcd60e51b815260206004820152605360248201527f4552524f523a204e6f7420656e6f7567682076616c75652073656e7420746f2060448201527f636f76657220636f73742e2063616c6c20636f73742066756e6374696f6e2074606482015272379030b9b9b2b9b9903a34329031b7b9ba399760691b608482015260a401610891565b610a7b3384611b5c565b6006546001600160a01b0316331461174f5760405162461bcd60e51b81526004016108919061282e565b6001600160a01b0381166117b45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610891565b610d0381611b0a565b60006001600160e01b031982166380ac58cd60e01b14806117ee57506001600160e01b03198216635b5e139f60e01b145b8061086157506301ffc9a760e01b6001600160e01b0319831614610861565b6000818152600260205260409020546001600160a01b0316610d035760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610891565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906118a182610ed4565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806118e683610ed4565b9050806001600160a01b0316846001600160a01b0316148061192d57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806112465750836001600160a01b031661194684610944565b6001600160a01b031614949350505050565b826001600160a01b031661196b82610ed4565b6001600160a01b0316146119cf5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610891565b6001600160a01b038216611a315760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610891565b611a3c60008261186c565b6001600160a01b0383166000908152600360205260408120805460019290611a659084906128e2565b90915550506001600160a01b0382166000908152600360205260408120805460019290611a93908490612b84565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600082611b018584611ed6565b14949350505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008161ffff1611611bb05760405162461bcd60e51b815260206004820152601e60248201527f4552524f523a204d696e7420616d6f756e74206d757374206265203e203000006044820152606401610891565b600c5460075461ffff91821691831690611bcc906001906128e2565b611bd69190612b84565b1115611c2f5760405162461bcd60e51b815260206004820152602260248201527f4552524f523a20436f6c6c656374696f6e2069732066756c6c79206d696e7465604482015261642160f01b6064820152608401610891565b60015b8161ffff168161ffff1611610a7b57611c4d83600754611f23565b60078054906000611c5d836128c9565b90915550506001600160a01b038316600090815260106020526040902054611c899060ff166001612b9c565b6001600160a01b0384166000908152601060205260409020805460ff191660ff9290921691909117905580611cbd81612bc1565b915050611c32565b816001600160a01b0316836001600160a01b031603611d265760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610891565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611d9e848484611958565b611daa84848484611f3d565b6113005760405162461bcd60e51b815260040161089190612be2565b6060600a80546108c190612863565b606081600003611dfc5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611e265780611e10816128c9565b9150611e1f9050600a8361299f565b9150611e00565b60008167ffffffffffffffff811115611e4157611e4161230c565b6040519080825280601f01601f191660200182016040528015611e6b576020820181803683370190505b5090505b841561124657611e806001836128e2565b9150611e8d600a86612c34565b611e98906030612b84565b60f81b818381518110611ead57611ead61289d565b60200101906001600160f81b031916908160001a905350611ecf600a8661299f565b9450611e6f565b600081815b8451811015611f1b57611f0782868381518110611efa57611efa61289d565b602002602001015161203b565b915080611f13816128c9565b915050611edb565b509392505050565b610ed082826040518060200160405280600081525061206d565b60006001600160a01b0384163b1561203357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611f81903390899088908890600401612c48565b6020604051808303816000875af1925050508015611fbc575060408051601f3d908101601f19168201909252611fb991810190612c7b565b60015b612019573d808015611fea576040519150601f19603f3d011682016040523d82523d6000602084013e611fef565b606091505b5080516000036120115760405162461bcd60e51b815260040161089190612be2565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611246565b506001611246565b6000818310612057576000828152602084905260409020612066565b60008381526020839052604090205b9392505050565b61207783836120a0565b6120846000848484611f3d565b610a7b5760405162461bcd60e51b815260040161089190612be2565b6001600160a01b0382166120f65760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610891565b6000818152600260205260409020546001600160a01b03161561215b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610891565b6001600160a01b0382166000908152600360205260408120805460019290612184908490612b84565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b031981168114610d0357600080fd5b60006020828403121561220a57600080fd5b8135612066816121e2565b803561ffff8116811461222757600080fd5b919050565b60006020828403121561223e57600080fd5b61206682612215565b60005b8381101561226257818101518382015260200161224a565b838111156113005750506000910152565b6000815180845261228b816020860160208601612247565b601f01601f19169290920160200192915050565b6020815260006120666020830184612273565b6000602082840312156122c457600080fd5b5035919050565b80356001600160a01b038116811461222757600080fd5b600080604083850312156122f557600080fd5b6122fe836122cb565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561234b5761234b61230c565b604052919050565b803560ff8116811461222757600080fd5b6000806040838503121561237757600080fd5b823567ffffffffffffffff8082111561238f57600080fd5b818501915085601f8301126123a357600080fd5b81356020828211156123b7576123b761230c565b8160051b92506123c8818401612322565b82815292840181019281810190898511156123e257600080fd5b948201945b84861015612407576123f8866122cb565b825294820194908201906123e7565b96506124169050878201612353565b9450505050509250929050565b60008060006060848603121561243857600080fd5b612441846122cb565b925061244f602085016122cb565b9150604084013590509250925092565b60006020828403121561247157600080fd5b612066826122cb565b6000806040838503121561248d57600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b818110156124d4578351835292840192918401916001016124b8565b50909695505050505050565b60008083601f8401126124f257600080fd5b50813567ffffffffffffffff81111561250a57600080fd5b6020830191508360208260051b8501011115610c6157600080fd5b60008060006040848603121561253a57600080fd5b612543846122cb565b9250602084013567ffffffffffffffff81111561255f57600080fd5b61256b868287016124e0565b9497909650939450505050565b600067ffffffffffffffff8311156125925761259261230c565b6125a5601f8401601f1916602001612322565b90508281528383830111156125b957600080fd5b828260208301376000602084830101529392505050565b6000602082840312156125e257600080fd5b813567ffffffffffffffff8111156125f957600080fd5b8201601f8101841361260a57600080fd5b61124684823560208401612578565b6000806040838503121561262c57600080fd5b61263583612353565b915061264360208401612353565b90509250929050565b60006020828403121561265e57600080fd5b61206682612353565b6000806000806060858703121561267d57600080fd5b612686856122cb565b9350602085013567ffffffffffffffff8111156126a257600080fd5b6126ae878288016124e0565b90945092506126c1905060408601612215565b905092959194509250565b600080604083850312156126df57600080fd5b6126e8836122cb565b9150602083013580151581146126fd57600080fd5b809150509250929050565b6000806000806080858703121561271e57600080fd5b612727856122cb565b9350612735602086016122cb565b925060408501359150606085013567ffffffffffffffff81111561275857600080fd5b8501601f8101871361276957600080fd5b61277887823560208401612578565b91505092959194509250565b6000806040838503121561279757600080fd5b6127a0836122cb565b915060208301356001600160601b03811681146126fd57600080fd5b600080604083850312156127cf57600080fd5b6127d8836122cb565b915061264360208401612215565b6000806000604084860312156127fb57600080fd5b61254384612215565b6000806040838503121561281757600080fd5b612820836122cb565b9150612643602084016122cb565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061287757607f821691505b60208210810361289757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016128db576128db6128b3565b5060010190565b6000828210156128f4576128f46128b3565b500390565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b600060ff821660ff841680821015612961576129616128b3565b90039392505050565b6000816000190483118215151615612984576129846128b3565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826129ae576129ae612989565b500490565b601f821115610a7b57600081815260208120601f850160051c810160208610156129da5750805b601f850160051c820191505b818110156129f9578281556001016129e6565b505050505050565b815167ffffffffffffffff811115612a1b57612a1b61230c565b612a2f81612a298454612863565b846129b3565b602080601f831160018114612a645760008415612a4c5750858301515b600019600386901b1c1916600185901b1785556129f9565b600085815260208120601f198616915b82811015612a9357888601518255948401946001909101908401612a74565b5085821015612ab15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600061ffff83811690831681811015612adc57612adc6128b3565b039392505050565b600084516020612af78285838a01612247565b855191840191612b0a8184848a01612247565b8554920191600090612b1b81612863565b60018281168015612b335760018114612b4857612b74565b60ff1984168752821515830287019450612b74565b896000528560002060005b84811015612b6c57815489820152908301908701612b53565b505082870194505b50929a9950505050505050505050565b60008219821115612b9757612b976128b3565b500190565b600060ff821660ff84168060ff03821115612bb957612bb96128b3565b019392505050565b600061ffff808316818103612bd857612bd86128b3565b6001019392505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600082612c4357612c43612989565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090610e9090830184612273565b600060208284031215612c8d57600080fd5b8151612066816121e256fea26469706673582212208d8f80e4efc4c84c61959ca0286f0c10eb795b171e40985b7adeec35a3837d0264736f6c634300080f0033697066733a2f2f516d5852365546315a6336417a51764253754472707737313570584244536376764168715672486d746e626b61512f

Deployed Bytecode

0x6080604052600436106102675760003560e01c8063788c599911610144578063bdb4b848116100b6578063d5abeb011161007a578063d5abeb011461073d578063d6b5a40d1461076b578063da41bfe1146107a4578063e985e9c5146107b7578063f2fde38b14610800578063fec0a4f81461082057600080fd5b8063bdb4b848146106a7578063c21b471b146106bd578063c67c8902146106dd578063c8752ef3146106fd578063c87b56dd1461071d57600080fd5b806395d89b411161010857806395d89b41146105fd578063963d1286146106125780639c9b6b8314610632578063a22cb46514610652578063b69ef8a814610672578063b88d4fde1461068757600080fd5b8063788c5999146105705780637896bb0a1461058a5780637e2285aa1461059f5780638545f4ea146105bf5780638da5cb5b146105df57600080fd5b80633ccfd60b116101dd5780636352211e116101a15780636352211e146104c65780636d2160e2146104e657806370a0823114610506578063715018a61461052657806372131db31461053b578063778077581461055b57600080fd5b80633ccfd60b1461043157806342842e0e14610439578063438b6300146104595780635005353a1461048657806355f804b3146104a657600080fd5b806313962e3c1161022f57806313962e3c1461033d57806318160ddd1461035d5780631eb5628c1461038057806323b872dd146103a057806324962b41146103c05780632a55205a146103f257600080fd5b806301ffc9a71461026c57806306421c2f146102a157806306fdde03146102c3578063081812fc146102e5578063095ea7b31461031d575b600080fd5b34801561027857600080fd5b5061028c6102873660046121f8565b610836565b60405190151581526020015b60405180910390f35b3480156102ad57600080fd5b506102c16102bc36600461222c565b610867565b005b3480156102cf57600080fd5b506102d86108b2565b604051610298919061229f565b3480156102f157600080fd5b506103056103003660046122b2565b610944565b6040516001600160a01b039091168152602001610298565b34801561032957600080fd5b506102c16103383660046122e2565b61096b565b34801561034957600080fd5b506102c1610358366004612364565b610a80565b34801561036957600080fd5b50610372610b20565b604051908152602001610298565b34801561038c57600080fd5b506102c161039b3660046122b2565b610b36565b3480156103ac57600080fd5b506102c16103bb366004612423565b610b65565b3480156103cc57600080fd5b506103e06103db36600461245f565b610b96565b60405160ff9091168152602001610298565b3480156103fe57600080fd5b5061041261040d36600461247a565b610c21565b604080516001600160a01b039093168352602083019190915201610298565b6102c1610c68565b34801561044557600080fd5b506102c1610454366004612423565b610d06565b34801561046557600080fd5b5061047961047436600461245f565b610d21565b604051610298919061249c565b34801561049257600080fd5b5061028c6104a1366004612525565b610e11565b3480156104b257600080fd5b506102c16104c13660046125d0565b610e9a565b3480156104d257600080fd5b506103056104e13660046122b2565b610ed4565b3480156104f257600080fd5b506102c1610501366004612619565b610f34565b34801561051257600080fd5b5061037261052136600461245f565b610fab565b34801561053257600080fd5b506102c1611031565b34801561054757600080fd5b506102c161055636600461264c565b611067565b34801561056757600080fd5b506103726110a7565b34801561057c57600080fd5b506008546103e09060ff1681565b34801561059657600080fd5b506102c16110db565b3480156105ab57600080fd5b506102c16105ba3660046125d0565b6111a3565b3480156105cb57600080fd5b506102c16105da3660046122b2565b6111d9565b3480156105eb57600080fd5b506006546001600160a01b0316610305565b34801561060957600080fd5b506102d8611208565b34801561061e57600080fd5b5061028c61062d366004612525565b611217565b34801561063e57600080fd5b5061037261064d366004612667565b61124e565b34801561065e57600080fd5b506102c161066d3660046126cc565b611291565b34801561067e57600080fd5b5061037261129c565b34801561069357600080fd5b506102c16106a2366004612708565b6112ce565b3480156106b357600080fd5b50610372600b5481565b3480156106c957600080fd5b506102c16106d8366004612784565b611306565b3480156106e957600080fd5b506102c16106f83660046127bc565b6113c8565b34801561070957600080fd5b506103e0610718366004612525565b6113fc565b34801561072957600080fd5b506102d86107383660046122b2565b6114e2565b34801561074957600080fd5b50600c546107589061ffff1681565b60405161ffff9091168152602001610298565b34801561077757600080fd5b506103e061078636600461245f565b6001600160a01b03166000908152600d602052604090205460ff1690565b6102c16107b23660046127e6565b61159c565b3480156107c357600080fd5b5061028c6107d2366004612804565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561080c57600080fd5b506102c161081b36600461245f565b611725565b34801561082c57600080fd5b50610372600e5481565b6000636ad56fd360e11b6001600160e01b031983160161085857506001919050565b610861826117bd565b92915050565b6006546001600160a01b0316331461089a5760405162461bcd60e51b81526004016108919061282e565b60405180910390fd5b600c805461ffff191661ffff92909216919091179055565b6060600080546108c190612863565b80601f01602080910402602001604051908101604052809291908181526020018280546108ed90612863565b801561093a5780601f1061090f5761010080835404028352916020019161093a565b820191906000526020600020905b81548152906001019060200180831161091d57829003601f168201915b5050505050905090565b600061094f8261180d565b506000908152600460205260409020546001600160a01b031690565b600061097682610ed4565b9050806001600160a01b0316836001600160a01b0316036109e35760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610891565b336001600160a01b03821614806109ff57506109ff81336107d2565b610a715760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610891565b610a7b838361186c565b505050565b6006546001600160a01b03163314610aaa5760405162461bcd60e51b81526004016108919061282e565b60005b8251811015610a7b5781600d6000858481518110610acd57610acd61289d565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508080610b18906128c9565b915050610aad565b60006001600754610b3191906128e2565b905090565b6006546001600160a01b03163314610b605760405162461bcd60e51b81526004016108919061282e565b600e55565b610b6f33826118da565b610b8b5760405162461bcd60e51b8152600401610891906128f9565b610a7b838383611958565b600f546001600160a01b038216600090815260106020526040812054909160ff6101009091048116911615610861576001600160a01b03831660009081526010602052604090205460ff90811690821610610c18576001600160a01b038316600090815260106020526040902054610c119060ff1682612947565b9050610861565b50600092915050565b60115460009081906001600160a01b0381169061271090610c5290600160a01b90046001600160601b03168661296a565b610c5c919061299f565b915091505b9250929050565b6006546001600160a01b03163314610c925760405162461bcd60e51b81526004016108919061282e565b6000610ca66006546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610cf0576040519150601f19603f3d011682016040523d82523d6000602084013e610cf5565b606091505b5050905080610d0357600080fd5b50565b610a7b838383604051806020016040528060008152506112ce565b60606000610d2e83610fab565b905060008167ffffffffffffffff811115610d4b57610d4b61230c565b604051908082528060200260200182016040528015610d74578160200160208202803683370190505b509050600060015b600754811015610e07576000818152600260205260409020546001600160a01b031615158015610dc55750856001600160a01b0316610dba82610ed4565b6001600160a01b0316145b15610df557808383610dd6816128c9565b945081518110610de857610de861289d565b6020026020010181815250505b80610dff816128c9565b915050610d7c565b5090949350505050565b6040516bffffffffffffffffffffffff19606085901b16602082015260009081906034016040516020818303038152906040528051906020012090506000610e9085858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e549150859050611af4565b9695505050505050565b6006546001600160a01b03163314610ec45760405162461bcd60e51b81526004016108919061282e565b600a610ed08282612a01565b5050565b6000818152600260205260408120546001600160a01b0316806108615760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610891565b6006546001600160a01b03163314610f5e5760405162461bcd60e51b81526004016108919061282e565b600f5460ff8281166101009092041614610f8757600f805461ff00191661010060ff8416021790555b600f5460ff838116911614610ed057600f805460ff841660ff199091161790555050565b60006001600160a01b0382166110155760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610891565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b0316331461105b5760405162461bcd60e51b81526004016108919061282e565b6110656000611b0a565b565b6006546001600160a01b031633146110915760405162461bcd60e51b81526004016108919061282e565b6008805460ff191660ff92909216919091179055565b6006546000906001600160a01b031633146110d45760405162461bcd60e51b81526004016108919061282e565b50600e5490565b600854600160ff909116116111325760405162461bcd60e51b815260206004820152601760248201527f4e6f7420696e207075626c69632073616c65207965742e0000000000000000006044820152606401610891565b600061113d33610b96565b60ff169050806111995760405162461bcd60e51b815260206004820152602160248201527f4552524f523a204e6f2066726565206d696e7473206c65667420666f7220796f6044820152607560f81b6064820152608401610891565b610d033382611b5c565b6006546001600160a01b031633146111cd5760405162461bcd60e51b81526004016108919061282e565b6009610ed08282612a01565b6006546001600160a01b031633146112035760405162461bcd60e51b81526004016108919061282e565b600b55565b6060600180546108c190612863565b6001600160a01b0383166000908152600d602052604081205460ff161515806112465750611246848484610e11565b949350505050565b60008061125c8686866113fc565b60ff16905061ffff83168110611276576000915050611246565b6112808184612ac1565b61ffff16600b54610e90919061296a565b610ed0338383611cc5565b6006546000906001600160a01b031633146112c95760405162461bcd60e51b81526004016108919061282e565b504790565b6112d833836118da565b6112f45760405162461bcd60e51b8152600401610891906128f9565b61130084848484611d93565b50505050565b6006546001600160a01b031633146113305760405162461bcd60e51b81526004016108919061282e565b612710816001600160601b031611156113a85760405162461bcd60e51b815260206004820152603460248201527f526f79616c746965733a2062617365706f696e74206d617820697320313030306044820152733020666f72203130302520726f79616c7469657360601b6064820152608401610891565b6001600160601b0316600160a01b026001600160a01b0390911617601155565b6006546001600160a01b031633146113f25760405162461bcd60e51b81526004016108919061282e565b610ed08282611b5c565b6001600160a01b0383166000908152600d602052604081205460ff168015801561142c575061142c858585610e11565b156114395750600f5460ff165b60ff81161580156114515750600854600160ff909116115b156114635750600f54610100900460ff165b6001600160a01b03851660009081526010602052604090205460ff1615611246576001600160a01b03851660009081526010602052604090205460ff908116908216106114d7576001600160a01b0385166000908152601060205260409020546114d09060ff1682612947565b9050611246565b506000949350505050565b6000818152600260205260409020546060906001600160a01b03166115615760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610891565b611569611dc6565b61157283611dd5565b600960405160200161158693929190612ae4565b6040516020818303038152906040529050919050565b60085460ff166115e75760405162461bcd60e51b815260206004820152601660248201527522a92927a91d1026b4b73a34b7339031b637b9b2b21760511b6044820152606401610891565b6115f2338383611217565b806116045750600854600160ff909116115b6116765760405162461bcd60e51b815260206004820152603a60248201527f4552524f523a20596f7520617265206e6f74206f6e207468652077686974656c60448201527f6973742e205761697420666f72207075626c69632073616c652e0000000000006064820152608401610891565b600b541561171b5761168a3383838661124e565b34101561171b5760405162461bcd60e51b815260206004820152605360248201527f4552524f523a204e6f7420656e6f7567682076616c75652073656e7420746f2060448201527f636f76657220636f73742e2063616c6c20636f73742066756e6374696f6e2074606482015272379030b9b9b2b9b9903a34329031b7b9ba399760691b608482015260a401610891565b610a7b3384611b5c565b6006546001600160a01b0316331461174f5760405162461bcd60e51b81526004016108919061282e565b6001600160a01b0381166117b45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610891565b610d0381611b0a565b60006001600160e01b031982166380ac58cd60e01b14806117ee57506001600160e01b03198216635b5e139f60e01b145b8061086157506301ffc9a760e01b6001600160e01b0319831614610861565b6000818152600260205260409020546001600160a01b0316610d035760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610891565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906118a182610ed4565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806118e683610ed4565b9050806001600160a01b0316846001600160a01b0316148061192d57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806112465750836001600160a01b031661194684610944565b6001600160a01b031614949350505050565b826001600160a01b031661196b82610ed4565b6001600160a01b0316146119cf5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610891565b6001600160a01b038216611a315760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610891565b611a3c60008261186c565b6001600160a01b0383166000908152600360205260408120805460019290611a659084906128e2565b90915550506001600160a01b0382166000908152600360205260408120805460019290611a93908490612b84565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600082611b018584611ed6565b14949350505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008161ffff1611611bb05760405162461bcd60e51b815260206004820152601e60248201527f4552524f523a204d696e7420616d6f756e74206d757374206265203e203000006044820152606401610891565b600c5460075461ffff91821691831690611bcc906001906128e2565b611bd69190612b84565b1115611c2f5760405162461bcd60e51b815260206004820152602260248201527f4552524f523a20436f6c6c656374696f6e2069732066756c6c79206d696e7465604482015261642160f01b6064820152608401610891565b60015b8161ffff168161ffff1611610a7b57611c4d83600754611f23565b60078054906000611c5d836128c9565b90915550506001600160a01b038316600090815260106020526040902054611c899060ff166001612b9c565b6001600160a01b0384166000908152601060205260409020805460ff191660ff9290921691909117905580611cbd81612bc1565b915050611c32565b816001600160a01b0316836001600160a01b031603611d265760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610891565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611d9e848484611958565b611daa84848484611f3d565b6113005760405162461bcd60e51b815260040161089190612be2565b6060600a80546108c190612863565b606081600003611dfc5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611e265780611e10816128c9565b9150611e1f9050600a8361299f565b9150611e00565b60008167ffffffffffffffff811115611e4157611e4161230c565b6040519080825280601f01601f191660200182016040528015611e6b576020820181803683370190505b5090505b841561124657611e806001836128e2565b9150611e8d600a86612c34565b611e98906030612b84565b60f81b818381518110611ead57611ead61289d565b60200101906001600160f81b031916908160001a905350611ecf600a8661299f565b9450611e6f565b600081815b8451811015611f1b57611f0782868381518110611efa57611efa61289d565b602002602001015161203b565b915080611f13816128c9565b915050611edb565b509392505050565b610ed082826040518060200160405280600081525061206d565b60006001600160a01b0384163b1561203357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611f81903390899088908890600401612c48565b6020604051808303816000875af1925050508015611fbc575060408051601f3d908101601f19168201909252611fb991810190612c7b565b60015b612019573d808015611fea576040519150601f19603f3d011682016040523d82523d6000602084013e611fef565b606091505b5080516000036120115760405162461bcd60e51b815260040161089190612be2565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611246565b506001611246565b6000818310612057576000828152602084905260409020612066565b60008381526020839052604090205b9392505050565b61207783836120a0565b6120846000848484611f3d565b610a7b5760405162461bcd60e51b815260040161089190612be2565b6001600160a01b0382166120f65760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610891565b6000818152600260205260409020546001600160a01b03161561215b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610891565b6001600160a01b0382166000908152600360205260408120805460019290612184908490612b84565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b031981168114610d0357600080fd5b60006020828403121561220a57600080fd5b8135612066816121e2565b803561ffff8116811461222757600080fd5b919050565b60006020828403121561223e57600080fd5b61206682612215565b60005b8381101561226257818101518382015260200161224a565b838111156113005750506000910152565b6000815180845261228b816020860160208601612247565b601f01601f19169290920160200192915050565b6020815260006120666020830184612273565b6000602082840312156122c457600080fd5b5035919050565b80356001600160a01b038116811461222757600080fd5b600080604083850312156122f557600080fd5b6122fe836122cb565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561234b5761234b61230c565b604052919050565b803560ff8116811461222757600080fd5b6000806040838503121561237757600080fd5b823567ffffffffffffffff8082111561238f57600080fd5b818501915085601f8301126123a357600080fd5b81356020828211156123b7576123b761230c565b8160051b92506123c8818401612322565b82815292840181019281810190898511156123e257600080fd5b948201945b84861015612407576123f8866122cb565b825294820194908201906123e7565b96506124169050878201612353565b9450505050509250929050565b60008060006060848603121561243857600080fd5b612441846122cb565b925061244f602085016122cb565b9150604084013590509250925092565b60006020828403121561247157600080fd5b612066826122cb565b6000806040838503121561248d57600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b818110156124d4578351835292840192918401916001016124b8565b50909695505050505050565b60008083601f8401126124f257600080fd5b50813567ffffffffffffffff81111561250a57600080fd5b6020830191508360208260051b8501011115610c6157600080fd5b60008060006040848603121561253a57600080fd5b612543846122cb565b9250602084013567ffffffffffffffff81111561255f57600080fd5b61256b868287016124e0565b9497909650939450505050565b600067ffffffffffffffff8311156125925761259261230c565b6125a5601f8401601f1916602001612322565b90508281528383830111156125b957600080fd5b828260208301376000602084830101529392505050565b6000602082840312156125e257600080fd5b813567ffffffffffffffff8111156125f957600080fd5b8201601f8101841361260a57600080fd5b61124684823560208401612578565b6000806040838503121561262c57600080fd5b61263583612353565b915061264360208401612353565b90509250929050565b60006020828403121561265e57600080fd5b61206682612353565b6000806000806060858703121561267d57600080fd5b612686856122cb565b9350602085013567ffffffffffffffff8111156126a257600080fd5b6126ae878288016124e0565b90945092506126c1905060408601612215565b905092959194509250565b600080604083850312156126df57600080fd5b6126e8836122cb565b9150602083013580151581146126fd57600080fd5b809150509250929050565b6000806000806080858703121561271e57600080fd5b612727856122cb565b9350612735602086016122cb565b925060408501359150606085013567ffffffffffffffff81111561275857600080fd5b8501601f8101871361276957600080fd5b61277887823560208401612578565b91505092959194509250565b6000806040838503121561279757600080fd5b6127a0836122cb565b915060208301356001600160601b03811681146126fd57600080fd5b600080604083850312156127cf57600080fd5b6127d8836122cb565b915061264360208401612215565b6000806000604084860312156127fb57600080fd5b61254384612215565b6000806040838503121561281757600080fd5b612820836122cb565b9150612643602084016122cb565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061287757607f821691505b60208210810361289757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016128db576128db6128b3565b5060010190565b6000828210156128f4576128f46128b3565b500390565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b600060ff821660ff841680821015612961576129616128b3565b90039392505050565b6000816000190483118215151615612984576129846128b3565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826129ae576129ae612989565b500490565b601f821115610a7b57600081815260208120601f850160051c810160208610156129da5750805b601f850160051c820191505b818110156129f9578281556001016129e6565b505050505050565b815167ffffffffffffffff811115612a1b57612a1b61230c565b612a2f81612a298454612863565b846129b3565b602080601f831160018114612a645760008415612a4c5750858301515b600019600386901b1c1916600185901b1785556129f9565b600085815260208120601f198616915b82811015612a9357888601518255948401946001909101908401612a74565b5085821015612ab15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600061ffff83811690831681811015612adc57612adc6128b3565b039392505050565b600084516020612af78285838a01612247565b855191840191612b0a8184848a01612247565b8554920191600090612b1b81612863565b60018281168015612b335760018114612b4857612b74565b60ff1984168752821515830287019450612b74565b896000528560002060005b84811015612b6c57815489820152908301908701612b53565b505082870194505b50929a9950505050505050505050565b60008219821115612b9757612b976128b3565b500190565b600060ff821660ff84168060ff03821115612bb957612bb96128b3565b019392505050565b600061ffff808316818103612bd857612bd86128b3565b6001019392505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600082612c4357612c43612989565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090610e9090830184612273565b600060208284031215612c8d57600080fd5b8151612066816121e256fea26469706673582212208d8f80e4efc4c84c61959ca0286f0c10eb795b171e40985b7adeec35a3837d0264736f6c634300080f0033

Deployed Bytecode Sourcemap

49077:8034:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53530:250;;;;;;;;;;-1:-1:-1;53530:250:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;53530:250:0;;;;;;;;55759:99;;;;;;;;;;-1:-1:-1;55759:99:0;;;;;:::i;:::-;;:::i;:::-;;33817:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;35330:171::-;;;;;;;;;;-1:-1:-1;35330:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2045:32:1;;;2027:51;;2015:2;2000:18;35330:171:0;1881:203:1;34847:417:0;;;;;;;;;;-1:-1:-1;34847:417:0;;;;;:::i;:::-;;:::i;55992:206::-;;;;;;;;;;-1:-1:-1;55992:206:0;;;;;:::i;:::-;;:::i;54214:92::-;;;;;;;;;;;;;:::i;:::-;;;4274:25:1;;;4262:2;4247:18;54214:92:0;4128:177:1;56339:146:0;;;;;;;;;;-1:-1:-1;56339:146:0;;;;;:::i;:::-;;:::i;36030:336::-;;;;;;;;;;-1:-1:-1;36030:336:0;;;;;:::i;:::-;;:::i;51388:394::-;;;;;;;;;;-1:-1:-1;51388:394:0;;;;;:::i;:::-;;:::i;:::-;;;5191:4:1;5179:17;;;5161:36;;5149:2;5134:18;51388:394:0;5019:184:1;53309:213:0;;;;;;;;;;-1:-1:-1;53309:213:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;5653:32:1;;;5635:51;;5717:2;5702:18;;5695:34;;;;5608:18;53309:213:0;5461:274:1;56953:155:0;;;:::i;36437:185::-;;;;;;;;;;-1:-1:-1;36437:185:0;;;;;:::i;:::-;;:::i;54318:414::-;;;;;;;;;;-1:-1:-1;54318:414:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;50397:302::-;;;;;;;;;;-1:-1:-1;50397:302:0;;;;;:::i;:::-;;:::i;54740:102::-;;;;;;;;;;-1:-1:-1;54740:102:0;;;;;:::i;:::-;;:::i;33528:222::-;;;;;;;;;;-1:-1:-1;33528:222:0;;;;;:::i;:::-;;:::i;55389:356::-;;;;;;;;;;-1:-1:-1;55389:356:0;;;;;:::i;:::-;;:::i;33259:207::-;;;;;;;;;;-1:-1:-1;33259:207:0;;;;;:::i;:::-;;:::i;13828:103::-;;;;;;;;;;;;;:::i;55884:94::-;;;;;;;;;;-1:-1:-1;55884:94:0;;;;;:::i;:::-;;:::i;56495:121::-;;;;;;;;;;;;;:::i;49178:25::-;;;;;;;;;;-1:-1:-1;49178:25:0;;;;;;;;51818:295;;;;;;;;;;;;;:::i;54854:122::-;;;;;;;;;;-1:-1:-1;54854:122:0;;;;;:::i;:::-;;:::i;54988:96::-;;;;;;;;;;-1:-1:-1;54988:96:0;;;;;:::i;:::-;;:::i;13177:87::-;;;;;;;;;;-1:-1:-1;13250:6:0;;-1:-1:-1;;;;;13250:6:0;13177:87;;33986:104;;;;;;;;;;;;;:::i;56624:194::-;;;;;;;;;;-1:-1:-1;56624:194:0;;;;;:::i;:::-;;:::i;50024:363::-;;;;;;;;;;-1:-1:-1;50024:363:0;;;;;:::i;:::-;;:::i;35573:155::-;;;;;;;;;;-1:-1:-1;35573:155:0;;;;;:::i;:::-;;:::i;56839:106::-;;;;;;;;;;;;;:::i;36693:323::-;;;;;;;;;;-1:-1:-1;36693:323:0;;;;;:::i;:::-;;:::i;49336:43::-;;;;;;;;;;;;;;;;55098:273;;;;;;;;;;-1:-1:-1;55098:273:0;;;;;:::i;:::-;;:::i;53184:111::-;;;;;;;;;;-1:-1:-1;53184:111:0;;;;;:::i;:::-;;:::i;50717:657::-;;;;;;;;;;-1:-1:-1;50717:657:0;;;;;:::i;:::-;;:::i;53915:284::-;;;;;;;;;;-1:-1:-1;53915:284:0;;;;;:::i;:::-;;:::i;49389:30::-;;;;;;;;;;-1:-1:-1;49389:30:0;;;;;;;;;;;11179:6:1;11167:19;;;11149:38;;11137:2;11122:18;49389:30:0;11005:188:1;56205:116:0;;;;;;;;;;-1:-1:-1;56205:116:0;;;;;:::i;:::-;-1:-1:-1;;;;;56293:20:0;56268:5;56293:20;;;:10;:20;;;;;;;;;56205:116;52151:569;;;;;;:::i;:::-;;:::i;35799:164::-;;;;;;;;;;-1:-1:-1;35799:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;35920:25:0;;;35896:4;35920:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;35799:164;14086:201;;;;;;;;;;-1:-1:-1;14086:201:0;;;;;:::i;:::-;;:::i;49509:104::-;;;;;;;;;;;;;;;;53530:250;53623:4;-1:-1:-1;;;;;;;;;53643:36:0;;;53640:79;;-1:-1:-1;53703:4:0;;53530:250;-1:-1:-1;53530:250:0:o;53640:79::-;53736:36;53760:11;53736:23;:36::i;:::-;53729:43;53530:250;-1:-1:-1;;53530:250:0:o;55759:99::-;13250:6;;-1:-1:-1;;;;;13250:6:0;11981:10;13397:23;13389:68;;;;-1:-1:-1;;;13389:68:0;;;;;;;:::i;:::-;;;;;;;;;55828:9:::1;:22:::0;;-1:-1:-1;;55828:22:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;55759:99::o;33817:100::-;33871:13;33904:5;33897:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33817:100;:::o;35330:171::-;35406:7;35426:23;35441:7;35426:14;:23::i;:::-;-1:-1:-1;35469:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;35469:24:0;;35330:171::o;34847:417::-;34928:13;34944:23;34959:7;34944:14;:23::i;:::-;34928:39;;34992:5;-1:-1:-1;;;;;34986:11:0;:2;-1:-1:-1;;;;;34986:11:0;;34978:57;;;;-1:-1:-1;;;34978:57:0;;12925:2:1;34978:57:0;;;12907:21:1;12964:2;12944:18;;;12937:30;13003:34;12983:18;;;12976:62;-1:-1:-1;;;13054:18:1;;;13047:31;13095:19;;34978:57:0;12723:397:1;34978:57:0;11981:10;-1:-1:-1;;;;;35070:21:0;;;;:62;;-1:-1:-1;35095:37:0;35112:5;11981:10;35799:164;:::i;35095:37::-;35048:174;;;;-1:-1:-1;;;35048:174:0;;13327:2:1;35048:174:0;;;13309:21:1;13366:2;13346:18;;;13339:30;13405:34;13385:18;;;13378:62;13476:32;13456:18;;;13449:60;13526:19;;35048:174:0;13125:426:1;35048:174:0;35235:21;35244:2;35248:7;35235:8;:21::i;:::-;34917:347;34847:417;;:::o;55992:206::-;13250:6;;-1:-1:-1;;;;;13250:6:0;11981:10;13397:23;13389:68;;;;-1:-1:-1;;;13389:68:0;;;;;;;:::i;:::-;56091:9:::1;56086:105;56110:8;:15;56106:1;:19;56086:105;;;56173:6;56147:10;:23;56158:8;56167:1;56158:11;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;56147:23:0::1;-1:-1:-1::0;;;;;56147:23:0::1;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;56127:3;;;;;:::i;:::-;;;;56086:105;;54214:92:::0;54258:7;54297:1;54285:11;;:13;;;;:::i;:::-;54278:20;;54214:92;:::o;56339:146::-;13250:6;;-1:-1:-1;;;;;13250:6:0;11981:10;13397:23;13389:68;;;;-1:-1:-1;;;13389:68:0;;;;;;;:::i;:::-;56433:20:::1;:44:::0;56339:146::o;36030:336::-;36225:41;11981:10;36258:7;36225:18;:41::i;:::-;36217:100;;;;-1:-1:-1;;;36217:100:0;;;;;;;:::i;:::-;36330:28;36340:4;36346:2;36350:7;36330:9;:28::i;51388:394::-;51491:15;;-1:-1:-1;;;;;51532:16:0;;51453:5;51532:16;;;:7;:16;;;;;;51453:5;;51491:15;;;;;;;;51532:16;:20;51529:218;;-1:-1:-1;;;;;51586:16:0;;;;;;:7;:16;;;;;;;;;;51572:30;;;;51569:167;;-1:-1:-1;;;;;51649:16:0;;;;;;:7;:16;;;;;;51636:29;;51649:16;;51636:10;:29;:::i;:::-;51623:42;;51569:167;;;-1:-1:-1;51719:1:0;51764:10;51388:394;-1:-1:-1;;51388:394:0:o;53309:213::-;53451:19;;53391:16;;;;-1:-1:-1;;;;;53451:19:0;;;53508:5;;53472:33;;-1:-1:-1;;;53485:20:0;;-1:-1:-1;;;;;53485:20:0;53472:10;:33;:::i;:::-;:41;;;;:::i;:::-;53443:71;;;;53309:213;;;;;;:::o;56953:155::-;13250:6;;-1:-1:-1;;;;;13250:6:0;11981:10;13397:23;13389:68;;;;-1:-1:-1;;;13389:68:0;;;;;;;:::i;:::-;57010:7:::1;57031;13250:6:::0;;-1:-1:-1;;;;;13250:6:0;;13177:87;57031:7:::1;-1:-1:-1::0;;;;;57023:21:0::1;57052;57023:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57009:69;;;57097:2;57089:11;;;::::0;::::1;;56998:110;56953:155::o:0;36437:185::-;36575:39;36592:4;36598:2;36602:7;36575:39;;;;;;;;;;;;:16;:39::i;54318:414::-;54378:16;54406:23;54432:17;54442:6;54432:9;:17::i;:::-;54406:43;;54460:25;54502:15;54488:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54488:30:0;-1:-1:-1;54460:58:0;-1:-1:-1;54529:15:0;54574:1;54559:140;54581:11;;54577:1;:15;54559:140;;;38588:4;38612:16;;;:7;:16;;;;;;-1:-1:-1;;;;;38612:16:0;:30;;54617:32;;;;;54643:6;-1:-1:-1;;;;;54631:18:0;:10;54639:1;54631:7;:10::i;:::-;-1:-1:-1;;;;;54631:18:0;;54617:32;54614:73;;;54686:1;54664:8;54673:9;;;;:::i;:::-;;;54664:19;;;;;;;;:::i;:::-;;;;;;:23;;;;;54614:73;54594:3;;;;:::i;:::-;;;;54559:140;;;-1:-1:-1;54716:8:0;;54318:414;-1:-1:-1;;;;54318:414:0:o;50397:302::-;50544:25;;-1:-1:-1;;15494:2:1;15490:15;;;15486:53;50544:25:0;;;15474:66:1;50492:4:0;;;;15556:12:1;;50544:25:0;;;;;;;;;;;;50534:36;;;;;;50519:51;;50581:17;50601:60;50620:12;;50601:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50634:20:0;;;-1:-1:-1;50656:4:0;;-1:-1:-1;50601:18:0;:60::i;:::-;50581:80;50397:302;-1:-1:-1;;;;;;50397:302:0:o;54740:102::-;13250:6;;-1:-1:-1;;;;;13250:6:0;11981:10;13397:23;13389:68;;;;-1:-1:-1;;;13389:68:0;;;;;;;:::i;:::-;54814:7:::1;:20;54824:10:::0;54814:7;:20:::1;:::i;:::-;;54740:102:::0;:::o;33528:222::-;33600:7;33636:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33636:16:0;;33663:56;;;;-1:-1:-1;;;33663:56:0;;17985:2:1;33663:56:0;;;17967:21:1;18024:2;18004:18;;;17997:30;-1:-1:-1;;;18043:18:1;;;18036:54;18107:18;;33663:56:0;17783:348:1;55389:356:0;13250:6;;-1:-1:-1;;;;;13250:6:0;11981:10;13397:23;13389:68;;;;-1:-1:-1;;;13389:68:0;;;;;;;:::i;:::-;55505:15:::1;::::0;:38:::1;::::0;;::::1;:15;::::0;;::::1;;:38;55502:107;;55560:15;:37:::0;;-1:-1:-1;;55560:37:0::1;;;::::0;::::1;;;::::0;;55502:107:::1;55622:18;::::0;:44:::1;::::0;;::::1;:18:::0;::::1;:44;55619:119;;55683:18;:43:::0;;::::1;::::0;::::1;-1:-1:-1::0;;55683:43:0;;::::1;;::::0;;55389:356;;:::o;33259:207::-;33331:7;-1:-1:-1;;;;;33359:19:0;;33351:73;;;;-1:-1:-1;;;33351:73:0;;18338:2:1;33351:73:0;;;18320:21:1;18377:2;18357:18;;;18350:30;18416:34;18396:18;;;18389:62;-1:-1:-1;;;18467:18:1;;;18460:39;18516:19;;33351:73:0;18136:405:1;33351:73:0;-1:-1:-1;;;;;;33442:16:0;;;;;:9;:16;;;;;;;33259:207::o;13828:103::-;13250:6;;-1:-1:-1;;;;;13250:6:0;11981:10;13397:23;13389:68;;;;-1:-1:-1;;;13389:68:0;;;;;;;:::i;:::-;13893:30:::1;13920:1;13893:18;:30::i;:::-;13828:103::o:0;55884:94::-;13250:6;;-1:-1:-1;;;;;13250:6:0;11981:10;13397:23;13389:68;;;;-1:-1:-1;;;13389:68:0;;;;;;;:::i;:::-;55950:8:::1;:20:::0;;-1:-1:-1;;55950:20:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;55884:94::o;56495:121::-;13250:6;;56561:7;;-1:-1:-1;;;;;13250:6:0;11981:10;13397:23;13389:68;;;;-1:-1:-1;;;13389:68:0;;;;;;;:::i;:::-;-1:-1:-1;56588:20:0::1;::::0;56495:121;:::o;51818:295::-;51866:8;;51877:1;51866:8;;;;:12;51858:48;;;;-1:-1:-1;;;51858:48:0;;18748:2:1;51858:48:0;;;18730:21:1;18787:2;18767:18;;;18760:30;18826:25;18806:18;;;18799:53;18869:18;;51858:48:0;18546:347:1;51858:48:0;51917:21;51941:29;51959:10;51941:17;:29::i;:::-;51917:53;;;-1:-1:-1;51989:18:0;51981:64;;;;-1:-1:-1;;;51981:64:0;;19100:2:1;51981:64:0;;;19082:21:1;19139:2;19119:18;;;19112:30;19178:34;19158:18;;;19151:62;-1:-1:-1;;;19229:18:1;;;19222:31;19270:19;;51981:64:0;18898:397:1;51981:64:0;52071:34;52078:10;52090:14;52071:6;:34::i;54854:122::-;13250:6;;-1:-1:-1;;;;;13250:6:0;11981:10;13397:23;13389:68;;;;-1:-1:-1;;;13389:68:0;;;;;;;:::i;:::-;54936:13:::1;:32;54952:16:::0;54936:13;:32:::1;:::i;54988:96::-:0;13250:6;;-1:-1:-1;;;;;13250:6:0;11981:10;13397:23;13389:68;;;;-1:-1:-1;;;13389:68:0;;;;;;;:::i;:::-;55056:8:::1;:20:::0;54988:96::o;33986:104::-;34042:13;34075:7;34068:14;;;;;:::i;56624:194::-;-1:-1:-1;;;;;56746:20:0;;56723:4;56746:20;;;:10;:20;;;;;;;;:22;;;:64;;;56772:38;56787:8;56797:12;;56772:14;:38::i;:::-;56739:71;56624:194;-1:-1:-1;;;;56624:194:0:o;50024:363::-;50122:7;50152:21;50183:36;50197:7;50206:12;;50183:13;:36::i;:::-;50176:44;;;-1:-1:-1;50246:22:0;;;;;50243:137;;50292:1;50285:8;;;;;50243:137;50346:21;50353:14;50346:4;:21;:::i;:::-;50334:34;;:8;;:34;;;;:::i;35573:155::-;35668:52;11981:10;35701:8;35711;35668:18;:52::i;56839:106::-;13250:6;;56889:7;;-1:-1:-1;;;;;13250:6:0;11981:10;13397:23;13389:68;;;;-1:-1:-1;;;13389:68:0;;;;;;;:::i;:::-;-1:-1:-1;56916:21:0::1;56839:106:::0;:::o;36693:323::-;36867:41;11981:10;36900:7;36867:18;:41::i;:::-;36859:100;;;;-1:-1:-1;;;36859:100:0;;;;;;;:::i;:::-;36970:38;36984:4;36990:2;36994:7;37003:4;36970:13;:38::i;:::-;36693:323;;;;:::o;55098:273::-;13250:6;;-1:-1:-1;;;;;13250:6:0;11981:10;13397:23;13389:68;;;;-1:-1:-1;;;13389:68:0;;;;;;;:::i;:::-;55209:5:::1;55196:11;-1:-1:-1::0;;;;;55196:18:0::1;;;55188:83;;;::::0;-1:-1:-1;;;55188:83:0;;19724:2:1;55188:83:0::1;::::0;::::1;19706:21:1::0;19763:2;19743:18;;;19736:30;19802:34;19782:18;;;19775:62;-1:-1:-1;;;19853:18:1;;;19846:50;19913:19;;55188:83:0::1;19522:416:1::0;55188:83:0::1;-1:-1:-1::0;;;;;55329:34:0::1;-1:-1:-1::0;;;55329:34:0::1;-1:-1:-1::0;;;;;55284:32:0;;::::1;55329:34;55284:19;55329:34:::0;55098:273::o;53184:111::-;13250:6;;-1:-1:-1;;;;;13250:6:0;11981:10;13397:23;13389:68;;;;-1:-1:-1;;;13389:68:0;;;;;;;:::i;:::-;53265:22:::1;53272:2;53276:10;53265:6;:22::i;50717:657::-:0;-1:-1:-1;;;;;50849:19:0;;50811:5;50849:19;;;:10;:19;;;;;;;;50882:15;;:56;;;;;50901:37;50916:7;50925:12;;50901:14;:37::i;:::-;50879:120;;;-1:-1:-1;50969:18:0;;;;50879:120;51012:15;;;;:29;;;;-1:-1:-1;51031:8:0;;51040:1;51031:8;;;;:10;51012:29;51009:90;;;-1:-1:-1;51072:15:0;;;;;;;51009:90;-1:-1:-1;;;;;51124:16:0;;51143:1;51124:16;;;:7;:16;;;;;;;;:20;51121:218;;-1:-1:-1;;;;;51178:16:0;;;;;;:7;:16;;;;;;;;;;51164:30;;;;51161:167;;-1:-1:-1;;;;;51241:16:0;;;;;;:7;:16;;;;;;51228:29;;51241:16;;51228:10;:29;:::i;:::-;51215:42;;51161:167;;;-1:-1:-1;51311:1:0;51356:10;50717:657;-1:-1:-1;;;;50717:657:0:o;53915:284::-;38588:4;38612:16;;;:7;:16;;;;;;53989:13;;-1:-1:-1;;;;;38612:16:0;54015:77;;;;-1:-1:-1;;;54015:77:0;;20145:2:1;54015:77:0;;;20127:21:1;20184:2;20164:18;;;20157:30;20223:34;20203:18;;;20196:62;-1:-1:-1;;;20274:18:1;;;20267:45;20329:19;;54015:77:0;19943:411:1;54015:77:0;54134:10;:8;:10::i;:::-;54146:26;54163:8;54146:16;:26::i;:::-;54174:13;54117:71;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54103:86;;53915:284;;;:::o;52151:569::-;52253:8;;;;52245:47;;;;-1:-1:-1;;;52245:47:0;;21796:2:1;52245:47:0;;;21778:21:1;21835:2;21815:18;;;21808:30;-1:-1:-1;;;21854:18:1;;;21847:52;21916:18;;52245:47:0;21594:346:1;52245:47:0;52311:43;52329:10;52341:12;;52311:17;:43::i;:::-;:59;;;-1:-1:-1;52358:8:0;;52369:1;52358:8;;;;:12;52311:59;52303:130;;;;-1:-1:-1;;;52303:130:0;;22147:2:1;52303:130:0;;;22129:21:1;22186:2;22166:18;;;22159:30;22225:34;22205:18;;;22198:62;22296:28;22276:18;;;22269:56;22342:19;;52303:130:0;21945:422:1;52303:130:0;52480:8;;:12;52476:195;;52528:43;52533:10;52545:12;;52559:11;52528:4;:43::i;:::-;52515:9;:56;;52507:152;;;;-1:-1:-1;;;52507:152:0;;22574:2:1;52507:152:0;;;22556:21:1;22613:2;22593:18;;;22586:30;22652:34;22632:18;;;22625:62;22723:34;22703:18;;;22696:62;-1:-1:-1;;;22774:19:1;;;22767:50;22834:19;;52507:152:0;22372:487:1;52507:152:0;52681:31;52688:10;52700:11;52681:6;:31::i;14086:201::-;13250:6;;-1:-1:-1;;;;;13250:6:0;11981:10;13397:23;13389:68;;;;-1:-1:-1;;;13389:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14175:22:0;::::1;14167:73;;;::::0;-1:-1:-1;;;14167:73:0;;23066:2:1;14167:73:0::1;::::0;::::1;23048:21:1::0;23105:2;23085:18;;;23078:30;23144:34;23124:18;;;23117:62;-1:-1:-1;;;23195:18:1;;;23188:36;23241:19;;14167:73:0::1;22864:402:1::0;14167:73:0::1;14251:28;14270:8;14251:18;:28::i;32890:305::-:0;32992:4;-1:-1:-1;;;;;;33029:40:0;;-1:-1:-1;;;33029:40:0;;:105;;-1:-1:-1;;;;;;;33086:48:0;;-1:-1:-1;;;33086:48:0;33029:105;:158;;;-1:-1:-1;;;;;;;;;;25741:40:0;;;33151:36;25632:157;43305:135;38588:4;38612:16;;;:7;:16;;;;;;-1:-1:-1;;;;;38612:16:0;43379:53;;;;-1:-1:-1;;;43379:53:0;;17985:2:1;43379:53:0;;;17967:21:1;18024:2;18004:18;;;17997:30;-1:-1:-1;;;18043:18:1;;;18036:54;18107:18;;43379:53:0;17783:348:1;42584:174:0;42659:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;42659:29:0;-1:-1:-1;;;;;42659:29:0;;;;;;;;:24;;42713:23;42659:24;42713:14;:23::i;:::-;-1:-1:-1;;;;;42704:46:0;;;;;;;;;;;42584:174;;:::o;38817:264::-;38910:4;38927:13;38943:23;38958:7;38943:14;:23::i;:::-;38927:39;;38996:5;-1:-1:-1;;;;;38985:16:0;:7;-1:-1:-1;;;;;38985:16:0;;:52;;;-1:-1:-1;;;;;;35920:25:0;;;35896:4;35920:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;39005:32;38985:87;;;;39065:7;-1:-1:-1;;;;;39041:31:0;:20;39053:7;39041:11;:20::i;:::-;-1:-1:-1;;;;;39041:31:0;;38977:96;38817:264;-1:-1:-1;;;;38817:264:0:o;41840:625::-;41999:4;-1:-1:-1;;;;;41972:31:0;:23;41987:7;41972:14;:23::i;:::-;-1:-1:-1;;;;;41972:31:0;;41964:81;;;;-1:-1:-1;;;41964:81:0;;23473:2:1;41964:81:0;;;23455:21:1;23512:2;23492:18;;;23485:30;23551:34;23531:18;;;23524:62;-1:-1:-1;;;23602:18:1;;;23595:35;23647:19;;41964:81:0;23271:401:1;41964:81:0;-1:-1:-1;;;;;42064:16:0;;42056:65;;;;-1:-1:-1;;;42056:65:0;;23879:2:1;42056:65:0;;;23861:21:1;23918:2;23898:18;;;23891:30;23957:34;23937:18;;;23930:62;-1:-1:-1;;;24008:18:1;;;24001:34;24052:19;;42056:65:0;23677:400:1;42056:65:0;42238:29;42255:1;42259:7;42238:8;:29::i;:::-;-1:-1:-1;;;;;42280:15:0;;;;;;:9;:15;;;;;:20;;42299:1;;42280:15;:20;;42299:1;;42280:20;:::i;:::-;;;;-1:-1:-1;;;;;;;42311:13:0;;;;;;:9;:13;;;;;:18;;42328:1;;42311:13;:18;;42328:1;;42311:18;:::i;:::-;;;;-1:-1:-1;;42340:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;42340:21:0;-1:-1:-1;;;;;42340:21:0;;;;;;;;;42379:27;;42340:16;;42379:27;;;;;;;34917:347;34847:417;;:::o;1219:190::-;1344:4;1397;1368:25;1381:5;1388:4;1368:12;:25::i;:::-;:33;;1219:190;-1:-1:-1;;;;1219:190:0:o;14447:191::-;14540:6;;;-1:-1:-1;;;;;14557:17:0;;;-1:-1:-1;;;;;;14557:17:0;;;;;;;14590:40;;14540:6;;;14557:17;14540:6;;14590:40;;14521:16;;14590:40;14510:128;14447:191;:::o;52734:428::-;52824:1;52810:11;:15;;;52802:58;;;;-1:-1:-1;;;52802:58:0;;24417:2:1;52802:58:0;;;24399:21:1;24456:2;24436:18;;;24429:30;24495:32;24475:18;;;24468:60;24545:18;;52802:58:0;24215:354:1;52802:58:0;52910:9;;52879:11;;52910:9;;;;;52879:27;;;:13;;52910:9;;52879:13;:::i;:::-;:27;;;;:::i;:::-;:40;;52871:87;;;;-1:-1:-1;;;52871:87:0;;24776:2:1;52871:87:0;;;24758:21:1;24815:2;24795:18;;;24788:30;24854:34;24834:18;;;24827:62;-1:-1:-1;;;24905:18:1;;;24898:32;24947:19;;52871:87:0;24574:398:1;52871:87:0;52991:1;52975:180;52999:11;52994:16;;:1;:16;;;52975:180;;53032:26;53042:2;53046:11;;53032:9;:26::i;:::-;53073:11;:13;;;:11;:13;;;:::i;:::-;;;;-1:-1:-1;;;;;;;53130:11:0;;;;;;:7;:11;;;;;;:13;;:11;;;:13;:::i;:::-;-1:-1:-1;;;;;53116:11:0;;;;;;:7;:11;;;;;:27;;-1:-1:-1;;53116:27:0;;;;;;;;;;;;53012:3;;;;:::i;:::-;;;;52975:180;;42901:315;43056:8;-1:-1:-1;;;;;43047:17:0;:5;-1:-1:-1;;;;;43047:17:0;;43039:55;;;;-1:-1:-1;;;43039:55:0;;25590:2:1;43039:55:0;;;25572:21:1;25629:2;25609:18;;;25602:30;25668:27;25648:18;;;25641:55;25713:18;;43039:55:0;25388:349:1;43039:55:0;-1:-1:-1;;;;;43105:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;43105:46:0;;;;;;;;;;43167:41;;540::1;;;43167::0;;513:18:1;43167:41:0;;;;;;;42901:315;;;:::o;37897:313::-;38053:28;38063:4;38069:2;38073:7;38053:9;:28::i;:::-;38100:47;38123:4;38129:2;38133:7;38142:4;38100:22;:47::i;:::-;38092:110;;;;-1:-1:-1;;;38092:110:0;;;;;;;:::i;53790:108::-;53850:13;53883:7;53876:14;;;;;:::i;9155:723::-;9211:13;9432:5;9441:1;9432:10;9428:53;;-1:-1:-1;;9459:10:0;;;;;;;;;;;;-1:-1:-1;;;9459:10:0;;;;;9155:723::o;9428:53::-;9506:5;9491:12;9547:78;9554:9;;9547:78;;9580:8;;;;:::i;:::-;;-1:-1:-1;9603:10:0;;-1:-1:-1;9611:2:0;9603:10;;:::i;:::-;;;9547:78;;;9635:19;9667:6;9657:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9657:17:0;;9635:39;;9685:154;9692:10;;9685:154;;9719:11;9729:1;9719:11;;:::i;:::-;;-1:-1:-1;9788:10:0;9796:2;9788:5;:10;:::i;:::-;9775:24;;:2;:24;:::i;:::-;9762:39;;9745:6;9752;9745:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;9745:56:0;;;;;;;;-1:-1:-1;9816:11:0;9825:2;9816:11;;:::i;:::-;;;9685:154;;2086:296;2169:7;2212:4;2169:7;2227:118;2251:5;:12;2247:1;:16;2227:118;;;2300:33;2310:12;2324:5;2330:1;2324:8;;;;;;;;:::i;:::-;;;;;;;2300:9;:33::i;:::-;2285:48;-1:-1:-1;2265:3:0;;;;:::i;:::-;;;;2227:118;;;-1:-1:-1;2362:12:0;2086:296;-1:-1:-1;;;2086:296:0:o;39423:110::-;39499:26;39509:2;39513:7;39499:26;;;;;;;;;;;;:9;:26::i;44004:853::-;44158:4;-1:-1:-1;;;;;44179:13:0;;15788:20;15836:8;44175:675;;44215:71;;-1:-1:-1;;;44215:71:0;;-1:-1:-1;;;;;44215:36:0;;;;;:71;;11981:10;;44266:4;;44272:7;;44281:4;;44215:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44215:71:0;;;;;;;;-1:-1:-1;;44215:71:0;;;;;;;;;;;;:::i;:::-;;;44211:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44456:6;:13;44473:1;44456:18;44452:328;;44499:60;;-1:-1:-1;;;44499:60:0;;;;;;;:::i;44452:328::-;44730:6;44724:13;44715:6;44711:2;44707:15;44700:38;44211:584;-1:-1:-1;;;;;;44337:51:0;-1:-1:-1;;;44337:51:0;;-1:-1:-1;44330:58:0;;44175:675;-1:-1:-1;44834:4:0;44827:11;;8293:149;8356:7;8387:1;8383;:5;:51;;8518:13;8612:15;;;8648:4;8641:15;;;8695:4;8679:21;;8383:51;;;8518:13;8612:15;;;8648:4;8641:15;;;8695:4;8679:21;;8391:20;8376:58;8293:149;-1:-1:-1;;;8293:149:0:o;39760:319::-;39889:18;39895:2;39899:7;39889:5;:18::i;:::-;39940:53;39971:1;39975:2;39979:7;39988:4;39940:22;:53::i;:::-;39918:153;;;;-1:-1:-1;;;39918:153:0;;;;;;;:::i;40415:439::-;-1:-1:-1;;;;;40495:16:0;;40487:61;;;;-1:-1:-1;;;40487:61:0;;27228:2:1;40487:61:0;;;27210:21:1;;;27247:18;;;27240:30;27306:34;27286:18;;;27279:62;27358:18;;40487:61:0;27026:356:1;40487:61:0;38588:4;38612:16;;;:7;:16;;;;;;-1:-1:-1;;;;;38612:16:0;:30;40559:58;;;;-1:-1:-1;;;40559:58:0;;27589:2:1;40559:58:0;;;27571:21:1;27628:2;27608:18;;;27601:30;27667;27647:18;;;27640:58;27715:18;;40559:58:0;27387:352:1;40559:58:0;-1:-1:-1;;;;;40688:13:0;;;;;;:9;:13;;;;;:18;;40705:1;;40688:13;:18;;40705:1;;40688:18;:::i;:::-;;;;-1:-1:-1;;40717:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;40717:21:0;-1:-1:-1;;;;;40717:21:0;;;;;;;;40756:33;;40717:16;;;40756:33;;40717:16;;40756:33;54814:20:::1;54740:102:::0;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:159::-;659:20;;719:6;708:18;;698:29;;688:57;;741:1;738;731:12;688:57;592:159;;;:::o;756:184::-;814:6;867:2;855:9;846:7;842:23;838:32;835:52;;;883:1;880;873:12;835:52;906:28;924:9;906:28;:::i;945:258::-;1017:1;1027:113;1041:6;1038:1;1035:13;1027:113;;;1117:11;;;1111:18;1098:11;;;1091:39;1063:2;1056:10;1027:113;;;1158:6;1155:1;1152:13;1149:48;;;-1:-1:-1;;1193:1:1;1175:16;;1168:27;945:258::o;1208:::-;1250:3;1288:5;1282:12;1315:6;1310:3;1303:19;1331:63;1387:6;1380:4;1375:3;1371:14;1364:4;1357:5;1353:16;1331:63;:::i;:::-;1448:2;1427:15;-1:-1:-1;;1423:29:1;1414:39;;;;1455:4;1410:50;;1208:258;-1:-1:-1;;1208:258:1:o;1471:220::-;1620:2;1609:9;1602:21;1583:4;1640:45;1681:2;1670:9;1666:18;1658:6;1640:45;:::i;1696:180::-;1755:6;1808:2;1796:9;1787:7;1783:23;1779:32;1776:52;;;1824:1;1821;1814:12;1776:52;-1:-1:-1;1847:23:1;;1696:180;-1:-1:-1;1696:180:1:o;2089:173::-;2157:20;;-1:-1:-1;;;;;2206:31:1;;2196:42;;2186:70;;2252:1;2249;2242:12;2267:254;2335:6;2343;2396:2;2384:9;2375:7;2371:23;2367:32;2364:52;;;2412:1;2409;2402:12;2364:52;2435:29;2454:9;2435:29;:::i;:::-;2425:39;2511:2;2496:18;;;;2483:32;;-1:-1:-1;;;2267:254:1:o;2526:127::-;2587:10;2582:3;2578:20;2575:1;2568:31;2618:4;2615:1;2608:15;2642:4;2639:1;2632:15;2658:275;2729:2;2723:9;2794:2;2775:13;;-1:-1:-1;;2771:27:1;2759:40;;2829:18;2814:34;;2850:22;;;2811:62;2808:88;;;2876:18;;:::i;:::-;2912:2;2905:22;2658:275;;-1:-1:-1;2658:275:1:o;2938:156::-;3004:20;;3064:4;3053:16;;3043:27;;3033:55;;3084:1;3081;3074:12;3099:1024;3190:6;3198;3251:2;3239:9;3230:7;3226:23;3222:32;3219:52;;;3267:1;3264;3257:12;3219:52;3307:9;3294:23;3336:18;3377:2;3369:6;3366:14;3363:34;;;3393:1;3390;3383:12;3363:34;3431:6;3420:9;3416:22;3406:32;;3476:7;3469:4;3465:2;3461:13;3457:27;3447:55;;3498:1;3495;3488:12;3447:55;3534:2;3521:16;3556:4;3579:2;3575;3572:10;3569:36;;;3585:18;;:::i;:::-;3631:2;3628:1;3624:10;3614:20;;3654:28;3678:2;3674;3670:11;3654:28;:::i;:::-;3716:15;;;3786:11;;;3782:20;;;3747:12;;;;3814:19;;;3811:39;;;3846:1;3843;3836:12;3811:39;3870:11;;;;3890:148;3906:6;3901:3;3898:15;3890:148;;;3972:23;3991:3;3972:23;:::i;:::-;3960:36;;3923:12;;;;4016;;;;3890:148;;;4057:5;-1:-1:-1;4081:36:1;;-1:-1:-1;4098:18:1;;;4081:36;:::i;:::-;4071:46;;;;;;3099:1024;;;;;:::o;4495:328::-;4572:6;4580;4588;4641:2;4629:9;4620:7;4616:23;4612:32;4609:52;;;4657:1;4654;4647:12;4609:52;4680:29;4699:9;4680:29;:::i;:::-;4670:39;;4728:38;4762:2;4751:9;4747:18;4728:38;:::i;:::-;4718:48;;4813:2;4802:9;4798:18;4785:32;4775:42;;4495:328;;;;;:::o;4828:186::-;4887:6;4940:2;4928:9;4919:7;4915:23;4911:32;4908:52;;;4956:1;4953;4946:12;4908:52;4979:29;4998:9;4979:29;:::i;5208:248::-;5276:6;5284;5337:2;5325:9;5316:7;5312:23;5308:32;5305:52;;;5353:1;5350;5343:12;5305:52;-1:-1:-1;;5376:23:1;;;5446:2;5431:18;;;5418:32;;-1:-1:-1;5208:248:1:o;5740:632::-;5911:2;5963:21;;;6033:13;;5936:18;;;6055:22;;;5882:4;;5911:2;6134:15;;;;6108:2;6093:18;;;5882:4;6177:169;6191:6;6188:1;6185:13;6177:169;;;6252:13;;6240:26;;6321:15;;;;6286:12;;;;6213:1;6206:9;6177:169;;;-1:-1:-1;6363:3:1;;5740:632;-1:-1:-1;;;;;;5740:632:1:o;6377:367::-;6440:8;6450:6;6504:3;6497:4;6489:6;6485:17;6481:27;6471:55;;6522:1;6519;6512:12;6471:55;-1:-1:-1;6545:20:1;;6588:18;6577:30;;6574:50;;;6620:1;6617;6610:12;6574:50;6657:4;6649:6;6645:17;6633:29;;6717:3;6710:4;6700:6;6697:1;6693:14;6685:6;6681:27;6677:38;6674:47;6671:67;;;6734:1;6731;6724:12;6749:511;6844:6;6852;6860;6913:2;6901:9;6892:7;6888:23;6884:32;6881:52;;;6929:1;6926;6919:12;6881:52;6952:29;6971:9;6952:29;:::i;:::-;6942:39;;7032:2;7021:9;7017:18;7004:32;7059:18;7051:6;7048:30;7045:50;;;7091:1;7088;7081:12;7045:50;7130:70;7192:7;7183:6;7172:9;7168:22;7130:70;:::i;:::-;6749:511;;7219:8;;-1:-1:-1;7104:96:1;;-1:-1:-1;;;;6749:511:1:o;7265:407::-;7330:5;7364:18;7356:6;7353:30;7350:56;;;7386:18;;:::i;:::-;7424:57;7469:2;7448:15;;-1:-1:-1;;7444:29:1;7475:4;7440:40;7424:57;:::i;:::-;7415:66;;7504:6;7497:5;7490:21;7544:3;7535:6;7530:3;7526:16;7523:25;7520:45;;;7561:1;7558;7551:12;7520:45;7610:6;7605:3;7598:4;7591:5;7587:16;7574:43;7664:1;7657:4;7648:6;7641:5;7637:18;7633:29;7626:40;7265:407;;;;;:::o;7677:451::-;7746:6;7799:2;7787:9;7778:7;7774:23;7770:32;7767:52;;;7815:1;7812;7805:12;7767:52;7855:9;7842:23;7888:18;7880:6;7877:30;7874:50;;;7920:1;7917;7910:12;7874:50;7943:22;;7996:4;7988:13;;7984:27;-1:-1:-1;7974:55:1;;8025:1;8022;8015:12;7974:55;8048:74;8114:7;8109:2;8096:16;8091:2;8087;8083:11;8048:74;:::i;8133:252::-;8197:6;8205;8258:2;8246:9;8237:7;8233:23;8229:32;8226:52;;;8274:1;8271;8264:12;8226:52;8297:27;8314:9;8297:27;:::i;:::-;8287:37;;8343:36;8375:2;8364:9;8360:18;8343:36;:::i;:::-;8333:46;;8133:252;;;;;:::o;8390:182::-;8447:6;8500:2;8488:9;8479:7;8475:23;8471:32;8468:52;;;8516:1;8513;8506:12;8468:52;8539:27;8556:9;8539:27;:::i;8759:583::-;8862:6;8870;8878;8886;8939:2;8927:9;8918:7;8914:23;8910:32;8907:52;;;8955:1;8952;8945:12;8907:52;8978:29;8997:9;8978:29;:::i;:::-;8968:39;;9058:2;9047:9;9043:18;9030:32;9085:18;9077:6;9074:30;9071:50;;;9117:1;9114;9107:12;9071:50;9156:70;9218:7;9209:6;9198:9;9194:22;9156:70;:::i;:::-;9245:8;;-1:-1:-1;9130:96:1;-1:-1:-1;9299:37:1;;-1:-1:-1;9332:2:1;9317:18;;9299:37;:::i;:::-;9289:47;;8759:583;;;;;;;:::o;9347:347::-;9412:6;9420;9473:2;9461:9;9452:7;9448:23;9444:32;9441:52;;;9489:1;9486;9479:12;9441:52;9512:29;9531:9;9512:29;:::i;:::-;9502:39;;9591:2;9580:9;9576:18;9563:32;9638:5;9631:13;9624:21;9617:5;9614:32;9604:60;;9660:1;9657;9650:12;9604:60;9683:5;9673:15;;;9347:347;;;;;:::o;9699:667::-;9794:6;9802;9810;9818;9871:3;9859:9;9850:7;9846:23;9842:33;9839:53;;;9888:1;9885;9878:12;9839:53;9911:29;9930:9;9911:29;:::i;:::-;9901:39;;9959:38;9993:2;9982:9;9978:18;9959:38;:::i;:::-;9949:48;;10044:2;10033:9;10029:18;10016:32;10006:42;;10099:2;10088:9;10084:18;10071:32;10126:18;10118:6;10115:30;10112:50;;;10158:1;10155;10148:12;10112:50;10181:22;;10234:4;10226:13;;10222:27;-1:-1:-1;10212:55:1;;10263:1;10260;10253:12;10212:55;10286:74;10352:7;10347:2;10334:16;10329:2;10325;10321:11;10286:74;:::i;:::-;10276:84;;;9699:667;;;;;;;:::o;10371:366::-;10438:6;10446;10499:2;10487:9;10478:7;10474:23;10470:32;10467:52;;;10515:1;10512;10505:12;10467:52;10538:29;10557:9;10538:29;:::i;:::-;10528:39;;10617:2;10606:9;10602:18;10589:32;-1:-1:-1;;;;;10654:5:1;10650:38;10643:5;10640:49;10630:77;;10703:1;10700;10693:12;10742:258;10809:6;10817;10870:2;10858:9;10849:7;10845:23;10841:32;10838:52;;;10886:1;10883;10876:12;10838:52;10909:29;10928:9;10909:29;:::i;:::-;10899:39;;10957:37;10990:2;10979:9;10975:18;10957:37;:::i;11198:509::-;11292:6;11300;11308;11361:2;11349:9;11340:7;11336:23;11332:32;11329:52;;;11377:1;11374;11367:12;11329:52;11400:28;11418:9;11400:28;:::i;11712:260::-;11780:6;11788;11841:2;11829:9;11820:7;11816:23;11812:32;11809:52;;;11857:1;11854;11847:12;11809:52;11880:29;11899:9;11880:29;:::i;:::-;11870:39;;11928:38;11962:2;11951:9;11947:18;11928:38;:::i;11977:356::-;12179:2;12161:21;;;12198:18;;;12191:30;12257:34;12252:2;12237:18;;12230:62;12324:2;12309:18;;11977:356::o;12338:380::-;12417:1;12413:12;;;;12460;;;12481:61;;12535:4;12527:6;12523:17;12513:27;;12481:61;12588:2;12580:6;12577:14;12557:18;12554:38;12551:161;;12634:10;12629:3;12625:20;12622:1;12615:31;12669:4;12666:1;12659:15;12697:4;12694:1;12687:15;12551:161;;12338:380;;;:::o;13556:127::-;13617:10;13612:3;13608:20;13605:1;13598:31;13648:4;13645:1;13638:15;13672:4;13669:1;13662:15;13688:127;13749:10;13744:3;13740:20;13737:1;13730:31;13780:4;13777:1;13770:15;13804:4;13801:1;13794:15;13820:135;13859:3;13880:17;;;13877:43;;13900:18;;:::i;:::-;-1:-1:-1;13947:1:1;13936:13;;13820:135::o;13960:125::-;14000:4;14028:1;14025;14022:8;14019:34;;;14033:18;;:::i;:::-;-1:-1:-1;14070:9:1;;13960:125::o;14090:410::-;14292:2;14274:21;;;14331:2;14311:18;;;14304:30;14370:34;14365:2;14350:18;;14343:62;-1:-1:-1;;;14436:2:1;14421:18;;14414:44;14490:3;14475:19;;14090:410::o;14505:195::-;14543:4;14580;14577:1;14573:12;14612:4;14609:1;14605:12;14637:3;14632;14629:12;14626:38;;;14644:18;;:::i;:::-;14681:13;;;14505:195;-1:-1:-1;;;14505:195:1:o;14705:168::-;14745:7;14811:1;14807;14803:6;14799:14;14796:1;14793:21;14788:1;14781:9;14774:17;14770:45;14767:71;;;14818:18;;:::i;:::-;-1:-1:-1;14858:9:1;;14705:168::o;14878:127::-;14939:10;14934:3;14930:20;14927:1;14920:31;14970:4;14967:1;14960:15;14994:4;14991:1;14984:15;15010:120;15050:1;15076;15066:35;;15081:18;;:::i;:::-;-1:-1:-1;15115:9:1;;15010:120::o;15705:545::-;15807:2;15802:3;15799:11;15796:448;;;15843:1;15868:5;15864:2;15857:17;15913:4;15909:2;15899:19;15983:2;15971:10;15967:19;15964:1;15960:27;15954:4;15950:38;16019:4;16007:10;16004:20;16001:47;;;-1:-1:-1;16042:4:1;16001:47;16097:2;16092:3;16088:12;16085:1;16081:20;16075:4;16071:31;16061:41;;16152:82;16170:2;16163:5;16160:13;16152:82;;;16215:17;;;16196:1;16185:13;16152:82;;;16156:3;;;15705:545;;;:::o;16426:1352::-;16552:3;16546:10;16579:18;16571:6;16568:30;16565:56;;;16601:18;;:::i;:::-;16630:97;16720:6;16680:38;16712:4;16706:11;16680:38;:::i;:::-;16674:4;16630:97;:::i;:::-;16782:4;;16846:2;16835:14;;16863:1;16858:663;;;;17565:1;17582:6;17579:89;;;-1:-1:-1;17634:19:1;;;17628:26;17579:89;-1:-1:-1;;16383:1:1;16379:11;;;16375:24;16371:29;16361:40;16407:1;16403:11;;;16358:57;17681:81;;16828:944;;16858:663;15652:1;15645:14;;;15689:4;15676:18;;-1:-1:-1;;16894:20:1;;;17012:236;17026:7;17023:1;17020:14;17012:236;;;17115:19;;;17109:26;17094:42;;17207:27;;;;17175:1;17163:14;;;;17042:19;;17012:236;;;17016:3;17276:6;17267:7;17264:19;17261:201;;;17337:19;;;17331:26;-1:-1:-1;;17420:1:1;17416:14;;;17432:3;17412:24;17408:37;17404:42;17389:58;17374:74;;17261:201;-1:-1:-1;;;;;17508:1:1;17492:14;;;17488:22;17475:36;;-1:-1:-1;16426:1352:1:o;19300:217::-;19339:4;19368:6;19424:10;;;;19394;;19446:12;;;19443:38;;;19461:18;;:::i;:::-;19498:13;;19300:217;-1:-1:-1;;;19300:217:1:o;20359:1230::-;20583:3;20621:6;20615:13;20647:4;20660:51;20704:6;20699:3;20694:2;20686:6;20682:15;20660:51;:::i;:::-;20774:13;;20733:16;;;;20796:55;20774:13;20733:16;20818:15;;;20796:55;:::i;:::-;20940:13;;20873:20;;;20913:1;;20978:36;20940:13;20978:36;:::i;:::-;21033:1;21050:18;;;21077:141;;;;21232:1;21227:337;;;;21043:521;;21077:141;-1:-1:-1;;21112:24:1;;21098:39;;21189:16;;21182:24;21168:39;;21157:51;;;-1:-1:-1;21077:141:1;;21227:337;21258:6;21255:1;21248:17;21306:2;21303:1;21293:16;21331:1;21345:169;21359:8;21356:1;21353:15;21345:169;;;21441:14;;21426:13;;;21419:37;21484:16;;;;21376:10;;21345:169;;;21349:3;;21545:8;21538:5;21534:20;21527:27;;21043:521;-1:-1:-1;21580:3:1;;20359:1230;-1:-1:-1;;;;;;;;;;20359:1230:1:o;24082:128::-;24122:3;24153:1;24149:6;24146:1;24143:13;24140:39;;;24159:18;;:::i;:::-;-1:-1:-1;24195:9:1;;24082:128::o;24977:204::-;25015:3;25051:4;25048:1;25044:12;25083:4;25080:1;25076:12;25118:3;25112:4;25108:14;25103:3;25100:23;25097:49;;;25126:18;;:::i;:::-;25162:13;;24977:204;-1:-1:-1;;;24977:204:1:o;25186:197::-;25224:3;25252:6;25293:2;25286:5;25282:14;25320:2;25311:7;25308:15;25305:41;;25326:18;;:::i;:::-;25375:1;25362:15;;25186:197;-1:-1:-1;;;25186:197:1:o;25742:414::-;25944:2;25926:21;;;25983:2;25963:18;;;25956:30;26022:34;26017:2;26002:18;;25995:62;-1:-1:-1;;;26088:2:1;26073:18;;26066:48;26146:3;26131:19;;25742:414::o;26161:112::-;26193:1;26219;26209:35;;26224:18;;:::i;:::-;-1:-1:-1;26258:9:1;;26161:112::o;26278:489::-;-1:-1:-1;;;;;26547:15:1;;;26529:34;;26599:15;;26594:2;26579:18;;26572:43;26646:2;26631:18;;26624:34;;;26694:3;26689:2;26674:18;;26667:31;;;26472:4;;26715:46;;26741:19;;26733:6;26715:46;:::i;26772:249::-;26841:6;26894:2;26882:9;26873:7;26869:23;26865:32;26862:52;;;26910:1;26907;26900:12;26862:52;26942:9;26936:16;26961:30;26985:5;26961:30;:::i

Swarm Source

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