ETH Price: $3,275.07 (+0.74%)
Gas: 1 Gwei

Token

Cosmic VX (CosmicVX)
 

Overview

Max Total Supply

195 CosmicVX

Holders

82

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
greddie.eth
Balance
2 CosmicVX
0xb4f2CE3BD9afb8E4D08901840F025d679240F86b
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:
CosmicVx

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-05-30
*/

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


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (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/token/ERC721/ERC721.sol


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

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

// File: cosmicVX.sol

pragma solidity 0.8.7;
/// SPDX-License-Identifier: MIT







/*
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBG?7!!~~!7JGBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBPB#GJ^^^..^^^!YP#BGBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBGPJ!#@&PJ?7^~7?JB&@#7^YGBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBGGGPB##GJ????JJ?JJJYGGPYY5GGBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGBB&@&G?7!!!!!77!!!!!!Y&&&GBBGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG#@##B5??J???7777???77JP&@&&#GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG#@P5GGGGGGGGGGGGGGGGGGGJY@BYBGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG&@&P~~~~~^^:::^^~~!~~^!B#@Y!BGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG&@&5^^^::...!?^^^::...^&&@JJBGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG&@GGGPP5555YB#P5YYJJJ?JB#@BGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG##JJYGB5YY5PJ?GG55PB#GPJ5@&GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGBBYJ777777777777777?7?????YGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGBB??7777777777777777777777??G&GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGBGYPP5YYYYYYYYYYJJJJJJJJYJYJG#GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGPPPGPPPGGPPPGGGGGGGGGGGBGPYGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGP?77??J5555555555YYYYPPGPGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGBBJ??J77JPPPPGGPGPP!^^~~~~7GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGPPGBB&@&@@@#BGBBBB#&@#BGGGGGB#GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGBB#55G#&&&###&&&@&&@@@BYG@@&&BPPGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGPG#&&?~!JG&@?^:G@@&PJJJB@###&###BGPGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP?Y#&B5!!J&@?..P@@J7777B@@&&&#&##&B5PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP57G##&B777?&Y..5&5?7!J&@&&&###B#BY!:YGPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP55&##&#BJ~!#5..Y&7!7JG&&&&###BB##5!^~PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPB#&&&&&&P7!BP.:J&7!!5@GB######B#&BJ~^5PPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPB####&&#B5#B::?@YYB&#?:^^Y&&###&#BBGGPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP#&#&&#G#&@#^:!@@@&#&&PG#&@#####&&&GPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPJ?&&&&&B5B&&#~^!&@&&@@@@@@@&B####B##GPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
55555555555555555555555555555555!J&&&&#G5G##&&&&#&@BYY55YJJJPG###BGPJY555555555555555555555555555555
5555555555555555555555555555555J~G#BB##P5G##&5Y5##Y!^YPGBB#B55#&&&#?:~555555555555555555555555555555
55555555555555555555555555555557?#BBB#G55GB#@PJJPYG##@@@@@#P55GGGBB7:!555555555555555555555555555555
5555555555555555555555555555555YPBBBB#P?7JJ!?JY5P5PBB#&&&&&GY5GPPBB7:!555555555555555555555555555555
5555555555555555555555555555555P#BBBBBY~^^^^^:::^^~JJYPB#&Y?7?PPPPPPYJ555555555555555555555555555555
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYJ?PGB##5YJPP7^::^:^^^^^^Y###J!~!Y5PPGBG5YYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYY?!!7?JJJY7YBBP5YJ?7?PGP5B&&&&G7^~~!!JGGYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYJ?JYYJYGP^!Y@@@@@@@J7?5&&&&&&!~~~~~~~!?YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYJJJ5YY5GJ^7P@@&@@@&!:^?&@&&&B!?J?!~~~~7YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY7~JB@&&@@@#^^^Y&@&&&P!5555YJ7!JYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYJP#&@@@@@@#J^^5@@&&@Y~#55555YJYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
55555555555555555555555555555555555555P&&@@&@@@@@&5PB&&#&@77&555555555555555555555555555555555555555
55555555555555555555555555555555555555PB#@&&&&@&@&#&##&&&&5?Y555555555555555555555555555555555555555
555555555555555555555555555555555555555YJG#&@@@@@&###&&@@&&5Y555555555555555555555555555555555555555
*/


contract CosmicVx is ERC721, Ownable, ReentrancyGuard {

    using Strings for uint256;
    using Counters for Counters.Counter;

    Counters.Counter private totalCounter;

    Counters.Counter private tierOneCounter;
    Counters.Counter private tierTwoCounter;
    Counters.Counter private tierThreeCounter;

    string public baseURI;
    string public baseExtension = ".json";

    bytes32 public merkleRoot = 0x35dd4f63c01eafb95fa8c2fddf5ba89f6ade54c480e6b36c6c41572c552cc14e;

    uint256 public maxPerPublicWallet = 3;
    uint256 public maxPerWLWallet = 1;


    uint256 public tierOnePrice = 0.10 ether;
    uint256 constant public tierOneMaxID = 3000;

    uint256 public tierTwoPrice = 0.20 ether;
    uint256 constant public tierTwoMaxID = 1500;

    uint256 public tierThreePrice = 0.30 ether;
    uint256 constant public tierThreeMaxID = 500;


    mapping (address => uint256) public totalMintedPublic;
    mapping (address => uint256) public totalMintedWhitelist;

    bool public isWLOpen = true;

    modifier onlySender {
        require(msg.sender == tx.origin);
        _;
    }

    modifier WLOpen {
        require(isWLOpen == true);
        _;
    }

    modifier PublicOpen {
        require(isWLOpen == false);
        _;
    }


    constructor(string memory _initBaseURI ) ERC721("Cosmic VX", "CosmicVX") 
    {
        setBaseURI(_initBaseURI);
    }


    function whitelistMint(bytes32[] calldata _merkleProof, uint256 tierSelection, uint256 amount) public payable onlySender nonReentrant WLOpen
    {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), "Invalid proof.");


        if(tierSelection == 3)
        {
            require((tierThreeCounter.current() + amount) <= tierThreeMaxID, "SOLD OUT");
            require((totalMintedWhitelist[msg.sender] + amount) <= maxPerWLWallet, "You will mint past the allowance per wallet");
            require(msg.value >= (tierThreePrice * amount), "Not enough eth");

            totalMintedWhitelist[msg.sender] += amount;
            for(uint256 i=0; i<amount; i++)
            {
                totalCounter.increment();
                tierThreeCounter.increment();
                _mint(msg.sender, tierThreeCounter.current());
            }
        }
        else if(tierSelection == 2)
        {
            require((tierTwoCounter.current() + amount) <= tierTwoMaxID, "SOLD OUT");
            require((totalMintedWhitelist[msg.sender] + amount) <= maxPerWLWallet, "You will mint past the allowance per wallet");
            require(msg.value >= (tierTwoPrice * amount), "Not enough eth");

            totalMintedWhitelist[msg.sender] += amount;

            for(uint256 i=0; i<amount; i++)
            {
                totalCounter.increment();
                tierTwoCounter.increment();
                _mint(msg.sender, (tierThreeMaxID + tierTwoCounter.current()));
            }
        }
        else if(tierSelection == 1)
        {
            require((tierOneCounter.current() + amount) <= tierOneMaxID, "SOLD OUT");
            require((totalMintedWhitelist[msg.sender] + amount) <= maxPerWLWallet, "You will mint past the allowance per wallet");
            require(msg.value >= (tierOnePrice * amount), "Not enough eth");

            totalMintedWhitelist[msg.sender] += amount;

            for(uint256 i=0; i<amount; i++)
            {
                totalCounter.increment();
                tierOneCounter.increment();
                _mint(msg.sender, (tierTwoMaxID + tierOneCounter.current()));
            }
        }
    }
    
    function publicMint(uint256 tierSelection, uint256 amount) public payable onlySender nonReentrant PublicOpen
    {
        if(tierSelection == 3)
        {
            require((tierThreeCounter.current() + amount) <= tierThreeMaxID, "SOLD OUT");
            require((totalMintedPublic[msg.sender] + amount) <= maxPerPublicWallet, "You will mint past the allowance per wallet");
            require(msg.value >= (tierThreePrice * amount), "Not enough eth");

            totalMintedPublic[msg.sender] += amount;
            for(uint256 i=0; i<amount; i++)
            {
                totalCounter.increment();
                tierThreeCounter.increment();
                _mint(msg.sender, tierThreeCounter.current());
            }
        }
        else if(tierSelection == 2)
        {
            require((tierTwoCounter.current() + amount) <= tierTwoMaxID, "SOLD OUT");
            require((totalMintedPublic[msg.sender] + amount) <= maxPerPublicWallet, "You will mint past the allowance per wallet");
            require(msg.value >= (tierTwoPrice * amount), "Not enough eth");

            totalMintedPublic[msg.sender] += amount;

            for(uint256 i=0; i<amount; i++)
            {
                totalCounter.increment();
                tierTwoCounter.increment();
                _mint(msg.sender, (tierThreeMaxID + tierTwoCounter.current()));
            }
        }
        else if(tierSelection == 1)
        {
            require((tierOneCounter.current() + amount) <= tierOneMaxID, "SOLD OUT");
            require((totalMintedPublic[msg.sender] + amount) <= maxPerPublicWallet, "You will mint past the allowance per wallet");
            require(msg.value >= (tierOnePrice * amount), "Not enough eth");

            totalMintedPublic[msg.sender] += amount;

            for(uint256 i=0; i<amount; i++)
            {
                totalCounter.increment();
                tierOneCounter.increment();
                _mint(msg.sender, (tierTwoMaxID + tierOneCounter.current()));
            }
        }
    }

    function howManySoldiersMinted() public view returns(uint256)
    {
        return tierOneCounter.current();
    }

    function howManyCommandersMinted() public view returns(uint256)
    {
        return tierTwoCounter.current();
    }

    function howManyGeneralsMinted() public view returns(uint256)
    {
        return tierThreeCounter.current();
    }


    //owner functions
    function setMerkleRoot(bytes32 incomingBytes) public onlyOwner
    {
        merkleRoot = incomingBytes;
    }
    function setTierOnePrice(uint256 _price) public onlyOwner
    {
        tierOnePrice = _price;
    }
    function setTierTwoPrice(uint256 _price) public onlyOwner
    {
        tierTwoPrice = _price;
    }
    function setTierThreePrice(uint256 _price) public onlyOwner
    {
        tierThreePrice = _price;
    }
    function switchToPublic() public onlyOwner
    {
        isWLOpen = !isWLOpen;
    }
    function setMaxPerWallet(uint256 _public, uint256 _wl) public onlyOwner
    {
        maxPerPublicWallet = _public;
        maxPerWLWallet = _wl;
    }

    function burn(uint256 tokenId) public virtual {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        totalCounter.decrement();
        _burn(tokenId);
    }

    function _withdraw(address payable address_, uint256 amount_) internal {
        (bool success, ) = payable(address_).call{value: amount_}("");
        require(success, "Transfer failed");
    }

    function withdrawEther() external onlyOwner {
        _withdraw(payable(msg.sender), address(this).balance);
    }

    function withdrawEtherTo(address payable to_) external onlyOwner {
        _withdraw(to_, address(this).balance);
    }
    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }   
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory)
    {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

    function totalSupply() public view returns (uint256) {
            return totalCounter.current();
    }

    function walletOfOwner(address address_) public virtual view returns (uint256[] memory) {
        uint256 _balance = balanceOf(address_);
        uint256[] memory _tokens = new uint256[] (_balance);
        uint256 _index;
        uint256 _loopThrough = totalSupply();
        for (uint256 i = 0; i < _loopThrough; i++) {
            bool _exists = _exists(i);
            if (_exists) {
                if (ownerOf(i) == address_) { _tokens[_index] = i; _index++; }
            }
            else if (!_exists && _tokens[_balance - 1] == 0) { _loopThrough++; }
        }
        return _tokens;
    }   

    function multiTransferFrom(address from_, address to_, uint256[] calldata tokenIds_) public {
        for (uint256 i = 0; i < tokenIds_.length; i++) {
            ERC721.transferFrom(from_, to_, tokenIds_[i]);
        }
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"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":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"howManyCommandersMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"howManyGeneralsMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"howManySoldiersMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWLOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerPublicWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWLWallet","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":"address","name":"from_","type":"address"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"multiTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tierSelection","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_public","type":"uint256"},{"internalType":"uint256","name":"_wl","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"incomingBytes","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setTierOnePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setTierThreePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setTierTwoPrice","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":"switchToPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tierOneMaxID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tierOnePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tierThreeMaxID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tierThreePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tierTwoMaxID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tierTwoPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalMintedPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalMintedWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"tierSelection","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to_","type":"address"}],"name":"withdrawEtherTo","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040526005608081905264173539b7b760d91b60a09081526200002891600d919062000223565b507f35dd4f63c01eafb95fa8c2fddf5ba89f6ade54c480e6b36c6c41572c552cc14e600e556003600f556001601081905567016345785d8a00006011556702c68af0bb140000601255670429d069189e00006013556016805460ff191690911790553480156200009757600080fd5b50604051620031d2380380620031d2833981016040819052620000ba91620002c9565b6040805180820182526009815268086dee6dad2c640acb60bb1b602080830191825283518085019094526008845267086dee6dad2c6acb60c31b9084015281519192916200010b9160009162000223565b5080516200012190600190602084019062000223565b5050506200013e620001386200015560201b60201c565b62000159565b60016007556200014e81620001ab565b50620003f8565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6006546001600160a01b031633146200020a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b80516200021f90600c90602084019062000223565b5050565b8280546200023190620003a5565b90600052602060002090601f016020900481019282620002555760008555620002a0565b82601f106200027057805160ff1916838001178555620002a0565b82800160010185558215620002a0579182015b82811115620002a057825182559160200191906001019062000283565b50620002ae929150620002b2565b5090565b5b80821115620002ae5760008155600101620002b3565b60006020808385031215620002dd57600080fd5b82516001600160401b0380821115620002f557600080fd5b818501915085601f8301126200030a57600080fd5b8151818111156200031f576200031f620003e2565b604051601f8201601f19908116603f011681019083821181831017156200034a576200034a620003e2565b8160405282815288868487010111156200036357600080fd5b600093505b8284101562000387578484018601518185018701529285019262000368565b82841115620003995760008684830101525b98975050505050505050565b600181811c90821680620003ba57607f821691505b60208210811415620003dc57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b612dca80620004086000396000f3fe6080604052600436106102935760003560e01c806370a082311161015a578063aaa47ef4116100c1578063da74434e1161007a578063da74434e1461075e578063e600dec814610774578063e985e9c5146107a1578063f2fde38b146107ea578063f487c6021461080a578063fb1954901461082a57600080fd5b8063aaa47ef4146106be578063af867329146106d3578063b88d4fde146106f3578063c668286214610713578063c87b56dd14610728578063d7e915d51461074857600080fd5b80638da5cb5b116101135780638da5cb5b1461062d5780638fd0aeb21461064b57806395d89b411461066057806398ae99a814610675578063a11dcce814610688578063a22cb4651461069e57600080fd5b806370a0823114610580578063715018a6146105a05780637362377b146105b55780637cb64759146105ca5780638600c8b2146105ea5780638b3005161461060057600080fd5b806342842e0e116101fe5780635753773d116101b75780635753773d146104e65780636352211e1461050657806365ab138a146105265780636c0360eb1461053b5780636d52cb23146105505780636dc4976c1461056657600080fd5b806342842e0e1461042357806342966c6814610443578063438b6300146104635780634e82dc891461049057806355f804b3146104a657806356ad15f6146104c657600080fd5b80630d428ad9116102505780630d428ad9146103895780630f9c0a96146103ad57806318160ddd146103c25780631fbc0893146103d757806323b872dd146103ed5780632eb4a7ab1461040d57600080fd5b806301ffc9a71461029857806305b3f842146102cd57806306fdde03146102ef57806307fa40e414610311578063081812fc14610331578063095ea7b314610369575b600080fd5b3480156102a457600080fd5b506102b86102b3366004612883565b61083d565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102ed6102e836600461286a565b61088f565b005b3480156102fb57600080fd5b506103046108c7565b6040516102c49190612a99565b34801561031d57600080fd5b506102ed61032c36600461263e565b610959565b34801561033d57600080fd5b5061035161034c36600461286a565b610990565b6040516001600160a01b0390911681526020016102c4565b34801561037557600080fd5b506102ed6103843660046127ed565b610a25565b34801561039557600080fd5b5061039f6105dc81565b6040519081526020016102c4565b3480156103b957600080fd5b5061039f610b3b565b3480156103ce57600080fd5b5061039f610b4b565b3480156103e357600080fd5b5061039f60105481565b3480156103f957600080fd5b506102ed6104083660046126f9565b610b56565b34801561041957600080fd5b5061039f600e5481565b34801561042f57600080fd5b506102ed61043e3660046126f9565b610b88565b34801561044f57600080fd5b506102ed61045e36600461286a565b610ba3565b34801561046f57600080fd5b5061048361047e36600461263e565b610c24565b6040516102c49190612a55565b34801561049c57600080fd5b5061039f60135481565b3480156104b257600080fd5b506102ed6104c13660046128bd565b610d67565b3480156104d257600080fd5b506102ed6104e1366004612906565b610da8565b3480156104f257600080fd5b506102ed61050136600461286a565b610ddd565b34801561051257600080fd5b5061035161052136600461286a565b610e0c565b34801561053257600080fd5b5061039f610e83565b34801561054757600080fd5b50610304610e8e565b34801561055c57600080fd5b5061039f610bb881565b34801561057257600080fd5b506016546102b89060ff1681565b34801561058c57600080fd5b5061039f61059b36600461263e565b610f1c565b3480156105ac57600080fd5b506102ed610fa3565b3480156105c157600080fd5b506102ed610fd9565b3480156105d657600080fd5b506102ed6105e536600461286a565b61100d565b3480156105f657600080fd5b5061039f60115481565b34801561060c57600080fd5b5061039f61061b36600461263e565b60146020526000908152604090205481565b34801561063957600080fd5b506006546001600160a01b0316610351565b34801561065757600080fd5b506102ed61103c565b34801561066c57600080fd5b5061030461107a565b6102ed610683366004612906565b611089565b34801561069457600080fd5b5061039f600f5481565b3480156106aa57600080fd5b506102ed6106b93660046127ba565b611461565b3480156106ca57600080fd5b5061039f61146c565b3480156106df57600080fd5b506102ed6106ee36600461286a565b611477565b3480156106ff57600080fd5b506102ed61070e36600461273a565b6114a6565b34801561071f57600080fd5b506103046114de565b34801561073457600080fd5b5061030461074336600461286a565b6114eb565b34801561075457600080fd5b5061039f60125481565b34801561076a57600080fd5b5061039f6101f481565b34801561078057600080fd5b5061039f61078f36600461263e565b60156020526000908152604090205481565b3480156107ad57600080fd5b506102b86107bc36600461265b565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107f657600080fd5b506102ed61080536600461263e565b6115c9565b34801561081657600080fd5b506102ed610825366004612694565b611661565b6102ed610838366004612819565b6116a8565b60006001600160e01b031982166380ac58cd60e01b148061086e57506001600160e01b03198216635b5e139f60e01b145b8061088957506301ffc9a760e01b6001600160e01b03198316145b92915050565b6006546001600160a01b031633146108c25760405162461bcd60e51b81526004016108b990612b93565b60405180910390fd5b601355565b6060600080546108d690612ca7565b80601f016020809104026020016040519081016040528092919081815260200182805461090290612ca7565b801561094f5780601f106109245761010080835404028352916020019161094f565b820191906000526020600020905b81548152906001019060200180831161093257829003601f168201915b5050505050905090565b6006546001600160a01b031633146109835760405162461bcd60e51b81526004016108b990612b93565b61098d8147611b21565b50565b6000818152600260205260408120546001600160a01b0316610a095760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108b9565b506000908152600460205260409020546001600160a01b031690565b6000610a3082610e0c565b9050806001600160a01b0316836001600160a01b03161415610a9e5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016108b9565b336001600160a01b0382161480610aba5750610aba81336107bc565b610b2c5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016108b9565b610b368383611bb6565b505050565b6000610b4660095490565b905090565b6000610b4660085490565b610b61335b82611c24565b610b7d5760405162461bcd60e51b81526004016108b990612bc8565b610b36838383611d1b565b610b36838383604051806020016040528060008152506114a6565b610bac33610b5b565b610c115760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b60648201526084016108b9565b610c1b6008611eb7565b61098d81611f0e565b60606000610c3183610f1c565b905060008167ffffffffffffffff811115610c4e57610c4e612d53565b604051908082528060200260200182016040528015610c77578160200160208202803683370190505b509050600080610c85610b4b565b905060005b81811015610d5c576000818152600260205260409020546001600160a01b031615801590610d0557876001600160a01b0316610cc583610e0c565b6001600160a01b03161415610d005781858581518110610ce757610ce7612d3d565b602090810291909101015283610cfc81612ce2565b9450505b610d49565b80158015610d36575084610d1a600188612c64565b81518110610d2a57610d2a612d3d565b60200260200101516000145b15610d495782610d4581612ce2565b9350505b5080610d5481612ce2565b915050610c8a565b509195945050505050565b6006546001600160a01b03163314610d915760405162461bcd60e51b81526004016108b990612b93565b8051610da490600c9060208401906124e3565b5050565b6006546001600160a01b03163314610dd25760405162461bcd60e51b81526004016108b990612b93565b600f91909155601055565b6006546001600160a01b03163314610e075760405162461bcd60e51b81526004016108b990612b93565b601155565b6000818152600260205260408120546001600160a01b0316806108895760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016108b9565b6000610b46600a5490565b600c8054610e9b90612ca7565b80601f0160208091040260200160405190810160405280929190818152602001828054610ec790612ca7565b8015610f145780601f10610ee957610100808354040283529160200191610f14565b820191906000526020600020905b815481529060010190602001808311610ef757829003601f168201915b505050505081565b60006001600160a01b038216610f875760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016108b9565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610fcd5760405162461bcd60e51b81526004016108b990612b93565b610fd76000611fa9565b565b6006546001600160a01b031633146110035760405162461bcd60e51b81526004016108b990612b93565b610fd73347611b21565b6006546001600160a01b031633146110375760405162461bcd60e51b81526004016108b990612b93565b600e55565b6006546001600160a01b031633146110665760405162461bcd60e51b81526004016108b990612b93565b6016805460ff19811660ff90911615179055565b6060600180546108d690612ca7565b33321461109557600080fd5b600260075414156110e85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108b9565b600260075560165460ff16156110fd57600080fd5b816003141561121a576101f481611113600b5490565b61111d9190612c19565b111561113b5760405162461bcd60e51b81526004016108b990612aac565b600f5433600090815260146020526040902054611159908390612c19565b11156111775760405162461bcd60e51b81526004016108b990612b20565b806013546111859190612c45565b3410156111a45760405162461bcd60e51b81526004016108b990612b6b565b33600090815260146020526040812080548392906111c3908490612c19565b90915550600090505b81811015611214576111e2600880546001019055565b6111f0600b80546001019055565b611202336111fd600b5490565b611ffb565b8061120c81612ce2565b9150506111cc565b50611458565b8160021415611338576105dc81611230600a5490565b61123a9190612c19565b11156112585760405162461bcd60e51b81526004016108b990612aac565b600f5433600090815260146020526040902054611276908390612c19565b11156112945760405162461bcd60e51b81526004016108b990612b20565b806012546112a29190612c45565b3410156112c15760405162461bcd60e51b81526004016108b990612b6b565b33600090815260146020526040812080548392906112e0908490612c19565b90915550600090505b81811015611214576112ff600880546001019055565b61130d600a80546001019055565b6113263361131a600a5490565b6111fd906101f4612c19565b8061133081612ce2565b9150506112e9565b816001141561145857610bb88161134e60095490565b6113589190612c19565b11156113765760405162461bcd60e51b81526004016108b990612aac565b600f5433600090815260146020526040902054611394908390612c19565b11156113b25760405162461bcd60e51b81526004016108b990612b20565b806011546113c09190612c45565b3410156113df5760405162461bcd60e51b81526004016108b990612b6b565b33600090815260146020526040812080548392906113fe908490612c19565b90915550600090505b818110156114565761141d600880546001019055565b61142b600980546001019055565b6114443361143860095490565b6111fd906105dc612c19565b8061144e81612ce2565b915050611407565b505b50506001600755565b610da433838361213d565b6000610b46600b5490565b6006546001600160a01b031633146114a15760405162461bcd60e51b81526004016108b990612b93565b601255565b6114b03383611c24565b6114cc5760405162461bcd60e51b81526004016108b990612bc8565b6114d88484848461220c565b50505050565b600d8054610e9b90612ca7565b6000818152600260205260409020546060906001600160a01b031661156a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016108b9565b600061157461223f565b9050600081511161159457604051806020016040528060008152506115c2565b8061159e8461224e565b600d6040516020016115b293929190612954565b6040516020818303038152906040525b9392505050565b6006546001600160a01b031633146115f35760405162461bcd60e51b81526004016108b990612b93565b6001600160a01b0381166116585760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108b9565b61098d81611fa9565b60005b818110156116a15761168f858585858581811061168357611683612d3d565b90506020020135610b56565b8061169981612ce2565b915050611664565b5050505050565b3332146116b457600080fd5b600260075414156117075760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108b9565b600260075560165460ff16151560011461172057600080fd5b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061179a85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e54915084905061234c565b6117d75760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b210383937b7b31760911b60448201526064016108b9565b82600314156118ef576101f4826117ed600b5490565b6117f79190612c19565b11156118155760405162461bcd60e51b81526004016108b990612aac565b60105433600090815260156020526040902054611833908490612c19565b11156118515760405162461bcd60e51b81526004016108b990612b20565b8160135461185f9190612c45565b34101561187e5760405162461bcd60e51b81526004016108b990612b6b565b336000908152601560205260408120805484929061189d908490612c19565b90915550600090505b828110156118e9576118bc600880546001019055565b6118ca600b80546001019055565b6118d7336111fd600b5490565b806118e181612ce2565b9150506118a6565b50611b15565b8260021415611a01576105dc82611905600a5490565b61190f9190612c19565b111561192d5760405162461bcd60e51b81526004016108b990612aac565b6010543360009081526015602052604090205461194b908490612c19565b11156119695760405162461bcd60e51b81526004016108b990612b20565b816012546119779190612c45565b3410156119965760405162461bcd60e51b81526004016108b990612b6b565b33600090815260156020526040812080548492906119b5908490612c19565b90915550600090505b828110156118e9576119d4600880546001019055565b6119e2600a80546001019055565b6119ef3361131a600a5490565b806119f981612ce2565b9150506119be565b8260011415611b1557610bb882611a1760095490565b611a219190612c19565b1115611a3f5760405162461bcd60e51b81526004016108b990612aac565b60105433600090815260156020526040902054611a5d908490612c19565b1115611a7b5760405162461bcd60e51b81526004016108b990612b20565b81601154611a899190612c45565b341015611aa85760405162461bcd60e51b81526004016108b990612b6b565b3360009081526015602052604081208054849290611ac7908490612c19565b90915550600090505b82811015611b1357611ae6600880546001019055565b611af4600980546001019055565b611b013361143860095490565b80611b0b81612ce2565b915050611ad0565b505b50506001600755505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611b6e576040519150601f19603f3d011682016040523d82523d6000602084013e611b73565b606091505b5050905080610b365760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016108b9565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611beb82610e0c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611c9d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108b9565b6000611ca883610e0c565b9050806001600160a01b0316846001600160a01b03161480611ce35750836001600160a01b0316611cd884610990565b6001600160a01b0316145b80611d1357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611d2e82610e0c565b6001600160a01b031614611d925760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016108b9565b6001600160a01b038216611df45760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016108b9565b611dff600082611bb6565b6001600160a01b0383166000908152600360205260408120805460019290611e28908490612c64565b90915550506001600160a01b0382166000908152600360205260408120805460019290611e56908490612c19565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b805480611f065760405162461bcd60e51b815260206004820152601b60248201527f436f756e7465723a2064656372656d656e74206f766572666c6f77000000000060448201526064016108b9565b600019019055565b6000611f1982610e0c565b9050611f26600083611bb6565b6001600160a01b0381166000908152600360205260408120805460019290611f4f908490612c64565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166120515760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016108b9565b6000818152600260205260409020546001600160a01b0316156120b65760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016108b9565b6001600160a01b03821660009081526003602052604081208054600192906120df908490612c19565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b816001600160a01b0316836001600160a01b0316141561219f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108b9565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612217848484611d1b565b61222384848484612362565b6114d85760405162461bcd60e51b81526004016108b990612ace565b6060600c80546108d690612ca7565b6060816122725750506040805180820190915260018152600360fc1b602082015290565b8160005b811561229c578061228681612ce2565b91506122959050600a83612c31565b9150612276565b60008167ffffffffffffffff8111156122b7576122b7612d53565b6040519080825280601f01601f1916602001820160405280156122e1576020820181803683370190505b5090505b8415611d13576122f6600183612c64565b9150612303600a86612cfd565b61230e906030612c19565b60f81b81838151811061232357612323612d3d565b60200101906001600160f81b031916908160001a905350612345600a86612c31565b94506122e5565b600082612359858461246f565b14949350505050565b60006001600160a01b0384163b1561246457604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906123a6903390899088908890600401612a18565b602060405180830381600087803b1580156123c057600080fd5b505af19250505080156123f0575060408051601f3d908101601f191682019092526123ed918101906128a0565b60015b61244a573d80801561241e576040519150601f19603f3d011682016040523d82523d6000602084013e612423565b606091505b5080516124425760405162461bcd60e51b81526004016108b990612ace565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611d13565b506001949350505050565b600081815b84518110156124db57600085828151811061249157612491612d3d565b602002602001015190508083116124b757600083815260208290526040902092506124c8565b600081815260208490526040902092505b50806124d381612ce2565b915050612474565b509392505050565b8280546124ef90612ca7565b90600052602060002090601f0160209004810192826125115760008555612557565b82601f1061252a57805160ff1916838001178555612557565b82800160010185558215612557579182015b8281111561255757825182559160200191906001019061253c565b50612563929150612567565b5090565b5b808211156125635760008155600101612568565b600067ffffffffffffffff8084111561259757612597612d53565b604051601f8501601f19908116603f011681019082821181831017156125bf576125bf612d53565b816040528093508581528686860111156125d857600080fd5b858560208301376000602087830101525050509392505050565b60008083601f84011261260457600080fd5b50813567ffffffffffffffff81111561261c57600080fd5b6020830191508360208260051b850101111561263757600080fd5b9250929050565b60006020828403121561265057600080fd5b81356115c281612d69565b6000806040838503121561266e57600080fd5b823561267981612d69565b9150602083013561268981612d69565b809150509250929050565b600080600080606085870312156126aa57600080fd5b84356126b581612d69565b935060208501356126c581612d69565b9250604085013567ffffffffffffffff8111156126e157600080fd5b6126ed878288016125f2565b95989497509550505050565b60008060006060848603121561270e57600080fd5b833561271981612d69565b9250602084013561272981612d69565b929592945050506040919091013590565b6000806000806080858703121561275057600080fd5b843561275b81612d69565b9350602085013561276b81612d69565b925060408501359150606085013567ffffffffffffffff81111561278e57600080fd5b8501601f8101871361279f57600080fd5b6127ae8782356020840161257c565b91505092959194509250565b600080604083850312156127cd57600080fd5b82356127d881612d69565b91506020830135801515811461268957600080fd5b6000806040838503121561280057600080fd5b823561280b81612d69565b946020939093013593505050565b6000806000806060858703121561282f57600080fd5b843567ffffffffffffffff81111561284657600080fd5b612852878288016125f2565b90989097506020870135966040013595509350505050565b60006020828403121561287c57600080fd5b5035919050565b60006020828403121561289557600080fd5b81356115c281612d7e565b6000602082840312156128b257600080fd5b81516115c281612d7e565b6000602082840312156128cf57600080fd5b813567ffffffffffffffff8111156128e657600080fd5b8201601f810184136128f757600080fd5b611d138482356020840161257c565b6000806040838503121561291957600080fd5b50508035926020909101359150565b60008151808452612940816020860160208601612c7b565b601f01601f19169290920160200192915050565b6000845160206129678285838a01612c7b565b85519184019161297a8184848a01612c7b565b8554920191600090600181811c908083168061299757607f831692505b8583108114156129b557634e487b7160e01b85526022600452602485fd5b8080156129c957600181146129da57612a07565b60ff19851688528388019550612a07565b60008b81526020902060005b858110156129ff5781548a8201529084019088016129e6565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612a4b90830184612928565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612a8d57835183529284019291840191600101612a71565b50909695505050505050565b6020815260006115c26020830184612928565b60208082526008908201526714d3d3110813d55560c21b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602b908201527f596f752077696c6c206d696e7420706173742074686520616c6c6f77616e636560408201526a081c195c881dd85b1b195d60aa1b606082015260800190565b6020808252600e908201526d09cdee840cadcdeeaced040cae8d60931b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612c2c57612c2c612d11565b500190565b600082612c4057612c40612d27565b500490565b6000816000190483118215151615612c5f57612c5f612d11565b500290565b600082821015612c7657612c76612d11565b500390565b60005b83811015612c96578181015183820152602001612c7e565b838111156114d85750506000910152565b600181811c90821680612cbb57607f821691505b60208210811415612cdc57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612cf657612cf6612d11565b5060010190565b600082612d0c57612d0c612d27565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461098d57600080fd5b6001600160e01b03198116811461098d57600080fdfea2646970667358221220001e43d51f10844a5b54e9b4d46157904e57473c68be81f0ac705a43e0a955bb64736f6c634300080700330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005668747470733a2f2f636f736d69636c6162732e6d7970696e6174612e636c6f75642f697066732f516d616f4b6d736d565037346164787741423555793458613873626872593872476b4150694e7565334a4a7577352f00000000000000000000

