ETH Price: $3,503.76 (+3.94%)
Gas: 4 Gwei

Token

CTNFT (CrittersTown)
 

Overview

Max Total Supply

7,777 CrittersTown

Holders

3,890

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
bullsy.eth
Balance
1 CrittersTown
0x2d1cb5ed13c731604a3f1d48dc206d85fe5e52b1
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
CrittersTown

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT 
// File: @openzeppelin/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

// File: @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/utils/cryptography/MerkleProof.sol


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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees 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.
 */
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 Returns the rebuilt hash obtained by traversing a Merklee 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++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// 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: erc721a/contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;








error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

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

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        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 overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

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

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 {
        _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 {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

// 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: contracts/Presale_Reveal.sol



pragma solidity >=0.8.0 <0.9.0;


contract CrittersTown is ERC721A, Ownable { 

  using Strings for uint256; 

  bytes32 public merkleRoot = 0xdad4fa560b70dd2227de75a38426a4b27e07d3d666d3941a61f65e3022d62db8; // Add MerkleRoot
  
  string public uriPrefix = "ipfs://QmfRdPJMkf9jTTwWfVPNQzgQo8uj8RhtHjmMwtdjx2XGJk/"; // Add ipfs://__CID__/ 
  string public uriSuffix = ".json"; 
  string public hiddenMetadataUri;
  
  uint256 public cost = 0.005 ether;    

  uint256 public publicTotalSupply = 0; 
  uint256 public reservedTotalSupply = 0; 
  uint256 public publicMaxSupply = 7227; 
  uint256 public reservedMaxSupply = 550; 
  uint256 public maxSupply = 7777; 

  uint256 public freeMaxMintAmount = 1; 
  uint256 public maxMintAmountPerTx = 10; 
  uint256 public TOTAL_MAX_MINT_AMOUNT = 15; 

  bool public paused = true;
  bool public publicSale = false;
  bool public revealed = true;

  mapping(address => uint256) public addressMintedBalance; 
  mapping(address => bool) whitelistedAddresses; 

  constructor() ERC721A("CTNFT", "CrittersTown") { // Replace NAME and SYMBOL 
        setHiddenMetadataUri("ipfs://__CID__/hidden.json"); // Replace CID
        ownerMint(50); // Replace uint - Automatic Free Mint for the owner and team 
    } 

  // MODIFIERS 
   modifier mintCompliance(uint256 _mintAmount) {
        if (msg.sender != owner()) {
    require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, 'Invalid mint amount!');
        }
    require(totalSupply() + _mintAmount <= maxSupply, 'Max supply exceeded!');
    _;
  }

  modifier mintPriceCompliance(uint256 _mintAmount) {
    uint256 ownerMintedCount = addressMintedBalance[msg.sender];
   if (ownerMintedCount >= freeMaxMintAmount) {
        require(msg.value >= cost * _mintAmount, 'Insufficient funds!');
   }
        _;
  }

   // MERKLE TREE
    function _verify(bytes32 leaf, bytes32[] memory proof)
        internal
        view
        returns (bool)
    {
        return MerkleProof.verify(proof, merkleRoot, leaf);
    }

    function _leaf(address account)
        internal
        pure
        returns (bytes32)
    {
        return keccak256(abi.encodePacked(account));
    }

  // MINT 
   function mint(uint256 _mintAmount, bytes32[] calldata proof) public payable mintCompliance(_mintAmount) mintPriceCompliance(_mintAmount) {
    require(!paused, 'The contract is paused!'); 
    require(publicSale, "Not open to public yet!");
    uint256 ownerMintedCount = addressMintedBalance[msg.sender];
    bytes32 leaf = keccak256(abi.encodePacked(msg.sender));

    if (!MerkleProof.verify(proof, merkleRoot, leaf) ||  (MerkleProof.verify(proof, merkleRoot, leaf) && ownerMintedCount >= freeMaxMintAmount)) {
        require(publicTotalSupply + _mintAmount <= publicMaxSupply, 'Public max supply exceeded!');
        if (ownerMintedCount < freeMaxMintAmount) {  
            require(ownerMintedCount + _mintAmount <= freeMaxMintAmount, "Exceeded Free Mint Limit");
        } else if (ownerMintedCount >= freeMaxMintAmount) { 
            require(ownerMintedCount + _mintAmount <= TOTAL_MAX_MINT_AMOUNT, "Exceeded Mint Limit");
        }

    _safeMint(_msgSender(), _mintAmount);
    for (uint256 i = 1; i <=_mintAmount; i++){
        addressMintedBalance[msg.sender]++;
        publicTotalSupply++;
    }
   } 
   
   else if (MerkleProof.verify(proof, merkleRoot, leaf)) {
       require(reservedTotalSupply + _mintAmount <= reservedMaxSupply, 'Reserved max supply exceeded!');
       if (ownerMintedCount < freeMaxMintAmount) {  
            require(ownerMintedCount + _mintAmount <= freeMaxMintAmount, "Exceeded Free Mint Limit");
        } else if (ownerMintedCount >= freeMaxMintAmount) { 
            require(ownerMintedCount + _mintAmount <= TOTAL_MAX_MINT_AMOUNT, "Exceeded Mint Limit");
        }

    _safeMint(_msgSender(), _mintAmount);
    for (uint256 i = 1; i <=_mintAmount; i++){
        addressMintedBalance[msg.sender]++;
        reservedTotalSupply++;
   }
  }
}

  function ownerMint(uint256 _mintAmount) public payable onlyOwner {
     require(_mintAmount > 0, 'Invalid mint amount!');
     require(totalSupply() + _mintAmount <= maxSupply, 'Max supply exceeded!');
    _safeMint(_msgSender(), _mintAmount);
  }

function mintForAddress(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner {
    _safeMint(_receiver, _mintAmount);
  }

  function isWhiteListed(address account, bytes32[] calldata proof) internal view returns(bool) {
        return _verify(_leaf(account), proof);
    }
  
  function walletOfOwner(address _owner) public view returns (uint256[] memory) {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
    uint256 currentTokenId = _startTokenId();
    uint256 ownedTokenIndex = 0;
    address latestOwnerAddress;

    while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
      TokenOwnership memory ownership = _ownerships[currentTokenId];

      if (!ownership.burned && ownership.addr != address(0)) {
        latestOwnerAddress = ownership.addr;
      }

      if (latestOwnerAddress == _owner) {
        ownedTokenIds[ownedTokenIndex] = currentTokenId;

        ownedTokenIndex++;
      }

      currentTokenId++;
    }

    return ownedTokenIds;
  }

  function _startTokenId() internal view virtual override returns (uint256) {
    return 1;
  }

  function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
    require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token');

    if (revealed == false) {
      return hiddenMetadataUri;
    }

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix))
        : '';
  }

  function setRevealed(bool _state) public onlyOwner {
    revealed = _state;
  }

  function setCost(uint256 _cost) public onlyOwner {
    cost = _cost;
  }

  function setTotalMaxMintAmount(uint _amount) public onlyOwner {
      require(_amount <= maxSupply, "Exceed total amount");
      TOTAL_MAX_MINT_AMOUNT = _amount;
  }

  function setFreeMaxMintAmount(uint256 _freeMaxMintAmount) public onlyOwner {
    freeMaxMintAmount = _freeMaxMintAmount;
  }

  function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner {
    maxMintAmountPerTx = _maxMintAmountPerTx;
  }

  function setReservedMaxSupply(uint256 _reservedMaxSupply) public onlyOwner {
    reservedMaxSupply = _reservedMaxSupply;
  }

  function setPublicMaxSupply(uint256 _publicMaxSupply) public onlyOwner {
    publicMaxSupply = _publicMaxSupply;
  }

  function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
    hiddenMetadataUri = _hiddenMetadataUri;
  }

  function setUriPrefix(string memory _uriPrefix) public onlyOwner {
    uriPrefix = _uriPrefix;
  }

  function setUriSuffix(string memory _uriSuffix) public onlyOwner {
    uriSuffix = _uriSuffix;
  }

  function setPaused(bool _state) public onlyOwner {
    paused = _state;
  }

  function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner {
    merkleRoot = _merkleRoot;
  }

  function setPublicSale(bool _state) public onlyOwner {
    publicSale = _state;
  }

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

  function addWhitelistUsers(address[] calldata _users) public onlyOwner {
      for (uint i=0; i < _users.length; i++) {
        whitelistedAddresses[_users[i]] = true;
    }
  }

  function _baseURI() internal view virtual override returns (string memory) {
    return uriPrefix;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"TOTAL_MAX_MINT_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"addWhitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMaxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","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":"_mintAmount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reservedTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_freeMaxMintAmount","type":"uint256"}],"name":"setFreeMaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicMaxSupply","type":"uint256"}],"name":"setPublicMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reservedMaxSupply","type":"uint256"}],"name":"setReservedMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setTotalMaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","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":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","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"}]