Deployed Bytecode

0x6080604052600436106102935760003560e01c806370a082311161015a578063aaa47ef4116100c1578063da74434e1161007a578063da74434e1461075e578063e600dec814610774578063e985e9c5146107a1578063f2fde38b146107ea578063f487c6021461080a578063fb1954901461082a57600080fd5b8063aaa47ef4146106be578063af867329146106d3578063b88d4fde146106f3578063c668286214610713578063c87b56dd14610728578063d7e915d51461074857600080fd5b80638da5cb5b116101135780638da5cb5b1461062d5780638fd0aeb21461064b57806395d89b411461066057806398ae99a814610675578063a11dcce814610688578063a22cb4651461069e57600080fd5b806370a0823114610580578063715018a6146105a05780637362377b146105b55780637cb64759146105ca5780638600c8b2146105ea5780638b3005161461060057600080fd5b806342842e0e116101fe5780635753773d116101b75780635753773d146104e65780636352211e1461050657806365ab138a146105265780636c0360eb1461053b5780636d52cb23146105505780636dc4976c1461056657600080fd5b806342842e0e1461042357806342966c6814610443578063438b6300146104635780634e82dc891461049057806355f804b3146104a657806356ad15f6146104c657600080fd5b80630d428ad9116102505780630d428ad9146103895780630f9c0a96146103ad57806318160ddd146103c25780631fbc0893146103d757806323b872dd146103ed5780632eb4a7ab1461040d57600080fd5b806301ffc9a71461029857806305b3f842146102cd57806306fdde03146102ef57806307fa40e414610311578063081812fc14610331578063095ea7b314610369575b600080fd5b3480156102a457600080fd5b506102b86102b3366004612883565b61083d565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102ed6102e836600461286a565b61088f565b005b3480156102fb57600080fd5b506103046108c7565b6040516102c49190612a99565b34801561031d57600080fd5b506102ed61032c36600461263e565b610959565b34801561033d57600080fd5b5061035161034c36600461286a565b610990565b6040516001600160a01b0390911681526020016102c4565b34801561037557600080fd5b506102ed6103843660046127ed565b610a25565b34801561039557600080fd5b5061039f6105dc81565b6040519081526020016102c4565b3480156103b957600080fd5b5061039f610b3b565b3480156103ce57600080fd5b5061039f610b4b565b3480156103e357600080fd5b5061039f60105481565b3480156103f957600080fd5b506102ed6104083660046126f9565b610b56565b34801561041957600080fd5b5061039f600e5481565b34801561042f57600080fd5b506102ed61043e3660046126f9565b610b88565b34801561044f57600080fd5b506102ed61045e36600461286a565b610ba3565b34801561046f57600080fd5b5061048361047e36600461263e565b610c24565b6040516102c49190612a55565b34801561049c57600080fd5b5061039f60135481565b3480156104b257600080fd5b506102ed6104c13660046128bd565b610d67565b3480156104d257600080fd5b506102ed6104e1366004612906565b610da8565b3480156104f257600080fd5b506102ed61050136600461286a565b610ddd565b34801561051257600080fd5b5061035161052136600461286a565b610e0c565b34801561053257600080fd5b5061039f610e83565b34801561054757600080fd5b50610304610e8e565b34801561055c57600080fd5b5061039f610bb881565b34801561057257600080fd5b506016546102b89060ff1681565b34801561058c57600080fd5b5061039f61059b36600461263e565b610f1c565b3480156105ac57600080fd5b506102ed610fa3565b3480156105c157600080fd5b506102ed610fd9565b3480156105d657600080fd5b506102ed6105e536600461286a565b61100d565b3480156105f657600080fd5b5061039f60115481565b34801561060c57600080fd5b5061039f61061b36600461263e565b60146020526000908152604090205481565b34801561063957600080fd5b506006546001600160a01b0316610351565b34801561065757600080fd5b506102ed61103c565b34801561066c57600080fd5b5061030461107a565b6102ed610683366004612906565b611089565b34801561069457600080fd5b5061039f600f5481565b3480156106aa57600080fd5b506102ed6106b93660046127ba565b611461565b3480156106ca57600080fd5b5061039f61146c565b3480156106df57600080fd5b506102ed6106ee36600461286a565b611477565b3480156106ff57600080fd5b506102ed61070e36600461273a565b6114a6565b34801561071f57600080fd5b506103046114de565b34801561073457600080fd5b5061030461074336600461286a565b6114eb565b34801561075457600080fd5b5061039f60125481565b34801561076a57600080fd5b5061039f6101f481565b34801561078057600080fd5b5061039f61078f36600461263e565b60156020526000908152604090205481565b3480156107ad57600080fd5b506102b86107bc36600461265b565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107f657600080fd5b506102ed61080536600461263e565b6115c9565b34801561081657600080fd5b506102ed610825366004612694565b611661565b6102ed610838366004612819565b6116a8565b60006001600160e01b031982166380ac58cd60e01b148061086e57506001600160e01b03198216635b5e139f60e01b145b8061088957506301ffc9a760e01b6001600160e01b03198316145b92915050565b6006546001600160a01b031633146108c25760405162461bcd60e51b81526004016108b990612b93565b60405180910390fd5b601355565b6060600080546108d690612ca7565b80601f016020809104026020016040519081016040528092919081815260200182805461090290612ca7565b801561094f5780601f106109245761010080835404028352916020019161094f565b820191906000526020600020905b81548152906001019060200180831161093257829003601f168201915b5050505050905090565b6006546001600160a01b031633146109835760405162461bcd60e51b81526004016108b990612b93565b61098d8147611b21565b50565b6000818152600260205260408120546001600160a01b0316610a095760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108b9565b506000908152600460205260409020546001600160a01b031690565b6000610a3082610e0c565b9050806001600160a01b0316836001600160a01b03161415610a9e5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016108b9565b336001600160a01b0382161480610aba5750610aba81336107bc565b610b2c5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016108b9565b610b368383611bb6565b505050565b6000610b4660095490565b905090565b6000610b4660085490565b610b61335b82611c24565b610b7d5760405162461bcd60e51b81526004016108b990612bc8565b610b36838383611d1b565b610b36838383604051806020016040528060008152506114a6565b610bac33610b5b565b610c115760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b60648201526084016108b9565b610c1b6008611eb7565b61098d81611f0e565b60606000610c3183610f1c565b905060008167ffffffffffffffff811115610c4e57610c4e612d53565b604051908082528060200260200182016040528015610c77578160200160208202803683370190505b509050600080610c85610b4b565b905060005b81811015610d5c576000818152600260205260409020546001600160a01b031615801590610d0557876001600160a01b0316610cc583610e0c565b6001600160a01b03161415610d005781858581518110610ce757610ce7612d3d565b602090810291909101015283610cfc81612ce2565b9450505b610d49565b80158015610d36575084610d1a600188612c64565b81518110610d2a57610d2a612d3d565b60200260200101516000145b15610d495782610d4581612ce2565b9350505b5080610d5481612ce2565b915050610c8a565b509195945050505050565b6006546001600160a01b03163314610d915760405162461bcd60e51b81526004016108b990612b93565b8051610da490600c9060208401906124e3565b5050565b6006546001600160a01b03163314610dd25760405162461bcd60e51b81526004016108b990612b93565b600f91909155601055565b6006546001600160a01b03163314610e075760405162461bcd60e51b81526004016108b990612b93565b601155565b6000818152600260205260408120546001600160a01b0316806108895760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016108b9565b6000610b46600a5490565b600c8054610e9b90612ca7565b80601f0160208091040260200160405190810160405280929190818152602001828054610ec790612ca7565b8015610f145780601f10610ee957610100808354040283529160200191610f14565b820191906000526020600020905b815481529060010190602001808311610ef757829003601f168201915b505050505081565b60006001600160a01b038216610f875760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016108b9565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610fcd5760405162461bcd60e51b81526004016108b990612b93565b610fd76000611fa9565b565b6006546001600160a01b031633146110035760405162461bcd60e51b81526004016108b990612b93565b610fd73347611b21565b6006546001600160a01b031633146110375760405162461bcd60e51b81526004016108b990612b93565b600e55565b6006546001600160a01b031633146110665760405162461bcd60e51b81526004016108b990612b93565b6016805460ff19811660ff90911615179055565b6060600180546108d690612ca7565b33321461109557600080fd5b600260075414156110e85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108b9565b600260075560165460ff16156110fd57600080fd5b816003141561121a576101f481611113600b5490565b61111d9190612c19565b111561113b5760405162461bcd60e51b81526004016108b990612aac565b600f5433600090815260146020526040902054611159908390612c19565b11156111775760405162461bcd60e51b81526004016108b990612b20565b806013546111859190612c45565b3410156111a45760405162461bcd60e51b81526004016108b990612b6b565b33600090815260146020526040812080548392906111c3908490612c19565b90915550600090505b81811015611214576111e2600880546001019055565b6111f0600b80546001019055565b611202336111fd600b5490565b611ffb565b8061120c81612ce2565b9150506111cc565b50611458565b8160021415611338576105dc81611230600a5490565b61123a9190612c19565b11156112585760405162461bcd60e51b81526004016108b990612aac565b600f5433600090815260146020526040902054611276908390612c19565b11156112945760405162461bcd60e51b81526004016108b990612b20565b806012546112a29190612c45565b3410156112c15760405162461bcd60e51b81526004016108b990612b6b565b33600090815260146020526040812080548392906112e0908490612c19565b90915550600090505b81811015611214576112ff600880546001019055565b61130d600a80546001019055565b6113263361131a600a5490565b6111fd906101f4612c19565b8061133081612ce2565b9150506112e9565b816001141561145857610bb88161134e60095490565b6113589190612c19565b11156113765760405162461bcd60e51b81526004016108b990612aac565b600f5433600090815260146020526040902054611394908390612c19565b11156113b25760405162461bcd60e51b81526004016108b990612b20565b806011546113c09190612c45565b3410156113df5760405162461bcd60e51b81526004016108b990612b6b565b33600090815260146020526040812080548392906113fe908490612c19565b90915550600090505b818110156114565761141d600880546001019055565b61142b600980546001019055565b6114443361143860095490565b6111fd906105dc612c19565b8061144e81612ce2565b915050611407565b505b50506001600755565b610da433838361213d565b6000610b46600b5490565b6006546001600160a01b031633146114a15760405162461bcd60e51b81526004016108b990612b93565b601255565b6114b03383611c24565b6114cc5760405162461bcd60e51b81526004016108b990612bc8565b6114d88484848461220c565b50505050565b600d8054610e9b90612ca7565b6000818152600260205260409020546060906001600160a01b031661156a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016108b9565b600061157461223f565b9050600081511161159457604051806020016040528060008152506115c2565b8061159e8461224e565b600d6040516020016115b293929190612954565b6040516020818303038152906040525b9392505050565b6006546001600160a01b031633146115f35760405162461bcd60e51b81526004016108b990612b93565b6001600160a01b0381166116585760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108b9565b61098d81611fa9565b60005b818110156116a15761168f858585858581811061168357611683612d3d565b90506020020135610b56565b8061169981612ce2565b915050611664565b5050505050565b3332146116b457600080fd5b600260075414156117075760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108b9565b600260075560165460ff16151560011461172057600080fd5b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061179a85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e54915084905061234c565b6117d75760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b210383937b7b31760911b60448201526064016108b9565b82600314156118ef576101f4826117ed600b5490565b6117f79190612c19565b11156118155760405162461bcd60e51b81526004016108b990612aac565b60105433600090815260156020526040902054611833908490612c19565b11156118515760405162461bcd60e51b81526004016108b990612b20565b8160135461185f9190612c45565b34101561187e5760405162461bcd60e51b81526004016108b990612b6b565b336000908152601560205260408120805484929061189d908490612c19565b90915550600090505b828110156118e9576118bc600880546001019055565b6118ca600b80546001019055565b6118d7336111fd600b5490565b806118e181612ce2565b9150506118a6565b50611b15565b8260021415611a01576105dc82611905600a5490565b61190f9190612c19565b111561192d5760405162461bcd60e51b81526004016108b990612aac565b6010543360009081526015602052604090205461194b908490612c19565b11156119695760405162461bcd60e51b81526004016108b990612b20565b816012546119779190612c45565b3410156119965760405162461bcd60e51b81526004016108b990612b6b565b33600090815260156020526040812080548492906119b5908490612c19565b90915550600090505b828110156118e9576119d4600880546001019055565b6119e2600a80546001019055565b6119ef3361131a600a5490565b806119f981612ce2565b9150506119be565b8260011415611b1557610bb882611a1760095490565b611a219190612c19565b1115611a3f5760405162461bcd60e51b81526004016108b990612aac565b60105433600090815260156020526040902054611a5d908490612c19565b1115611a7b5760405162461bcd60e51b81526004016108b990612b20565b81601154611a899190612c45565b341015611aa85760405162461bcd60e51b81526004016108b990612b6b565b3360009081526015602052604081208054849290611ac7908490612c19565b90915550600090505b82811015611b1357611ae6600880546001019055565b611af4600980546001019055565b611b013361143860095490565b80611b0b81612ce2565b915050611ad0565b505b50506001600755505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611b6e576040519150601f19603f3d011682016040523d82523d6000602084013e611b73565b606091505b5050905080610b365760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016108b9565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611beb82610e0c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611c9d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108b9565b6000611ca883610e0c565b9050806001600160a01b0316846001600160a01b03161480611ce35750836001600160a01b0316611cd884610990565b6001600160a01b0316145b80611d1357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611d2e82610e0c565b6001600160a01b031614611d925760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016108b9565b6001600160a01b038216611df45760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016108b9565b611dff600082611bb6565b6001600160a01b0383166000908152600360205260408120805460019290611e28908490612c64565b90915550506001600160a01b0382166000908152600360205260408120805460019290611e56908490612c19565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b805480611f065760405162461bcd60e51b815260206004820152601b60248201527f436f756e7465723a2064656372656d656e74206f766572666c6f77000000000060448201526064016108b9565b600019019055565b6000611f1982610e0c565b9050611f26600083611bb6565b6001600160a01b0381166000908152600360205260408120805460019290611f4f908490612c64565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166120515760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016108b9565b6000818152600260205260409020546001600160a01b0316156120b65760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016108b9565b6001600160a01b03821660009081526003602052604081208054600192906120df908490612c19565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b816001600160a01b0316836001600160a01b0316141561219f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108b9565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612217848484611d1b565b61222384848484612362565b6114d85760405162461bcd60e51b81526004016108b990612ace565b6060600c80546108d690612ca7565b6060816122725750506040805180820190915260018152600360fc1b602082015290565b8160005b811561229c578061228681612ce2565b91506122959050600a83612c31565b9150612276565b60008167ffffffffffffffff8111156122b7576122b7612d53565b6040519080825280601f01601f1916602001820160405280156122e1576020820181803683370190505b5090505b8415611d13576122f6600183612c64565b9150612303600a86612cfd565b61230e906030612c19565b60f81b81838151811061232357612323612d3d565b60200101906001600160f81b031916908160001a905350612345600a86612c31565b94506122e5565b600082612359858461246f565b14949350505050565b60006001600160a01b0384163b1561246457604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906123a6903390899088908890600401612a18565b602060405180830381600087803b1580156123c057600080fd5b505af19250505080156123f0575060408051601f3d908101601f191682019092526123ed918101906128a0565b60015b61244a573d80801561241e576040519150601f19603f3d011682016040523d82523d6000602084013e612423565b606091505b5080516124425760405162461bcd60e51b81526004016108b990612ace565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611d13565b506001949350505050565b600081815b84518110156124db57600085828151811061249157612491612d3d565b602002602001015190508083116124b757600083815260208290526040902092506124c8565b600081815260208490526040902092505b50806124d381612ce2565b915050612474565b509392505050565b8280546124ef90612ca7565b90600052602060002090601f0160209004810192826125115760008555612557565b82601f1061252a57805160ff1916838001178555612557565b82800160010185558215612557579182015b8281111561255757825182559160200191906001019061253c565b50612563929150612567565b5090565b5b808211156125635760008155600101612568565b600067ffffffffffffffff8084111561259757612597612d53565b604051601f8501601f19908116603f011681019082821181831017156125bf576125bf612d53565b816040528093508581528686860111156125d857600080fd5b858560208301376000602087830101525050509392505050565b60008083601f84011261260457600080fd5b50813567ffffffffffffffff81111561261c57600080fd5b6020830191508360208260051b850101111561263757600080fd5b9250929050565b60006020828403121561265057600080fd5b81356115c281612d69565b6000806040838503121561266e57600080fd5b823561267981612d69565b9150602083013561268981612d69565b809150509250929050565b600080600080606085870312156126aa57600080fd5b84356126b581612d69565b935060208501356126c581612d69565b9250604085013567ffffffffffffffff8111156126e157600080fd5b6126ed878288016125f2565b95989497509550505050565b60008060006060848603121561270e57600080fd5b833561271981612d69565b9250602084013561272981612d69565b929592945050506040919091013590565b6000806000806080858703121561275057600080fd5b843561275b81612d69565b9350602085013561276b81612d69565b925060408501359150606085013567ffffffffffffffff81111561278e57600080fd5b8501601f8101871361279f57600080fd5b6127ae8782356020840161257c565b91505092959194509250565b600080604083850312156127cd57600080fd5b82356127d881612d69565b91506020830135801515811461268957600080fd5b6000806040838503121561280057600080fd5b823561280b81612d69565b946020939093013593505050565b6000806000806060858703121561282f57600080fd5b843567ffffffffffffffff81111561284657600080fd5b612852878288016125f2565b90989097506020870135966040013595509350505050565b60006020828403121561287c57600080fd5b5035919050565b60006020828403121561289557600080fd5b81356115c281612d7e565b6000602082840312156128b257600080fd5b81516115c281612d7e565b6000602082840312156128cf57600080fd5b813567ffffffffffffffff8111156128e657600080fd5b8201601f810184136128f757600080fd5b611d138482356020840161257c565b6000806040838503121561291957600080fd5b50508035926020909101359150565b60008151808452612940816020860160208601612c7b565b601f01601f19169290920160200192915050565b6000845160206129678285838a01612c7b565b85519184019161297a8184848a01612c7b565b8554920191600090600181811c908083168061299757607f831692505b8583108114156129b557634e487b7160e01b85526022600452602485fd5b8080156129c957600181146129da57612a07565b60ff19851688528388019550612a07565b60008b81526020902060005b858110156129ff5781548a8201529084019088016129e6565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612a4b90830184612928565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612a8d57835183529284019291840191600101612a71565b50909695505050505050565b6020815260006115c26020830184612928565b60208082526008908201526714d3d3110813d55560c21b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602b908201527f596f752077696c6c206d696e7420706173742074686520616c6c6f77616e636560408201526a081c195c881dd85b1b195d60aa1b606082015260800190565b6020808252600e908201526d09cdee840cadcdeeaced040cae8d60931b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612c2c57612c2c612d11565b500190565b600082612c4057612c40612d27565b500490565b6000816000190483118215151615612c5f57612c5f612d11565b500290565b600082821015612c7657612c76612d11565b500390565b60005b83811015612c96578181015183820152602001612c7e565b838111156114d85750506000910152565b600181811c90821680612cbb57607f821691505b60208210811415612cdc57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612cf657612cf6612d11565b5060010190565b600082612d0c57612d0c612d27565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461098d57600080fd5b6001600160e01b03198116811461098d57600080fdfea2646970667358221220001e43d51f10844a5b54e9b4d46157904e57473c68be81f0ac705a43e0a955bb64736f6c63430008070033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005668747470733a2f2f636f736d69636c6162732e6d7970696e6174612e636c6f75642f697066732f516d616f4b6d736d565037346164787741423555793458613873626872593872476b4150694e7565334a4a7577352f00000000000000000000