7fdad4fa560b70dd2227de75a38426a4b27e07d3d666d3941a61f65e3022d62db860095560e060405260366080818152906200352360a03980516200004d91600a9160209091019062000679565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200007c91600b9162000679565b506611c37937e08000600d556000600e819055600f908155611c3b601055610226601155611e616012556001601355600a6014556015556016805462ffffff191662010001179055348015620000d157600080fd5b50604080518082018252600581526410d513919560da1b60208083019182528351808501909452600c84526b21b934ba3a32b939aa37bbb760a11b908401528151919291620001239160029162000679565b5080516200013990600390602084019062000679565b50506001600055506200014c336200019d565b60408051808201909152601a81527f697066733a2f2f5f5f4349445f5f2f68696464656e2e6a736f6e00000000000060208201526200018b90620001ef565b62000197603262000257565b62000831565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6008546001600160a01b031633146200023e5760405162461bcd60e51b815260206004820181905260248201526000805160206200355983398151915260448201526064015b60405180910390fd5b80516200025390600c90602084019062000679565b5050565b6008546001600160a01b03163314620002a25760405162461bcd60e51b8152602060048201819052602482015260008051602062003559833981519152604482015260640162000235565b60008111620002f45760405162461bcd60e51b815260206004820152601460248201527f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000604482015260640162000235565b6012546001546000548391900360001901620003119190620007cd565b1115620003615760405162461bcd60e51b815260206004820152601460248201527f4d617820737570706c7920657863656564656421000000000000000000000000604482015260640162000235565b6200036d338262000370565b50565b620002538282604051806020016040528060008152506200039260201b60201c565b620003a18383836001620003a6565b505050565b6000546001600160a01b038516620003d057604051622e076360e81b815260040160405180910390fd5b83620003ef5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546001600160801b031981166001600160401b038083168c018116918217680100000000000000006001600160401b031990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b429092169190910217905580808501838015620004a85750620004a8876001600160a01b03166200056960201b62001c631760201c565b1562000528575b60405182906001600160a01b0389169060009060008051602062003579833981519152908290a46001820191620004ec9060009089908862000578565b6200050a576040516368d2bf6b60e11b815260040160405180910390fd5b80821415620004af5782600054146200052257600080fd5b6200055e565b5b6040516001830192906001600160a01b0389169060009060008051602062003579833981519152908290a48082141562000529575b506000555050505050565b6001600160a01b03163b151590565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290620005af90339089908890889060040162000752565b602060405180830381600087803b158015620005ca57600080fd5b505af1925050508015620005fd575060408051601f3d908101601f19168201909252620005fa918101906200071f565b60015b6200065c573d8080156200062e576040519150601f19603f3d011682016040523d82523d6000602084013e62000633565b606091505b50805162000654576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b8280546200068790620007f4565b90600052602060002090601f016020900481019282620006ab5760008555620006f6565b82601f10620006c657805160ff1916838001178555620006f6565b82800160010185558215620006f6579182015b82811115620006f6578251825591602001919060010190620006d9565b506200070492915062000708565b5090565b5b8082111562000704576000815560010162000709565b6000602082840312156200073257600080fd5b81516001600160e01b0319811681146200074b57600080fd5b9392505050565b600060018060a01b038087168352602081871681850152856040850152608060608501528451915081608085015260005b82811015620007a15785810182015185820160a00152810162000783565b82811115620007b457600060a084870101525b5050601f01601f19169190910160a00195945050505050565b60008219821115620007ef57634e487b7160e01b600052601160045260246000fd5b500190565b600181811c908216806200080957607f821691505b602082108114156200082b57634e487b7160e01b600052602260045260246000fd5b50919050565b612ce280620008416000396000f3fe60806040526004361061031a5760003560e01c806362b99ad4116101ab578063a45ba8e7116100f7578063d5abeb0111610095578063efbd73f41161006f578063efbd73f414610900578063f19e75d414610920578063f2873c8a14610933578063f2fde38b1461094957600080fd5b8063d5abeb0114610881578063e0a8085314610897578063e985e9c5146108b757600080fd5b8063b985add8116100d1578063b985add814610818578063ba41b0c61461082e578063c87b56dd14610841578063d4fcb2ae1461086157600080fd5b8063a45ba8e7146107c3578063b071401b146107d8578063b88d4fde146107f857600080fd5b80637cb647591161016457806394354fd01161013e57806394354fd01461075857806395d89b411461076e5780639734763a14610783578063a22cb465146107a357600080fd5b80637cb64759146106fa5780637ec4a6591461071a5780638da5cb5b1461073a57600080fd5b806362b99ad41461065a5780636352211e1461066f578063686b28121461068f57806370a08231146106af578063715018a6146106cf57806378cbcf23146106e457600080fd5b80632c99589b1161026a57806344a0d68a1161022357806351830227116101fd57806351830227146105eb5780635503a0e81461060b5780635aca1bb6146106205780635c975abb1461064057600080fd5b806344a0d68a146105955780634baabc8b146105b55780634fdd43cb146105cb57600080fd5b80632c99589b146104eb5780632eb4a7ab1461050b57806333bc1c5c146105215780633ccfd60b1461054057806342842e0e14610548578063438b63001461056857600080fd5b80631159aca4116102d757806316c38b3c116102b157806316c38b3c1461046057806318160ddd1461048057806318cae2691461049e57806323b872dd146104cb57600080fd5b80631159aca41461041457806313faede61461042a57806316ba10e01461044057600080fd5b806301ffc9a71461031f57806306fdde0314610354578063081812fc14610376578063095ea7b3146103ae5780630e98f811146103d05780631042779c146103f4575b600080fd5b34801561032b57600080fd5b5061033f61033a366004612841565b610969565b60405190151581526020015b60405180910390f35b34801561036057600080fd5b506103696109bb565b60405161034b9190612aa2565b34801561038257600080fd5b50610396610391366004612828565b610a4d565b6040516001600160a01b03909116815260200161034b565b3480156103ba57600080fd5b506103ce6103c93660046127a2565b610a91565b005b3480156103dc57600080fd5b506103e6600f5481565b60405190815260200161034b565b34801561040057600080fd5b506103ce61040f366004612828565b610b1f565b34801561042057600080fd5b506103e660135481565b34801561043657600080fd5b506103e6600d5481565b34801561044c57600080fd5b506103ce61045b36600461287b565b610b9f565b34801561046c57600080fd5b506103ce61047b36600461280d565b610be0565b34801561048c57600080fd5b506103e6600154600054036000190190565b3480156104aa57600080fd5b506103e66104b9366004612673565b60176020526000908152604090205481565b3480156104d757600080fd5b506103ce6104e63660046126c1565b610c1d565b3480156104f757600080fd5b506103ce610506366004612828565b610c28565b34801561051757600080fd5b506103e660095481565b34801561052d57600080fd5b5060165461033f90610100900460ff1681565b6103ce610c57565b34801561055457600080fd5b506103ce6105633660046126c1565b610cf5565b34801561057457600080fd5b50610588610583366004612673565b610d10565b60405161034b9190612a5e565b3480156105a157600080fd5b506103ce6105b0366004612828565b610e57565b3480156105c157600080fd5b506103e660155481565b3480156105d757600080fd5b506103ce6105e636600461287b565b610e86565b3480156105f757600080fd5b5060165461033f9062010000900460ff1681565b34801561061757600080fd5b50610369610ec3565b34801561062c57600080fd5b506103ce61063b36600461280d565b610f51565b34801561064c57600080fd5b5060165461033f9060ff1681565b34801561066657600080fd5b50610369610f95565b34801561067b57600080fd5b5061039661068a366004612828565b610fa2565b34801561069b57600080fd5b506103ce6106aa3660046127cc565b610fb4565b3480156106bb57600080fd5b506103e66106ca366004612673565b611050565b3480156106db57600080fd5b506103ce61109e565b3480156106f057600080fd5b506103e660105481565b34801561070657600080fd5b506103ce610715366004612828565b6110d4565b34801561072657600080fd5b506103ce61073536600461287b565b611103565b34801561074657600080fd5b506008546001600160a01b0316610396565b34801561076457600080fd5b506103e660145481565b34801561077a57600080fd5b50610369611140565b34801561078f57600080fd5b506103ce61079e366004612828565b61114f565b3480156107af57600080fd5b506103ce6107be366004612778565b61117e565b3480156107cf57600080fd5b50610369611214565b3480156107e457600080fd5b506103ce6107f3366004612828565b611221565b34801561080457600080fd5b506103ce6108133660046126fd565b611250565b34801561082457600080fd5b506103e6600e5481565b6103ce61083c3660046128e6565b6112a1565b34801561084d57600080fd5b5061036961085c366004612828565b61188b565b34801561086d57600080fd5b506103ce61087c366004612828565b6119fb565b34801561088d57600080fd5b506103e660125481565b3480156108a357600080fd5b506103ce6108b236600461280d565b611a2a565b3480156108c357600080fd5b5061033f6108d236600461268e565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561090c57600080fd5b506103ce61091b3660046128c3565b611a70565b6103ce61092e366004612828565b611b3a565b34801561093f57600080fd5b506103e660115481565b34801561095557600080fd5b506103ce610964366004612673565b611bcb565b60006001600160e01b031982166380ac58cd60e01b148061099a57506001600160e01b03198216635b5e139f60e01b145b806109b557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600280546109ca90612bd4565b80601f01602080910402602001604051908101604052809291908181526020018280546109f690612bd4565b8015610a435780601f10610a1857610100808354040283529160200191610a43565b820191906000526020600020905b815481529060010190602001808311610a2657829003601f168201915b5050505050905090565b6000610a5882611c72565b610a75576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610a9c82610fa2565b9050806001600160a01b0316836001600160a01b03161415610ad15760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610af15750610aef81336108d2565b155b15610b0f576040516367d9dca160e11b815260040160405180910390fd5b610b1a838383611cab565b505050565b6008546001600160a01b03163314610b525760405162461bcd60e51b8152600401610b4990612ae3565b60405180910390fd5b601254811115610b9a5760405162461bcd60e51b8152602060048201526013602482015272115e18d95959081d1bdd185b08185b5bdd5b9d606a1b6044820152606401610b49565b601555565b6008546001600160a01b03163314610bc95760405162461bcd60e51b8152600401610b4990612ae3565b8051610bdc90600b9060208401906124ee565b5050565b6008546001600160a01b03163314610c0a5760405162461bcd60e51b8152600401610b4990612ae3565b6016805460ff1916911515919091179055565b610b1a838383611d07565b6008546001600160a01b03163314610c525760405162461bcd60e51b8152600401610b4990612ae3565b601055565b6008546001600160a01b03163314610c815760405162461bcd60e51b8152600401610b4990612ae3565b6000610c956008546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610cdf576040519150601f19603f3d011682016040523d82523d6000602084013e610ce4565b606091505b5050905080610cf257600080fd5b50565b610b1a83838360405180602001604052806000815250611250565b60606000610d1d83611050565b90506000816001600160401b03811115610d3957610d39612c80565b604051908082528060200260200182016040528015610d62578160200160208202803683370190505b50905060016000805b8482108015610d7c57506012548311155b15610e4c57600083815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161580159282018390529091610de9575080516001600160a01b031615155b15610df357805191505b876001600160a01b0316826001600160a01b03161415610e395783858481518110610e2057610e20612c6a565b602090810291909101015282610e3581612c0f565b9350505b83610e4381612c0f565b94505050610d6b565b509195945050505050565b6008546001600160a01b03163314610e815760405162461bcd60e51b8152600401610b4990612ae3565b600d55565b6008546001600160a01b03163314610eb05760405162461bcd60e51b8152600401610b4990612ae3565b8051610bdc90600c9060208401906124ee565b600b8054610ed090612bd4565b80601f0160208091040260200160405190810160405280929190818152602001828054610efc90612bd4565b8015610f495780601f10610f1e57610100808354040283529160200191610f49565b820191906000526020600020905b815481529060010190602001808311610f2c57829003601f168201915b505050505081565b6008546001600160a01b03163314610f7b5760405162461bcd60e51b8152600401610b4990612ae3565b601680549115156101000261ff0019909216919091179055565b600a8054610ed090612bd4565b6000610fad82611ef5565b5192915050565b6008546001600160a01b03163314610fde5760405162461bcd60e51b8152600401610b4990612ae3565b60005b81811015610b1a5760016018600085858581811061100157611001612c6a565b90506020020160208101906110169190612673565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061104881612c0f565b915050610fe1565b60006001600160a01b038216611079576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146110c85760405162461bcd60e51b8152600401610b4990612ae3565b6110d2600061201c565b565b6008546001600160a01b031633146110fe5760405162461bcd60e51b8152600401610b4990612ae3565b600955565b6008546001600160a01b0316331461112d5760405162461bcd60e51b8152600401610b4990612ae3565b8051610bdc90600a9060208401906124ee565b6060600380546109ca90612bd4565b6008546001600160a01b031633146111795760405162461bcd60e51b8152600401610b4990612ae3565b601155565b6001600160a01b0382163314156111a85760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600c8054610ed090612bd4565b6008546001600160a01b0316331461124b5760405162461bcd60e51b8152600401610b4990612ae3565b601455565b61125b848484611d07565b6001600160a01b0383163b1515801561127d575061127b8484848461206e565b155b1561129b576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b826112b46008546001600160a01b031690565b6001600160a01b0316336001600160a01b0316146112fa576000811180156112de57506014548111155b6112fa5760405162461bcd60e51b8152600401610b4990612ab5565b6012548161130f600154600054036000190190565b6113199190612b46565b11156113375760405162461bcd60e51b8152600401610b4990612b18565b3360009081526017602052604090205460135485919081106113a65781600d546113619190612b72565b3410156113a65760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401610b49565b60165460ff16156113f95760405162461bcd60e51b815260206004820152601760248201527f54686520636f6e747261637420697320706175736564210000000000000000006044820152606401610b49565b601654610100900460ff166114505760405162461bcd60e51b815260206004820152601760248201527f4e6f74206f70656e20746f207075626c696320796574210000000000000000006044820152606401610b49565b336000818152601760209081526040808320549051909361148b9290910160609190911b6bffffffffffffffffffffffff1916815260140190565b6040516020818303038152906040528051906020012090506114e4878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506009549150849050612166565b158061153a575061152c878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506009549150849050612166565b801561153a57506013548210155b156116c05760105488600e546115509190612b46565b111561159e5760405162461bcd60e51b815260206004820152601b60248201527f5075626c6963206d617820737570706c792065786365656465642100000000006044820152606401610b49565b601354821015611603576013546115b58984612b46565b11156115fe5760405162461bcd60e51b8152602060048201526018602482015277115e18d95959195908119c995948135a5b9d08131a5b5a5d60421b6044820152606401610b49565b61165d565b601354821061165d576015546116198984612b46565b111561165d5760405162461bcd60e51b8152602060048201526013602482015272115e18d95959195908135a5b9d08131a5b5a5d606a1b6044820152606401610b49565b611668335b8961217c565b60015b8881116116ba5733600090815260176020526040812080549161168d83612c0f565b9091555050600e80549060006116a283612c0f565b919050555080806116b290612c0f565b91505061166b565b50611881565b611701878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506009549150849050612166565b156118815760115488600f546117179190612b46565b11156117655760405162461bcd60e51b815260206004820152601d60248201527f5265736572766564206d617820737570706c79206578636565646564210000006044820152606401610b49565b6013548210156117ca5760135461177c8984612b46565b11156117c55760405162461bcd60e51b8152602060048201526018602482015277115e18d95959195908119c995948135a5b9d08131a5b5a5d60421b6044820152606401610b49565b611824565b6013548210611824576015546117e08984612b46565b11156118245760405162461bcd60e51b8152602060048201526013602482015272115e18d95959195908135a5b9d08131a5b5a5d606a1b6044820152606401610b49565b61182d33611662565b60015b88811161187f5733600090815260176020526040812080549161185283612c0f565b9091555050600f805490600061186783612c0f565b9190505550808061187790612c0f565b915050611830565b505b5050505050505050565b606061189682611c72565b6118fa5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b49565b60165462010000900460ff1661199c57600c805461191790612bd4565b80601f016020809104026020016040519081016040528092919081815260200182805461194390612bd4565b80156119905780601f1061196557610100808354040283529160200191611990565b820191906000526020600020905b81548152906001019060200180831161197357829003601f168201915b50505050509050919050565b60006119a6612196565b905060008151116119c657604051806020016040528060008152506119f4565b806119d0846121a5565b600b6040516020016119e49392919061295d565b6040516020818303038152906040525b9392505050565b6008546001600160a01b03163314611a255760405162461bcd60e51b8152600401610b4990612ae3565b601355565b6008546001600160a01b03163314611a545760405162461bcd60e51b8152600401610b4990612ae3565b60168054911515620100000262ff000019909216919091179055565b81611a836008546001600160a01b031690565b6001600160a01b0316336001600160a01b031614611ac957600081118015611aad57506014548111155b611ac95760405162461bcd60e51b8152600401610b4990612ab5565b60125481611ade600154600054036000190190565b611ae89190612b46565b1115611b065760405162461bcd60e51b8152600401610b4990612b18565b6008546001600160a01b03163314611b305760405162461bcd60e51b8152600401610b4990612ae3565b610b1a828461217c565b6008546001600160a01b03163314611b645760405162461bcd60e51b8152600401610b4990612ae3565b60008111611b845760405162461bcd60e51b8152600401610b4990612ab5565b60125481611b99600154600054036000190190565b611ba39190612b46565b1115611bc15760405162461bcd60e51b8152600401610b4990612b18565b610cf2338261217c565b6008546001600160a01b03163314611bf55760405162461bcd60e51b8152600401610b4990612ae3565b6001600160a01b038116611c5a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b49565b610cf28161201c565b6001600160a01b03163b151590565b600081600111158015611c86575060005482105b80156109b5575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611d1282611ef5565b9050836001600160a01b031681600001516001600160a01b031614611d495760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611d675750611d6785336108d2565b80611d82575033611d7784610a4d565b6001600160a01b0316145b905080611da257604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611dc957604051633a954ecd60e21b815260040160405180910390fd5b611dd560008487611cab565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116611ea9576000548214611ea957805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b60408051606081018252600080825260208201819052918101919091528180600111158015611f25575060005481105b1561200357600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906120015780516001600160a01b031615611f98579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215611ffc579392505050565b611f98565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906120a3903390899088908890600401612a21565b602060405180830381600087803b1580156120bd57600080fd5b505af19250505080156120ed575060408051601f3d908101601f191682019092526120ea9181019061285e565b60015b612148573d80801561211b576040519150601f19603f3d011682016040523d82523d6000602084013e612120565b606091505b508051612140576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60008261217385846122a2565b14949350505050565b610bdc828260405180602001604052806000815250612316565b6060600a80546109ca90612bd4565b6060816121c95750506040805180820190915260018152600360fc1b602082015290565b8160005b81156121f357806121dd81612c0f565b91506121ec9050600a83612b5e565b91506121cd565b6000816001600160401b0381111561220d5761220d612c80565b6040519080825280601f01601f191660200182016040528015612237576020820181803683370190505b5090505b841561215e5761224c600183612b91565b9150612259600a86612c2a565b612264906030612b46565b60f81b81838151811061227957612279612c6a565b60200101906001600160f81b031916908160001a90535061229b600a86612b5e565b945061223b565b600081815b845181101561230e5760008582815181106122c4576122c4612c6a565b602002602001015190508083116122ea57600083815260208290526040902092506122fb565b600081815260208490526040902092505b508061230681612c0f565b9150506122a7565b509392505050565b610b1a83838360016000546001600160a01b03851661234757604051622e076360e81b815260040160405180910390fd5b836123655760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561241657506001600160a01b0387163b15155b1561249f575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612467600088848060010195508861206e565b612484576040516368d2bf6b60e11b815260040160405180910390fd5b8082141561241c57826000541461249a57600080fd5b6124e5565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808214156124a0575b50600055611eee565b8280546124fa90612bd4565b90600052602060002090601f01602090048101928261251c5760008555612562565b82601f1061253557805160ff1916838001178555612562565b82800160010185558215612562579182015b82811115612562578251825591602001919060010190612547565b5061256e929150612572565b5090565b5b8082111561256e5760008155600101612573565b60006001600160401b03808411156125a1576125a1612c80565b604051601f8501601f19908116603f011681019082821181831017156125c9576125c9612c80565b816040528093508581528686860111156125e257600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461261357600080fd5b919050565b60008083601f84011261262a57600080fd5b5081356001600160401b0381111561264157600080fd5b6020830191508360208260051b850101111561265c57600080fd5b9250929050565b8035801515811461261357600080fd5b60006020828403121561268557600080fd5b6119f4826125fc565b600080604083850312156126a157600080fd5b6126aa836125fc565b91506126b8602084016125fc565b90509250929050565b6000806000606084860312156126d657600080fd5b6126df846125fc565b92506126ed602085016125fc565b9150604084013590509250925092565b6000806000806080858703121561271357600080fd5b61271c856125fc565b935061272a602086016125fc565b92506040850135915060608501356001600160401b0381111561274c57600080fd5b8501601f8101871361275d57600080fd5b61276c87823560208401612587565b91505092959194509250565b6000806040838503121561278b57600080fd5b612794836125fc565b91506126b860208401612663565b600080604083850312156127b557600080fd5b6127be836125fc565b946020939093013593505050565b600080602083850312156127df57600080fd5b82356001600160401b038111156127f557600080fd5b61280185828601612618565b90969095509350505050565b60006020828403121561281f57600080fd5b6119f482612663565b60006020828403121561283a57600080fd5b5035919050565b60006020828403121561285357600080fd5b81356119f481612c96565b60006020828403121561287057600080fd5b81516119f481612c96565b60006020828403121561288d57600080fd5b81356001600160401b038111156128a357600080fd5b8201601f810184136128b457600080fd5b61215e84823560208401612587565b600080604083850312156128d657600080fd5b823591506126b8602084016125fc565b6000806000604084860312156128fb57600080fd5b8335925060208401356001600160401b0381111561291857600080fd5b61292486828701612618565b9497909650939450505050565b60008151808452612949816020860160208601612ba8565b601f01601f19169290920160200192915050565b6000845160206129708285838a01612ba8565b8551918401916129838184848a01612ba8565b8554920191600090600181811c90808316806129a057607f831692505b8583108114156129be57634e487b7160e01b85526022600452602485fd5b8080156129d257600181146129e357612a10565b60ff19851688528388019550612a10565b60008b81526020902060005b85811015612a085781548a8201529084019088016129ef565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612a5490830184612931565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612a9657835183529284019291840191600101612a7a565b50909695505050505050565b6020815260006119f46020830184612931565b602080825260149082015273496e76616c6964206d696e7420616d6f756e742160601b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601490820152734d617820737570706c792065786365656465642160601b604082015260600190565b60008219821115612b5957612b59612c3e565b500190565b600082612b6d57612b6d612c54565b500490565b6000816000190483118215151615612b8c57612b8c612c3e565b500290565b600082821015612ba357612ba3612c3e565b500390565b60005b83811015612bc3578181015183820152602001612bab565b8381111561129b5750506000910152565b600181811c90821680612be857607f821691505b60208210811415612c0957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612c2357612c23612c3e565b5060010190565b600082612c3957612c39612c54565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610cf257600080fdfea26469706673582212206c636ad46fa2726fb79efe54dcf28eabf95053c0c473de7ea1d0d6a16aac7d1f64736f6c63430008070033697066733a2f2f516d665264504a4d6b66396a545477576656504e517a67516f38756a38526874486a6d4d7774646a783258474a6b2f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef

Deployed Bytecode

0x60806040526004361061031a5760003560e01c806362b99ad4116101ab578063a45ba8e7116100f7578063d5abeb0111610095578063efbd73f41161006f578063efbd73f414610900578063f19e75d414610920578063f2873c8a14610933578063f2fde38b1461094957600080fd5b8063d5abeb0114610881578063e0a8085314610897578063e985e9c5146108b757600080fd5b8063b985add8116100d1578063b985add814610818578063ba41b0c61461082e578063c87b56dd14610841578063d4fcb2ae1461086157600080fd5b8063a45ba8e7146107c3578063b071401b146107d8578063b88d4fde146107f857600080fd5b80637cb647591161016457806394354fd01161013e57806394354fd01461075857806395d89b411461076e5780639734763a14610783578063a22cb465146107a357600080fd5b80637cb64759146106fa5780637ec4a6591461071a5780638da5cb5b1461073a57600080fd5b806362b99ad41461065a5780636352211e1461066f578063686b28121461068f57806370a08231146106af578063715018a6146106cf57806378cbcf23146106e457600080fd5b80632c99589b1161026a57806344a0d68a1161022357806351830227116101fd57806351830227146105eb5780635503a0e81461060b5780635aca1bb6146106205780635c975abb1461064057600080fd5b806344a0d68a146105955780634baabc8b146105b55780634fdd43cb146105cb57600080fd5b80632c99589b146104eb5780632eb4a7ab1461050b57806333bc1c5c146105215780633ccfd60b1461054057806342842e0e14610548578063438b63001461056857600080fd5b80631159aca4116102d757806316c38b3c116102b157806316c38b3c1461046057806318160ddd1461048057806318cae2691461049e57806323b872dd146104cb57600080fd5b80631159aca41461041457806313faede61461042a57806316ba10e01461044057600080fd5b806301ffc9a71461031f57806306fdde0314610354578063081812fc14610376578063095ea7b3146103ae5780630e98f811146103d05780631042779c146103f4575b600080fd5b34801561032b57600080fd5b5061033f61033a366004612841565b610969565b60405190151581526020015b60405180910390f35b34801561036057600080fd5b506103696109bb565b60405161034b9190612aa2565b34801561038257600080fd5b50610396610391366004612828565b610a4d565b6040516001600160a01b03909116815260200161034b565b3480156103ba57600080fd5b506103ce6103c93660046127a2565b610a91565b005b3480156103dc57600080fd5b506103e6600f5481565b60405190815260200161034b565b34801561040057600080fd5b506103ce61040f366004612828565b610b1f565b34801561042057600080fd5b506103e660135481565b34801561043657600080fd5b506103e6600d5481565b34801561044c57600080fd5b506103ce61045b36600461287b565b610b9f565b34801561046c57600080fd5b506103ce61047b36600461280d565b610be0565b34801561048c57600080fd5b506103e6600154600054036000190190565b3480156104aa57600080fd5b506103e66104b9366004612673565b60176020526000908152604090205481565b3480156104d757600080fd5b506103ce6104e63660046126c1565b610c1d565b3480156104f757600080fd5b506103ce610506366004612828565b610c28565b34801561051757600080fd5b506103e660095481565b34801561052d57600080fd5b5060165461033f90610100900460ff1681565b6103ce610c57565b34801561055457600080fd5b506103ce6105633660046126c1565b610cf5565b34801561057457600080fd5b50610588610583366004612673565b610d10565b60405161034b9190612a5e565b3480156105a157600080fd5b506103ce6105b0366004612828565b610e57565b3480156105c157600080fd5b506103e660155481565b3480156105d757600080fd5b506103ce6105e636600461287b565b610e86565b3480156105f757600080fd5b5060165461033f9062010000900460ff1681565b34801561061757600080fd5b50610369610ec3565b34801561062c57600080fd5b506103ce61063b36600461280d565b610f51565b34801561064c57600080fd5b5060165461033f9060ff1681565b34801561066657600080fd5b50610369610f95565b34801561067b57600080fd5b5061039661068a366004612828565b610fa2565b34801561069b57600080fd5b506103ce6106aa3660046127cc565b610fb4565b3480156106bb57600080fd5b506103e66106ca366004612673565b611050565b3480156106db57600080fd5b506103ce61109e565b3480156106f057600080fd5b506103e660105481565b34801561070657600080fd5b506103ce610715366004612828565b6110d4565b34801561072657600080fd5b506103ce61073536600461287b565b611103565b34801561074657600080fd5b506008546001600160a01b0316610396565b34801561076457600080fd5b506103e660145481565b34801561077a57600080fd5b50610369611140565b34801561078f57600080fd5b506103ce61079e366004612828565b61114f565b3480156107af57600080fd5b506103ce6107be366004612778565b61117e565b3480156107cf57600080fd5b50610369611214565b3480156107e457600080fd5b506103ce6107f3366004612828565b611221565b34801561080457600080fd5b506103ce6108133660046126fd565b611250565b34801561082457600080fd5b506103e6600e5481565b6103ce61083c3660046128e6565b6112a1565b34801561084d57600080fd5b5061036961085c366004612828565b61188b565b34801561086d57600080fd5b506103ce61087c366004612828565b6119fb565b34801561088d57600080fd5b506103e660125481565b3480156108a357600080fd5b506103ce6108b236600461280d565b611a2a565b3480156108c357600080fd5b5061033f6108d236600461268e565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561090c57600080fd5b506103ce61091b3660046128c3565b611a70565b6103ce61092e366004612828565b611b3a565b34801561093f57600080fd5b506103e660115481565b34801561095557600080fd5b506103ce610964366004612673565b611bcb565b60006001600160e01b031982166380ac58cd60e01b148061099a57506001600160e01b03198216635b5e139f60e01b145b806109b557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600280546109ca90612bd4565b80601f01602080910402602001604051908101604052809291908181526020018280546109f690612bd4565b8015610a435780601f10610a1857610100808354040283529160200191610a43565b820191906000526020600020905b815481529060010190602001808311610a2657829003601f168201915b5050505050905090565b6000610a5882611c72565b610a75576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610a9c82610fa2565b9050806001600160a01b0316836001600160a01b03161415610ad15760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610af15750610aef81336108d2565b155b15610b0f576040516367d9dca160e11b815260040160405180910390fd5b610b1a838383611cab565b505050565b6008546001600160a01b03163314610b525760405162461bcd60e51b8152600401610b4990612ae3565b60405180910390fd5b601254811115610b9a5760405162461bcd60e51b8152602060048201526013602482015272115e18d95959081d1bdd185b08185b5bdd5b9d606a1b6044820152606401610b49565b601555565b6008546001600160a01b03163314610bc95760405162461bcd60e51b8152600401610b4990612ae3565b8051610bdc90600b9060208401906124ee565b5050565b6008546001600160a01b03163314610c0a5760405162461bcd60e51b8152600401610b4990612ae3565b6016805460ff1916911515919091179055565b610b1a838383611d07565b6008546001600160a01b03163314610c525760405162461bcd60e51b8152600401610b4990612ae3565b601055565b6008546001600160a01b03163314610c815760405162461bcd60e51b8152600401610b4990612ae3565b6000610c956008546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610cdf576040519150601f19603f3d011682016040523d82523d6000602084013e610ce4565b606091505b5050905080610cf257600080fd5b50565b610b1a83838360405180602001604052806000815250611250565b60606000610d1d83611050565b90506000816001600160401b03811115610d3957610d39612c80565b604051908082528060200260200182016040528015610d62578160200160208202803683370190505b50905060016000805b8482108015610d7c57506012548311155b15610e4c57600083815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161580159282018390529091610de9575080516001600160a01b031615155b15610df357805191505b876001600160a01b0316826001600160a01b03161415610e395783858481518110610e2057610e20612c6a565b602090810291909101015282610e3581612c0f565b9350505b83610e4381612c0f565b94505050610d6b565b509195945050505050565b6008546001600160a01b03163314610e815760405162461bcd60e51b8152600401610b4990612ae3565b600d55565b6008546001600160a01b03163314610eb05760405162461bcd60e51b8152600401610b4990612ae3565b8051610bdc90600c9060208401906124ee565b600b8054610ed090612bd4565b80601f0160208091040260200160405190810160405280929190818152602001828054610efc90612bd4565b8015610f495780601f10610f1e57610100808354040283529160200191610f49565b820191906000526020600020905b815481529060010190602001808311610f2c57829003601f168201915b505050505081565b6008546001600160a01b03163314610f7b5760405162461bcd60e51b8152600401610b4990612ae3565b601680549115156101000261ff0019909216919091179055565b600a8054610ed090612bd4565b6000610fad82611ef5565b5192915050565b6008546001600160a01b03163314610fde5760405162461bcd60e51b8152600401610b4990612ae3565b60005b81811015610b1a5760016018600085858581811061100157611001612c6a565b90506020020160208101906110169190612673565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061104881612c0f565b915050610fe1565b60006001600160a01b038216611079576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146110c85760405162461bcd60e51b8152600401610b4990612ae3565b6110d2600061201c565b565b6008546001600160a01b031633146110fe5760405162461bcd60e51b8152600401610b4990612ae3565b600955565b6008546001600160a01b0316331461112d5760405162461bcd60e51b8152600401610b4990612ae3565b8051610bdc90600a9060208401906124ee565b6060600380546109ca90612bd4565b6008546001600160a01b031633146111795760405162461bcd60e51b8152600401610b4990612ae3565b601155565b6001600160a01b0382163314156111a85760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600c8054610ed090612bd4565b6008546001600160a01b0316331461124b5760405162461bcd60e51b8152600401610b4990612ae3565b601455565b61125b848484611d07565b6001600160a01b0383163b1515801561127d575061127b8484848461206e565b155b1561129b576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b826112b46008546001600160a01b031690565b6001600160a01b0316336001600160a01b0316146112fa576000811180156112de57506014548111155b6112fa5760405162461bcd60e51b8152600401610b4990612ab5565b6012548161130f600154600054036000190190565b6113199190612b46565b11156113375760405162461bcd60e51b8152600401610b4990612b18565b3360009081526017602052604090205460135485919081106113a65781600d546113619190612b72565b3410156113a65760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401610b49565b60165460ff16156113f95760405162461bcd60e51b815260206004820152601760248201527f54686520636f6e747261637420697320706175736564210000000000000000006044820152606401610b49565b601654610100900460ff166114505760405162461bcd60e51b815260206004820152601760248201527f4e6f74206f70656e20746f207075626c696320796574210000000000000000006044820152606401610b49565b336000818152601760209081526040808320549051909361148b9290910160609190911b6bffffffffffffffffffffffff1916815260140190565b6040516020818303038152906040528051906020012090506114e4878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506009549150849050612166565b158061153a575061152c878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506009549150849050612166565b801561153a57506013548210155b156116c05760105488600e546115509190612b46565b111561159e5760405162461bcd60e51b815260206004820152601b60248201527f5075626c6963206d617820737570706c792065786365656465642100000000006044820152606401610b49565b601354821015611603576013546115b58984612b46565b11156115fe5760405162461bcd60e51b8152602060048201526018602482015277115e18d95959195908119c995948135a5b9d08131a5b5a5d60421b6044820152606401610b49565b61165d565b601354821061165d576015546116198984612b46565b111561165d5760405162461bcd60e51b8152602060048201526013602482015272115e18d95959195908135a5b9d08131a5b5a5d606a1b6044820152606401610b49565b611668335b8961217c565b60015b8881116116ba5733600090815260176020526040812080549161168d83612c0f565b9091555050600e80549060006116a283612c0f565b919050555080806116b290612c0f565b91505061166b565b50611881565b611701878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506009549150849050612166565b156118815760115488600f546117179190612b46565b11156117655760405162461bcd60e51b815260206004820152601d60248201527f5265736572766564206d617820737570706c79206578636565646564210000006044820152606401610b49565b6013548210156117ca5760135461177c8984612b46565b11156117c55760405162461bcd60e51b8152602060048201526018602482015277115e18d95959195908119c995948135a5b9d08131a5b5a5d60421b6044820152606401610b49565b611824565b6013548210611824576015546117e08984612b46565b11156118245760405162461bcd60e51b8152602060048201526013602482015272115e18d95959195908135a5b9d08131a5b5a5d606a1b6044820152606401610b49565b61182d33611662565b60015b88811161187f5733600090815260176020526040812080549161185283612c0f565b9091555050600f805490600061186783612c0f565b9190505550808061187790612c0f565b915050611830565b505b5050505050505050565b606061189682611c72565b6118fa5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b49565b60165462010000900460ff1661199c57600c805461191790612bd4565b80601f016020809104026020016040519081016040528092919081815260200182805461194390612bd4565b80156119905780601f1061196557610100808354040283529160200191611990565b820191906000526020600020905b81548152906001019060200180831161197357829003601f168201915b50505050509050919050565b60006119a6612196565b905060008151116119c657604051806020016040528060008152506119f4565b806119d0846121a5565b600b6040516020016119e49392919061295d565b6040516020818303038152906040525b9392505050565b6008546001600160a01b03163314611a255760405162461bcd60e51b8152600401610b4990612ae3565b601355565b6008546001600160a01b03163314611a545760405162461bcd60e51b8152600401610b4990612ae3565b60168054911515620100000262ff000019909216919091179055565b81611a836008546001600160a01b031690565b6001600160a01b0316336001600160a01b031614611ac957600081118015611aad57506014548111155b611ac95760405162461bcd60e51b8152600401610b4990612ab5565b60125481611ade600154600054036000190190565b611ae89190612b46565b1115611b065760405162461bcd60e51b8152600401610b4990612b18565b6008546001600160a01b03163314611b305760405162461bcd60e51b8152600401610b4990612ae3565b610b1a828461217c565b6008546001600160a01b03163314611b645760405162461bcd60e51b8152600401610b4990612ae3565b60008111611b845760405162461bcd60e51b8152600401610b4990612ab5565b60125481611b99600154600054036000190190565b611ba39190612b46565b1115611bc15760405162461bcd60e51b8152600401610b4990612b18565b610cf2338261217c565b6008546001600160a01b03163314611bf55760405162461bcd60e51b8152600401610b4990612ae3565b6001600160a01b038116611c5a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b49565b610cf28161201c565b6001600160a01b03163b151590565b600081600111158015611c86575060005482105b80156109b5575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611d1282611ef5565b9050836001600160a01b031681600001516001600160a01b031614611d495760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611d675750611d6785336108d2565b80611d82575033611d7784610a4d565b6001600160a01b0316145b905080611da257604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611dc957604051633a954ecd60e21b815260040160405180910390fd5b611dd560008487611cab565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116611ea9576000548214611ea957805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b60408051606081018252600080825260208201819052918101919091528180600111158015611f25575060005481105b1561200357600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906120015780516001600160a01b031615611f98579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215611ffc579392505050565b611f98565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906120a3903390899088908890600401612a21565b602060405180830381600087803b1580156120bd57600080fd5b505af19250505080156120ed575060408051601f3d908101601f191682019092526120ea9181019061285e565b60015b612148573d80801561211b576040519150601f19603f3d011682016040523d82523d6000602084013e612120565b606091505b508051612140576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60008261217385846122a2565b14949350505050565b610bdc828260405180602001604052806000815250612316565b6060600a80546109ca90612bd4565b6060816121c95750506040805180820190915260018152600360fc1b602082015290565b8160005b81156121f357806121dd81612c0f565b91506121ec9050600a83612b5e565b91506121cd565b6000816001600160401b0381111561220d5761220d612c80565b6040519080825280601f01601f191660200182016040528015612237576020820181803683370190505b5090505b841561215e5761224c600183612b91565b9150612259600a86612c2a565b612264906030612b46565b60f81b81838151811061227957612279612c6a565b60200101906001600160f81b031916908160001a90535061229b600a86612b5e565b945061223b565b600081815b845181101561230e5760008582815181106122c4576122c4612c6a565b602002602001015190508083116122ea57600083815260208290526040902092506122fb565b600081815260208490526040902092505b508061230681612c0f565b9150506122a7565b509392505050565b610b1a83838360016000546001600160a01b03851661234757604051622e076360e81b815260040160405180910390fd5b836123655760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561241657506001600160a01b0387163b15155b1561249f575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612467600088848060010195508861206e565b612484576040516368d2bf6b60e11b815260040160405180910390fd5b8082141561241c57826000541461249a57600080fd5b6124e5565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808214156124a0575b50600055611eee565b8280546124fa90612bd4565b90600052602060002090601f01602090048101928261251c5760008555612562565b82601f1061253557805160ff1916838001178555612562565b82800160010185558215612562579182015b82811115612562578251825591602001919060010190612547565b5061256e929150612572565b5090565b5b8082111561256e5760008155600101612573565b60006001600160401b03808411156125a1576125a1612c80565b604051601f8501601f19908116603f011681019082821181831017156125c9576125c9612c80565b816040528093508581528686860111156125e257600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461261357600080fd5b919050565b60008083601f84011261262a57600080fd5b5081356001600160401b0381111561264157600080fd5b6020830191508360208260051b850101111561265c57600080fd5b9250929050565b8035801515811461261357600080fd5b60006020828403121561268557600080fd5b6119f4826125fc565b600080604083850312156126a157600080fd5b6126aa836125fc565b91506126b8602084016125fc565b90509250929050565b6000806000606084860312156126d657600080fd5b6126df846125fc565b92506126ed602085016125fc565b9150604084013590509250925092565b6000806000806080858703121561271357600080fd5b61271c856125fc565b935061272a602086016125fc565b92506040850135915060608501356001600160401b0381111561274c57600080fd5b8501601f8101871361275d57600080fd5b61276c87823560208401612587565b91505092959194509250565b6000806040838503121561278b57600080fd5b612794836125fc565b91506126b860208401612663565b600080604083850312156127b557600080fd5b6127be836125fc565b946020939093013593505050565b600080602083850312156127df57600080fd5b82356001600160401b038111156127f557600080fd5b61280185828601612618565b90969095509350505050565b60006020828403121561281f57600080fd5b6119f482612663565b60006020828403121561283a57600080fd5b5035919050565b60006020828403121561285357600080fd5b81356119f481612c96565b60006020828403121561287057600080fd5b81516119f481612c96565b60006020828403121561288d57600080fd5b81356001600160401b038111156128a357600080fd5b8201601f810184136128b457600080fd5b61215e84823560208401612587565b600080604083850312156128d657600080fd5b823591506126b8602084016125fc565b6000806000604084860312156128fb57600080fd5b8335925060208401356001600160401b0381111561291857600080fd5b61292486828701612618565b9497909650939450505050565b60008151808452612949816020860160208601612ba8565b601f01601f19169290920160200192915050565b6000845160206129708285838a01612ba8565b8551918401916129838184848a01612ba8565b8554920191600090600181811c90808316806129a057607f831692505b8583108114156129be57634e487b7160e01b85526022600452602485fd5b8080156129d257600181146129e357612a10565b60ff19851688528388019550612a10565b60008b81526020902060005b85811015612a085781548a8201529084019088016129ef565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612a5490830184612931565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612a9657835183529284019291840191600101612a7a565b50909695505050505050565b6020815260006119f46020830184612931565b602080825260149082015273496e76616c6964206d696e7420616d6f756e742160601b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601490820152734d617820737570706c792065786365656465642160601b604082015260600190565b60008219821115612b5957612b59612c3e565b500190565b600082612b6d57612b6d612c54565b500490565b6000816000190483118215151615612b8c57612b8c612c3e565b500290565b600082821015612ba357612ba3612c3e565b500390565b60005b83811015612bc3578181015183820152602001612bab565b8381111561129b5750506000910152565b600181811c90821680612be857607f821691505b60208210811415612c0957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612c2357612c23612c3e565b5060010190565b600082612c3957612c39612c54565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610cf257600080fdfea26469706673582212206c636ad46fa2726fb79efe54dcf28eabf95053c0c473de7ea1d0d6a16aac7d1f64736f6c63430008070033

Deployed Bytecode Sourcemap

47222:7936:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26865:305;;;;;;;;;;-1:-1:-1;26865:305:0;;;;;:::i;:::-;;:::i;:::-;;;9809:14:1;;9802:22;9784:41;;9772:2;9757:18;26865:305:0;;;;;;;;29978:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;31481:204::-;;;;;;;;;;-1:-1:-1;31481:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8470:32:1;;;8452:51;;8440:2;8425:18;31481:204:0;8306:203:1;31044:371:0;;;;;;;;;;-1:-1:-1;31044:371:0;;;;;:::i;:::-;;:::i;:::-;;47702:38;;;;;;;;;;;;;;;;;;;9982:25:1;;;9970:2;9955:18;47702:38:0;9836:177:1;53359:169:0;;;;;;;;;;-1:-1:-1;53359:169:0;;;;;:::i;:::-;;:::i;47872:36::-;;;;;;;;;;;;;;;;47616:33;;;;;;;;;;;;;;;;54302:100;;;;;;;;;;-1:-1:-1;54302:100:0;;;;;:::i;:::-;;:::i;54408:77::-;;;;;;;;;;-1:-1:-1;54408:77:0;;;;;:::i;:::-;;:::i;26114:303::-;;;;;;;;;;;;52728:1;26368:12;26158:7;26352:13;:28;-1:-1:-1;;26352:46:0;;26114:303;48106:55;;;;;;;;;;-1:-1:-1;48106:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;32346:170;;;;;;;;;;-1:-1:-1;32346:170:0;;;;;:::i;:::-;;:::i;53934:118::-;;;;;;;;;;-1:-1:-1;53934:118:0;;;;;:::i;:::-;;:::i;47305:94::-;;;;;;;;;;;;;;;;48037:30;;;;;;;;;;-1:-1:-1;48037:30:0;;;;;;;;;;;54703:155;;;:::i;32587:185::-;;;;;;;;;;-1:-1:-1;32587:185:0;;;;;:::i;:::-;;:::i;51838:796::-;;;;;;;;;;-1:-1:-1;51838:796:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;53279:74::-;;;;;;;;;;-1:-1:-1;53279:74:0;;;;;:::i;:::-;;:::i;47958:41::-;;;;;;;;;;;;;;;;54058:132;;;;;;;;;;-1:-1:-1;54058:132:0;;;;;:::i;:::-;;:::i;48072:27::-;;;;;;;;;;-1:-1:-1;48072:27:0;;;;;;;;;;;47537:33;;;;;;;;;;;;;:::i;54595:85::-;;;;;;;;;;-1:-1:-1;54595:85:0;;;;;:::i;:::-;;:::i;48007:25::-;;;;;;;;;;-1:-1:-1;48007:25:0;;;;;;;;47426:82;;;;;;;;;;;;;:::i;29786:125::-;;;;;;;;;;-1:-1:-1;29786:125:0;;;;;:::i;:::-;;:::i;54864:181::-;;;;;;;;;;-1:-1:-1;54864:181:0;;;;;:::i;:::-;;:::i;27234:206::-;;;;;;;;;;-1:-1:-1;27234:206:0;;;;;:::i;:::-;;:::i;46323:103::-;;;;;;;;;;;;;:::i;47746:37::-;;;;;;;;;;;;;;;;54491:98;;;;;;;;;;-1:-1:-1;54491:98:0;;;;;:::i;:::-;;:::i;54196:100::-;;;;;;;;;;-1:-1:-1;54196:100:0;;;;;:::i;:::-;;:::i;45672:87::-;;;;;;;;;;-1:-1:-1;45745:6:0;;-1:-1:-1;;;;;45745:6:0;45672:87;;47914:38;;;;;;;;;;;;;;;;30147:104;;;;;;;;;;;;;:::i;53802:126::-;;;;;;;;;;-1:-1:-1;53802:126:0;;;;;:::i;:::-;;:::i;31757:287::-;;;;;;;;;;-1:-1:-1;31757:287:0;;;;;:::i;:::-;;:::i;47576:31::-;;;;;;;;;;;;;:::i;53666:130::-;;;;;;;;;;-1:-1:-1;53666:130:0;;;;;:::i;:::-;;:::i;32843:369::-;;;;;;;;;;-1:-1:-1;32843:369:0;;;;;:::i;:::-;;:::i;47660:36::-;;;;;;;;;;;;;;;;49436:1822;;;;;;:::i;:::-;;:::i;52741:445::-;;;;;;;;;;-1:-1:-1;52741:445:0;;;;;:::i;:::-;;:::i;53534:126::-;;;;;;;;;;-1:-1:-1;53534:126:0;;;;;:::i;:::-;;:::i;47833:31::-;;;;;;;;;;;;;;;;53192:81;;;;;;;;;;-1:-1:-1;53192:81:0;;;;;:::i;:::-;;:::i;32115:164::-;;;;;;;;;;-1:-1:-1;32115:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;32236:25:0;;;32212:4;32236:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;32115:164;51519:155;;;;;;;;;;-1:-1:-1;51519:155:0;;;;;:::i;:::-;;:::i;51264:251::-;;;;;;:::i;:::-;;:::i;47789:38::-;;;;;;;;;;;;;;;;46581:201;;;;;;;;;;-1:-1:-1;46581:201:0;;;;;:::i;:::-;;:::i;26865:305::-;26967:4;-1:-1:-1;;;;;;27004:40:0;;-1:-1:-1;;;27004:40:0;;:105;;-1:-1:-1;;;;;;;27061:48:0;;-1:-1:-1;;;27061:48:0;27004:105;:158;;;-1:-1:-1;;;;;;;;;;13583:40:0;;;27126:36;26984:178;26865:305;-1:-1:-1;;26865:305:0:o;29978:100::-;30032:13;30065:5;30058:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29978:100;:::o;31481:204::-;31549:7;31574:16;31582:7;31574;:16::i;:::-;31569:64;;31599:34;;-1:-1:-1;;;31599:34:0;;;;;;;;;;;31569:64;-1:-1:-1;31653:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;31653:24:0;;31481:204::o;31044:371::-;31117:13;31133:24;31149:7;31133:15;:24::i;:::-;31117:40;;31178:5;-1:-1:-1;;;;;31172:11:0;:2;-1:-1:-1;;;;;31172:11:0;;31168:48;;;31192:24;;-1:-1:-1;;;31192:24:0;;;;;;;;;;;31168:48;22461:10;-1:-1:-1;;;;;31233:21:0;;;;;;:63;;-1:-1:-1;31259:37:0;31276:5;22461:10;32115:164;:::i;31259:37::-;31258:38;31233:63;31229:138;;;31320:35;;-1:-1:-1;;;31320:35:0;;;;;;;;;;;31229:138;31379:28;31388:2;31392:7;31401:5;31379:8;:28::i;:::-;31106:309;31044:371;;:::o;53359:169::-;45745:6;;-1:-1:-1;;;;;45745:6:0;22461:10;45892:23;45884:68;;;;-1:-1:-1;;;45884:68:0;;;;;;;:::i;:::-;;;;;;;;;53449:9:::1;;53438:7;:20;;53430:52;;;::::0;-1:-1:-1;;;53430:52:0;;11906:2:1;53430:52:0::1;::::0;::::1;11888:21:1::0;11945:2;11925:18;;;11918:30;-1:-1:-1;;;11964:18:1;;;11957:49;12023:18;;53430:52:0::1;11704:343:1::0;53430:52:0::1;53491:21;:31:::0;53359:169::o;54302:100::-;45745:6;;-1:-1:-1;;;;;45745:6:0;22461:10;45892:23;45884:68;;;;-1:-1:-1;;;45884:68:0;;;;;;;:::i;:::-;54374:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;54302:100:::0;:::o;54408:77::-;45745:6;;-1:-1:-1;;;;;45745:6:0;22461:10;45892:23;45884:68;;;;-1:-1:-1;;;45884:68:0;;;;;;;:::i;:::-;54464:6:::1;:15:::0;;-1:-1:-1;;54464:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;54408:77::o;32346:170::-;32480:28;32490:4;32496:2;32500:7;32480:9;:28::i;53934:118::-;45745:6;;-1:-1:-1;;;;;45745:6:0;22461:10;45892:23;45884:68;;;;-1:-1:-1;;;45884:68:0;;;;;;;:::i;:::-;54012:15:::1;:34:::0;53934:118::o;54703:155::-;45745:6;;-1:-1:-1;;;;;45745:6:0;22461:10;45892:23;45884:68;;;;-1:-1:-1;;;45884:68:0;;;;;;;:::i;:::-;54760:7:::1;54781;45745:6:::0;;-1:-1:-1;;;;;45745:6:0;;45672:87;54781:7:::1;-1:-1:-1::0;;;;;54773:21:0::1;54802;54773:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54759:69;;;54844:2;54836:11;;;::::0;::::1;;54748:110;54703:155::o:0;32587:185::-;32725:39;32742:4;32748:2;32752:7;32725:39;;;;;;;;;;;;:16;:39::i;51838:796::-;51898:16;51923:23;51949:17;51959:6;51949:9;:17::i;:::-;51923:43;;51973:30;52020:15;-1:-1:-1;;;;;52006:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52006:30:0;-1:-1:-1;51973:63:0;-1:-1:-1;52728:1:0;52043:22;;52159:441;52184:15;52166;:33;:64;;;;;52221:9;;52203:14;:27;;52166:64;52159:441;;;52241:31;52275:27;;;:11;:27;;;;;;;;;52241:61;;;;;;;;;-1:-1:-1;;;;;52241:61:0;;;;-1:-1:-1;;;52241:61:0;;-1:-1:-1;;;;;52241:61:0;;;;;;;;-1:-1:-1;;;52241:61:0;;;;;;;;;;;;;;;;52317:49;;-1:-1:-1;52338:14:0;;-1:-1:-1;;;;;52338:28:0;;;52317:49;52313:111;;;52400:14;;;-1:-1:-1;52313:111:0;52460:6;-1:-1:-1;;;;;52438:28:0;:18;-1:-1:-1;;;;;52438:28:0;;52434:132;;;52512:14;52479:13;52493:15;52479:30;;;;;;;;:::i;:::-;;;;;;;;;;:47;52539:17;;;;:::i;:::-;;;;52434:132;52576:16;;;;:::i;:::-;;;;52232:368;52159:441;;;-1:-1:-1;52615:13:0;;51838:796;-1:-1:-1;;;;;51838:796:0:o;53279:74::-;45745:6;;-1:-1:-1;;;;;45745:6:0;22461:10;45892:23;45884:68;;;;-1:-1:-1;;;45884:68:0;;;;;;;:::i;:::-;53335:4:::1;:12:::0;53279:74::o;54058:132::-;45745:6;;-1:-1:-1;;;;;45745:6:0;22461:10;45892:23;45884:68;;;;-1:-1:-1;;;45884:68:0;;;;;;;:::i;:::-;54146:38;;::::1;::::0;:17:::1;::::0;:38:::1;::::0;::::1;::::0;::::1;:::i;47537:33::-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54595:85::-;45745:6;;-1:-1:-1;;;;;45745:6:0;22461:10;45892:23;45884:68;;;;-1:-1:-1;;;45884:68:0;;;;;;;:::i;:::-;54655:10:::1;:19:::0;;;::::1;;;;-1:-1:-1::0;;54655:19:0;;::::1;::::0;;;::::1;::::0;;54595:85::o;47426:82::-;;;;;;;:::i;29786:125::-;29850:7;29877:21;29890:7;29877:12;:21::i;:::-;:26;;29786:125;-1:-1:-1;;29786:125:0:o;54864:181::-;45745:6;;-1:-1:-1;;;;;45745:6:0;22461:10;45892:23;45884:68;;;;-1:-1:-1;;;45884:68:0;;;;;;;:::i;:::-;54949:6:::1;54944:96;54959:17:::0;;::::1;54944:96;;;55028:4;54994:20;:31;55015:6;;55022:1;55015:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;54994:31:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;54994:31:0;:38;;-1:-1:-1;;54994:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;54978:3;::::1;::::0;::::1;:::i;:::-;;;;54944:96;;27234:206:::0;27298:7;-1:-1:-1;;;;;27322:19:0;;27318:60;;27350:28;;-1:-1:-1;;;27350:28:0;;;;;;;;;;;27318:60;-1:-1:-1;;;;;;27404:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;27404:27:0;;27234:206::o;46323:103::-;45745:6;;-1:-1:-1;;;;;45745:6:0;22461:10;45892:23;45884:68;;;;-1:-1:-1;;;45884:68:0;;;;;;;:::i;:::-;46388:30:::1;46415:1;46388:18;:30::i;:::-;46323:103::o:0;54491:98::-;45745:6;;-1:-1:-1;;;;;45745:6:0;22461:10;45892:23;45884:68;;;;-1:-1:-1;;;45884:68:0;;;;;;;:::i;:::-;54559:10:::1;:24:::0;54491:98::o;54196:100::-;45745:6;;-1:-1:-1;;;;;45745:6:0;22461:10;45892:23;45884:68;;;;-1:-1:-1;;;45884:68:0;;;;;;;:::i;:::-;54268:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;30147:104::-:0;30203:13;30236:7;30229:14;;;;;:::i;53802:126::-;45745:6;;-1:-1:-1;;;;;45745:6:0;22461:10;45892:23;45884:68;;;;-1:-1:-1;;;45884:68:0;;;;;;;:::i;:::-;53884:17:::1;:38:::0;53802:126::o;31757:287::-;-1:-1:-1;;;;;31856:24:0;;22461:10;31856:24;31852:54;;;31889:17;;-1:-1:-1;;;31889:17:0;;;;;;;;;;;31852:54;22461:10;31919:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;31919:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;31919:53:0;;;;;;;;;;31988:48;;9784:41:1;;;31919:42:0;;22461:10;31988:48;;9757:18:1;31988:48:0;;;;;;;31757:287;;:::o;47576:31::-;;;;;;;:::i;53666:130::-;45745:6;;-1:-1:-1;;;;;45745:6:0;22461:10;45892:23;45884:68;;;;-1:-1:-1;;;45884:68:0;;;;;;;:::i;:::-;53750:18:::1;:40:::0;53666:130::o;32843:369::-;33010:28;33020:4;33026:2;33030:7;33010:9;:28::i;:::-;-1:-1:-1;;;;;33053:13:0;;3686:19;:23;;33053:76;;;;;33073:56;33104:4;33110:2;33114:7;33123:5;33073:30;:56::i;:::-;33072:57;33053:76;33049:156;;;33153:40;;-1:-1:-1;;;33153:40:0;;;;;;;;;;;33049:156;32843:369;;;;:::o;49436:1822::-;49527:11;48564:7;45745:6;;-1:-1:-1;;;;;45745:6:0;;45672:87;48564:7;-1:-1:-1;;;;;48550:21:0;:10;-1:-1:-1;;;;;48550:21:0;;48546:131;;48602:1;48588:11;:15;:52;;;;;48622:18;;48607:11;:33;;48588:52;48580:85;;;;-1:-1:-1;;;48580:85:0;;;;;;;:::i;:::-;48722:9;;48707:11;48691:13;52728:1;26368:12;26158:7;26352:13;:28;-1:-1:-1;;26352:46:0;;26114:303;48691:13;:27;;;;:::i;:::-;:40;;48683:73;;;;-1:-1:-1;;;48683:73:0;;;;;;;:::i;:::-;48881:10:::1;48833:24;48860:32:::0;;;:20:::1;:32;::::0;;;;;48922:17:::1;::::0;49560:11;;48860:32;48902:37;::::1;48898:124;;48980:11;48973:4;;:18;;;;:::i;:::-;48960:9;:31;;48952:63;;;::::0;-1:-1:-1;;;48952:63:0;;14793:2:1;48952:63:0::1;::::0;::::1;14775:21:1::0;14832:2;14812:18;;;14805:30;-1:-1:-1;;;14851:18:1;;;14844:49;14910:18;;48952:63:0::1;14591:343:1::0;48952:63:0::1;49589:6:::2;::::0;::::2;;49588:7;49580:43;;;::::0;-1:-1:-1;;;49580:43:0;;12968:2:1;49580:43:0::2;::::0;::::2;12950:21:1::0;13007:2;12987:18;;;12980:30;13046:25;13026:18;;;13019:53;13089:18;;49580:43:0::2;12766:347:1::0;49580:43:0::2;49639:10;::::0;::::2;::::0;::::2;;;49631:46;;;::::0;-1:-1:-1;;;49631:46:0;;14441:2:1;49631:46:0::2;::::0;::::2;14423:21:1::0;14480:2;14460:18;;;14453:30;14519:25;14499:18;;;14492:53;14562:18;;49631:46:0::2;14239:347:1::0;49631:46:0::2;49732:10;49684:24;49711:32:::0;;;:20:::2;:32;::::0;;;;;;;;49775:28;;49711:32;;49775:28:::2;::::0;49732:10;;49775:28:::2;6479:2:1::0;6475:15;;;;-1:-1:-1;;6471:53:1;6459:66;;6550:2;6541:12;;6330:229;49775:28:0::2;;;;;;;;;;;;;49765:39;;;;;;49750:54;;49818:43;49837:5;;49818:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;;49844:10:0::2;::::0;;-1:-1:-1;49856:4:0;;-1:-1:-1;49818:18:0::2;:43::i;:::-;49817:44;:135;;;;49867:43;49886:5;;49867:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;;49893:10:0::2;::::0;;-1:-1:-1;49905:4:0;;-1:-1:-1;49867:18:0::2;:43::i;:::-;:84;;;;;49934:17;;49914:16;:37;;49867:84;49813:1442;;;50008:15;;49993:11;49973:17;;:31;;;;:::i;:::-;:50;;49965:90;;;::::0;-1:-1:-1;;;49965:90:0;;14085:2:1;49965:90:0::2;::::0;::::2;14067:21:1::0;14124:2;14104:18;;;14097:30;14163:29;14143:18;;;14136:57;14210:18;;49965:90:0::2;13883:351:1::0;49965:90:0::2;50089:17;;50070:16;:36;50066:323;;;50167:17;::::0;50133:30:::2;50152:11:::0;50133:16;:30:::2;:::i;:::-;:51;;50125:88;;;::::0;-1:-1:-1;;;50125:88:0;;12254:2:1;50125:88:0::2;::::0;::::2;12236:21:1::0;12293:2;12273:18;;;12266:30;-1:-1:-1;;;12312:18:1;;;12305:54;12376:18;;50125:88:0::2;12052:348:1::0;50125:88:0::2;50066:323;;;50255:17;;50235:16;:37;50231:158;;50332:21;::::0;50298:30:::2;50317:11:::0;50298:16;:30:::2;:::i;:::-;:55;;50290:87;;;::::0;-1:-1:-1;;;50290:87:0;;10444:2:1;50290:87:0::2;::::0;::::2;10426:21:1::0;10483:2;10463:18;;;10456:30;-1:-1:-1;;;10502:18:1;;;10495:49;10561:18;;50290:87:0::2;10242:343:1::0;50290:87:0::2;50397:36;22461:10:::0;50407:12:::2;50421:11;50397:9;:36::i;:::-;50457:1;50440:124;50464:11;50460:1;:15;50440:124;;50513:10;50492:32;::::0;;;:20:::2;:32;::::0;;;;:34;;;::::2;::::0;::::2;:::i;:::-;::::0;;;-1:-1:-1;;50537:17:0::2;:19:::0;;;:17:::2;:19;::::0;::::2;:::i;:::-;;;;;;50477:3;;;;;:::i;:::-;;;;50440:124;;;;49813:1442;;;50590:43;50609:5;;50590:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;;50616:10:0::2;::::0;;-1:-1:-1;50628:4:0;;-1:-1:-1;50590:18:0::2;:43::i;:::-;50586:669;;;50690:17;;50675:11;50653:19;;:33;;;;:::i;:::-;:54;;50645:96;;;::::0;-1:-1:-1;;;50645:96:0;;11548:2:1;50645:96:0::2;::::0;::::2;11530:21:1::0;11587:2;11567:18;;;11560:30;11626:31;11606:18;;;11599:59;11675:18;;50645:96:0::2;11346:353:1::0;50645:96:0::2;50774:17;;50755:16;:36;50751:323;;;50852:17;::::0;50818:30:::2;50837:11:::0;50818:16;:30:::2;:::i;:::-;:51;;50810:88;;;::::0;-1:-1:-1;;;50810:88:0;;12254:2:1;50810:88:0::2;::::0;::::2;12236:21:1::0;12293:2;12273:18;;;12266:30;-1:-1:-1;;;12312:18:1;;;12305:54;12376:18;;50810:88:0::2;12052:348:1::0;50810:88:0::2;50751:323;;;50940:17;;50920:16;:37;50916:158;;51017:21;::::0;50983:30:::2;51002:11:::0;50983:16;:30:::2;:::i;:::-;:55;;50975:87;;;::::0;-1:-1:-1;;;50975:87:0;;10444:2:1;50975:87:0::2;::::0;::::2;10426:21:1::0;10483:2;10463:18;;;10456:30;-1:-1:-1;;;10502:18:1;;;10495:49;10561:18;;50975:87:0::2;10242:343:1::0;50975:87:0::2;51082:36;22461:10:::0;51092:12:::2;22381:98:::0;51082:36:::2;51142:1;51125:125;51149:11;51145:1;:15;51125:125;;51198:10;51177:32;::::0;;;:20:::2;:32;::::0;;;;:34;;;::::2;::::0;::::2;:::i;:::-;::::0;;;-1:-1:-1;;51222:19:0::2;:21:::0;;;:19:::2;:21;::::0;::::2;:::i;:::-;;;;;;51162:3;;;;;:::i;:::-;;;;51125:125;;;;50586:669;49573:1685;;48826:213:::1;48763:1;49436:1822:::0;;;;:::o;52741:445::-;52815:13;52845:17;52853:8;52845:7;:17::i;:::-;52837:77;;;;-1:-1:-1;;;52837:77:0;;13320:2:1;52837:77:0;;;13302:21:1;13359:2;13339:18;;;13332:30;13398:34;13378:18;;;13371:62;-1:-1:-1;;;13449:18:1;;;13442:45;13504:19;;52837:77:0;13118:411:1;52837:77:0;52927:8;;;;;;;52923:64;;52962:17;52955:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52741:445;;;:::o;52923:64::-;52995:28;53026:10;:8;:10::i;:::-;52995:41;;53081:1;53056:14;53050:28;:32;:130;;;;;;;;;;;;;;;;;53118:14;53134:19;:8;:17;:19::i;:::-;53155:9;53101:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53050:130;53043:137;52741:445;-1:-1:-1;;;52741:445:0:o;53534:126::-;45745:6;;-1:-1:-1;;;;;45745:6:0;22461:10;45892:23;45884:68;;;;-1:-1:-1;;;45884:68:0;;;;;;;:::i;:::-;53616:17:::1;:38:::0;53534:126::o;53192:81::-;45745:6;;-1:-1:-1;;;;;45745:6:0;22461:10;45892:23;45884:68;;;;-1:-1:-1;;;45884:68:0;;;;;;;:::i;:::-;53250:8:::1;:17:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;53250:17:0;;::::1;::::0;;;::::1;::::0;;53192:81::o;51519:155::-;51605:11;48564:7;45745:6;;-1:-1:-1;;;;;45745:6:0;;45672:87;48564:7;-1:-1:-1;;;;;48550:21:0;:10;-1:-1:-1;;;;;48550:21:0;;48546:131;;48602:1;48588:11;:15;:52;;;;;48622:18;;48607:11;:33;;48588:52;48580:85;;;;-1:-1:-1;;;48580:85:0;;;;;;;:::i;:::-;48722:9;;48707:11;48691:13;52728:1;26368:12;26158:7;26352:13;:28;-1:-1:-1;;26352:46:0;;26114:303;48691:13;:27;;;;:::i;:::-;:40;;48683:73;;;;-1:-1:-1;;;48683:73:0;;;;;;;:::i;:::-;45745:6;;-1:-1:-1;;;;;45745:6:0;22461:10;45892:23:::1;45884:68;;;;-1:-1:-1::0;;;45884:68:0::1;;;;;;;:::i;:::-;51635:33:::2;51645:9;51656:11;51635:9;:33::i;51264:251::-:0;45745:6;;-1:-1:-1;;;;;45745:6:0;22461:10;45892:23;45884:68;;;;-1:-1:-1;;;45884:68:0;;;;;;;:::i;:::-;51359:1:::1;51345:11;:15;51337:48;;;;-1:-1:-1::0;;;51337:48:0::1;;;;;;;:::i;:::-;51432:9;;51417:11;51401:13;52728:1:::0;26368:12;26158:7;26352:13;:28;-1:-1:-1;;26352:46:0;;26114:303;51401:13:::1;:27;;;;:::i;:::-;:40;;51393:73;;;;-1:-1:-1::0;;;51393:73:0::1;;;;;;;:::i;:::-;51473:36;22461:10:::0;51497:11:::1;51473:9;:36::i;46581:201::-:0;45745:6;;-1:-1:-1;;;;;45745:6:0;22461:10;45892:23;45884:68;;;;-1:-1:-1;;;45884:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46670:22:0;::::1;46662:73;;;::::0;-1:-1:-1;;;46662:73:0;;10792:2:1;46662:73:0::1;::::0;::::1;10774:21:1::0;10831:2;10811:18;;;10804:30;10870:34;10850:18;;;10843:62;-1:-1:-1;;;10921:18:1;;;10914:36;10967:19;;46662:73:0::1;10590:402:1::0;46662:73:0::1;46746:28;46765:8;46746:18;:28::i;3391:326::-:0;-1:-1:-1;;;;;3686:19:0;;:23;;;3391:326::o;33467:174::-;33524:4;33567:7;52728:1;33548:26;;:53;;;;;33588:13;;33578:7;:23;33548:53;:85;;;;-1:-1:-1;;33606:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;33606:27:0;;;;33605:28;;33467:174::o;41624:196::-;41739:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;41739:29:0;-1:-1:-1;;;;;41739:29:0;;;;;;;;;41784:28;;41739:24;;41784:28;;;;;;;41624:196;;;:::o;36567:2130::-;36682:35;36720:21;36733:7;36720:12;:21::i;:::-;36682:59;;36780:4;-1:-1:-1;;;;;36758:26:0;:13;:18;;;-1:-1:-1;;;;;36758:26:0;;36754:67;;36793:28;;-1:-1:-1;;;36793:28:0;;;;;;;;;;;36754:67;36834:22;22461:10;-1:-1:-1;;;;;36860:20:0;;;;:73;;-1:-1:-1;36897:36:0;36914:4;22461:10;32115:164;:::i;36897:36::-;36860:126;;;-1:-1:-1;22461:10:0;36950:20;36962:7;36950:11;:20::i;:::-;-1:-1:-1;;;;;36950:36:0;;36860:126;36834:153;;37005:17;37000:66;;37031:35;;-1:-1:-1;;;37031:35:0;;;;;;;;;;;37000:66;-1:-1:-1;;;;;37081:16:0;;37077:52;;37106:23;;-1:-1:-1;;;37106:23:0;;;;;;;;;;;37077:52;37250:35;37267:1;37271:7;37280:4;37250:8;:35::i;:::-;-1:-1:-1;;;;;37581:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;37581:31:0;;;-1:-1:-1;;;;;37581:31:0;;;-1:-1:-1;;37581:31:0;;;;;;;37627:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;37627:29:0;;;;;;;;;;;37707:20;;;:11;:20;;;;;;37742:18;;-1:-1:-1;;;;;;37775:49:0;;;;-1:-1:-1;;;37808:15:0;37775:49;;;;;;;;;;38098:11;;38158:24;;;;;38201:13;;37707:20;;38158:24;;38201:13;38197:384;;38411:13;;38396:11;:28;38392:174;;38449:20;;38518:28;;;;-1:-1:-1;;;;;38492:54:0;-1:-1:-1;;;38492:54:0;-1:-1:-1;;;;;;38492:54:0;;;-1:-1:-1;;;;;38449:20:0;;38492:54;;;;38392:174;37556:1036;;;38628:7;38624:2;-1:-1:-1;;;;;38609:27:0;38618:4;-1:-1:-1;;;;;38609:27:0;;;;;;;;;;;38647:42;36671:2026;;36567:2130;;;:::o;28615:1109::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;28726:7:0;;52728:1;28775:23;;:47;;;;;28809:13;;28802:4;:20;28775:47;28771:886;;;28843:31;28877:17;;;:11;:17;;;;;;;;;28843:51;;;;;;;;;-1:-1:-1;;;;;28843:51:0;;;;-1:-1:-1;;;28843:51:0;;-1:-1:-1;;;;;28843:51:0;;;;;;;;-1:-1:-1;;;28843:51:0;;;;;;;;;;;;;;28913:729;;28963:14;;-1:-1:-1;;;;;28963:28:0;;28959:101;;29027:9;28615:1109;-1:-1:-1;;;28615:1109:0:o;28959:101::-;-1:-1:-1;;;29402:6:0;29447:17;;;;:11;:17;;;;;;;;;29435:29;;;;;;;;;-1:-1:-1;;;;;29435:29:0;;;;;-1:-1:-1;;;29435:29:0;;-1:-1:-1;;;;;29435:29:0;;;;;;;;-1:-1:-1;;;29435:29:0;;;;;;;;;;;;;29495:28;29491:109;;29563:9;28615:1109;-1:-1:-1;;;28615:1109:0:o;29491:109::-;29362:261;;;28824:833;28771:886;29685:31;;-1:-1:-1;;;29685:31:0;;;;;;;;;;;46942:191;47035:6;;;-1:-1:-1;;;;;47052:17:0;;;-1:-1:-1;;;;;;47052:17:0;;;;;;;47085:40;;47035:6;;;47052:17;47035:6;;47085:40;;47016:16;;47085:40;47005:128;46942:191;:::o;42312:667::-;42496:72;;-1:-1:-1;;;42496:72:0;;42475:4;;-1:-1:-1;;;;;42496:36:0;;;;;:72;;22461:10;;42547:4;;42553:7;;42562:5;;42496:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42496:72:0;;;;;;;;-1:-1:-1;;42496:72:0;;;;;;;;;;;;:::i;:::-;;;42492:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42730:13:0;;42726:235;;42776:40;;-1:-1:-1;;;42776:40:0;;;;;;;;;;;42726:235;42919:6;42913:13;42904:6;42900:2;42896:15;42889:38;42492:480;-1:-1:-1;;;;;;42615:55:0;-1:-1:-1;;;42615:55:0;;-1:-1:-1;42492:480:0;42312:667;;;;;;:::o;20236:190::-;20361:4;20414;20385:25;20398:5;20405:4;20385:12;:25::i;:::-;:33;;20236:190;-1:-1:-1;;;;20236:190:0:o;33649:104::-;33718:27;33728:2;33732:8;33718:27;;;;;;;;;;;;:9;:27::i;55051:104::-;55111:13;55140:9;55133:16;;;;;:::i;399:723::-;455:13;676:10;672:53;;-1:-1:-1;;703:10:0;;;;;;;;;;;;-1:-1:-1;;;703:10:0;;;;;399:723::o;672:53::-;750:5;735:12;791:78;798:9;;791:78;;824:8;;;;:::i;:::-;;-1:-1:-1;847:10:0;;-1:-1:-1;855:2:0;847:10;;:::i;:::-;;;791:78;;;879:19;911:6;-1:-1:-1;;;;;901:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;901:17:0;;879:39;;929:154;936:10;;929:154;;963:11;973:1;963:11;;:::i;:::-;;-1:-1:-1;1032:10:0;1040:2;1032:5;:10;:::i;:::-;1019:24;;:2;:24;:::i;:::-;1006:39;;989:6;996;989:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;989:56:0;;;;;;;;-1:-1:-1;1060:11:0;1069:2;1060:11;;:::i;:::-;;;929:154;;20788:675;20871:7;20914:4;20871:7;20929:497;20953:5;:12;20949:1;:16;20929:497;;;20987:20;21010:5;21016:1;21010:8;;;;;;;;:::i;:::-;;;;;;;20987:31;;21053:12;21037;:28;21033:382;;21539:13;21589:15;;;21625:4;21618:15;;;21672:4;21656:21;;21165:57;;21033:382;;;21539:13;21589:15;;;21625:4;21618:15;;;21672:4;21656:21;;21342:57;;21033:382;-1:-1:-1;20967:3:0;;;;:::i;:::-;;;;20929:497;;;-1:-1:-1;21443:12:0;20788:675;-1:-1:-1;;;20788:675:0:o;34116:163::-;34239:32;34245:2;34249:8;34259:5;34266:4;34677:20;34700:13;-1:-1:-1;;;;;34728:16:0;;34724:48;;34753:19;;-1:-1:-1;;;34753:19:0;;;;;;;;;;;34724:48;34787:13;34783:44;;34809:18;;-1:-1:-1;;;34809:18:0;;;;;;;;;;;34783:44;-1:-1:-1;;;;;35178:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;35237:49:0;;-1:-1:-1;;;;;35178:44:0;;;;;;;35237:49;;;;-1:-1:-1;;35178:44:0;;;;;;35237:49;;;;;;;;;;;;;;;;35303:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;35353:66:0;;;;-1:-1:-1;;;35403:15:0;35353:66;;;;;;;;;;35303:25;35500:23;;;35544:4;:23;;;;-1:-1:-1;;;;;;35552:13:0;;3686:19;:23;;35552:15;35540:641;;;35588:314;35619:38;;35644:12;;-1:-1:-1;;;;;35619:38:0;;;35636:1;;35619:38;;35636:1;;35619:38;35685:69;35724:1;35728:2;35732:14;;;;;;35748:5;35685:30;:69::i;:::-;35680:174;;35790:40;;-1:-1:-1;;;35790:40:0;;;;;;;;;;;35680:174;35897:3;35881:12;:19;;35588:314;;35983:12;35966:13;;:29;35962:43;;35997:8;;;35962:43;35540:641;;;36046:120;36077:40;;36102:14;;;;;-1:-1:-1;;;;;36077:40:0;;;36094:1;;36077:40;;36094:1;;36077:40;36161:3;36145:12;:19;;36046:120;;35540:641;-1:-1:-1;36195:13:0;:28;36245:60;32843:369;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;-1:-1:-1;;;;;149:2:1;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:367::-;891:8;901:6;955:3;948:4;940:6;936:17;932:27;922:55;;973:1;970;963:12;922:55;-1:-1:-1;996:20:1;;-1:-1:-1;;;;;1028:30:1;;1025:50;;;1071:1;1068;1061:12;1025:50;1108:4;1100:6;1096:17;1084:29;;1168:3;1161:4;1151:6;1148:1;1144:14;1136:6;1132:27;1128:38;1125:47;1122:67;;;1185:1;1182;1175:12;1122:67;828:367;;;;;:::o;1200:160::-;1265:20;;1321:13;;1314:21;1304:32;;1294:60;;1350:1;1347;1340:12;1365:186;1424:6;1477:2;1465:9;1456:7;1452:23;1448:32;1445:52;;;1493:1;1490;1483:12;1445:52;1516:29;1535:9;1516:29;:::i;1556:260::-;1624:6;1632;1685:2;1673:9;1664:7;1660:23;1656:32;1653:52;;;1701:1;1698;1691:12;1653:52;1724:29;1743:9;1724:29;:::i;:::-;1714:39;;1772:38;1806:2;1795:9;1791:18;1772:38;:::i;:::-;1762:48;;1556:260;;;;;:::o;1821:328::-;1898:6;1906;1914;1967:2;1955:9;1946:7;1942:23;1938:32;1935:52;;;1983:1;1980;1973:12;1935:52;2006:29;2025:9;2006:29;:::i;:::-;1996:39;;2054:38;2088:2;2077:9;2073:18;2054:38;:::i;:::-;2044:48;;2139:2;2128:9;2124:18;2111:32;2101:42;;1821:328;;;;;:::o;2154:666::-;2249:6;2257;2265;2273;2326:3;2314:9;2305:7;2301:23;2297:33;2294:53;;;2343:1;2340;2333:12;2294:53;2366:29;2385:9;2366:29;:::i;:::-;2356:39;;2414:38;2448:2;2437:9;2433:18;2414:38;:::i;:::-;2404:48;;2499:2;2488:9;2484:18;2471:32;2461:42;;2554:2;2543:9;2539:18;2526:32;-1:-1:-1;;;;;2573:6:1;2570:30;2567:50;;;2613:1;2610;2603:12;2567:50;2636:22;;2689:4;2681:13;;2677:27;-1:-1:-1;2667:55:1;;2718:1;2715;2708:12;2667:55;2741:73;2806:7;2801:2;2788:16;2783:2;2779;2775:11;2741:73;:::i;:::-;2731:83;;;2154:666;;;;;;;:::o;2825:254::-;2890:6;2898;2951:2;2939:9;2930:7;2926:23;2922:32;2919:52;;;2967:1;2964;2957:12;2919:52;2990:29;3009:9;2990:29;:::i;:::-;2980:39;;3038:35;3069:2;3058:9;3054:18;3038:35;:::i;3084:254::-;3152:6;3160;3213:2;3201:9;3192:7;3188:23;3184:32;3181:52;;;3229:1;3226;3219:12;3181:52;3252:29;3271:9;3252:29;:::i;:::-;3242:39;3328:2;3313:18;;;;3300:32;;-1:-1:-1;;;3084:254:1:o;3343:437::-;3429:6;3437;3490:2;3478:9;3469:7;3465:23;3461:32;3458:52;;;3506:1;3503;3496:12;3458:52;3546:9;3533:23;-1:-1:-1;;;;;3571:6:1;3568:30;3565:50;;;3611:1;3608;3601:12;3565:50;3650:70;3712:7;3703:6;3692:9;3688:22;3650:70;:::i;:::-;3739:8;;3624:96;;-1:-1:-1;3343:437:1;-1:-1:-1;;;;3343:437:1:o;3785:180::-;3841:6;3894:2;3882:9;3873:7;3869:23;3865:32;3862:52;;;3910:1;3907;3900:12;3862:52;3933:26;3949:9;3933:26;:::i;3970:180::-;4029:6;4082:2;4070:9;4061:7;4057:23;4053:32;4050:52;;;4098:1;4095;4088:12;4050:52;-1:-1:-1;4121:23:1;;3970:180;-1:-1:-1;3970:180:1:o;4155:245::-;4213:6;4266:2;4254:9;4245:7;4241:23;4237:32;4234:52;;;4282:1;4279;4272:12;4234:52;4321:9;4308:23;4340:30;4364:5;4340:30;:::i;4405:249::-;4474:6;4527:2;4515:9;4506:7;4502:23;4498:32;4495:52;;;4543:1;4540;4533:12;4495:52;4575:9;4569:16;4594:30;4618:5;4594:30;:::i;4659:450::-;4728:6;4781:2;4769:9;4760:7;4756:23;4752:32;4749:52;;;4797:1;4794;4787:12;4749:52;4837:9;4824:23;-1:-1:-1;;;;;4862:6:1;4859:30;4856:50;;;4902:1;4899;4892:12;4856:50;4925:22;;4978:4;4970:13;;4966:27;-1:-1:-1;4956:55:1;;5007:1;5004;4997:12;4956:55;5030:73;5095:7;5090:2;5077:16;5072:2;5068;5064:11;5030:73;:::i;5299:254::-;5367:6;5375;5428:2;5416:9;5407:7;5403:23;5399:32;5396:52;;;5444:1;5441;5434:12;5396:52;5480:9;5467:23;5457:33;;5509:38;5543:2;5532:9;5528:18;5509:38;:::i;5558:505::-;5653:6;5661;5669;5722:2;5710:9;5701:7;5697:23;5693:32;5690:52;;;5738:1;5735;5728:12;5690:52;5774:9;5761:23;5751:33;;5835:2;5824:9;5820:18;5807:32;-1:-1:-1;;;;;5854:6:1;5851:30;5848:50;;;5894:1;5891;5884:12;5848:50;5933:70;5995:7;5986:6;5975:9;5971:22;5933:70;:::i;:::-;5558:505;;6022:8;;-1:-1:-1;5907:96:1;;-1:-1:-1;;;;5558:505:1:o;6068:257::-;6109:3;6147:5;6141:12;6174:6;6169:3;6162:19;6190:63;6246:6;6239:4;6234:3;6230:14;6223:4;6216:5;6212:16;6190:63;:::i;:::-;6307:2;6286:15;-1:-1:-1;;6282:29:1;6273:39;;;;6314:4;6269:50;;6068:257;-1:-1:-1;;6068:257:1:o;6564:1527::-;6788:3;6826:6;6820:13;6852:4;6865:51;6909:6;6904:3;6899:2;6891:6;6887:15;6865:51;:::i;:::-;6979:13;;6938:16;;;;7001:55;6979:13;6938:16;7023:15;;;7001:55;:::i;:::-;7145:13;;7078:20;;;7118:1;;7205;7227:18;;;;7280;;;;7307:93;;7385:4;7375:8;7371:19;7359:31;;7307:93;7448:2;7438:8;7435:16;7415:18;7412:40;7409:167;;;-1:-1:-1;;;7475:33:1;;7531:4;7528:1;7521:15;7561:4;7482:3;7549:17;7409:167;7592:18;7619:110;;;;7743:1;7738:328;;;;7585:481;;7619:110;-1:-1:-1;;7654:24:1;;7640:39;;7699:20;;;;-1:-1:-1;7619:110:1;;7738:328;15194:1;15187:14;;;15231:4;15218:18;;7833:1;7847:169;7861:8;7858:1;7855:15;7847:169;;;7943:14;;7928:13;;;7921:37;7986:16;;;;7878:10;;7847:169;;;7851:3;;8047:8;8040:5;8036:20;8029:27;;7585:481;-1:-1:-1;8082:3:1;;6564:1527;-1:-1:-1;;;;;;;;;;;6564:1527:1:o;8514:488::-;-1:-1:-1;;;;;8783:15:1;;;8765:34;;8835:15;;8830:2;8815:18;;8808:43;8882:2;8867:18;;8860:34;;;8930:3;8925:2;8910:18;;8903:31;;;8708:4;;8951:45;;8976:19;;8968:6;8951:45;:::i;:::-;8943:53;8514:488;-1:-1:-1;;;;;;8514:488:1:o;9007:632::-;9178:2;9230:21;;;9300:13;;9203:18;;;9322:22;;;9149:4;;9178:2;9401:15;;;;9375:2;9360:18;;;9149:4;9444:169;9458:6;9455:1;9452:13;9444:169;;;9519:13;;9507:26;;9588:15;;;;9553:12;;;;9480:1;9473:9;9444:169;;;-1:-1:-1;9630:3:1;;9007:632;-1:-1:-1;;;;;;9007:632:1:o;10018:219::-;10167:2;10156:9;10149:21;10130:4;10187:44;10227:2;10216:9;10212:18;10204:6;10187:44;:::i;10997:344::-;11199:2;11181:21;;;11238:2;11218:18;;;11211:30;-1:-1:-1;;;11272:2:1;11257:18;;11250:50;11332:2;11317:18;;10997:344::o;12405:356::-;12607:2;12589:21;;;12626:18;;;12619:30;12685:34;12680:2;12665:18;;12658:62;12752:2;12737:18;;12405:356::o;13534:344::-;13736:2;13718:21;;;13775:2;13755:18;;;13748:30;-1:-1:-1;;;13809:2:1;13794:18;;13787:50;13869:2;13854:18;;13534:344::o;15247:128::-;15287:3;15318:1;15314:6;15311:1;15308:13;15305:39;;;15324:18;;:::i;:::-;-1:-1:-1;15360:9:1;;15247:128::o;15380:120::-;15420:1;15446;15436:35;;15451:18;;:::i;:::-;-1:-1:-1;15485:9:1;;15380:120::o;15505:168::-;15545:7;15611:1;15607;15603:6;15599:14;15596:1;15593:21;15588:1;15581:9;15574:17;15570:45;15567:71;;;15618:18;;:::i;:::-;-1:-1:-1;15658:9:1;;15505:168::o;15678:125::-;15718:4;15746:1;15743;15740:8;15737:34;;;15751:18;;:::i;:::-;-1:-1:-1;15788:9:1;;15678:125::o;15808:258::-;15880:1;15890:113;15904:6;15901:1;15898:13;15890:113;;;15980:11;;;15974:18;15961:11;;;15954:39;15926:2;15919:10;15890:113;;;16021:6;16018:1;16015:13;16012:48;;;-1:-1:-1;;16056:1:1;16038:16;;16031:27;15808:258::o;16071:380::-;16150:1;16146:12;;;;16193;;;16214:61;;16268:4;16260:6;16256:17;16246:27;;16214:61;16321:2;16313:6;16310:14;16290:18;16287:38;16284:161;;;16367:10;16362:3;16358:20;16355:1;16348:31;16402:4;16399:1;16392:15;16430:4;16427:1;16420:15;16284:161;;16071:380;;;:::o;16456:135::-;16495:3;-1:-1:-1;;16516:17:1;;16513:43;;;16536:18;;:::i;:::-;-1:-1:-1;16583:1:1;16572:13;;16456:135::o;16596:112::-;16628:1;16654;16644:35;;16659:18;;:::i;:::-;-1:-1:-1;16693:9:1;;16596:112::o;16713:127::-;16774:10;16769:3;16765:20;16762:1;16755:31;16805:4;16802:1;16795:15;16829:4;16826:1;16819:15;16845:127;16906:10;16901:3;16897:20;16894:1;16887:31;16937:4;16934:1;16927:15;16961:4;16958:1;16951:15;16977:127;17038:10;17033:3;17029:20;17026:1;17019:31;17069:4;17066:1;17059:15;17093:4;17090:1;17083:15;17109:127;17170:10;17165:3;17161:20;17158:1;17151:31;17201:4;17198:1;17191:15;17225:4;17222:1;17215:15;17241:131;-1:-1:-1;;;;;;17315:32:1;;17305:43;;17295:71;;17362:1;17359;17352:12

Swarm Source

ipfs://6c636ad46fa2726fb79efe54dcf28eabf95053c0c473de7ea1d0d6a16aac7d1f
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.