-----Decoded View---------------
Arg [0] : _initBaseURI (string): https://cosmiclabs.mypinata.cloud/ipfs/QmaoKmsmVP74adxwAB5Uy4Xa8sbhrY8rGkAPiNue3JJuw5/

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000056
Arg [2] : 68747470733a2f2f636f736d69636c6162732e6d7970696e6174612e636c6f75
Arg [3] : 642f697066732f516d616f4b6d736d5650373461647877414235557934586138
Arg [4] : 73626872593872476b4150694e7565334a4a7577352f00000000000000000000


Deployed Bytecode Sourcemap

48127:9205:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30722:305;;;;;;;;;;-1:-1:-1;30722:305:0;;;;;:::i;:::-;;:::i;:::-;;;10547:14:1;;10540:22;10522:41;;10510:2;10495:18;30722:305:0;;;;;;;;54690:107;;;;;;;;;;-1:-1:-1;54690:107:0;;;;;:::i;:::-;;:::i;:::-;;31667:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;55623:121::-;;;;;;;;;;-1:-1:-1;55623:121:0;;;;;:::i;:::-;;:::i;33226:221::-;;;;;;;;;;-1:-1:-1;33226:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9208:32:1;;;9190:51;;9178:2;9163:18;33226:221:0;9044:203:1;32749:411:0;;;;;;;;;;-1:-1:-1;32749:411:0;;;;;:::i;:::-;;:::i;48865:43::-;;;;;;;;;;;;48904:4;48865:43;;;;;10720:25:1;;;10708:2;10693:18;48865:43:0;10574:177:1;53949:117:0;;;;;;;;;;;;;:::i;56360:105::-;;;;;;;;;;;;;:::i;48675:33::-;;;;;;;;;;;;;;;;33976:339;;;;;;;;;;-1:-1:-1;33976:339:0;;;;;:::i;:::-;;:::i;48528:94::-;;;;;;;;;;;;;;;;34386:185;;;;;;;;;;-1:-1:-1;34386:185:0;;;;;:::i;:::-;;:::i;55059:227::-;;;;;;;;;;-1:-1:-1;55059:227:0;;;;;:::i;:::-;;:::i;56473:614::-;;;;;;;;;;-1:-1:-1;56473:614:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;48917:42::-;;;;;;;;;;;;;;;;55750:104;;;;;;;;;;-1:-1:-1;55750:104:0;;;;;:::i;:::-;;:::i;54896:155::-;;;;;;;;;;-1:-1:-1;54896:155:0;;;;;:::i;:::-;;:::i;54472:103::-;;;;;;;;;;-1:-1:-1;54472:103:0;;;;;:::i;:::-;;:::i;31361:239::-;;;;;;;;;;-1:-1:-1;31361:239:0;;;;;:::i;:::-;;:::i;54074:119::-;;;;;;;;;;;;;:::i;48454:21::-;;;;;;;;;;;;;:::i;48766:43::-;;;;;;;;;;;;48805:4;48766:43;;49146:27;;;;;;;;;;-1:-1:-1;49146:27:0;;;;;;;;31091:208;;;;;;;;;;-1:-1:-1;31091:208:0;;;;;:::i;:::-;;:::i;11343:103::-;;;;;;;;;;;;;:::i;55499:116::-;;;;;;;;;;;;;:::i;54353:113::-;;;;;;;;;;-1:-1:-1;54353:113:0;;;;;:::i;:::-;;:::i;48719:40::-;;;;;;;;;;;;;;;;49021:53;;;;;;;;;;-1:-1:-1;49021:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;10692:87;;;;;;;;;;-1:-1:-1;10765:6:0;;-1:-1:-1;;;;;10765:6:0;10692:87;;54803;;;;;;;;;;;;;:::i;31836:104::-;;;;;;;;;;;;;:::i;51860:2081::-;;;;;;:::i;:::-;;:::i;48631:37::-;;;;;;;;;;;;;;;;33519:155;;;;;;;;;;-1:-1:-1;33519:155:0;;;;;:::i;:::-;;:::i;54201:119::-;;;;;;;;;;;;;:::i;54581:103::-;;;;;;;;;;-1:-1:-1;54581:103:0;;;;;:::i;:::-;;:::i;34642:328::-;;;;;;;;;;-1:-1:-1;34642:328:0;;;;;:::i;:::-;;:::i;48482:37::-;;;;;;;;;;;;;:::i;55977:375::-;;;;;;;;;;-1:-1:-1;55977:375:0;;;;;:::i;:::-;;:::i;48818:40::-;;;;;;;;;;;;;;;;48966:44;;;;;;;;;;;;49007:3;48966:44;;49081:56;;;;;;;;;;-1:-1:-1;49081:56:0;;;;;:::i;:::-;;;;;;;;;;;;;;33745:164;;;;;;;;;;-1:-1:-1;33745:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;33866:25:0;;;33842:4;33866:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;33745:164;11601:201;;;;;;;;;;-1:-1:-1;11601:201:0;;;;;:::i;:::-;;:::i;57098:229::-;;;;;;;;;;-1:-1:-1;57098:229:0;;;;;:::i;:::-;;:::i;49572:2276::-;;;;;;:::i;:::-;;:::i;30722:305::-;30824:4;-1:-1:-1;;;;;;30861:40:0;;-1:-1:-1;;;30861:40:0;;:105;;-1:-1:-1;;;;;;;30918:48:0;;-1:-1:-1;;;30918:48:0;30861:105;:158;;;-1:-1:-1;;;;;;;;;;23585:40:0;;;30983:36;30841:178;30722:305;-1:-1:-1;;30722:305:0:o;54690:107::-;10765:6;;-1:-1:-1;;;;;10765:6:0;9496:10;10912:23;10904:68;;;;-1:-1:-1;;;10904:68:0;;;;;;;:::i;:::-;;;;;;;;;54766:14:::1;:23:::0;54690:107::o;31667:100::-;31721:13;31754:5;31747:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31667:100;:::o;55623:121::-;10765:6;;-1:-1:-1;;;;;10765:6:0;9496:10;10912:23;10904:68;;;;-1:-1:-1;;;10904:68:0;;;;;;;:::i;:::-;55699:37:::1;55709:3;55714:21;55699:9;:37::i;:::-;55623:121:::0;:::o;33226:221::-;33302:7;36569:16;;;:7;:16;;;;;;-1:-1:-1;;;;;36569:16:0;33322:73;;;;-1:-1:-1;;;33322:73:0;;17341:2:1;33322:73:0;;;17323:21:1;17380:2;17360:18;;;17353:30;17419:34;17399:18;;;17392:62;-1:-1:-1;;;17470:18:1;;;17463:42;17522:19;;33322:73:0;17139:408:1;33322:73:0;-1:-1:-1;33415:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;33415:24:0;;33226:221::o;32749:411::-;32830:13;32846:23;32861:7;32846:14;:23::i;:::-;32830:39;;32894:5;-1:-1:-1;;;;;32888:11:0;:2;-1:-1:-1;;;;;32888:11:0;;;32880:57;;;;-1:-1:-1;;;32880:57:0;;18531:2:1;32880:57:0;;;18513:21:1;18570:2;18550:18;;;18543:30;18609:34;18589:18;;;18582:62;-1:-1:-1;;;18660:18:1;;;18653:31;18701:19;;32880:57:0;18329:397:1;32880:57:0;9496:10;-1:-1:-1;;;;;32972:21:0;;;;:62;;-1:-1:-1;32997:37:0;33014:5;9496:10;33745:164;:::i;32997:37::-;32950:168;;;;-1:-1:-1;;;32950:168:0;;15734:2:1;32950:168:0;;;15716:21:1;15773:2;15753:18;;;15746:30;15812:34;15792:18;;;15785:62;15883:26;15863:18;;;15856:54;15927:19;;32950:168:0;15532:420:1;32950:168:0;33131:21;33140:2;33144:7;33131:8;:21::i;:::-;32819:341;32749:411;;:::o;53949:117::-;54002:7;54034:24;:14;6112;;6020:114;54034:24;54027:31;;53949:117;:::o;56360:105::-;56404:7;56435:22;:12;6112:14;;6020:114;33976:339;34171:41;9496:10;34190:12;34204:7;34171:18;:41::i;:::-;34163:103;;;;-1:-1:-1;;;34163:103:0;;;;;;;:::i;:::-;34279:28;34289:4;34295:2;34299:7;34279:9;:28::i;34386:185::-;34524:39;34541:4;34547:2;34551:7;34524:39;;;;;;;;;;;;:16;:39::i;55059:227::-;55124:41;9496:10;55143:12;9416:98;55124:41;55116:102;;;;-1:-1:-1;;;55116:102:0;;20054:2:1;55116:102:0;;;20036:21:1;20093:2;20073:18;;;20066:30;20132:34;20112:18;;;20105:62;-1:-1:-1;;;20183:18:1;;;20176:46;20239:19;;55116:102:0;19852:412:1;55116:102:0;55229:24;:12;:22;:24::i;:::-;55264:14;55270:7;55264:5;:14::i;56473:614::-;56543:16;56572;56591:19;56601:8;56591:9;:19::i;:::-;56572:38;;56621:24;56663:8;56648:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56648:24:0;;56621:51;;56683:14;56708:20;56731:13;:11;:13::i;:::-;56708:36;;56760:9;56755:300;56779:12;56775:1;:16;56755:300;;;56813:12;36569:16;;;:7;:16;;;;;;-1:-1:-1;;;;;36569:16:0;:30;;;;56853:191;;56903:8;-1:-1:-1;;;;;56889:22:0;:10;56897:1;56889:7;:10::i;:::-;-1:-1:-1;;;;;56889:22:0;;56885:62;;;56933:1;56915:7;56923:6;56915:15;;;;;;;;:::i;:::-;;;;;;;;;;:19;56936:8;;;;:::i;:::-;;;;56885:62;56853:191;;;56986:7;56985:8;:38;;;;-1:-1:-1;56997:7:0;57005:12;57016:1;57005:8;:12;:::i;:::-;56997:21;;;;;;;;:::i;:::-;;;;;;;57022:1;56997:26;56985:38;56981:63;;;57027:14;;;;:::i;:::-;;;;56981:63;-1:-1:-1;56793:3:0;;;;:::i;:::-;;;;56755:300;;;-1:-1:-1;57072:7:0;;56473:614;-1:-1:-1;;;;;56473:614:0:o;55750:104::-;10765:6;;-1:-1:-1;;;;;10765:6:0;9496:10;10912:23;10904:68;;;;-1:-1:-1;;;10904:68:0;;;;;;;:::i;:::-;55825:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;55750:104:::0;:::o;54896:155::-;10765:6;;-1:-1:-1;;;;;10765:6:0;9496:10;10912:23;10904:68;;;;-1:-1:-1;;;10904:68:0;;;;;;;:::i;:::-;54984:18:::1;:28:::0;;;;55023:14:::1;:20:::0;54896:155::o;54472:103::-;10765:6;;-1:-1:-1;;;;;10765:6:0;9496:10;10912:23;10904:68;;;;-1:-1:-1;;;10904:68:0;;;;;;;:::i;:::-;54546:12:::1;:21:::0;54472:103::o;31361:239::-;31433:7;31469:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31469:16:0;31504:19;31496:73;;;;-1:-1:-1;;;31496:73:0;;16570:2:1;31496:73:0;;;16552:21:1;16609:2;16589:18;;;16582:30;16648:34;16628:18;;;16621:62;-1:-1:-1;;;16699:18:1;;;16692:39;16748:19;;31496:73:0;16368:405:1;54074:119:0;54129:7;54161:24;:14;6112;;6020:114;48454:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31091:208::-;31163:7;-1:-1:-1;;;;;31191:19:0;;31183:74;;;;-1:-1:-1;;;31183:74:0;;16159:2:1;31183:74:0;;;16141:21:1;16198:2;16178:18;;;16171:30;16237:34;16217:18;;;16210:62;-1:-1:-1;;;16288:18:1;;;16281:40;16338:19;;31183:74:0;15957:406:1;31183:74:0;-1:-1:-1;;;;;;31275:16:0;;;;;:9;:16;;;;;;;31091:208::o;11343:103::-;10765:6;;-1:-1:-1;;;;;10765:6:0;9496:10;10912:23;10904:68;;;;-1:-1:-1;;;10904:68:0;;;;;;;:::i;:::-;11408:30:::1;11435:1;11408:18;:30::i;:::-;11343:103::o:0;55499:116::-;10765:6;;-1:-1:-1;;;;;10765:6:0;9496:10;10912:23;10904:68;;;;-1:-1:-1;;;10904:68:0;;;;;;;:::i;:::-;55554:53:::1;55572:10;55585:21;55554:9;:53::i;54353:113::-:0;10765:6;;-1:-1:-1;;;;;10765:6:0;9496:10;10912:23;10904:68;;;;-1:-1:-1;;;10904:68:0;;;;;;;:::i;:::-;54432:10:::1;:26:::0;54353:113::o;54803:87::-;10765:6;;-1:-1:-1;;;;;10765:6:0;9496:10;10912:23;10904:68;;;;-1:-1:-1;;;10904:68:0;;;;;;;:::i;:::-;54874:8:::1;::::0;;-1:-1:-1;;54862:20:0;::::1;54874:8;::::0;;::::1;54873:9;54862:20;::::0;;54803:87::o;31836:104::-;31892:13;31925:7;31918:14;;;;;:::i;51860:2081::-;49221:10;49235:9;49221:23;49213:32;;;;;;4201:1:::1;4799:7;;:19;;4791:63;;;::::0;-1:-1:-1;;;4791:63:0;;19694:2:1;4791:63:0::1;::::0;::::1;19676:21:1::0;19733:2;19713:18;;;19706:30;19772:33;19752:18;;;19745:61;19823:18;;4791:63:0::1;19492:355:1::0;4791:63:0::1;4201:1;4932:7;:18:::0;49392:8:::2;::::0;::::2;;:17;49384:26;;;::::0;::::2;;51988:13:::3;52005:1;51988:18;51985:1949;;;49007:3;52070:6;52041:26;:16;6112:14:::0;;6020:114;52041:26:::3;:35;;;;:::i;:::-;52040:55;;52032:76;;;;-1:-1:-1::0;;;52032:76:0::3;;;;;;;:::i;:::-;52175:18;::::0;52150:10:::3;52132:29;::::0;;;:17:::3;:29;::::0;;;;;:38:::3;::::0;52164:6;;52132:38:::3;:::i;:::-;52131:62;;52123:118;;;;-1:-1:-1::0;;;52123:118:0::3;;;;;;;:::i;:::-;52295:6;52278:14;;:23;;;;:::i;:::-;52264:9;:38;;52256:65;;;;-1:-1:-1::0;;;52256:65:0::3;;;;;;;:::i;:::-;52356:10;52338:29;::::0;;;:17:::3;:29;::::0;;;;:39;;52371:6;;52338:29;:39:::3;::::0;52371:6;;52338:39:::3;:::i;:::-;::::0;;;-1:-1:-1;52396:9:0::3;::::0;-1:-1:-1;52392:215:0::3;52411:6;52409:1;:8;52392:215;;;52456:24;:12;6231:19:::0;;6249:1;6231:19;;;6142:127;52456:24:::3;52499:28;:16;6231:19:::0;;6249:1;6231:19;;;6142:127;52499:28:::3;52546:45;52552:10;52564:26;:16;6112:14:::0;;6020:114;52564:26:::3;52546:5;:45::i;:::-;52419:3:::0;::::3;::::0;::::3;:::i;:::-;;;;52392:215;;;;51985:1949;;;52636:13;52653:1;52636:18;52633:1301;;;48904:4;52716:6;52689:24;:14;6112::::0;;6020:114;52689:24:::3;:33;;;;:::i;:::-;52688:51;;52680:72;;;;-1:-1:-1::0;;;52680:72:0::3;;;;;;;:::i;:::-;52819:18;::::0;52794:10:::3;52776:29;::::0;;;:17:::3;:29;::::0;;;;;:38:::3;::::0;52808:6;;52776:38:::3;:::i;:::-;52775:62;;52767:118;;;;-1:-1:-1::0;;;52767:118:0::3;;;;;;;:::i;:::-;52937:6;52922:12;;:21;;;;:::i;:::-;52908:9;:36;;52900:63;;;;-1:-1:-1::0;;;52900:63:0::3;;;;;;;:::i;:::-;52998:10;52980:29;::::0;;;:17:::3;:29;::::0;;;;:39;;53013:6;;52980:29;:39:::3;::::0;53013:6;;52980:39:::3;:::i;:::-;::::0;;;-1:-1:-1;53040:9:0::3;::::0;-1:-1:-1;53036:230:0::3;53055:6;53053:1;:8;53036:230;;;53100:24;:12;6231:19:::0;;6249:1;6231:19;;;6142:127;53100:24:::3;53143:26;:14;6231:19:::0;;6249:1;6231:19;;;6142:127;53143:26:::3;53188:62;53194:10;53224:24;:14;6112::::0;;6020:114;53224:24:::3;53207:41;::::0;49007:3:::3;53207:41;:::i;53188:62::-;53063:3:::0;::::3;::::0;::::3;:::i;:::-;;;;53036:230;;52633:1301;53295:13;53312:1;53295:18;53292:642;;;48805:4;53375:6;53348:24;:14;6112::::0;;6020:114;53348:24:::3;:33;;;;:::i;:::-;53347:51;;53339:72;;;;-1:-1:-1::0;;;53339:72:0::3;;;;;;;:::i;:::-;53478:18;::::0;53453:10:::3;53435:29;::::0;;;:17:::3;:29;::::0;;;;;:38:::3;::::0;53467:6;;53435:38:::3;:::i;:::-;53434:62;;53426:118;;;;-1:-1:-1::0;;;53426:118:0::3;;;;;;;:::i;:::-;53596:6;53581:12;;:21;;;;:::i;:::-;53567:9;:36;;53559:63;;;;-1:-1:-1::0;;;53559:63:0::3;;;;;;;:::i;:::-;53657:10;53639:29;::::0;;;:17:::3;:29;::::0;;;;:39;;53672:6;;53639:29;:39:::3;::::0;53672:6;;53639:39:::3;:::i;:::-;::::0;;;-1:-1:-1;53699:9:0::3;::::0;-1:-1:-1;53695:228:0::3;53714:6;53712:1;:8;53695:228;;;53759:24;:12;6231:19:::0;;6249:1;6231:19;;;6142:127;53759:24:::3;53802:26;:14;6231:19:::0;;6249:1;6231:19;;;6142:127;53802:26:::3;53847:60;53853:10;53881:24;:14;6112::::0;;6020:114;53881:24:::3;53866:39;::::0;48904:4:::3;53866:39;:::i;53847:60::-;53722:3:::0;::::3;::::0;::::3;:::i;:::-;;;;53695:228;;;;53292:642;-1:-1:-1::0;;4157:1:0::1;5111:7;:22:::0;51860:2081::o;33519:155::-;33614:52;9496:10;33647:8;33657;33614:18;:52::i;54201:119::-;54254:7;54286:26;:16;6112:14;;6020:114;54581:103;10765:6;;-1:-1:-1;;;;;10765:6:0;9496:10;10912:23;10904:68;;;;-1:-1:-1;;;10904:68:0;;;;;;;:::i;:::-;54655:12:::1;:21:::0;54581:103::o;34642:328::-;34817:41;9496:10;34850:7;34817:18;:41::i;:::-;34809:103;;;;-1:-1:-1;;;34809:103:0;;;;;;;:::i;:::-;34923:39;34937:4;34943:2;34947:7;34956:5;34923:13;:39::i;:::-;34642:328;;;;:::o;48482:37::-;;;;;;;:::i;55977:375::-;36545:4;36569:16;;;:7;:16;;;;;;56050:13;;-1:-1:-1;;;;;36569:16:0;56081:76;;;;-1:-1:-1;;;56081:76:0;;18115:2:1;56081:76:0;;;18097:21:1;18154:2;18134:18;;;18127:30;18193:34;18173:18;;;18166:62;-1:-1:-1;;;18244:18:1;;;18237:45;18299:19;;56081:76:0;17913:411:1;56081:76:0;56170:28;56201:10;:8;:10::i;:::-;56170:41;;56260:1;56235:14;56229:28;:32;:115;;;;;;;;;;;;;;;;;56288:14;56304:18;:7;:16;:18::i;:::-;56324:13;56271:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56229:115;56222:122;55977:375;-1:-1:-1;;;55977:375:0:o;11601:201::-;10765:6;;-1:-1:-1;;;;;10765:6:0;9496:10;10912:23;10904:68;;;;-1:-1:-1;;;10904:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11690:22:0;::::1;11682:73;;;::::0;-1:-1:-1;;;11682:73:0;;12293:2:1;11682:73:0::1;::::0;::::1;12275:21:1::0;12332:2;12312:18;;;12305:30;12371:34;12351:18;;;12344:62;-1:-1:-1;;;12422:18:1;;;12415:36;12468:19;;11682:73:0::1;12091:402:1::0;11682:73:0::1;11766:28;11785:8;11766:18;:28::i;57098:229::-:0;57206:9;57201:119;57221:20;;;57201:119;;;57263:45;57283:5;57290:3;57295:9;;57305:1;57295:12;;;;;;;:::i;:::-;;;;;;;57263:19;:45::i;:::-;57243:3;;;;:::i;:::-;;;;57201:119;;;;57098:229;;;;:::o;49572:2276::-;49221:10;49235:9;49221:23;49213:32;;;;;;4201:1:::1;4799:7;;:19;;4791:63;;;::::0;-1:-1:-1;;;4791:63:0;;19694:2:1;4791:63:0::1;::::0;::::1;19676:21:1::0;19733:2;19713:18;;;19706:30;19772:33;19752:18;;;19745:61;19823:18;;4791:63:0::1;19492:355:1::0;4791:63:0::1;4201:1;4932:7;:18:::0;49308:8:::2;::::0;::::2;;:16;;:8:::0;:16:::2;49300:25;;;::::0;::::2;;49754:28:::3;::::0;-1:-1:-1;;49771:10:0::3;7217:2:1::0;7213:15;7209:53;49754:28:0::3;::::0;::::3;7197:66:1::0;49729:12:0::3;::::0;7279::1;;49754:28:0::3;;;;;;;;;;;;49744:39;;;;;;49729:54;;49802:50;49821:12;;49802:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;::::0;;;;-1:-1:-1;;49835:10:0::3;::::0;;-1:-1:-1;49847:4:0;;-1:-1:-1;49802:18:0::3;:50::i;:::-;49794:77;;;::::0;-1:-1:-1;;;49794:77:0;;19351:2:1;49794:77:0::3;::::0;::::3;19333:21:1::0;19390:2;19370:18;;;19363:30;-1:-1:-1;;;19409:18:1;;;19402:44;19463:18;;49794:77:0::3;19149:338:1::0;49794:77:0::3;49889:13;49906:1;49889:18;49886:1955;;;49007:3;49971:6;49942:26;:16;6112:14:::0;;6020:114;49942:26:::3;:35;;;;:::i;:::-;49941:55;;49933:76;;;;-1:-1:-1::0;;;49933:76:0::3;;;;;;;:::i;:::-;50079:14;::::0;50054:10:::3;50033:32;::::0;;;:20:::3;:32;::::0;;;;;:41:::3;::::0;50068:6;;50033:41:::3;:::i;:::-;50032:61;;50024:117;;;;-1:-1:-1::0;;;50024:117:0::3;;;;;;;:::i;:::-;50195:6;50178:14;;:23;;;;:::i;:::-;50164:9;:38;;50156:65;;;;-1:-1:-1::0;;;50156:65:0::3;;;;;;;:::i;:::-;50259:10;50238:32;::::0;;;:20:::3;:32;::::0;;;;:42;;50274:6;;50238:32;:42:::3;::::0;50274:6;;50238:42:::3;:::i;:::-;::::0;;;-1:-1:-1;50299:9:0::3;::::0;-1:-1:-1;50295:215:0::3;50314:6;50312:1;:8;50295:215;;;50359:24;:12;6231:19:::0;;6249:1;6231:19;;;6142:127;50359:24:::3;50402:28;:16;6231:19:::0;;6249:1;6231:19;;;6142:127;50402:28:::3;50449:45;50455:10;50467:26;:16;6112:14:::0;;6020:114;50449:45:::3;50322:3:::0;::::3;::::0;::::3;:::i;:::-;;;;50295:215;;;;49886:1955;;;50539:13;50556:1;50539:18;50536:1305;;;48904:4;50619:6;50592:24;:14;6112::::0;;6020:114;50592:24:::3;:33;;;;:::i;:::-;50591:51;;50583:72;;;;-1:-1:-1::0;;;50583:72:0::3;;;;;;;:::i;:::-;50725:14;::::0;50700:10:::3;50679:32;::::0;;;:20:::3;:32;::::0;;;;;:41:::3;::::0;50714:6;;50679:41:::3;:::i;:::-;50678:61;;50670:117;;;;-1:-1:-1::0;;;50670:117:0::3;;;;;;;:::i;:::-;50839:6;50824:12;;:21;;;;:::i;:::-;50810:9;:36;;50802:63;;;;-1:-1:-1::0;;;50802:63:0::3;;;;;;;:::i;:::-;50903:10;50882:32;::::0;;;:20:::3;:32;::::0;;;;:42;;50918:6;;50882:32;:42:::3;::::0;50918:6;;50882:42:::3;:::i;:::-;::::0;;;-1:-1:-1;50945:9:0::3;::::0;-1:-1:-1;50941:230:0::3;50960:6;50958:1;:8;50941:230;;;51005:24;:12;6231:19:::0;;6249:1;6231:19;;;6142:127;51005:24:::3;51048:26;:14;6231:19:::0;;6249:1;6231:19;;;6142:127;51048:26:::3;51093:62;51099:10;51129:24;:14;6112::::0;;6020:114;51093:62:::3;50968:3:::0;::::3;::::0;::::3;:::i;:::-;;;;50941:230;;50536:1305;51200:13;51217:1;51200:18;51197:644;;;48805:4;51280:6;51253:24;:14;6112::::0;;6020:114;51253:24:::3;:33;;;;:::i;:::-;51252:51;;51244:72;;;;-1:-1:-1::0;;;51244:72:0::3;;;;;;;:::i;:::-;51386:14;::::0;51361:10:::3;51340:32;::::0;;;:20:::3;:32;::::0;;;;;:41:::3;::::0;51375:6;;51340:41:::3;:::i;:::-;51339:61;;51331:117;;;;-1:-1:-1::0;;;51331:117:0::3;;;;;;;:::i;:::-;51500:6;51485:12;;:21;;;;:::i;:::-;51471:9;:36;;51463:63;;;;-1:-1:-1::0;;;51463:63:0::3;;;;;;;:::i;:::-;51564:10;51543:32;::::0;;;:20:::3;:32;::::0;;;;:42;;51579:6;;51543:32;:42:::3;::::0;51579:6;;51543:42:::3;:::i;:::-;::::0;;;-1:-1:-1;51606:9:0::3;::::0;-1:-1:-1;51602:228:0::3;51621:6;51619:1;:8;51602:228;;;51666:24;:12;6231:19:::0;;6249:1;6231:19;;;6142:127;51666:24:::3;51709:26;:14;6231:19:::0;;6249:1;6231:19;;;6142:127;51709:26:::3;51754:60;51760:10;51788:24;:14;6112::::0;;6020:114;51754:60:::3;51629:3:::0;::::3;::::0;::::3;:::i;:::-;;;;51602:228;;;;51197:644;-1:-1:-1::0;;4157:1:0::1;5111:7;:22:::0;-1:-1:-1;;;49572:2276:0:o;55294:197::-;55377:12;55403:8;-1:-1:-1;;;;;55395:22:0;55425:7;55395:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55376:61;;;55456:7;55448:35;;;;-1:-1:-1;;;55448:35:0;;12700:2:1;55448:35:0;;;12682:21:1;12739:2;12719:18;;;12712:30;-1:-1:-1;;;12758:18:1;;;12751:45;12813:18;;55448:35:0;12498:339:1;40626:174:0;40701:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;40701:29:0;-1:-1:-1;;;;;40701:29:0;;;;;;;;:24;;40755:23;40701:24;40755:14;:23::i;:::-;-1:-1:-1;;;;;40746:46:0;;;;;;;;;;;40626:174;;:::o;36774:348::-;36867:4;36569:16;;;:7;:16;;;;;;-1:-1:-1;;;;;36569:16:0;36884:73;;;;-1:-1:-1;;;36884:73:0;;14978:2:1;36884:73:0;;;14960:21:1;15017:2;14997:18;;;14990:30;15056:34;15036:18;;;15029:62;-1:-1:-1;;;15107:18:1;;;15100:42;15159:19;;36884:73:0;14776:408:1;36884:73:0;36968:13;36984:23;36999:7;36984:14;:23::i;:::-;36968:39;;37037:5;-1:-1:-1;;;;;37026:16:0;:7;-1:-1:-1;;;;;37026:16:0;;:51;;;;37070:7;-1:-1:-1;;;;;37046:31:0;:20;37058:7;37046:11;:20::i;:::-;-1:-1:-1;;;;;37046:31:0;;37026:51;:87;;;-1:-1:-1;;;;;;33866:25:0;;;33842:4;33866:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;37081:32;37018:96;36774:348;-1:-1:-1;;;;36774:348:0:o;39883:625::-;40042:4;-1:-1:-1;;;;;40015:31:0;:23;40030:7;40015:14;:23::i;:::-;-1:-1:-1;;;;;40015:31:0;;40007:81;;;;-1:-1:-1;;;40007:81:0;;13044:2:1;40007:81:0;;;13026:21:1;13083:2;13063:18;;;13056:30;13122:34;13102:18;;;13095:62;-1:-1:-1;;;13173:18:1;;;13166:35;13218:19;;40007:81:0;12842:401:1;40007:81:0;-1:-1:-1;;;;;40107:16:0;;40099:65;;;;-1:-1:-1;;;40099:65:0;;13807:2:1;40099:65:0;;;13789:21:1;13846:2;13826:18;;;13819:30;13885:34;13865:18;;;13858:62;-1:-1:-1;;;13936:18:1;;;13929:34;13980:19;;40099:65:0;13605:400:1;40099:65:0;40281:29;40298:1;40302:7;40281:8;:29::i;:::-;-1:-1:-1;;;;;40323:15:0;;;;;;:9;:15;;;;;:20;;40342:1;;40323:15;:20;;40342:1;;40323:20;:::i;:::-;;;;-1:-1:-1;;;;;;;40354:13:0;;;;;;:9;:13;;;;;:18;;40371:1;;40354:13;:18;;40371:1;;40354:18;:::i;:::-;;;;-1:-1:-1;;40383:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;40383:21:0;-1:-1:-1;;;;;40383:21:0;;;;;;;;;40422:27;;40383:16;;40422:27;;;;;;;32819:341;32749:411;;:::o;6277:235::-;6357:14;;6390:9;6382:49;;;;-1:-1:-1;;;6382:49:0;;11518:2:1;6382:49:0;;;11500:21:1;11557:2;11537:18;;;11530:30;11596:29;11576:18;;;11569:57;11643:18;;6382:49:0;11316:351:1;6382:49:0;-1:-1:-1;;6484:9:0;6467:26;;6277:235::o;39126:420::-;39186:13;39202:23;39217:7;39202:14;:23::i;:::-;39186:39;;39327:29;39344:1;39348:7;39327:8;:29::i;:::-;-1:-1:-1;;;;;39369:16:0;;;;;;:9;:16;;;;;:21;;39389:1;;39369:16;:21;;39389:1;;39369:21;:::i;:::-;;;;-1:-1:-1;;39408:16:0;;;;:7;:16;;;;;;39401:23;;-1:-1:-1;;;;;;39401:23:0;;;39442:36;39416:7;;39408:16;-1:-1:-1;;;;;39442:36:0;;;;;39408:16;;39442:36;55825:21:::1;55750:104:::0;:::o;11962:191::-;12055:6;;;-1:-1:-1;;;;;12072:17:0;;;-1:-1:-1;;;;;;12072:17:0;;;;;;;12105:40;;12055:6;;;12072:17;12055:6;;12105:40;;12036:16;;12105:40;12025:128;11962:191;:::o;38458:439::-;-1:-1:-1;;;;;38538:16:0;;38530:61;;;;-1:-1:-1;;;38530:61:0;;16980:2:1;38530:61:0;;;16962:21:1;;;16999:18;;;16992:30;17058:34;17038:18;;;17031:62;17110:18;;38530:61:0;16778:356:1;38530:61:0;36545:4;36569:16;;;:7;:16;;;;;;-1:-1:-1;;;;;36569:16:0;:30;38602:58;;;;-1:-1:-1;;;38602:58:0;;13450:2:1;38602:58:0;;;13432:21:1;13489:2;13469:18;;;13462:30;13528;13508:18;;;13501:58;13576:18;;38602:58:0;13248:352:1;38602:58:0;-1:-1:-1;;;;;38731:13:0;;;;;;:9;:13;;;;;:18;;38748:1;;38731:13;:18;;38748:1;;38731:18;:::i;:::-;;;;-1:-1:-1;;38760:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;38760:21:0;-1:-1:-1;;;;;38760:21:0;;;;;;;;38799:33;;38760:16;;;38799:33;;38760:16;;38799:33;55825:21:::1;55750:104:::0;:::o;40942:315::-;41097:8;-1:-1:-1;;;;;41088:17:0;:5;-1:-1:-1;;;;;41088:17:0;;;41080:55;;;;-1:-1:-1;;;41080:55:0;;14212:2:1;41080:55:0;;;14194:21:1;14251:2;14231:18;;;14224:30;14290:27;14270:18;;;14263:55;14335:18;;41080:55:0;14010:349:1;41080:55:0;-1:-1:-1;;;;;41146:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;41146:46:0;;;;;;;;;;41208:41;;10522::1;;;41208::0;;10495:18:1;41208:41:0;;;;;;;40942:315;;;:::o;35852:::-;36009:28;36019:4;36025:2;36029:7;36009:9;:28::i;:::-;36056:48;36079:4;36085:2;36089:7;36098:5;36056:22;:48::i;:::-;36048:111;;;;-1:-1:-1;;;36048:111:0;;;;;;;:::i;55860:108::-;55920:13;55953:7;55946:14;;;;;:::i;6978:723::-;7034:13;7255:10;7251:53;;-1:-1:-1;;7282:10:0;;;;;;;;;;;;-1:-1:-1;;;7282:10:0;;;;;6978:723::o;7251:53::-;7329:5;7314:12;7370:78;7377:9;;7370:78;;7403:8;;;;:::i;:::-;;-1:-1:-1;7426:10:0;;-1:-1:-1;7434:2:0;7426:10;;:::i;:::-;;;7370:78;;;7458:19;7490:6;7480:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7480:17:0;;7458:39;;7508:154;7515:10;;7508:154;;7542:11;7552:1;7542:11;;:::i;:::-;;-1:-1:-1;7611:10:0;7619:2;7611:5;:10;:::i;:::-;7598:24;;:2;:24;:::i;:::-;7585:39;;7568:6;7575;7568:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;7568:56:0;;;;;;;;-1:-1:-1;7639:11:0;7648:2;7639:11;;:::i;:::-;;;7508:154;;923:190;1048:4;1101;1072:25;1085:5;1092:4;1072:12;:25::i;:::-;:33;;923:190;-1:-1:-1;;;;923:190:0:o;41822:799::-;41977:4;-1:-1:-1;;;;;41998:13:0;;13688:19;:23;41994:620;;42034:72;;-1:-1:-1;;;42034:72:0;;-1:-1:-1;;;;;42034:36:0;;;;;:72;;9496:10;;42085:4;;42091:7;;42100:5;;42034:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42034:72:0;;;;;;;;-1:-1:-1;;42034:72:0;;;;;;;;;;;;:::i;:::-;;;42030:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42276:13:0;;42272:272;;42319:60;;-1:-1:-1;;;42319:60:0;;;;;;;:::i;42272:272::-;42494:6;42488:13;42479:6;42475:2;42471:15;42464:38;42030:529;-1:-1:-1;;;;;;42157:51:0;-1:-1:-1;;;42157:51:0;;-1:-1:-1;42150:58:0;;41994:620;-1:-1:-1;42598:4:0;41822:799;;;;;;:::o;1475:675::-;1558:7;1601:4;1558:7;1616:497;1640:5;:12;1636:1;:16;1616:497;;;1674:20;1697:5;1703:1;1697:8;;;;;;;;:::i;:::-;;;;;;;1674:31;;1740:12;1724;:28;1720:382;;2226:13;2276:15;;;2312:4;2305:15;;;2359:4;2343:21;;1852:57;;1720:382;;;2226:13;2276:15;;;2312:4;2305:15;;;2359:4;2343:21;;2029:57;;1720:382;-1:-1:-1;1654:3:0;;;;:::i;:::-;;;;1616:497;;;-1:-1:-1;2130:12:0;1475:675;-1:-1:-1;;;1475:675:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;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:367::-;713:8;723:6;777:3;770:4;762:6;758:17;754:27;744:55;;795:1;792;785:12;744:55;-1:-1:-1;818:20:1;;861:18;850:30;;847:50;;;893:1;890;883:12;847:50;930:4;922:6;918:17;906:29;;990:3;983:4;973:6;970:1;966:14;958:6;954:27;950:38;947:47;944:67;;;1007:1;1004;997:12;944:67;650:367;;;;;:::o;1022:247::-;1081:6;1134:2;1122:9;1113:7;1109:23;1105:32;1102:52;;;1150:1;1147;1140:12;1102:52;1189:9;1176:23;1208:31;1233:5;1208:31;:::i;1534:388::-;1602:6;1610;1663:2;1651:9;1642:7;1638:23;1634:32;1631:52;;;1679:1;1676;1669:12;1631:52;1718:9;1705:23;1737:31;1762:5;1737:31;:::i;:::-;1787:5;-1:-1:-1;1844:2:1;1829:18;;1816:32;1857:33;1816:32;1857:33;:::i;:::-;1909:7;1899:17;;;1534:388;;;;;:::o;1927:713::-;2031:6;2039;2047;2055;2108:2;2096:9;2087:7;2083:23;2079:32;2076:52;;;2124:1;2121;2114:12;2076:52;2163:9;2150:23;2182:31;2207:5;2182:31;:::i;:::-;2232:5;-1:-1:-1;2289:2:1;2274:18;;2261:32;2302:33;2261:32;2302:33;:::i;:::-;2354:7;-1:-1:-1;2412:2:1;2397:18;;2384:32;2439:18;2428:30;;2425:50;;;2471:1;2468;2461:12;2425:50;2510:70;2572:7;2563:6;2552:9;2548:22;2510:70;:::i;:::-;1927:713;;;;-1:-1:-1;2599:8:1;-1:-1:-1;;;;1927:713:1:o;2645:456::-;2722:6;2730;2738;2791:2;2779:9;2770:7;2766:23;2762:32;2759:52;;;2807:1;2804;2797:12;2759:52;2846:9;2833:23;2865:31;2890:5;2865:31;:::i;:::-;2915:5;-1:-1:-1;2972:2:1;2957:18;;2944:32;2985:33;2944:32;2985:33;:::i;:::-;2645:456;;3037:7;;-1:-1:-1;;;3091:2:1;3076:18;;;;3063:32;;2645:456::o;3106:794::-;3201:6;3209;3217;3225;3278:3;3266:9;3257:7;3253:23;3249:33;3246:53;;;3295:1;3292;3285:12;3246:53;3334:9;3321:23;3353:31;3378:5;3353:31;:::i;:::-;3403:5;-1:-1:-1;3460:2:1;3445:18;;3432:32;3473:33;3432:32;3473:33;:::i;:::-;3525:7;-1:-1:-1;3579:2:1;3564:18;;3551:32;;-1:-1:-1;3634:2:1;3619:18;;3606:32;3661:18;3650:30;;3647:50;;;3693:1;3690;3683:12;3647:50;3716:22;;3769:4;3761:13;;3757:27;-1:-1:-1;3747:55:1;;3798:1;3795;3788:12;3747:55;3821:73;3886:7;3881:2;3868:16;3863:2;3859;3855:11;3821:73;:::i;:::-;3811:83;;;3106:794;;;;;;;:::o;3905:416::-;3970:6;3978;4031:2;4019:9;4010:7;4006:23;4002:32;3999:52;;;4047:1;4044;4037:12;3999:52;4086:9;4073:23;4105:31;4130:5;4105:31;:::i;:::-;4155:5;-1:-1:-1;4212:2:1;4197:18;;4184:32;4254:15;;4247:23;4235:36;;4225:64;;4285:1;4282;4275:12;4326:315;4394:6;4402;4455:2;4443:9;4434:7;4430:23;4426:32;4423:52;;;4471:1;4468;4461:12;4423:52;4510:9;4497:23;4529:31;4554:5;4529:31;:::i;:::-;4579:5;4631:2;4616:18;;;;4603:32;;-1:-1:-1;;;4326:315:1:o;4646:573::-;4750:6;4758;4766;4774;4827:2;4815:9;4806:7;4802:23;4798:32;4795:52;;;4843:1;4840;4833:12;4795:52;4883:9;4870:23;4916:18;4908:6;4905:30;4902:50;;;4948:1;4945;4938:12;4902:50;4987:70;5049:7;5040:6;5029:9;5025:22;4987:70;:::i;:::-;5076:8;;4961:96;;-1:-1:-1;5158:2:1;5143:18;;5130:32;;5209:2;5194:18;5181:32;;-1:-1:-1;4646:573:1;-1:-1:-1;;;;4646:573:1:o;5224:180::-;5283:6;5336:2;5324:9;5315:7;5311:23;5307:32;5304:52;;;5352:1;5349;5342:12;5304:52;-1:-1:-1;5375:23:1;;5224:180;-1:-1:-1;5224:180:1:o;5409:245::-;5467:6;5520:2;5508:9;5499:7;5495:23;5491:32;5488:52;;;5536:1;5533;5526:12;5488:52;5575:9;5562:23;5594:30;5618:5;5594:30;:::i;5659:249::-;5728:6;5781:2;5769:9;5760:7;5756:23;5752:32;5749:52;;;5797:1;5794;5787:12;5749:52;5829:9;5823:16;5848:30;5872:5;5848:30;:::i;5913:450::-;5982:6;6035:2;6023:9;6014:7;6010:23;6006:32;6003:52;;;6051:1;6048;6041:12;6003:52;6091:9;6078:23;6124:18;6116:6;6113:30;6110:50;;;6156:1;6153;6146:12;6110:50;6179:22;;6232:4;6224:13;;6220:27;-1:-1:-1;6210:55:1;;6261:1;6258;6251:12;6210:55;6284:73;6349:7;6344:2;6331:16;6326:2;6322;6318:11;6284:73;:::i;6553:248::-;6621:6;6629;6682:2;6670:9;6661:7;6657:23;6653:32;6650:52;;;6698:1;6695;6688:12;6650:52;-1:-1:-1;;6721:23:1;;;6791:2;6776:18;;;6763:32;;-1:-1:-1;6553:248:1:o;6806:257::-;6847:3;6885:5;6879:12;6912:6;6907:3;6900:19;6928:63;6984:6;6977:4;6972:3;6968:14;6961:4;6954:5;6950:16;6928:63;:::i;:::-;7045:2;7024:15;-1:-1:-1;;7020:29:1;7011:39;;;;7052:4;7007:50;;6806:257;-1:-1:-1;;6806:257:1:o;7302:1527::-;7526:3;7564:6;7558:13;7590:4;7603:51;7647:6;7642:3;7637:2;7629:6;7625:15;7603:51;:::i;:::-;7717:13;;7676:16;;;;7739:55;7717:13;7676:16;7761:15;;;7739:55;:::i;:::-;7883:13;;7816:20;;;7856:1;;7943;7965:18;;;;8018;;;;8045:93;;8123:4;8113:8;8109:19;8097:31;;8045:93;8186:2;8176:8;8173:16;8153:18;8150:40;8147:167;;;-1:-1:-1;;;8213:33:1;;8269:4;8266:1;8259:15;8299:4;8220:3;8287:17;8147:167;8330:18;8357:110;;;;8481:1;8476:328;;;;8323:481;;8357:110;-1:-1:-1;;8392:24:1;;8378:39;;8437:20;;;;-1:-1:-1;8357:110:1;;8476:328;20524:1;20517:14;;;20561:4;20548:18;;8571:1;8585:169;8599:8;8596:1;8593:15;8585:169;;;8681:14;;8666:13;;;8659:37;8724:16;;;;8616:10;;8585:169;;;8589:3;;8785:8;8778:5;8774:20;8767:27;;8323:481;-1:-1:-1;8820:3:1;;7302:1527;-1:-1:-1;;;;;;;;;;;7302:1527:1:o;9252:488::-;-1:-1:-1;;;;;9521:15:1;;;9503:34;;9573:15;;9568:2;9553:18;;9546:43;9620:2;9605:18;;9598:34;;;9668:3;9663:2;9648:18;;9641:31;;;9446:4;;9689:45;;9714:19;;9706:6;9689:45;:::i;:::-;9681:53;9252:488;-1:-1:-1;;;;;;9252:488:1:o;9745:632::-;9916:2;9968:21;;;10038:13;;9941:18;;;10060:22;;;9887:4;;9916:2;10139:15;;;;10113:2;10098:18;;;9887:4;10182:169;10196:6;10193:1;10190:13;10182:169;;;10257:13;;10245:26;;10326:15;;;;10291:12;;;;10218:1;10211:9;10182:169;;;-1:-1:-1;10368:3:1;;9745:632;-1:-1:-1;;;;;;9745:632:1:o;10756:219::-;10905:2;10894:9;10887:21;10868:4;10925:44;10965:2;10954:9;10950:18;10942:6;10925:44;:::i;10980:331::-;11182:2;11164:21;;;11221:1;11201:18;;;11194:29;-1:-1:-1;;;11254:2:1;11239:18;;11232:38;11302:2;11287:18;;10980:331::o;11672:414::-;11874:2;11856:21;;;11913:2;11893:18;;;11886:30;11952:34;11947:2;11932:18;;11925:62;-1:-1:-1;;;12018:2:1;12003:18;;11996:48;12076:3;12061:19;;11672:414::o;14364:407::-;14566:2;14548:21;;;14605:2;14585:18;;;14578:30;14644:34;14639:2;14624:18;;14617:62;-1:-1:-1;;;14710:2:1;14695:18;;14688:41;14761:3;14746:19;;14364:407::o;15189:338::-;15391:2;15373:21;;;15430:2;15410:18;;;15403:30;-1:-1:-1;;;15464:2:1;15449:18;;15442:44;15518:2;15503:18;;15189:338::o;17552:356::-;17754:2;17736:21;;;17773:18;;;17766:30;17832:34;17827:2;17812:18;;17805:62;17899:2;17884:18;;17552:356::o;18731:413::-;18933:2;18915:21;;;18972:2;18952:18;;;18945:30;19011:34;19006:2;18991:18;;18984:62;-1:-1:-1;;;19077:2:1;19062:18;;19055:47;19134:3;19119:19;;18731:413::o;20577:128::-;20617:3;20648:1;20644:6;20641:1;20638:13;20635:39;;;20654:18;;:::i;:::-;-1:-1:-1;20690:9:1;;20577:128::o;20710:120::-;20750:1;20776;20766:35;;20781:18;;:::i;:::-;-1:-1:-1;20815:9:1;;20710:120::o;20835:168::-;20875:7;20941:1;20937;20933:6;20929:14;20926:1;20923:21;20918:1;20911:9;20904:17;20900:45;20897:71;;;20948:18;;:::i;:::-;-1:-1:-1;20988:9:1;;20835:168::o;21008:125::-;21048:4;21076:1;21073;21070:8;21067:34;;;21081:18;;:::i;:::-;-1:-1:-1;21118:9:1;;21008:125::o;21138:258::-;21210:1;21220:113;21234:6;21231:1;21228:13;21220:113;;;21310:11;;;21304:18;21291:11;;;21284:39;21256:2;21249:10;21220:113;;;21351:6;21348:1;21345:13;21342:48;;;-1:-1:-1;;21386:1:1;21368:16;;21361:27;21138:258::o;21401:380::-;21480:1;21476:12;;;;21523;;;21544:61;;21598:4;21590:6;21586:17;21576:27;;21544:61;21651:2;21643:6;21640:14;21620:18;21617:38;21614:161;;;21697:10;21692:3;21688:20;21685:1;21678:31;21732:4;21729:1;21722:15;21760:4;21757:1;21750:15;21614:161;;21401:380;;;:::o;21786:135::-;21825:3;-1:-1:-1;;21846:17:1;;21843:43;;;21866:18;;:::i;:::-;-1:-1:-1;21913:1:1;21902:13;;21786:135::o;21926:112::-;21958:1;21984;21974:35;;21989:18;;:::i;:::-;-1:-1:-1;22023:9:1;;21926:112::o;22043:127::-;22104:10;22099:3;22095:20;22092:1;22085:31;22135:4;22132:1;22125:15;22159:4;22156:1;22149:15;22175:127;22236:10;22231:3;22227:20;22224:1;22217:31;22267:4;22264:1;22257:15;22291:4;22288:1;22281:15;22307:127;22368:10;22363:3;22359:20;22356:1;22349:31;22399:4;22396:1;22389:15;22423:4;22420:1;22413:15;22439:127;22500:10;22495:3;22491:20;22488:1;22481:31;22531:4;22528:1;22521:15;22555:4;22552:1;22545:15;22571:131;-1:-1:-1;;;;;22646:31:1;;22636:42;;22626:70;;22692:1;22689;22682:12;22707:131;-1:-1:-1;;;;;;22781:32:1;;22771:43;;22761:71;;22828:1;22825;22818:12

Swarm Source

ipfs://001e43d51f10844a5b54e9b4d46157904e57473c68be81f0ac705a43e0a955bb
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.