ETH Price: $3,241.09 (+2.21%)
Gas: 2 Gwei

Token

Mandala Regens (Regens)
 

Overview

Max Total Supply

1,000 Regens

Holders

343

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
clicksell.eth
Balance
2 Regens
0xd694b5db4d1bff216e2fe3b3b72cf2f5ce95c56b
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:
NFT_ERC721

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

// Author: Red

// Genesis

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol
// OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/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.0 (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.0 (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.0 (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Address.sol
// OpenZeppelin Contracts v4.4.0 (utils/Address.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol
// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `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.0 (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.0 (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.0 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

    /**
     * @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 of token that is not own"
        );
        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);
    }

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

// File: contracts/NFT.sol

pragma solidity ^0.8.0;

contract NFT_ERC721 is ERC721, Ownable {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenSupply;

    using Strings for uint256;

    string baseURI = "ipfs://QmPWckBjpmQSTGXMzMsez91ayKGbGjonJ2cTe2ms3iTzig/";
    string public baseExtension = ".json";
    uint256 public maxSupply = 1000;
    bool public revealed = false;
    string public notRevealedUri =
        "ipfs://QmPWckBjpmQSTGXMzMsez91ayKGbGjonJ2cTe2ms3iTzig/hidden.json";
    address payable public payments;
    bytes32 public merkleRootOG =
        0x3b0da7204ced669c3d8054621fa567e585f035b8583353fdc65d4d7a3aa7ffe4;
    bytes32 public merkleRootCollab =
        0x1515793cdc55dc782b4e6dd8c5bd013d8eb53973bcf7752abf2b167194b85b67;
    // Phase 1 (OG & Partners): October 23, 8:30AM UTC / 4:30AM EST
    // Phase 2 (Collabs): October 23, 4PM UTC / 12PM EST
    // Phase 3 (Public): October 23, 7PM UTC / 3PM EST
    uint256 public OGStartTime = 1666513800;
    uint256 public collabStartTime = 1666540800;
    uint256 public publicStartTime = 1666551600;

    mapping(address => bool) public mintClaimed;

    constructor() ERC721("Mandala Regens", "Regens") {
        uint256 supply = _tokenSupply.current();
        for (uint256 i = 0; i < 25; i++) {
            _tokenSupply.increment();
            _safeMint(0x809bFD2E376BF2E4C53F352B8bF07c812662f588, supply + i);
        }
    }

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

    // public
    function OGMint(bytes32[] calldata _merkleProof) public payable {
        require(block.timestamp > OGStartTime, "OG minting not started");
        uint256 supply = _tokenSupply.current();
        require(supply + 1 <= maxSupply, "Max supply has been reached");
        require(!mintClaimed[msg.sender], "Address already claimed");
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(
            MerkleProof.verify(_merkleProof, merkleRootOG, leaf),
            "Invalid Merkle proof for OG"
        );

        mintClaimed[msg.sender] = true;
        _tokenSupply.increment();
        _safeMint(msg.sender, supply);
    }

    function collabMint(bytes32[] calldata _merkleProof) public payable {
        require(
            block.timestamp > collabStartTime,
            "Collab minting not started"
        );
        uint256 supply = _tokenSupply.current();
        require(supply + 1 <= maxSupply, "Max supply has been reached");
        require(!mintClaimed[msg.sender], "Address already claimed");
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(
            MerkleProof.verify(_merkleProof, merkleRootOG, leaf),
            "Invalid Merkle proof for Collab"
        );

        mintClaimed[msg.sender] = true;
        _tokenSupply.increment();
        _safeMint(msg.sender, supply);
    }

    function publicMint() public payable {
        require(
            block.timestamp > publicStartTime,
            "Public minting not started"
        );
        uint256 supply = _tokenSupply.current();
        require(supply + 1 <= maxSupply, "Max supply has been reached");
        require(!mintClaimed[msg.sender], "Address already claimed");

        mintClaimed[msg.sender] = true;
        _tokenSupply.increment();
        _safeMint(msg.sender, supply);
    }

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

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

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

    // only owner
    function reveal() public onlyOwner {
        revealed = true;
    }

    function setMerkleRootOG(bytes32 _merkleRoot) external onlyOwner {
        merkleRootOG = _merkleRoot;
    }

    function setMerkleRootCollab(bytes32 _merkleRoot) external onlyOwner {
        merkleRootCollab = _merkleRoot;
    }

    function setOGStartTime(uint256 _OGStartTime) external onlyOwner {
        OGStartTime = _OGStartTime;
    }

    function setCollabStartTime(uint256 _collabStartTime) external onlyOwner {
        collabStartTime = _collabStartTime;
    }

    function setPublicStartTime(uint256 _publicStartTime) external onlyOwner {
        publicStartTime = _publicStartTime;
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
        notRevealedUri = _notRevealedURI;
    }

    function setBaseExtension(string memory _newBaseExtension)
        public
        onlyOwner
    {
        baseExtension = _newBaseExtension;
    }

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"OGMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"OGStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"collabMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"collabStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRootCollab","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRootOG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payments","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collabStartTime","type":"uint256"}],"name":"setCollabStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRootCollab","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRootOG","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_OGStartTime","type":"uint256"}],"name":"setOGStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicStartTime","type":"uint256"}],"name":"setPublicStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060600160405280603681526020016200559760369139600890805190602001906200003592919062000845565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600990805190602001906200008392919062000845565b506103e8600a556000600b60006101000a81548160ff021916908315150217905550604051806080016040528060418152602001620055cd60419139600c9080519060200190620000d692919062000845565b507f3b0da7204ced669c3d8054621fa567e585f035b8583353fdc65d4d7a3aa7ffe460001b600e557f1515793cdc55dc782b4e6dd8c5bd013d8eb53973bcf7752abf2b167194b85b6760001b600f55636354fb8860105563635565006011556363558f306012553480156200014a57600080fd5b506040518060400160405280600e81526020017f4d616e64616c6120526567656e730000000000000000000000000000000000008152506040518060400160405280600681526020017f526567656e7300000000000000000000000000000000000000000000000000008152508160009080519060200190620001cf92919062000845565b508060019080519060200190620001e892919062000845565b5050506200020b620001ff6200029b60201b60201c565b620002a360201b60201c565b60006200022460076200036960201b620020961760201c565b905060005b601981101562000293576200024a60076200037760201b620020a41760201c565b6200027d73809bfd2e376bf2e4c53f352b8bf07c812662f588828462000271919062000afd565b6200038d60201b60201c565b80806200028a9062000c30565b91505062000229565b505062000dad565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b6001816000016000828254019250508190555050565b620003af828260405180602001604052806000815250620003b360201b60201c565b5050565b620003c583836200042160201b60201c565b620003da60008484846200060760201b60201c565b6200041c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004139062000a6a565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000494576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200048b9062000aae565b60405180910390fd5b620004a581620007c160201b60201c565b15620004e8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004df9062000a8c565b60405180910390fd5b620004fc600083836200082d60201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200054e919062000afd565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000620006358473ffffffffffffffffffffffffffffffffffffffff166200083260201b620020ba1760201c565b15620007b4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620006676200029b60201b60201c565b8786866040518563ffffffff1660e01b81526004016200068b949392919062000a16565b602060405180830381600087803b158015620006a657600080fd5b505af1925050508015620006da57506040513d601f19601f82011682018060405250810190620006d791906200090c565b60015b62000763573d80600081146200070d576040519150601f19603f3d011682016040523d82523d6000602084013e62000712565b606091505b506000815114156200075b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007529062000a6a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050620007b9565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b600080823b905060008111915050919050565b828054620008539062000bfa565b90600052602060002090601f016020900481019282620008775760008555620008c3565b82601f106200089257805160ff1916838001178555620008c3565b82800160010185558215620008c3579182015b82811115620008c2578251825591602001919060010190620008a5565b5b509050620008d29190620008d6565b5090565b5b80821115620008f1576000816000905550600101620008d7565b5090565b600081519050620009068162000d93565b92915050565b60006020828403121562000925576200092462000cdc565b5b60006200093584828501620008f5565b91505092915050565b620009498162000b5a565b82525050565b60006200095c8262000ad0565b62000968818562000adb565b93506200097a81856020860162000bc4565b620009858162000ce1565b840191505092915050565b60006200099f60328362000aec565b9150620009ac8262000cf2565b604082019050919050565b6000620009c6601c8362000aec565b9150620009d38262000d41565b602082019050919050565b6000620009ed60208362000aec565b9150620009fa8262000d6a565b602082019050919050565b62000a108162000bba565b82525050565b600060808201905062000a2d60008301876200093e565b62000a3c60208301866200093e565b62000a4b604083018562000a05565b818103606083015262000a5f81846200094f565b905095945050505050565b6000602082019050818103600083015262000a858162000990565b9050919050565b6000602082019050818103600083015262000aa781620009b7565b9050919050565b6000602082019050818103600083015262000ac981620009de565b9050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600062000b0a8262000bba565b915062000b178362000bba565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000b4f5762000b4e62000c7e565b5b828201905092915050565b600062000b678262000b9a565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000be457808201518184015260208101905062000bc7565b8381111562000bf4576000848401525b50505050565b6000600282049050600182168062000c1357607f821691505b6020821081141562000c2a5762000c2962000cad565b5b50919050565b600062000c3d8262000bba565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000c735762000c7262000c7e565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b62000d9e8162000b6e565b811462000daa57600080fd5b50565b6147da8062000dbd6000396000f3fe6080604052600436106102465760003560e01c806370a0823111610139578063ad6cb319116100b6578063da3ef23f1161007a578063da3ef23f146107fe578063db8cc8fa14610827578063e514c7e114610850578063e985e9c514610879578063f2c4ce1e146108b6578063f2fde38b146108df57610246565b8063ad6cb31914610717578063b88d4fde14610742578063c66828621461076b578063c87b56dd14610796578063d5abeb01146107d357610246565b8063a22cb465116100fd578063a22cb46514610658578063a475b5dd14610681578063a58fdc1114610698578063a6d23e10146106c1578063aafdff7c146106ec57610246565b806370a0823114610583578063715018a6146105c05780638da5cb5b146105d757806395d89b4114610602578063970703d01461062d57610246565b8063203b1581116101c75780634704b6771161018b5780634704b677146104ab57806351830227146104c757806355f804b3146104f25780635fd1bbc41461051b5780636352211e1461054657610246565b8063203b15811461041c57806323b872dd1461044557806326092b831461046e5780633ccfd60b1461047857806342842e0e1461048257610246565b8063095ea7b31161020e578063095ea7b3146103375780631237e5e81461036057806318160ddd1461039d5780631c7e49b5146103c85780632018e884146103f157610246565b80630186d1371461024b57806301ffc9a71461026757806306fdde03146102a4578063081812fc146102cf578063081c8c441461030c575b600080fd5b610265600480360381019061026091906132cc565b610908565b005b34801561027357600080fd5b5061028e60048036038101906102899190613346565b610b62565b60405161029b91906139c5565b60405180910390f35b3480156102b057600080fd5b506102b9610c44565b6040516102c691906139fb565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f191906133e9565b610cd6565b6040516103039190613943565b60405180910390f35b34801561031857600080fd5b50610321610d5b565b60405161032e91906139fb565b60405180910390f35b34801561034357600080fd5b5061035e6004803603810190610359919061328c565b610de9565b005b34801561036c57600080fd5b5061038760048036038101906103829190613109565b610f01565b60405161039491906139c5565b60405180910390f35b3480156103a957600080fd5b506103b2610f21565b6040516103bf9190613cfd565b60405180910390f35b3480156103d457600080fd5b506103ef60048036038101906103ea91906133e9565b610f32565b005b3480156103fd57600080fd5b50610406610fb8565b6040516104139190613cfd565b60405180910390f35b34801561042857600080fd5b50610443600480360381019061043e91906133e9565b610fbe565b005b34801561045157600080fd5b5061046c60048036038101906104679190613176565b611044565b005b6104766110a4565b005b610480611243565b005b34801561048e57600080fd5b506104a960048036038101906104a49190613176565b61133f565b005b6104c560048036038101906104c091906132cc565b61135f565b005b3480156104d357600080fd5b506104dc6115b9565b6040516104e991906139c5565b60405180910390f35b3480156104fe57600080fd5b50610519600480360381019061051491906133a0565b6115cc565b005b34801561052757600080fd5b50610530611662565b60405161053d9190613cfd565b60405180910390f35b34801561055257600080fd5b5061056d600480360381019061056891906133e9565b611668565b60405161057a9190613943565b60405180910390f35b34801561058f57600080fd5b506105aa60048036038101906105a59190613109565b61171a565b6040516105b79190613cfd565b60405180910390f35b3480156105cc57600080fd5b506105d56117d2565b005b3480156105e357600080fd5b506105ec61185a565b6040516105f99190613943565b60405180910390f35b34801561060e57600080fd5b50610617611884565b60405161062491906139fb565b60405180910390f35b34801561063957600080fd5b50610642611916565b60405161064f91906139e0565b60405180910390f35b34801561066457600080fd5b5061067f600480360381019061067a919061324c565b61191c565b005b34801561068d57600080fd5b50610696611932565b005b3480156106a457600080fd5b506106bf60048036038101906106ba9190613319565b6119cb565b005b3480156106cd57600080fd5b506106d6611a51565b6040516106e3919061395e565b60405180910390f35b3480156106f857600080fd5b50610701611a77565b60405161070e9190613cfd565b60405180910390f35b34801561072357600080fd5b5061072c611a7d565b60405161073991906139e0565b60405180910390f35b34801561074e57600080fd5b50610769600480360381019061076491906131c9565b611a83565b005b34801561077757600080fd5b50610780611ae5565b60405161078d91906139fb565b60405180910390f35b3480156107a257600080fd5b506107bd60048036038101906107b891906133e9565b611b73565b6040516107ca91906139fb565b60405180910390f35b3480156107df57600080fd5b506107e8611ccc565b6040516107f59190613cfd565b60405180910390f35b34801561080a57600080fd5b50610825600480360381019061082091906133a0565b611cd2565b005b34801561083357600080fd5b5061084e600480360381019061084991906133e9565b611d68565b005b34801561085c57600080fd5b5061087760048036038101906108729190613319565b611dee565b005b34801561088557600080fd5b506108a0600480360381019061089b9190613136565b611e74565b6040516108ad91906139c5565b60405180910390f35b3480156108c257600080fd5b506108dd60048036038101906108d891906133a0565b611f08565b005b3480156108eb57600080fd5b5061090660048036038101906109019190613109565b611f9e565b005b601054421161094c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094390613b5d565b60405180910390fd5b60006109586007612096565b9050600a5460018261096a9190613e02565b11156109ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a290613cbd565b60405180910390fd5b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610a38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2f90613bfd565b60405180910390fd5b600033604051602001610a4b91906138e2565b604051602081830303815290604052805190602001209050610ab1848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e54836120cd565b610af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae790613c9d565b60405180910390fd5b6001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610b5260076120a4565b610b5c33836120e4565b50505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c2d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c3d5750610c3c82612102565b5b9050919050565b606060008054610c5390613f8f565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7f90613f8f565b8015610ccc5780601f10610ca157610100808354040283529160200191610ccc565b820191906000526020600020905b815481529060010190602001808311610caf57829003601f168201915b5050505050905090565b6000610ce18261216c565b610d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1790613bbd565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600c8054610d6890613f8f565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9490613f8f565b8015610de15780601f10610db657610100808354040283529160200191610de1565b820191906000526020600020905b815481529060010190602001808311610dc457829003601f168201915b505050505081565b6000610df482611668565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5c90613c5d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e846121d8565b73ffffffffffffffffffffffffffffffffffffffff161480610eb35750610eb281610ead6121d8565b611e74565b5b610ef2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee990613add565b60405180910390fd5b610efc83836121e0565b505050565b60136020528060005260406000206000915054906101000a900460ff1681565b6000610f2d6007612096565b905090565b610f3a6121d8565b73ffffffffffffffffffffffffffffffffffffffff16610f5861185a565b73ffffffffffffffffffffffffffffffffffffffff1614610fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa590613bdd565b60405180910390fd5b8060118190555050565b60115481565b610fc66121d8565b73ffffffffffffffffffffffffffffffffffffffff16610fe461185a565b73ffffffffffffffffffffffffffffffffffffffff161461103a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103190613bdd565b60405180910390fd5b8060108190555050565b61105561104f6121d8565b82612299565b611094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108b90613c7d565b60405180910390fd5b61109f838383612377565b505050565b60125442116110e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110df90613b9d565b60405180910390fd5b60006110f46007612096565b9050600a546001826111069190613e02565b1115611147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113e90613cbd565b60405180910390fd5b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156111d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cb90613bfd565b60405180910390fd5b6001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061123660076120a4565b61124033826120e4565b50565b61124b6121d8565b73ffffffffffffffffffffffffffffffffffffffff1661126961185a565b73ffffffffffffffffffffffffffffffffffffffff16146112bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b690613bdd565b60405180910390fd5b60006112c961185a565b73ffffffffffffffffffffffffffffffffffffffff16476040516112ec9061392e565b60006040518083038185875af1925050503d8060008114611329576040519150601f19603f3d011682016040523d82523d6000602084013e61132e565b606091505b505090508061133c57600080fd5b50565b61135a83838360405180602001604052806000815250611a83565b505050565b60115442116113a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139a90613b3d565b60405180910390fd5b60006113af6007612096565b9050600a546001826113c19190613e02565b1115611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f990613cbd565b60405180910390fd5b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561148f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148690613bfd565b60405180910390fd5b6000336040516020016114a291906138e2565b604051602081830303815290604052805190602001209050611508848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e54836120cd565b611547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153e90613cdd565b60405180910390fd5b6001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506115a960076120a4565b6115b333836120e4565b50505050565b600b60009054906101000a900460ff1681565b6115d46121d8565b73ffffffffffffffffffffffffffffffffffffffff166115f261185a565b73ffffffffffffffffffffffffffffffffffffffff1614611648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163f90613bdd565b60405180910390fd5b806008908051906020019061165e929190612eb2565b5050565b60125481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611711576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170890613b1d565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561178b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178290613afd565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117da6121d8565b73ffffffffffffffffffffffffffffffffffffffff166117f861185a565b73ffffffffffffffffffffffffffffffffffffffff161461184e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184590613bdd565b60405180910390fd5b61185860006125d3565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461189390613f8f565b80601f01602080910402602001604051908101604052809291908181526020018280546118bf90613f8f565b801561190c5780601f106118e15761010080835404028352916020019161190c565b820191906000526020600020905b8154815290600101906020018083116118ef57829003601f168201915b5050505050905090565b600f5481565b61192e6119276121d8565b8383612699565b5050565b61193a6121d8565b73ffffffffffffffffffffffffffffffffffffffff1661195861185a565b73ffffffffffffffffffffffffffffffffffffffff16146119ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a590613bdd565b60405180910390fd5b6001600b60006101000a81548160ff021916908315150217905550565b6119d36121d8565b73ffffffffffffffffffffffffffffffffffffffff166119f161185a565b73ffffffffffffffffffffffffffffffffffffffff1614611a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3e90613bdd565b60405180910390fd5b80600e8190555050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60105481565b600e5481565b611a94611a8e6121d8565b83612299565b611ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aca90613c7d565b60405180910390fd5b611adf84848484612806565b50505050565b60098054611af290613f8f565b80601f0160208091040260200160405190810160405280929190818152602001828054611b1e90613f8f565b8015611b6b5780601f10611b4057610100808354040283529160200191611b6b565b820191906000526020600020905b815481529060010190602001808311611b4e57829003601f168201915b505050505081565b6060611b7e8261216c565b611bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb490613c3d565b60405180910390fd5b60001515600b60009054906101000a900460ff1615151415611c6b57600c8054611be690613f8f565b80601f0160208091040260200160405190810160405280929190818152602001828054611c1290613f8f565b8015611c5f5780601f10611c3457610100808354040283529160200191611c5f565b820191906000526020600020905b815481529060010190602001808311611c4257829003601f168201915b50505050509050611cc7565b6000611c75612862565b90506000815111611c955760405180602001604052806000815250611cc3565b80611c9f846128f4565b6009604051602001611cb3939291906138fd565b6040516020818303038152906040525b9150505b919050565b600a5481565b611cda6121d8565b73ffffffffffffffffffffffffffffffffffffffff16611cf861185a565b73ffffffffffffffffffffffffffffffffffffffff1614611d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4590613bdd565b60405180910390fd5b8060099080519060200190611d64929190612eb2565b5050565b611d706121d8565b73ffffffffffffffffffffffffffffffffffffffff16611d8e61185a565b73ffffffffffffffffffffffffffffffffffffffff1614611de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddb90613bdd565b60405180910390fd5b8060128190555050565b611df66121d8565b73ffffffffffffffffffffffffffffffffffffffff16611e1461185a565b73ffffffffffffffffffffffffffffffffffffffff1614611e6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6190613bdd565b60405180910390fd5b80600f8190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f106121d8565b73ffffffffffffffffffffffffffffffffffffffff16611f2e61185a565b73ffffffffffffffffffffffffffffffffffffffff1614611f84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7b90613bdd565b60405180910390fd5b80600c9080519060200190611f9a929190612eb2565b5050565b611fa66121d8565b73ffffffffffffffffffffffffffffffffffffffff16611fc461185a565b73ffffffffffffffffffffffffffffffffffffffff161461201a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201190613bdd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561208a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208190613a3d565b60405180910390fd5b612093816125d3565b50565b600081600001549050919050565b6001816000016000828254019250508190555050565b600080823b905060008111915050919050565b6000826120da8584612a55565b1490509392505050565b6120fe828260405180602001604052806000815250612aab565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661225383611668565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006122a48261216c565b6122e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122da90613abd565b60405180910390fd5b60006122ee83611668565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061235d57508373ffffffffffffffffffffffffffffffffffffffff1661234584610cd6565b73ffffffffffffffffffffffffffffffffffffffff16145b8061236e575061236d8185611e74565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661239782611668565b73ffffffffffffffffffffffffffffffffffffffff16146123ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e490613c1d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561245d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245490613a7d565b60405180910390fd5b612468838383612b06565b6124736000826121e0565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124c39190613e89565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461251a9190613e02565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ff90613a9d565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127f991906139c5565b60405180910390a3505050565b612811848484612377565b61281d84848484612b0b565b61285c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285390613a1d565b60405180910390fd5b50505050565b60606008805461287190613f8f565b80601f016020809104026020016040519081016040528092919081815260200182805461289d90613f8f565b80156128ea5780601f106128bf576101008083540402835291602001916128ea565b820191906000526020600020905b8154815290600101906020018083116128cd57829003601f168201915b5050505050905090565b6060600082141561293c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a50565b600082905060005b6000821461296e57808061295790613ff2565b915050600a826129679190613e58565b9150612944565b60008167ffffffffffffffff81111561298a5761298961414c565b5b6040519080825280601f01601f1916602001820160405280156129bc5781602001600182028036833780820191505090505b5090505b60008514612a49576001826129d59190613e89565b9150600a856129e4919061405f565b60306129f09190613e02565b60f81b818381518110612a0657612a0561411d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a429190613e58565b94506129c0565b8093505050505b919050565b60008082905060005b8451811015612aa057612a8b82868381518110612a7e57612a7d61411d565b5b6020026020010151612ca2565b91508080612a9890613ff2565b915050612a5e565b508091505092915050565b612ab58383612ccd565b612ac26000848484612b0b565b612b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af890613a1d565b60405180910390fd5b505050565b505050565b6000612b2c8473ffffffffffffffffffffffffffffffffffffffff166120ba565b15612c95578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b556121d8565b8786866040518563ffffffff1660e01b8152600401612b779493929190613979565b602060405180830381600087803b158015612b9157600080fd5b505af1925050508015612bc257506040513d601f19601f82011682018060405250810190612bbf9190613373565b60015b612c45573d8060008114612bf2576040519150601f19603f3d011682016040523d82523d6000602084013e612bf7565b606091505b50600081511415612c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3490613a1d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c9a565b600190505b949350505050565b6000818310612cba57612cb58284612e9b565b612cc5565b612cc48383612e9b565b5b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3490613b7d565b60405180910390fd5b612d468161216c565b15612d86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7d90613a5d565b60405180910390fd5b612d9260008383612b06565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612de29190613e02565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600082600052816020526040600020905092915050565b828054612ebe90613f8f565b90600052602060002090601f016020900481019282612ee05760008555612f27565b82601f10612ef957805160ff1916838001178555612f27565b82800160010185558215612f27579182015b82811115612f26578251825591602001919060010190612f0b565b5b509050612f349190612f38565b5090565b5b80821115612f51576000816000905550600101612f39565b5090565b6000612f68612f6384613d3d565b613d18565b905082815260208101848484011115612f8457612f8361418a565b5b612f8f848285613f4d565b509392505050565b6000612faa612fa584613d6e565b613d18565b905082815260208101848484011115612fc657612fc561418a565b5b612fd1848285613f4d565b509392505050565b600081359050612fe881614731565b92915050565b60008083601f84011261300457613003614180565b5b8235905067ffffffffffffffff8111156130215761302061417b565b5b60208301915083602082028301111561303d5761303c614185565b5b9250929050565b60008135905061305381614748565b92915050565b6000813590506130688161475f565b92915050565b60008135905061307d81614776565b92915050565b60008151905061309281614776565b92915050565b600082601f8301126130ad576130ac614180565b5b81356130bd848260208601612f55565b91505092915050565b600082601f8301126130db576130da614180565b5b81356130eb848260208601612f97565b91505092915050565b6000813590506131038161478d565b92915050565b60006020828403121561311f5761311e614194565b5b600061312d84828501612fd9565b91505092915050565b6000806040838503121561314d5761314c614194565b5b600061315b85828601612fd9565b925050602061316c85828601612fd9565b9150509250929050565b60008060006060848603121561318f5761318e614194565b5b600061319d86828701612fd9565b93505060206131ae86828701612fd9565b92505060406131bf868287016130f4565b9150509250925092565b600080600080608085870312156131e3576131e2614194565b5b60006131f187828801612fd9565b945050602061320287828801612fd9565b9350506040613213878288016130f4565b925050606085013567ffffffffffffffff8111156132345761323361418f565b5b61324087828801613098565b91505092959194509250565b6000806040838503121561326357613262614194565b5b600061327185828601612fd9565b925050602061328285828601613044565b9150509250929050565b600080604083850312156132a3576132a2614194565b5b60006132b185828601612fd9565b92505060206132c2858286016130f4565b9150509250929050565b600080602083850312156132e3576132e2614194565b5b600083013567ffffffffffffffff8111156133015761330061418f565b5b61330d85828601612fee565b92509250509250929050565b60006020828403121561332f5761332e614194565b5b600061333d84828501613059565b91505092915050565b60006020828403121561335c5761335b614194565b5b600061336a8482850161306e565b91505092915050565b60006020828403121561338957613388614194565b5b600061339784828501613083565b91505092915050565b6000602082840312156133b6576133b5614194565b5b600082013567ffffffffffffffff8111156133d4576133d361418f565b5b6133e0848285016130c6565b91505092915050565b6000602082840312156133ff576133fe614194565b5b600061340d848285016130f4565b91505092915050565b61341f81613ecf565b82525050565b61342e81613ebd565b82525050565b61344561344082613ebd565b61403b565b82525050565b61345481613ee1565b82525050565b61346381613eed565b82525050565b600061347482613db4565b61347e8185613dca565b935061348e818560208601613f5c565b61349781614199565b840191505092915050565b60006134ad82613dbf565b6134b78185613de6565b93506134c7818560208601613f5c565b6134d081614199565b840191505092915050565b60006134e682613dbf565b6134f08185613df7565b9350613500818560208601613f5c565b80840191505092915050565b6000815461351981613f8f565b6135238186613df7565b9450600182166000811461353e576001811461354f57613582565b60ff19831686528186019350613582565b61355885613d9f565b60005b8381101561357a5781548189015260018201915060208101905061355b565b838801955050505b50505092915050565b6000613598603283613de6565b91506135a3826141b7565b604082019050919050565b60006135bb602683613de6565b91506135c682614206565b604082019050919050565b60006135de601c83613de6565b91506135e982614255565b602082019050919050565b6000613601602483613de6565b915061360c8261427e565b604082019050919050565b6000613624601983613de6565b915061362f826142cd565b602082019050919050565b6000613647602c83613de6565b9150613652826142f6565b604082019050919050565b600061366a603883613de6565b915061367582614345565b604082019050919050565b600061368d602a83613de6565b915061369882614394565b604082019050919050565b60006136b0602983613de6565b91506136bb826143e3565b604082019050919050565b60006136d3601a83613de6565b91506136de82614432565b602082019050919050565b60006136f6601683613de6565b91506137018261445b565b602082019050919050565b6000613719602083613de6565b915061372482614484565b602082019050919050565b600061373c601a83613de6565b9150613747826144ad565b602082019050919050565b600061375f602c83613de6565b915061376a826144d6565b604082019050919050565b6000613782602083613de6565b915061378d82614525565b602082019050919050565b60006137a5601783613de6565b91506137b08261454e565b602082019050919050565b60006137c8602983613de6565b91506137d382614577565b604082019050919050565b60006137eb602f83613de6565b91506137f6826145c6565b604082019050919050565b600061380e602183613de6565b915061381982614615565b604082019050919050565b6000613831600083613ddb565b915061383c82614664565b600082019050919050565b6000613854603183613de6565b915061385f82614667565b604082019050919050565b6000613877601b83613de6565b9150613882826146b6565b602082019050919050565b600061389a601b83613de6565b91506138a5826146df565b602082019050919050565b60006138bd601f83613de6565b91506138c882614708565b602082019050919050565b6138dc81613f43565b82525050565b60006138ee8284613434565b60148201915081905092915050565b600061390982866134db565b915061391582856134db565b9150613921828461350c565b9150819050949350505050565b600061393982613824565b9150819050919050565b60006020820190506139586000830184613425565b92915050565b60006020820190506139736000830184613416565b92915050565b600060808201905061398e6000830187613425565b61399b6020830186613425565b6139a860408301856138d3565b81810360608301526139ba8184613469565b905095945050505050565b60006020820190506139da600083018461344b565b92915050565b60006020820190506139f5600083018461345a565b92915050565b60006020820190508181036000830152613a1581846134a2565b905092915050565b60006020820190508181036000830152613a368161358b565b9050919050565b60006020820190508181036000830152613a56816135ae565b9050919050565b60006020820190508181036000830152613a76816135d1565b9050919050565b60006020820190508181036000830152613a96816135f4565b9050919050565b60006020820190508181036000830152613ab681613617565b9050919050565b60006020820190508181036000830152613ad68161363a565b9050919050565b60006020820190508181036000830152613af68161365d565b9050919050565b60006020820190508181036000830152613b1681613680565b9050919050565b60006020820190508181036000830152613b36816136a3565b9050919050565b60006020820190508181036000830152613b56816136c6565b9050919050565b60006020820190508181036000830152613b76816136e9565b9050919050565b60006020820190508181036000830152613b968161370c565b9050919050565b60006020820190508181036000830152613bb68161372f565b9050919050565b60006020820190508181036000830152613bd681613752565b9050919050565b60006020820190508181036000830152613bf681613775565b9050919050565b60006020820190508181036000830152613c1681613798565b9050919050565b60006020820190508181036000830152613c36816137bb565b9050919050565b60006020820190508181036000830152613c56816137de565b9050919050565b60006020820190508181036000830152613c7681613801565b9050919050565b60006020820190508181036000830152613c9681613847565b9050919050565b60006020820190508181036000830152613cb68161386a565b9050919050565b60006020820190508181036000830152613cd68161388d565b9050919050565b60006020820190508181036000830152613cf6816138b0565b9050919050565b6000602082019050613d1260008301846138d3565b92915050565b6000613d22613d33565b9050613d2e8282613fc1565b919050565b6000604051905090565b600067ffffffffffffffff821115613d5857613d5761414c565b5b613d6182614199565b9050602081019050919050565b600067ffffffffffffffff821115613d8957613d8861414c565b5b613d9282614199565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613e0d82613f43565b9150613e1883613f43565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613e4d57613e4c614090565b5b828201905092915050565b6000613e6382613f43565b9150613e6e83613f43565b925082613e7e57613e7d6140bf565b5b828204905092915050565b6000613e9482613f43565b9150613e9f83613f43565b925082821015613eb257613eb1614090565b5b828203905092915050565b6000613ec882613f23565b9050919050565b6000613eda82613f23565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613f7a578082015181840152602081019050613f5f565b83811115613f89576000848401525b50505050565b60006002820490506001821680613fa757607f821691505b60208210811415613fbb57613fba6140ee565b5b50919050565b613fca82614199565b810181811067ffffffffffffffff82111715613fe957613fe861414c565b5b80604052505050565b6000613ffd82613f43565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156140305761402f614090565b5b600182019050919050565b60006140468261404d565b9050919050565b6000614058826141aa565b9050919050565b600061406a82613f43565b915061407583613f43565b925082614085576140846140bf565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f436f6c6c6162206d696e74696e67206e6f742073746172746564000000000000600082015250565b7f4f47206d696e74696e67206e6f74207374617274656400000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f5075626c6963206d696e74696e67206e6f742073746172746564000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4164647265737320616c726561647920636c61696d6564000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f496e76616c6964204d65726b6c652070726f6f6620666f72204f470000000000600082015250565b7f4d617820737570706c7920686173206265656e20726561636865640000000000600082015250565b7f496e76616c6964204d65726b6c652070726f6f6620666f7220436f6c6c616200600082015250565b61473a81613ebd565b811461474557600080fd5b50565b61475181613ee1565b811461475c57600080fd5b50565b61476881613eed565b811461477357600080fd5b50565b61477f81613ef7565b811461478a57600080fd5b50565b61479681613f43565b81146147a157600080fd5b5056fea2646970667358221220fa2e6020658fa404d45cdd29a6b81a15bb8858cf43a847224d2392a51c9edc5764736f6c63430008070033697066733a2f2f516d5057636b426a706d51535447584d7a4d73657a393161794b4762476a6f6e4a32635465326d733369547a69672f697066733a2f2f516d5057636b426a706d51535447584d7a4d73657a393161794b4762476a6f6e4a32635465326d733369547a69672f68696464656e2e6a736f6e

Deployed Bytecode

0x6080604052600436106102465760003560e01c806370a0823111610139578063ad6cb319116100b6578063da3ef23f1161007a578063da3ef23f146107fe578063db8cc8fa14610827578063e514c7e114610850578063e985e9c514610879578063f2c4ce1e146108b6578063f2fde38b146108df57610246565b8063ad6cb31914610717578063b88d4fde14610742578063c66828621461076b578063c87b56dd14610796578063d5abeb01146107d357610246565b8063a22cb465116100fd578063a22cb46514610658578063a475b5dd14610681578063a58fdc1114610698578063a6d23e10146106c1578063aafdff7c146106ec57610246565b806370a0823114610583578063715018a6146105c05780638da5cb5b146105d757806395d89b4114610602578063970703d01461062d57610246565b8063203b1581116101c75780634704b6771161018b5780634704b677146104ab57806351830227146104c757806355f804b3146104f25780635fd1bbc41461051b5780636352211e1461054657610246565b8063203b15811461041c57806323b872dd1461044557806326092b831461046e5780633ccfd60b1461047857806342842e0e1461048257610246565b8063095ea7b31161020e578063095ea7b3146103375780631237e5e81461036057806318160ddd1461039d5780631c7e49b5146103c85780632018e884146103f157610246565b80630186d1371461024b57806301ffc9a71461026757806306fdde03146102a4578063081812fc146102cf578063081c8c441461030c575b600080fd5b610265600480360381019061026091906132cc565b610908565b005b34801561027357600080fd5b5061028e60048036038101906102899190613346565b610b62565b60405161029b91906139c5565b60405180910390f35b3480156102b057600080fd5b506102b9610c44565b6040516102c691906139fb565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f191906133e9565b610cd6565b6040516103039190613943565b60405180910390f35b34801561031857600080fd5b50610321610d5b565b60405161032e91906139fb565b60405180910390f35b34801561034357600080fd5b5061035e6004803603810190610359919061328c565b610de9565b005b34801561036c57600080fd5b5061038760048036038101906103829190613109565b610f01565b60405161039491906139c5565b60405180910390f35b3480156103a957600080fd5b506103b2610f21565b6040516103bf9190613cfd565b60405180910390f35b3480156103d457600080fd5b506103ef60048036038101906103ea91906133e9565b610f32565b005b3480156103fd57600080fd5b50610406610fb8565b6040516104139190613cfd565b60405180910390f35b34801561042857600080fd5b50610443600480360381019061043e91906133e9565b610fbe565b005b34801561045157600080fd5b5061046c60048036038101906104679190613176565b611044565b005b6104766110a4565b005b610480611243565b005b34801561048e57600080fd5b506104a960048036038101906104a49190613176565b61133f565b005b6104c560048036038101906104c091906132cc565b61135f565b005b3480156104d357600080fd5b506104dc6115b9565b6040516104e991906139c5565b60405180910390f35b3480156104fe57600080fd5b50610519600480360381019061051491906133a0565b6115cc565b005b34801561052757600080fd5b50610530611662565b60405161053d9190613cfd565b60405180910390f35b34801561055257600080fd5b5061056d600480360381019061056891906133e9565b611668565b60405161057a9190613943565b60405180910390f35b34801561058f57600080fd5b506105aa60048036038101906105a59190613109565b61171a565b6040516105b79190613cfd565b60405180910390f35b3480156105cc57600080fd5b506105d56117d2565b005b3480156105e357600080fd5b506105ec61185a565b6040516105f99190613943565b60405180910390f35b34801561060e57600080fd5b50610617611884565b60405161062491906139fb565b60405180910390f35b34801561063957600080fd5b50610642611916565b60405161064f91906139e0565b60405180910390f35b34801561066457600080fd5b5061067f600480360381019061067a919061324c565b61191c565b005b34801561068d57600080fd5b50610696611932565b005b3480156106a457600080fd5b506106bf60048036038101906106ba9190613319565b6119cb565b005b3480156106cd57600080fd5b506106d6611a51565b6040516106e3919061395e565b60405180910390f35b3480156106f857600080fd5b50610701611a77565b60405161070e9190613cfd565b60405180910390f35b34801561072357600080fd5b5061072c611a7d565b60405161073991906139e0565b60405180910390f35b34801561074e57600080fd5b50610769600480360381019061076491906131c9565b611a83565b005b34801561077757600080fd5b50610780611ae5565b60405161078d91906139fb565b60405180910390f35b3480156107a257600080fd5b506107bd60048036038101906107b891906133e9565b611b73565b6040516107ca91906139fb565b60405180910390f35b3480156107df57600080fd5b506107e8611ccc565b6040516107f59190613cfd565b60405180910390f35b34801561080a57600080fd5b50610825600480360381019061082091906133a0565b611cd2565b005b34801561083357600080fd5b5061084e600480360381019061084991906133e9565b611d68565b005b34801561085c57600080fd5b5061087760048036038101906108729190613319565b611dee565b005b34801561088557600080fd5b506108a0600480360381019061089b9190613136565b611e74565b6040516108ad91906139c5565b60405180910390f35b3480156108c257600080fd5b506108dd60048036038101906108d891906133a0565b611f08565b005b3480156108eb57600080fd5b5061090660048036038101906109019190613109565b611f9e565b005b601054421161094c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094390613b5d565b60405180910390fd5b60006109586007612096565b9050600a5460018261096a9190613e02565b11156109ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a290613cbd565b60405180910390fd5b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610a38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2f90613bfd565b60405180910390fd5b600033604051602001610a4b91906138e2565b604051602081830303815290604052805190602001209050610ab1848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e54836120cd565b610af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae790613c9d565b60405180910390fd5b6001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610b5260076120a4565b610b5c33836120e4565b50505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c2d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c3d5750610c3c82612102565b5b9050919050565b606060008054610c5390613f8f565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7f90613f8f565b8015610ccc5780601f10610ca157610100808354040283529160200191610ccc565b820191906000526020600020905b815481529060010190602001808311610caf57829003601f168201915b5050505050905090565b6000610ce18261216c565b610d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1790613bbd565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600c8054610d6890613f8f565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9490613f8f565b8015610de15780601f10610db657610100808354040283529160200191610de1565b820191906000526020600020905b815481529060010190602001808311610dc457829003601f168201915b505050505081565b6000610df482611668565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5c90613c5d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e846121d8565b73ffffffffffffffffffffffffffffffffffffffff161480610eb35750610eb281610ead6121d8565b611e74565b5b610ef2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee990613add565b60405180910390fd5b610efc83836121e0565b505050565b60136020528060005260406000206000915054906101000a900460ff1681565b6000610f2d6007612096565b905090565b610f3a6121d8565b73ffffffffffffffffffffffffffffffffffffffff16610f5861185a565b73ffffffffffffffffffffffffffffffffffffffff1614610fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa590613bdd565b60405180910390fd5b8060118190555050565b60115481565b610fc66121d8565b73ffffffffffffffffffffffffffffffffffffffff16610fe461185a565b73ffffffffffffffffffffffffffffffffffffffff161461103a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103190613bdd565b60405180910390fd5b8060108190555050565b61105561104f6121d8565b82612299565b611094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108b90613c7d565b60405180910390fd5b61109f838383612377565b505050565b60125442116110e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110df90613b9d565b60405180910390fd5b60006110f46007612096565b9050600a546001826111069190613e02565b1115611147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113e90613cbd565b60405180910390fd5b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156111d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cb90613bfd565b60405180910390fd5b6001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061123660076120a4565b61124033826120e4565b50565b61124b6121d8565b73ffffffffffffffffffffffffffffffffffffffff1661126961185a565b73ffffffffffffffffffffffffffffffffffffffff16146112bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b690613bdd565b60405180910390fd5b60006112c961185a565b73ffffffffffffffffffffffffffffffffffffffff16476040516112ec9061392e565b60006040518083038185875af1925050503d8060008114611329576040519150601f19603f3d011682016040523d82523d6000602084013e61132e565b606091505b505090508061133c57600080fd5b50565b61135a83838360405180602001604052806000815250611a83565b505050565b60115442116113a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139a90613b3d565b60405180910390fd5b60006113af6007612096565b9050600a546001826113c19190613e02565b1115611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f990613cbd565b60405180910390fd5b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561148f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148690613bfd565b60405180910390fd5b6000336040516020016114a291906138e2565b604051602081830303815290604052805190602001209050611508848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e54836120cd565b611547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153e90613cdd565b60405180910390fd5b6001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506115a960076120a4565b6115b333836120e4565b50505050565b600b60009054906101000a900460ff1681565b6115d46121d8565b73ffffffffffffffffffffffffffffffffffffffff166115f261185a565b73ffffffffffffffffffffffffffffffffffffffff1614611648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163f90613bdd565b60405180910390fd5b806008908051906020019061165e929190612eb2565b5050565b60125481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611711576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170890613b1d565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561178b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178290613afd565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117da6121d8565b73ffffffffffffffffffffffffffffffffffffffff166117f861185a565b73ffffffffffffffffffffffffffffffffffffffff161461184e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184590613bdd565b60405180910390fd5b61185860006125d3565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461189390613f8f565b80601f01602080910402602001604051908101604052809291908181526020018280546118bf90613f8f565b801561190c5780601f106118e15761010080835404028352916020019161190c565b820191906000526020600020905b8154815290600101906020018083116118ef57829003601f168201915b5050505050905090565b600f5481565b61192e6119276121d8565b8383612699565b5050565b61193a6121d8565b73ffffffffffffffffffffffffffffffffffffffff1661195861185a565b73ffffffffffffffffffffffffffffffffffffffff16146119ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a590613bdd565b60405180910390fd5b6001600b60006101000a81548160ff021916908315150217905550565b6119d36121d8565b73ffffffffffffffffffffffffffffffffffffffff166119f161185a565b73ffffffffffffffffffffffffffffffffffffffff1614611a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3e90613bdd565b60405180910390fd5b80600e8190555050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60105481565b600e5481565b611a94611a8e6121d8565b83612299565b611ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aca90613c7d565b60405180910390fd5b611adf84848484612806565b50505050565b60098054611af290613f8f565b80601f0160208091040260200160405190810160405280929190818152602001828054611b1e90613f8f565b8015611b6b5780601f10611b4057610100808354040283529160200191611b6b565b820191906000526020600020905b815481529060010190602001808311611b4e57829003601f168201915b505050505081565b6060611b7e8261216c565b611bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb490613c3d565b60405180910390fd5b60001515600b60009054906101000a900460ff1615151415611c6b57600c8054611be690613f8f565b80601f0160208091040260200160405190810160405280929190818152602001828054611c1290613f8f565b8015611c5f5780601f10611c3457610100808354040283529160200191611c5f565b820191906000526020600020905b815481529060010190602001808311611c4257829003601f168201915b50505050509050611cc7565b6000611c75612862565b90506000815111611c955760405180602001604052806000815250611cc3565b80611c9f846128f4565b6009604051602001611cb3939291906138fd565b6040516020818303038152906040525b9150505b919050565b600a5481565b611cda6121d8565b73ffffffffffffffffffffffffffffffffffffffff16611cf861185a565b73ffffffffffffffffffffffffffffffffffffffff1614611d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4590613bdd565b60405180910390fd5b8060099080519060200190611d64929190612eb2565b5050565b611d706121d8565b73ffffffffffffffffffffffffffffffffffffffff16611d8e61185a565b73ffffffffffffffffffffffffffffffffffffffff1614611de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddb90613bdd565b60405180910390fd5b8060128190555050565b611df66121d8565b73ffffffffffffffffffffffffffffffffffffffff16611e1461185a565b73ffffffffffffffffffffffffffffffffffffffff1614611e6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6190613bdd565b60405180910390fd5b80600f8190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f106121d8565b73ffffffffffffffffffffffffffffffffffffffff16611f2e61185a565b73ffffffffffffffffffffffffffffffffffffffff1614611f84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7b90613bdd565b60405180910390fd5b80600c9080519060200190611f9a929190612eb2565b5050565b611fa66121d8565b73ffffffffffffffffffffffffffffffffffffffff16611fc461185a565b73ffffffffffffffffffffffffffffffffffffffff161461201a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201190613bdd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561208a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208190613a3d565b60405180910390fd5b612093816125d3565b50565b600081600001549050919050565b6001816000016000828254019250508190555050565b600080823b905060008111915050919050565b6000826120da8584612a55565b1490509392505050565b6120fe828260405180602001604052806000815250612aab565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661225383611668565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006122a48261216c565b6122e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122da90613abd565b60405180910390fd5b60006122ee83611668565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061235d57508373ffffffffffffffffffffffffffffffffffffffff1661234584610cd6565b73ffffffffffffffffffffffffffffffffffffffff16145b8061236e575061236d8185611e74565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661239782611668565b73ffffffffffffffffffffffffffffffffffffffff16146123ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e490613c1d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561245d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245490613a7d565b60405180910390fd5b612468838383612b06565b6124736000826121e0565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124c39190613e89565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461251a9190613e02565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ff90613a9d565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127f991906139c5565b60405180910390a3505050565b612811848484612377565b61281d84848484612b0b565b61285c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285390613a1d565b60405180910390fd5b50505050565b60606008805461287190613f8f565b80601f016020809104026020016040519081016040528092919081815260200182805461289d90613f8f565b80156128ea5780601f106128bf576101008083540402835291602001916128ea565b820191906000526020600020905b8154815290600101906020018083116128cd57829003601f168201915b5050505050905090565b6060600082141561293c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a50565b600082905060005b6000821461296e57808061295790613ff2565b915050600a826129679190613e58565b9150612944565b60008167ffffffffffffffff81111561298a5761298961414c565b5b6040519080825280601f01601f1916602001820160405280156129bc5781602001600182028036833780820191505090505b5090505b60008514612a49576001826129d59190613e89565b9150600a856129e4919061405f565b60306129f09190613e02565b60f81b818381518110612a0657612a0561411d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a429190613e58565b94506129c0565b8093505050505b919050565b60008082905060005b8451811015612aa057612a8b82868381518110612a7e57612a7d61411d565b5b6020026020010151612ca2565b91508080612a9890613ff2565b915050612a5e565b508091505092915050565b612ab58383612ccd565b612ac26000848484612b0b565b612b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af890613a1d565b60405180910390fd5b505050565b505050565b6000612b2c8473ffffffffffffffffffffffffffffffffffffffff166120ba565b15612c95578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b556121d8565b8786866040518563ffffffff1660e01b8152600401612b779493929190613979565b602060405180830381600087803b158015612b9157600080fd5b505af1925050508015612bc257506040513d601f19601f82011682018060405250810190612bbf9190613373565b60015b612c45573d8060008114612bf2576040519150601f19603f3d011682016040523d82523d6000602084013e612bf7565b606091505b50600081511415612c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3490613a1d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c9a565b600190505b949350505050565b6000818310612cba57612cb58284612e9b565b612cc5565b612cc48383612e9b565b5b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3490613b7d565b60405180910390fd5b612d468161216c565b15612d86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7d90613a5d565b60405180910390fd5b612d9260008383612b06565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612de29190613e02565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600082600052816020526040600020905092915050565b828054612ebe90613f8f565b90600052602060002090601f016020900481019282612ee05760008555612f27565b82601f10612ef957805160ff1916838001178555612f27565b82800160010185558215612f27579182015b82811115612f26578251825591602001919060010190612f0b565b5b509050612f349190612f38565b5090565b5b80821115612f51576000816000905550600101612f39565b5090565b6000612f68612f6384613d3d565b613d18565b905082815260208101848484011115612f8457612f8361418a565b5b612f8f848285613f4d565b509392505050565b6000612faa612fa584613d6e565b613d18565b905082815260208101848484011115612fc657612fc561418a565b5b612fd1848285613f4d565b509392505050565b600081359050612fe881614731565b92915050565b60008083601f84011261300457613003614180565b5b8235905067ffffffffffffffff8111156130215761302061417b565b5b60208301915083602082028301111561303d5761303c614185565b5b9250929050565b60008135905061305381614748565b92915050565b6000813590506130688161475f565b92915050565b60008135905061307d81614776565b92915050565b60008151905061309281614776565b92915050565b600082601f8301126130ad576130ac614180565b5b81356130bd848260208601612f55565b91505092915050565b600082601f8301126130db576130da614180565b5b81356130eb848260208601612f97565b91505092915050565b6000813590506131038161478d565b92915050565b60006020828403121561311f5761311e614194565b5b600061312d84828501612fd9565b91505092915050565b6000806040838503121561314d5761314c614194565b5b600061315b85828601612fd9565b925050602061316c85828601612fd9565b9150509250929050565b60008060006060848603121561318f5761318e614194565b5b600061319d86828701612fd9565b93505060206131ae86828701612fd9565b92505060406131bf868287016130f4565b9150509250925092565b600080600080608085870312156131e3576131e2614194565b5b60006131f187828801612fd9565b945050602061320287828801612fd9565b9350506040613213878288016130f4565b925050606085013567ffffffffffffffff8111156132345761323361418f565b5b61324087828801613098565b91505092959194509250565b6000806040838503121561326357613262614194565b5b600061327185828601612fd9565b925050602061328285828601613044565b9150509250929050565b600080604083850312156132a3576132a2614194565b5b60006132b185828601612fd9565b92505060206132c2858286016130f4565b9150509250929050565b600080602083850312156132e3576132e2614194565b5b600083013567ffffffffffffffff8111156133015761330061418f565b5b61330d85828601612fee565b92509250509250929050565b60006020828403121561332f5761332e614194565b5b600061333d84828501613059565b91505092915050565b60006020828403121561335c5761335b614194565b5b600061336a8482850161306e565b91505092915050565b60006020828403121561338957613388614194565b5b600061339784828501613083565b91505092915050565b6000602082840312156133b6576133b5614194565b5b600082013567ffffffffffffffff8111156133d4576133d361418f565b5b6133e0848285016130c6565b91505092915050565b6000602082840312156133ff576133fe614194565b5b600061340d848285016130f4565b91505092915050565b61341f81613ecf565b82525050565b61342e81613ebd565b82525050565b61344561344082613ebd565b61403b565b82525050565b61345481613ee1565b82525050565b61346381613eed565b82525050565b600061347482613db4565b61347e8185613dca565b935061348e818560208601613f5c565b61349781614199565b840191505092915050565b60006134ad82613dbf565b6134b78185613de6565b93506134c7818560208601613f5c565b6134d081614199565b840191505092915050565b60006134e682613dbf565b6134f08185613df7565b9350613500818560208601613f5c565b80840191505092915050565b6000815461351981613f8f565b6135238186613df7565b9450600182166000811461353e576001811461354f57613582565b60ff19831686528186019350613582565b61355885613d9f565b60005b8381101561357a5781548189015260018201915060208101905061355b565b838801955050505b50505092915050565b6000613598603283613de6565b91506135a3826141b7565b604082019050919050565b60006135bb602683613de6565b91506135c682614206565b604082019050919050565b60006135de601c83613de6565b91506135e982614255565b602082019050919050565b6000613601602483613de6565b915061360c8261427e565b604082019050919050565b6000613624601983613de6565b915061362f826142cd565b602082019050919050565b6000613647602c83613de6565b9150613652826142f6565b604082019050919050565b600061366a603883613de6565b915061367582614345565b604082019050919050565b600061368d602a83613de6565b915061369882614394565b604082019050919050565b60006136b0602983613de6565b91506136bb826143e3565b604082019050919050565b60006136d3601a83613de6565b91506136de82614432565b602082019050919050565b60006136f6601683613de6565b91506137018261445b565b602082019050919050565b6000613719602083613de6565b915061372482614484565b602082019050919050565b600061373c601a83613de6565b9150613747826144ad565b602082019050919050565b600061375f602c83613de6565b915061376a826144d6565b604082019050919050565b6000613782602083613de6565b915061378d82614525565b602082019050919050565b60006137a5601783613de6565b91506137b08261454e565b602082019050919050565b60006137c8602983613de6565b91506137d382614577565b604082019050919050565b60006137eb602f83613de6565b91506137f6826145c6565b604082019050919050565b600061380e602183613de6565b915061381982614615565b604082019050919050565b6000613831600083613ddb565b915061383c82614664565b600082019050919050565b6000613854603183613de6565b915061385f82614667565b604082019050919050565b6000613877601b83613de6565b9150613882826146b6565b602082019050919050565b600061389a601b83613de6565b91506138a5826146df565b602082019050919050565b60006138bd601f83613de6565b91506138c882614708565b602082019050919050565b6138dc81613f43565b82525050565b60006138ee8284613434565b60148201915081905092915050565b600061390982866134db565b915061391582856134db565b9150613921828461350c565b9150819050949350505050565b600061393982613824565b9150819050919050565b60006020820190506139586000830184613425565b92915050565b60006020820190506139736000830184613416565b92915050565b600060808201905061398e6000830187613425565b61399b6020830186613425565b6139a860408301856138d3565b81810360608301526139ba8184613469565b905095945050505050565b60006020820190506139da600083018461344b565b92915050565b60006020820190506139f5600083018461345a565b92915050565b60006020820190508181036000830152613a1581846134a2565b905092915050565b60006020820190508181036000830152613a368161358b565b9050919050565b60006020820190508181036000830152613a56816135ae565b9050919050565b60006020820190508181036000830152613a76816135d1565b9050919050565b60006020820190508181036000830152613a96816135f4565b9050919050565b60006020820190508181036000830152613ab681613617565b9050919050565b60006020820190508181036000830152613ad68161363a565b9050919050565b60006020820190508181036000830152613af68161365d565b9050919050565b60006020820190508181036000830152613b1681613680565b9050919050565b60006020820190508181036000830152613b36816136a3565b9050919050565b60006020820190508181036000830152613b56816136c6565b9050919050565b60006020820190508181036000830152613b76816136e9565b9050919050565b60006020820190508181036000830152613b968161370c565b9050919050565b60006020820190508181036000830152613bb68161372f565b9050919050565b60006020820190508181036000830152613bd681613752565b9050919050565b60006020820190508181036000830152613bf681613775565b9050919050565b60006020820190508181036000830152613c1681613798565b9050919050565b60006020820190508181036000830152613c36816137bb565b9050919050565b60006020820190508181036000830152613c56816137de565b9050919050565b60006020820190508181036000830152613c7681613801565b9050919050565b60006020820190508181036000830152613c9681613847565b9050919050565b60006020820190508181036000830152613cb68161386a565b9050919050565b60006020820190508181036000830152613cd68161388d565b9050919050565b60006020820190508181036000830152613cf6816138b0565b9050919050565b6000602082019050613d1260008301846138d3565b92915050565b6000613d22613d33565b9050613d2e8282613fc1565b919050565b6000604051905090565b600067ffffffffffffffff821115613d5857613d5761414c565b5b613d6182614199565b9050602081019050919050565b600067ffffffffffffffff821115613d8957613d8861414c565b5b613d9282614199565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613e0d82613f43565b9150613e1883613f43565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613e4d57613e4c614090565b5b828201905092915050565b6000613e6382613f43565b9150613e6e83613f43565b925082613e7e57613e7d6140bf565b5b828204905092915050565b6000613e9482613f43565b9150613e9f83613f43565b925082821015613eb257613eb1614090565b5b828203905092915050565b6000613ec882613f23565b9050919050565b6000613eda82613f23565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613f7a578082015181840152602081019050613f5f565b83811115613f89576000848401525b50505050565b60006002820490506001821680613fa757607f821691505b60208210811415613fbb57613fba6140ee565b5b50919050565b613fca82614199565b810181811067ffffffffffffffff82111715613fe957613fe861414c565b5b80604052505050565b6000613ffd82613f43565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156140305761402f614090565b5b600182019050919050565b60006140468261404d565b9050919050565b6000614058826141aa565b9050919050565b600061406a82613f43565b915061407583613f43565b925082614085576140846140bf565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f436f6c6c6162206d696e74696e67206e6f742073746172746564000000000000600082015250565b7f4f47206d696e74696e67206e6f74207374617274656400000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f5075626c6963206d696e74696e67206e6f742073746172746564000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4164647265737320616c726561647920636c61696d6564000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f496e76616c6964204d65726b6c652070726f6f6620666f72204f470000000000600082015250565b7f4d617820737570706c7920686173206265656e20726561636865640000000000600082015250565b7f496e76616c6964204d65726b6c652070726f6f6620666f7220436f6c6c616200600082015250565b61473a81613ebd565b811461474557600080fd5b50565b61475181613ee1565b811461475c57600080fd5b50565b61476881613eed565b811461477357600080fd5b50565b61477f81613ef7565b811461478a57600080fd5b50565b61479681613f43565b81146147a157600080fd5b5056fea2646970667358221220fa2e6020658fa404d45cdd29a6b81a15bb8858cf43a847224d2392a51c9edc5764736f6c63430008070033

Deployed Bytecode Sourcemap

48444:5581:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50009:665;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34987:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36156:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37849:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48809:107;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37372:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49520:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53921:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53085:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49418:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52967:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38768:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51408:478;;;:::i;:::-;;53758:155;;;:::i;:::-;;39215:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50682:718;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48774:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53353:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49468:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35763:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35406:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15313:103;;;;;;;;;;;;;:::i;:::-;;14662:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36325:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49073:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38229:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52646:69;;;;;;;;;;;;;:::i;:::-;;52723:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48923:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49372:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48961:105;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39471:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48692:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51894:725;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48736:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53599:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53219:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52841:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38487:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53465:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15571:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50009:665;50110:11;;50092:15;:29;50084:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;50159:14;50176:22;:12;:20;:22::i;:::-;50159:39;;50231:9;;50226:1;50217:6;:10;;;;:::i;:::-;:23;;50209:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;50292:11;:23;50304:10;50292:23;;;;;;;;;;;;;;;;;;;;;;;;;50291:24;50283:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;50354:12;50396:10;50379:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;50369:39;;;;;;50354:54;;50441:52;50460:12;;50441:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50474:12;;50488:4;50441:18;:52::i;:::-;50419:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;50587:4;50561:11;:23;50573:10;50561:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;50602:24;:12;:22;:24::i;:::-;50637:29;50647:10;50659:6;50637:9;:29::i;:::-;50073:601;;50009:665;;:::o;34987:355::-;35134:4;35191:25;35176:40;;;:11;:40;;;;:105;;;;35248:33;35233:48;;;:11;:48;;;;35176:105;:158;;;;35298:36;35322:11;35298:23;:36::i;:::-;35176:158;35156:178;;34987:355;;;:::o;36156:100::-;36210:13;36243:5;36236:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36156:100;:::o;37849:308::-;37970:7;38017:16;38025:7;38017;:16::i;:::-;37995:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;38125:15;:24;38141:7;38125:24;;;;;;;;;;;;;;;;;;;;;38118:31;;37849:308;;;:::o;48809:107::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37372:411::-;37453:13;37469:23;37484:7;37469:14;:23::i;:::-;37453:39;;37517:5;37511:11;;:2;:11;;;;37503:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;37611:5;37595:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;37620:37;37637:5;37644:12;:10;:12::i;:::-;37620:16;:37::i;:::-;37595:62;37573:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;37754:21;37763:2;37767:7;37754:8;:21::i;:::-;37442:341;37372:411;;:::o;49520:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;53921:101::-;53965:7;53992:22;:12;:20;:22::i;:::-;53985:29;;53921:101;:::o;53085:126::-;14893:12;:10;:12::i;:::-;14882:23;;:7;:5;:7::i;:::-;:23;;;14874:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53187:16:::1;53169:15;:34;;;;53085:126:::0;:::o;49418:43::-;;;;:::o;52967:110::-;14893:12;:10;:12::i;:::-;14882:23;;:7;:5;:7::i;:::-;:23;;;14874:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53057:12:::1;53043:11;:26;;;;52967:110:::0;:::o;38768:376::-;38977:41;38996:12;:10;:12::i;:::-;39010:7;38977:18;:41::i;:::-;38955:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;39108:28;39118:4;39124:2;39128:7;39108:9;:28::i;:::-;38768:376;;;:::o;51408:478::-;51496:15;;51478;:33;51456:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;51576:14;51593:22;:12;:20;:22::i;:::-;51576:39;;51648:9;;51643:1;51634:6;:10;;;;:::i;:::-;:23;;51626:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;51709:11;:23;51721:10;51709:23;;;;;;;;;;;;;;;;;;;;;;;;;51708:24;51700:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;51799:4;51773:11;:23;51785:10;51773:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;51814:24;:12;:22;:24::i;:::-;51849:29;51859:10;51871:6;51849:9;:29::i;:::-;51445:441;51408:478::o;53758:155::-;14893:12;:10;:12::i;:::-;14882:23;;:7;:5;:7::i;:::-;:23;;;14874:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53815:7:::1;53836;:5;:7::i;:::-;53828:21;;53857;53828:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53814:69;;;53902:2;53894:11;;;::::0;::::1;;53803:110;53758:155::o:0;39215:185::-;39353:39;39370:4;39376:2;39380:7;39353:39;;;;;;;;;;;;:16;:39::i;:::-;39215:185;;;:::o;50682:718::-;50801:15;;50783;:33;50761:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;50881:14;50898:22;:12;:20;:22::i;:::-;50881:39;;50953:9;;50948:1;50939:6;:10;;;;:::i;:::-;:23;;50931:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;51014:11;:23;51026:10;51014:23;;;;;;;;;;;;;;;;;;;;;;;;;51013:24;51005:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;51076:12;51118:10;51101:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;51091:39;;;;;;51076:54;;51163:52;51182:12;;51163:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51196:12;;51210:4;51163:18;:52::i;:::-;51141:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;51313:4;51287:11;:23;51299:10;51287:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;51328:24;:12;:22;:24::i;:::-;51363:29;51373:10;51385:6;51363:9;:29::i;:::-;50750:650;;50682:718;;:::o;48774:28::-;;;;;;;;;;;;;:::o;53353:104::-;14893:12;:10;:12::i;:::-;14882:23;;:7;:5;:7::i;:::-;:23;;;14874:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53438:11:::1;53428:7;:21;;;;;;;;;;;;:::i;:::-;;53353:104:::0;:::o;49468:43::-;;;;:::o;35763:326::-;35880:7;35905:13;35921:7;:16;35929:7;35921:16;;;;;;;;;;;;;;;;;;;;;35905:32;;35987:1;35970:19;;:5;:19;;;;35948:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;36076:5;36069:12;;;35763:326;;;:::o;35406:295::-;35523:7;35587:1;35570:19;;:5;:19;;;;35548:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;35677:9;:16;35687:5;35677:16;;;;;;;;;;;;;;;;35670:23;;35406:295;;;:::o;15313:103::-;14893:12;:10;:12::i;:::-;14882:23;;:7;:5;:7::i;:::-;:23;;;14874:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15378:30:::1;15405:1;15378:18;:30::i;:::-;15313:103::o:0;14662:87::-;14708:7;14735:6;;;;;;;;;;;14728:13;;14662:87;:::o;36325:104::-;36381:13;36414:7;36407:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36325:104;:::o;49073:109::-;;;;:::o;38229:187::-;38356:52;38375:12;:10;:12::i;:::-;38389:8;38399;38356:18;:52::i;:::-;38229:187;;:::o;52646:69::-;14893:12;:10;:12::i;:::-;14882:23;;:7;:5;:7::i;:::-;:23;;;14874:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52703:4:::1;52692:8;;:15;;;;;;;;;;;;;;;;;;52646:69::o:0;52723:110::-;14893:12;:10;:12::i;:::-;14882:23;;:7;:5;:7::i;:::-;:23;;;14874:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52814:11:::1;52799:12;:26;;;;52723:110:::0;:::o;48923:31::-;;;;;;;;;;;;;:::o;49372:39::-;;;;:::o;48961:105::-;;;;:::o;39471:365::-;39660:41;39679:12;:10;:12::i;:::-;39693:7;39660:18;:41::i;:::-;39638:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;39789:39;39803:4;39809:2;39813:7;39822:5;39789:13;:39::i;:::-;39471:365;;;;:::o;48692:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51894:725::-;52012:13;52065:16;52073:7;52065;:16::i;:::-;52043:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;52185:5;52173:17;;:8;;;;;;;;;;;:17;;;52169:71;;;52214:14;52207:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52169:71;52252:28;52283:10;:8;:10::i;:::-;52252:41;;52355:1;52330:14;52324:28;:32;:287;;;;;;;;;;;;;;;;;52448:14;52489:18;:7;:16;:18::i;:::-;52534:13;52405:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52324:287;52304:307;;;51894:725;;;;:::o;48736:31::-;;;;:::o;53599:151::-;14893:12;:10;:12::i;:::-;14882:23;;:7;:5;:7::i;:::-;:23;;;14874:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53725:17:::1;53709:13;:33;;;;;;;;;;;;:::i;:::-;;53599:151:::0;:::o;53219:126::-;14893:12;:10;:12::i;:::-;14882:23;;:7;:5;:7::i;:::-;:23;;;14874:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53321:16:::1;53303:15;:34;;;;53219:126:::0;:::o;52841:118::-;14893:12;:10;:12::i;:::-;14882:23;;:7;:5;:7::i;:::-;:23;;;14874:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52940:11:::1;52921:16;:30;;;;52841:118:::0;:::o;38487:214::-;38629:4;38658:18;:25;38677:5;38658:25;;;;;;;;;;;;;;;:35;38684:8;38658:35;;;;;;;;;;;;;;;;;;;;;;;;;38651:42;;38487:214;;;;:::o;53465:126::-;14893:12;:10;:12::i;:::-;14882:23;;:7;:5;:7::i;:::-;:23;;;14874:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53568:15:::1;53551:14;:32;;;;;;;;;;;;:::i;:::-;;53465:126:::0;:::o;15571:238::-;14893:12;:10;:12::i;:::-;14882:23;;:7;:5;:7::i;:::-;:23;;;14874:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15694:1:::1;15674:22;;:8;:22;;;;15652:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;15773:28;15792:8;15773:18;:28::i;:::-;15571:238:::0;:::o;9947:114::-;10012:7;10039;:14;;;10032:21;;9947:114;;;:::o;10069:127::-;10176:1;10158:7;:14;;;:19;;;;;;;;;;;10069:127;:::o;16983:387::-;17043:4;17251:12;17318:7;17306:20;17298:28;;17361:1;17354:4;:8;17347:15;;;16983:387;;;:::o;1267:190::-;1392:4;1445;1416:25;1429:5;1436:4;1416:12;:25::i;:::-;:33;1409:40;;1267:190;;;;;:::o;42471:110::-;42547:26;42557:2;42561:7;42547:26;;;;;;;;;;;;:9;:26::i;:::-;42471:110;;:::o;27580:207::-;27710:4;27754:25;27739:40;;;:11;:40;;;;27732:47;;27580:207;;;:::o;41383:127::-;41448:4;41500:1;41472:30;;:7;:16;41480:7;41472:16;;;;;;;;;;;;;;;;;;;;;:30;;;;41465:37;;41383:127;;;:::o;13367:98::-;13420:7;13447:10;13440:17;;13367:98;:::o;45506:174::-;45608:2;45581:15;:24;45597:7;45581:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;45664:7;45660:2;45626:46;;45635:23;45650:7;45635:14;:23::i;:::-;45626:46;;;;;;;;;;;;45506:174;;:::o;41677:452::-;41806:4;41850:16;41858:7;41850;:16::i;:::-;41828:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;41949:13;41965:23;41980:7;41965:14;:23::i;:::-;41949:39;;42018:5;42007:16;;:7;:16;;;:64;;;;42064:7;42040:31;;:20;42052:7;42040:11;:20::i;:::-;:31;;;42007:64;:113;;;;42088:32;42105:5;42112:7;42088:16;:32::i;:::-;42007:113;41999:122;;;41677:452;;;;:::o;44773:615::-;44946:4;44919:31;;:23;44934:7;44919:14;:23::i;:::-;:31;;;44897:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;45052:1;45038:16;;:2;:16;;;;45030:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;45108:39;45129:4;45135:2;45139:7;45108:20;:39::i;:::-;45212:29;45229:1;45233:7;45212:8;:29::i;:::-;45273:1;45254:9;:15;45264:4;45254:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;45302:1;45285:9;:13;45295:2;45285:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;45333:2;45314:7;:16;45322:7;45314:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;45372:7;45368:2;45353:27;;45362:4;45353:27;;;;;;;;;;;;44773:615;;;:::o;15969:191::-;16043:16;16062:6;;;;;;;;;;;16043:25;;16088:8;16079:6;;:17;;;;;;;;;;;;;;;;;;16143:8;16112:40;;16133:8;16112:40;;;;;;;;;;;;16032:128;15969:191;:::o;45822:315::-;45977:8;45968:17;;:5;:17;;;;45960:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;46064:8;46026:18;:25;46045:5;46026:25;;;;;;;;;;;;;;;:35;46052:8;46026:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;46110:8;46088:41;;46103:5;46088:41;;;46120:8;46088:41;;;;;;:::i;:::-;;;;;;;;45822:315;;;:::o;40718:352::-;40875:28;40885:4;40891:2;40895:7;40875:9;:28::i;:::-;40936:48;40959:4;40965:2;40969:7;40978:5;40936:22;:48::i;:::-;40914:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;40718:352;;;;:::o;49878:108::-;49938:13;49971:7;49964:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49878:108;:::o;10901:723::-;10957:13;11187:1;11178:5;:10;11174:53;;;11205:10;;;;;;;;;;;;;;;;;;;;;11174:53;11237:12;11252:5;11237:20;;11268:14;11293:78;11308:1;11300:4;:9;11293:78;;11326:8;;;;;:::i;:::-;;;;11357:2;11349:10;;;;;:::i;:::-;;;11293:78;;;11381:19;11413:6;11403:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11381:39;;11431:154;11447:1;11438:5;:10;11431:154;;11475:1;11465:11;;;;;:::i;:::-;;;11542:2;11534:5;:10;;;;:::i;:::-;11521:2;:24;;;;:::i;:::-;11508:39;;11491:6;11498;11491:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;11571:2;11562:11;;;;;:::i;:::-;;;11431:154;;;11609:6;11595:21;;;;;10901:723;;;;:::o;2134:328::-;2244:7;2269:20;2292:4;2269:27;;2312:9;2307:118;2331:5;:12;2327:1;:16;2307:118;;;2380:33;2390:12;2404:5;2410:1;2404:8;;;;;;;;:::i;:::-;;;;;;;;2380:9;:33::i;:::-;2365:48;;2345:3;;;;;:::i;:::-;;;;2307:118;;;;2442:12;2435:19;;;2134:328;;;;:::o;42808:321::-;42938:18;42944:2;42948:7;42938:5;:18::i;:::-;42989:54;43020:1;43024:2;43028:7;43037:5;42989:22;:54::i;:::-;42967:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;42808:321;;;:::o;48254:126::-;;;;:::o;46702:980::-;46857:4;46878:15;:2;:13;;;:15::i;:::-;46874:801;;;46947:2;46931:36;;;46990:12;:10;:12::i;:::-;47025:4;47052:7;47082:5;46931:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46910:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47306:1;47289:6;:13;:18;47285:320;;;47332:108;;;;;;;;;;:::i;:::-;;;;;;;;47285:320;47555:6;47549:13;47540:6;47536:2;47532:15;47525:38;46910:710;47180:41;;;47170:51;;;:6;:51;;;;47163:58;;;;;46874:801;47659:4;47652:11;;46702:980;;;;;;;:::o;8615:149::-;8678:7;8709:1;8705;:5;:51;;8736:20;8751:1;8754;8736:14;:20::i;:::-;8705:51;;;8713:20;8728:1;8731;8713:14;:20::i;:::-;8705:51;8698:58;;8615:149;;;;:::o;43465:382::-;43559:1;43545:16;;:2;:16;;;;43537:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;43618:16;43626:7;43618;:16::i;:::-;43617:17;43609:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;43680:45;43709:1;43713:2;43717:7;43680:20;:45::i;:::-;43755:1;43738:9;:13;43748:2;43738:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;43786:2;43767:7;:16;43775:7;43767:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;43831:7;43827:2;43806:33;;43823:1;43806:33;;;;;;;;;;;;43465:382;;:::o;8772:300::-;8867:13;8979:1;8973:4;8966:15;9008:1;9002:4;8995:15;9049:4;9043;9033:21;9024:30;;8772:300;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:139::-;1762:5;1800:6;1787:20;1778:29;;1816:33;1843:5;1816:33;:::i;:::-;1716:139;;;;:::o;1861:137::-;1906:5;1944:6;1931:20;1922:29;;1960:32;1986:5;1960:32;:::i;:::-;1861:137;;;;:::o;2004:141::-;2060:5;2091:6;2085:13;2076:22;;2107:32;2133:5;2107:32;:::i;:::-;2004:141;;;;:::o;2164:338::-;2219:5;2268:3;2261:4;2253:6;2249:17;2245:27;2235:122;;2276:79;;:::i;:::-;2235:122;2393:6;2380:20;2418:78;2492:3;2484:6;2477:4;2469:6;2465:17;2418:78;:::i;:::-;2409:87;;2225:277;2164:338;;;;:::o;2522:340::-;2578:5;2627:3;2620:4;2612:6;2608:17;2604:27;2594:122;;2635:79;;:::i;:::-;2594:122;2752:6;2739:20;2777:79;2852:3;2844:6;2837:4;2829:6;2825:17;2777:79;:::i;:::-;2768:88;;2584:278;2522:340;;;;:::o;2868:139::-;2914:5;2952:6;2939:20;2930:29;;2968:33;2995:5;2968:33;:::i;:::-;2868:139;;;;:::o;3013:329::-;3072:6;3121:2;3109:9;3100:7;3096:23;3092:32;3089:119;;;3127:79;;:::i;:::-;3089:119;3247:1;3272:53;3317:7;3308:6;3297:9;3293:22;3272:53;:::i;:::-;3262:63;;3218:117;3013:329;;;;:::o;3348:474::-;3416:6;3424;3473:2;3461:9;3452:7;3448:23;3444:32;3441:119;;;3479:79;;:::i;:::-;3441:119;3599:1;3624:53;3669:7;3660:6;3649:9;3645:22;3624:53;:::i;:::-;3614:63;;3570:117;3726:2;3752:53;3797:7;3788:6;3777:9;3773:22;3752:53;:::i;:::-;3742:63;;3697:118;3348:474;;;;;:::o;3828:619::-;3905:6;3913;3921;3970:2;3958:9;3949:7;3945:23;3941:32;3938:119;;;3976:79;;:::i;:::-;3938:119;4096:1;4121:53;4166:7;4157:6;4146:9;4142:22;4121:53;:::i;:::-;4111:63;;4067:117;4223:2;4249:53;4294:7;4285:6;4274:9;4270:22;4249:53;:::i;:::-;4239:63;;4194:118;4351:2;4377:53;4422:7;4413:6;4402:9;4398:22;4377:53;:::i;:::-;4367:63;;4322:118;3828:619;;;;;:::o;4453:943::-;4548:6;4556;4564;4572;4621:3;4609:9;4600:7;4596:23;4592:33;4589:120;;;4628:79;;:::i;:::-;4589:120;4748:1;4773:53;4818:7;4809:6;4798:9;4794:22;4773:53;:::i;:::-;4763:63;;4719:117;4875:2;4901:53;4946:7;4937:6;4926:9;4922:22;4901:53;:::i;:::-;4891:63;;4846:118;5003:2;5029:53;5074:7;5065:6;5054:9;5050:22;5029:53;:::i;:::-;5019:63;;4974:118;5159:2;5148:9;5144:18;5131:32;5190:18;5182:6;5179:30;5176:117;;;5212:79;;:::i;:::-;5176:117;5317:62;5371:7;5362:6;5351:9;5347:22;5317:62;:::i;:::-;5307:72;;5102:287;4453:943;;;;;;;:::o;5402:468::-;5467:6;5475;5524:2;5512:9;5503:7;5499:23;5495:32;5492:119;;;5530:79;;:::i;:::-;5492:119;5650:1;5675:53;5720:7;5711:6;5700:9;5696:22;5675:53;:::i;:::-;5665:63;;5621:117;5777:2;5803:50;5845:7;5836:6;5825:9;5821:22;5803:50;:::i;:::-;5793:60;;5748:115;5402:468;;;;;:::o;5876:474::-;5944:6;5952;6001:2;5989:9;5980:7;5976:23;5972:32;5969:119;;;6007:79;;:::i;:::-;5969:119;6127:1;6152:53;6197:7;6188:6;6177:9;6173:22;6152:53;:::i;:::-;6142:63;;6098:117;6254:2;6280:53;6325:7;6316:6;6305:9;6301:22;6280:53;:::i;:::-;6270:63;;6225:118;5876:474;;;;;:::o;6356:559::-;6442:6;6450;6499:2;6487:9;6478:7;6474:23;6470:32;6467:119;;;6505:79;;:::i;:::-;6467:119;6653:1;6642:9;6638:17;6625:31;6683:18;6675:6;6672:30;6669:117;;;6705:79;;:::i;:::-;6669:117;6818:80;6890:7;6881:6;6870:9;6866:22;6818:80;:::i;:::-;6800:98;;;;6596:312;6356:559;;;;;:::o;6921:329::-;6980:6;7029:2;7017:9;7008:7;7004:23;7000:32;6997:119;;;7035:79;;:::i;:::-;6997:119;7155:1;7180:53;7225:7;7216:6;7205:9;7201:22;7180:53;:::i;:::-;7170:63;;7126:117;6921:329;;;;:::o;7256:327::-;7314:6;7363:2;7351:9;7342:7;7338:23;7334:32;7331:119;;;7369:79;;:::i;:::-;7331:119;7489:1;7514:52;7558:7;7549:6;7538:9;7534:22;7514:52;:::i;:::-;7504:62;;7460:116;7256:327;;;;:::o;7589:349::-;7658:6;7707:2;7695:9;7686:7;7682:23;7678:32;7675:119;;;7713:79;;:::i;:::-;7675:119;7833:1;7858:63;7913:7;7904:6;7893:9;7889:22;7858:63;:::i;:::-;7848:73;;7804:127;7589:349;;;;:::o;7944:509::-;8013:6;8062:2;8050:9;8041:7;8037:23;8033:32;8030:119;;;8068:79;;:::i;:::-;8030:119;8216:1;8205:9;8201:17;8188:31;8246:18;8238:6;8235:30;8232:117;;;8268:79;;:::i;:::-;8232:117;8373:63;8428:7;8419:6;8408:9;8404:22;8373:63;:::i;:::-;8363:73;;8159:287;7944:509;;;;:::o;8459:329::-;8518:6;8567:2;8555:9;8546:7;8542:23;8538:32;8535:119;;;8573:79;;:::i;:::-;8535:119;8693:1;8718:53;8763:7;8754:6;8743:9;8739:22;8718:53;:::i;:::-;8708:63;;8664:117;8459:329;;;;:::o;8794:142::-;8897:32;8923:5;8897:32;:::i;:::-;8892:3;8885:45;8794:142;;:::o;8942:118::-;9029:24;9047:5;9029:24;:::i;:::-;9024:3;9017:37;8942:118;;:::o;9066:157::-;9171:45;9191:24;9209:5;9191:24;:::i;:::-;9171:45;:::i;:::-;9166:3;9159:58;9066:157;;:::o;9229:109::-;9310:21;9325:5;9310:21;:::i;:::-;9305:3;9298:34;9229:109;;:::o;9344:118::-;9431:24;9449:5;9431:24;:::i;:::-;9426:3;9419:37;9344:118;;:::o;9468:360::-;9554:3;9582:38;9614:5;9582:38;:::i;:::-;9636:70;9699:6;9694:3;9636:70;:::i;:::-;9629:77;;9715:52;9760:6;9755:3;9748:4;9741:5;9737:16;9715:52;:::i;:::-;9792:29;9814:6;9792:29;:::i;:::-;9787:3;9783:39;9776:46;;9558:270;9468:360;;;;:::o;9834:364::-;9922:3;9950:39;9983:5;9950:39;:::i;:::-;10005:71;10069:6;10064:3;10005:71;:::i;:::-;9998:78;;10085:52;10130:6;10125:3;10118:4;10111:5;10107:16;10085:52;:::i;:::-;10162:29;10184:6;10162:29;:::i;:::-;10157:3;10153:39;10146:46;;9926:272;9834:364;;;;:::o;10204:377::-;10310:3;10338:39;10371:5;10338:39;:::i;:::-;10393:89;10475:6;10470:3;10393:89;:::i;:::-;10386:96;;10491:52;10536:6;10531:3;10524:4;10517:5;10513:16;10491:52;:::i;:::-;10568:6;10563:3;10559:16;10552:23;;10314:267;10204:377;;;;:::o;10611:845::-;10714:3;10751:5;10745:12;10780:36;10806:9;10780:36;:::i;:::-;10832:89;10914:6;10909:3;10832:89;:::i;:::-;10825:96;;10952:1;10941:9;10937:17;10968:1;10963:137;;;;11114:1;11109:341;;;;10930:520;;10963:137;11047:4;11043:9;11032;11028:25;11023:3;11016:38;11083:6;11078:3;11074:16;11067:23;;10963:137;;11109:341;11176:38;11208:5;11176:38;:::i;:::-;11236:1;11250:154;11264:6;11261:1;11258:13;11250:154;;;11338:7;11332:14;11328:1;11323:3;11319:11;11312:35;11388:1;11379:7;11375:15;11364:26;;11286:4;11283:1;11279:12;11274:17;;11250:154;;;11433:6;11428:3;11424:16;11417:23;;11116:334;;10930:520;;10718:738;;10611:845;;;;:::o;11462:366::-;11604:3;11625:67;11689:2;11684:3;11625:67;:::i;:::-;11618:74;;11701:93;11790:3;11701:93;:::i;:::-;11819:2;11814:3;11810:12;11803:19;;11462:366;;;:::o;11834:::-;11976:3;11997:67;12061:2;12056:3;11997:67;:::i;:::-;11990:74;;12073:93;12162:3;12073:93;:::i;:::-;12191:2;12186:3;12182:12;12175:19;;11834:366;;;:::o;12206:::-;12348:3;12369:67;12433:2;12428:3;12369:67;:::i;:::-;12362:74;;12445:93;12534:3;12445:93;:::i;:::-;12563:2;12558:3;12554:12;12547:19;;12206:366;;;:::o;12578:::-;12720:3;12741:67;12805:2;12800:3;12741:67;:::i;:::-;12734:74;;12817:93;12906:3;12817:93;:::i;:::-;12935:2;12930:3;12926:12;12919:19;;12578:366;;;:::o;12950:::-;13092:3;13113:67;13177:2;13172:3;13113:67;:::i;:::-;13106:74;;13189:93;13278:3;13189:93;:::i;:::-;13307:2;13302:3;13298:12;13291:19;;12950:366;;;:::o;13322:::-;13464:3;13485:67;13549:2;13544:3;13485:67;:::i;:::-;13478:74;;13561:93;13650:3;13561:93;:::i;:::-;13679:2;13674:3;13670:12;13663:19;;13322:366;;;:::o;13694:::-;13836:3;13857:67;13921:2;13916:3;13857:67;:::i;:::-;13850:74;;13933:93;14022:3;13933:93;:::i;:::-;14051:2;14046:3;14042:12;14035:19;;13694:366;;;:::o;14066:::-;14208:3;14229:67;14293:2;14288:3;14229:67;:::i;:::-;14222:74;;14305:93;14394:3;14305:93;:::i;:::-;14423:2;14418:3;14414:12;14407:19;;14066:366;;;:::o;14438:::-;14580:3;14601:67;14665:2;14660:3;14601:67;:::i;:::-;14594:74;;14677:93;14766:3;14677:93;:::i;:::-;14795:2;14790:3;14786:12;14779:19;;14438:366;;;:::o;14810:::-;14952:3;14973:67;15037:2;15032:3;14973:67;:::i;:::-;14966:74;;15049:93;15138:3;15049:93;:::i;:::-;15167:2;15162:3;15158:12;15151:19;;14810:366;;;:::o;15182:::-;15324:3;15345:67;15409:2;15404:3;15345:67;:::i;:::-;15338:74;;15421:93;15510:3;15421:93;:::i;:::-;15539:2;15534:3;15530:12;15523:19;;15182:366;;;:::o;15554:::-;15696:3;15717:67;15781:2;15776:3;15717:67;:::i;:::-;15710:74;;15793:93;15882:3;15793:93;:::i;:::-;15911:2;15906:3;15902:12;15895:19;;15554:366;;;:::o;15926:::-;16068:3;16089:67;16153:2;16148:3;16089:67;:::i;:::-;16082:74;;16165:93;16254:3;16165:93;:::i;:::-;16283:2;16278:3;16274:12;16267:19;;15926:366;;;:::o;16298:::-;16440:3;16461:67;16525:2;16520:3;16461:67;:::i;:::-;16454:74;;16537:93;16626:3;16537:93;:::i;:::-;16655:2;16650:3;16646:12;16639:19;;16298:366;;;:::o;16670:::-;16812:3;16833:67;16897:2;16892:3;16833:67;:::i;:::-;16826:74;;16909:93;16998:3;16909:93;:::i;:::-;17027:2;17022:3;17018:12;17011:19;;16670:366;;;:::o;17042:::-;17184:3;17205:67;17269:2;17264:3;17205:67;:::i;:::-;17198:74;;17281:93;17370:3;17281:93;:::i;:::-;17399:2;17394:3;17390:12;17383:19;;17042:366;;;:::o;17414:::-;17556:3;17577:67;17641:2;17636:3;17577:67;:::i;:::-;17570:74;;17653:93;17742:3;17653:93;:::i;:::-;17771:2;17766:3;17762:12;17755:19;;17414:366;;;:::o;17786:::-;17928:3;17949:67;18013:2;18008:3;17949:67;:::i;:::-;17942:74;;18025:93;18114:3;18025:93;:::i;:::-;18143:2;18138:3;18134:12;18127:19;;17786:366;;;:::o;18158:::-;18300:3;18321:67;18385:2;18380:3;18321:67;:::i;:::-;18314:74;;18397:93;18486:3;18397:93;:::i;:::-;18515:2;18510:3;18506:12;18499:19;;18158:366;;;:::o;18530:398::-;18689:3;18710:83;18791:1;18786:3;18710:83;:::i;:::-;18703:90;;18802:93;18891:3;18802:93;:::i;:::-;18920:1;18915:3;18911:11;18904:18;;18530:398;;;:::o;18934:366::-;19076:3;19097:67;19161:2;19156:3;19097:67;:::i;:::-;19090:74;;19173:93;19262:3;19173:93;:::i;:::-;19291:2;19286:3;19282:12;19275:19;;18934:366;;;:::o;19306:::-;19448:3;19469:67;19533:2;19528:3;19469:67;:::i;:::-;19462:74;;19545:93;19634:3;19545:93;:::i;:::-;19663:2;19658:3;19654:12;19647:19;;19306:366;;;:::o;19678:::-;19820:3;19841:67;19905:2;19900:3;19841:67;:::i;:::-;19834:74;;19917:93;20006:3;19917:93;:::i;:::-;20035:2;20030:3;20026:12;20019:19;;19678:366;;;:::o;20050:::-;20192:3;20213:67;20277:2;20272:3;20213:67;:::i;:::-;20206:74;;20289:93;20378:3;20289:93;:::i;:::-;20407:2;20402:3;20398:12;20391:19;;20050:366;;;:::o;20422:118::-;20509:24;20527:5;20509:24;:::i;:::-;20504:3;20497:37;20422:118;;:::o;20546:256::-;20658:3;20673:75;20744:3;20735:6;20673:75;:::i;:::-;20773:2;20768:3;20764:12;20757:19;;20793:3;20786:10;;20546:256;;;;:::o;20808:589::-;21033:3;21055:95;21146:3;21137:6;21055:95;:::i;:::-;21048:102;;21167:95;21258:3;21249:6;21167:95;:::i;:::-;21160:102;;21279:92;21367:3;21358:6;21279:92;:::i;:::-;21272:99;;21388:3;21381:10;;20808:589;;;;;;:::o;21403:379::-;21587:3;21609:147;21752:3;21609:147;:::i;:::-;21602:154;;21773:3;21766:10;;21403:379;;;:::o;21788:222::-;21881:4;21919:2;21908:9;21904:18;21896:26;;21932:71;22000:1;21989:9;21985:17;21976:6;21932:71;:::i;:::-;21788:222;;;;:::o;22016:254::-;22125:4;22163:2;22152:9;22148:18;22140:26;;22176:87;22260:1;22249:9;22245:17;22236:6;22176:87;:::i;:::-;22016:254;;;;:::o;22276:640::-;22471:4;22509:3;22498:9;22494:19;22486:27;;22523:71;22591:1;22580:9;22576:17;22567:6;22523:71;:::i;:::-;22604:72;22672:2;22661:9;22657:18;22648:6;22604:72;:::i;:::-;22686;22754:2;22743:9;22739:18;22730:6;22686:72;:::i;:::-;22805:9;22799:4;22795:20;22790:2;22779:9;22775:18;22768:48;22833:76;22904:4;22895:6;22833:76;:::i;:::-;22825:84;;22276:640;;;;;;;:::o;22922:210::-;23009:4;23047:2;23036:9;23032:18;23024:26;;23060:65;23122:1;23111:9;23107:17;23098:6;23060:65;:::i;:::-;22922:210;;;;:::o;23138:222::-;23231:4;23269:2;23258:9;23254:18;23246:26;;23282:71;23350:1;23339:9;23335:17;23326:6;23282:71;:::i;:::-;23138:222;;;;:::o;23366:313::-;23479:4;23517:2;23506:9;23502:18;23494:26;;23566:9;23560:4;23556:20;23552:1;23541:9;23537:17;23530:47;23594:78;23667:4;23658:6;23594:78;:::i;:::-;23586:86;;23366:313;;;;:::o;23685:419::-;23851:4;23889:2;23878:9;23874:18;23866:26;;23938:9;23932:4;23928:20;23924:1;23913:9;23909:17;23902:47;23966:131;24092:4;23966:131;:::i;:::-;23958:139;;23685:419;;;:::o;24110:::-;24276:4;24314:2;24303:9;24299:18;24291:26;;24363:9;24357:4;24353:20;24349:1;24338:9;24334:17;24327:47;24391:131;24517:4;24391:131;:::i;:::-;24383:139;;24110:419;;;:::o;24535:::-;24701:4;24739:2;24728:9;24724:18;24716:26;;24788:9;24782:4;24778:20;24774:1;24763:9;24759:17;24752:47;24816:131;24942:4;24816:131;:::i;:::-;24808:139;;24535:419;;;:::o;24960:::-;25126:4;25164:2;25153:9;25149:18;25141:26;;25213:9;25207:4;25203:20;25199:1;25188:9;25184:17;25177:47;25241:131;25367:4;25241:131;:::i;:::-;25233:139;;24960:419;;;:::o;25385:::-;25551:4;25589:2;25578:9;25574:18;25566:26;;25638:9;25632:4;25628:20;25624:1;25613:9;25609:17;25602:47;25666:131;25792:4;25666:131;:::i;:::-;25658:139;;25385:419;;;:::o;25810:::-;25976:4;26014:2;26003:9;25999:18;25991:26;;26063:9;26057:4;26053:20;26049:1;26038:9;26034:17;26027:47;26091:131;26217:4;26091:131;:::i;:::-;26083:139;;25810:419;;;:::o;26235:::-;26401:4;26439:2;26428:9;26424:18;26416:26;;26488:9;26482:4;26478:20;26474:1;26463:9;26459:17;26452:47;26516:131;26642:4;26516:131;:::i;:::-;26508:139;;26235:419;;;:::o;26660:::-;26826:4;26864:2;26853:9;26849:18;26841:26;;26913:9;26907:4;26903:20;26899:1;26888:9;26884:17;26877:47;26941:131;27067:4;26941:131;:::i;:::-;26933:139;;26660:419;;;:::o;27085:::-;27251:4;27289:2;27278:9;27274:18;27266:26;;27338:9;27332:4;27328:20;27324:1;27313:9;27309:17;27302:47;27366:131;27492:4;27366:131;:::i;:::-;27358:139;;27085:419;;;:::o;27510:::-;27676:4;27714:2;27703:9;27699:18;27691:26;;27763:9;27757:4;27753:20;27749:1;27738:9;27734:17;27727:47;27791:131;27917:4;27791:131;:::i;:::-;27783:139;;27510:419;;;:::o;27935:::-;28101:4;28139:2;28128:9;28124:18;28116:26;;28188:9;28182:4;28178:20;28174:1;28163:9;28159:17;28152:47;28216:131;28342:4;28216:131;:::i;:::-;28208:139;;27935:419;;;:::o;28360:::-;28526:4;28564:2;28553:9;28549:18;28541:26;;28613:9;28607:4;28603:20;28599:1;28588:9;28584:17;28577:47;28641:131;28767:4;28641:131;:::i;:::-;28633:139;;28360:419;;;:::o;28785:::-;28951:4;28989:2;28978:9;28974:18;28966:26;;29038:9;29032:4;29028:20;29024:1;29013:9;29009:17;29002:47;29066:131;29192:4;29066:131;:::i;:::-;29058:139;;28785:419;;;:::o;29210:::-;29376:4;29414:2;29403:9;29399:18;29391:26;;29463:9;29457:4;29453:20;29449:1;29438:9;29434:17;29427:47;29491:131;29617:4;29491:131;:::i;:::-;29483:139;;29210:419;;;:::o;29635:::-;29801:4;29839:2;29828:9;29824:18;29816:26;;29888:9;29882:4;29878:20;29874:1;29863:9;29859:17;29852:47;29916:131;30042:4;29916:131;:::i;:::-;29908:139;;29635:419;;;:::o;30060:::-;30226:4;30264:2;30253:9;30249:18;30241:26;;30313:9;30307:4;30303:20;30299:1;30288:9;30284:17;30277:47;30341:131;30467:4;30341:131;:::i;:::-;30333:139;;30060:419;;;:::o;30485:::-;30651:4;30689:2;30678:9;30674:18;30666:26;;30738:9;30732:4;30728:20;30724:1;30713:9;30709:17;30702:47;30766:131;30892:4;30766:131;:::i;:::-;30758:139;;30485:419;;;:::o;30910:::-;31076:4;31114:2;31103:9;31099:18;31091:26;;31163:9;31157:4;31153:20;31149:1;31138:9;31134:17;31127:47;31191:131;31317:4;31191:131;:::i;:::-;31183:139;;30910:419;;;:::o;31335:::-;31501:4;31539:2;31528:9;31524:18;31516:26;;31588:9;31582:4;31578:20;31574:1;31563:9;31559:17;31552:47;31616:131;31742:4;31616:131;:::i;:::-;31608:139;;31335:419;;;:::o;31760:::-;31926:4;31964:2;31953:9;31949:18;31941:26;;32013:9;32007:4;32003:20;31999:1;31988:9;31984:17;31977:47;32041:131;32167:4;32041:131;:::i;:::-;32033:139;;31760:419;;;:::o;32185:::-;32351:4;32389:2;32378:9;32374:18;32366:26;;32438:9;32432:4;32428:20;32424:1;32413:9;32409:17;32402:47;32466:131;32592:4;32466:131;:::i;:::-;32458:139;;32185:419;;;:::o;32610:::-;32776:4;32814:2;32803:9;32799:18;32791:26;;32863:9;32857:4;32853:20;32849:1;32838:9;32834:17;32827:47;32891:131;33017:4;32891:131;:::i;:::-;32883:139;;32610:419;;;:::o;33035:::-;33201:4;33239:2;33228:9;33224:18;33216:26;;33288:9;33282:4;33278:20;33274:1;33263:9;33259:17;33252:47;33316:131;33442:4;33316:131;:::i;:::-;33308:139;;33035:419;;;:::o;33460:222::-;33553:4;33591:2;33580:9;33576:18;33568:26;;33604:71;33672:1;33661:9;33657:17;33648:6;33604:71;:::i;:::-;33460:222;;;;:::o;33688:129::-;33722:6;33749:20;;:::i;:::-;33739:30;;33778:33;33806:4;33798:6;33778:33;:::i;:::-;33688:129;;;:::o;33823:75::-;33856:6;33889:2;33883:9;33873:19;;33823:75;:::o;33904:307::-;33965:4;34055:18;34047:6;34044:30;34041:56;;;34077:18;;:::i;:::-;34041:56;34115:29;34137:6;34115:29;:::i;:::-;34107:37;;34199:4;34193;34189:15;34181:23;;33904:307;;;:::o;34217:308::-;34279:4;34369:18;34361:6;34358:30;34355:56;;;34391:18;;:::i;:::-;34355:56;34429:29;34451:6;34429:29;:::i;:::-;34421:37;;34513:4;34507;34503:15;34495:23;;34217:308;;;:::o;34531:141::-;34580:4;34603:3;34595:11;;34626:3;34623:1;34616:14;34660:4;34657:1;34647:18;34639:26;;34531:141;;;:::o;34678:98::-;34729:6;34763:5;34757:12;34747:22;;34678:98;;;:::o;34782:99::-;34834:6;34868:5;34862:12;34852:22;;34782:99;;;:::o;34887:168::-;34970:11;35004:6;34999:3;34992:19;35044:4;35039:3;35035:14;35020:29;;34887:168;;;;:::o;35061:147::-;35162:11;35199:3;35184:18;;35061:147;;;;:::o;35214:169::-;35298:11;35332:6;35327:3;35320:19;35372:4;35367:3;35363:14;35348:29;;35214:169;;;;:::o;35389:148::-;35491:11;35528:3;35513:18;;35389:148;;;;:::o;35543:305::-;35583:3;35602:20;35620:1;35602:20;:::i;:::-;35597:25;;35636:20;35654:1;35636:20;:::i;:::-;35631:25;;35790:1;35722:66;35718:74;35715:1;35712:81;35709:107;;;35796:18;;:::i;:::-;35709:107;35840:1;35837;35833:9;35826:16;;35543:305;;;;:::o;35854:185::-;35894:1;35911:20;35929:1;35911:20;:::i;:::-;35906:25;;35945:20;35963:1;35945:20;:::i;:::-;35940:25;;35984:1;35974:35;;35989:18;;:::i;:::-;35974:35;36031:1;36028;36024:9;36019:14;;35854:185;;;;:::o;36045:191::-;36085:4;36105:20;36123:1;36105:20;:::i;:::-;36100:25;;36139:20;36157:1;36139:20;:::i;:::-;36134:25;;36178:1;36175;36172:8;36169:34;;;36183:18;;:::i;:::-;36169:34;36228:1;36225;36221:9;36213:17;;36045:191;;;;:::o;36242:96::-;36279:7;36308:24;36326:5;36308:24;:::i;:::-;36297:35;;36242:96;;;:::o;36344:104::-;36389:7;36418:24;36436:5;36418:24;:::i;:::-;36407:35;;36344:104;;;:::o;36454:90::-;36488:7;36531:5;36524:13;36517:21;36506:32;;36454:90;;;:::o;36550:77::-;36587:7;36616:5;36605:16;;36550:77;;;:::o;36633:149::-;36669:7;36709:66;36702:5;36698:78;36687:89;;36633:149;;;:::o;36788:126::-;36825:7;36865:42;36858:5;36854:54;36843:65;;36788:126;;;:::o;36920:77::-;36957:7;36986:5;36975:16;;36920:77;;;:::o;37003:154::-;37087:6;37082:3;37077;37064:30;37149:1;37140:6;37135:3;37131:16;37124:27;37003:154;;;:::o;37163:307::-;37231:1;37241:113;37255:6;37252:1;37249:13;37241:113;;;37340:1;37335:3;37331:11;37325:18;37321:1;37316:3;37312:11;37305:39;37277:2;37274:1;37270:10;37265:15;;37241:113;;;37372:6;37369:1;37366:13;37363:101;;;37452:1;37443:6;37438:3;37434:16;37427:27;37363:101;37212:258;37163:307;;;:::o;37476:320::-;37520:6;37557:1;37551:4;37547:12;37537:22;;37604:1;37598:4;37594:12;37625:18;37615:81;;37681:4;37673:6;37669:17;37659:27;;37615:81;37743:2;37735:6;37732:14;37712:18;37709:38;37706:84;;;37762:18;;:::i;:::-;37706:84;37527:269;37476:320;;;:::o;37802:281::-;37885:27;37907:4;37885:27;:::i;:::-;37877:6;37873:40;38015:6;38003:10;38000:22;37979:18;37967:10;37964:34;37961:62;37958:88;;;38026:18;;:::i;:::-;37958:88;38066:10;38062:2;38055:22;37845:238;37802:281;;:::o;38089:233::-;38128:3;38151:24;38169:5;38151:24;:::i;:::-;38142:33;;38197:66;38190:5;38187:77;38184:103;;;38267:18;;:::i;:::-;38184:103;38314:1;38307:5;38303:13;38296:20;;38089:233;;;:::o;38328:100::-;38367:7;38396:26;38416:5;38396:26;:::i;:::-;38385:37;;38328:100;;;:::o;38434:94::-;38473:7;38502:20;38516:5;38502:20;:::i;:::-;38491:31;;38434:94;;;:::o;38534:176::-;38566:1;38583:20;38601:1;38583:20;:::i;:::-;38578:25;;38617:20;38635:1;38617:20;:::i;:::-;38612:25;;38656:1;38646:35;;38661:18;;:::i;:::-;38646:35;38702:1;38699;38695:9;38690:14;;38534:176;;;;:::o;38716:180::-;38764:77;38761:1;38754:88;38861:4;38858:1;38851:15;38885:4;38882:1;38875:15;38902:180;38950:77;38947:1;38940:88;39047:4;39044:1;39037:15;39071:4;39068:1;39061:15;39088:180;39136:77;39133:1;39126:88;39233:4;39230:1;39223:15;39257:4;39254:1;39247:15;39274:180;39322:77;39319:1;39312:88;39419:4;39416:1;39409:15;39443:4;39440:1;39433:15;39460:180;39508:77;39505:1;39498:88;39605:4;39602:1;39595:15;39629:4;39626:1;39619:15;39646:117;39755:1;39752;39745:12;39769:117;39878:1;39875;39868:12;39892:117;40001:1;39998;39991:12;40015:117;40124:1;40121;40114:12;40138:117;40247:1;40244;40237:12;40261:117;40370:1;40367;40360:12;40384:102;40425:6;40476:2;40472:7;40467:2;40460:5;40456:14;40452:28;40442:38;;40384:102;;;:::o;40492:94::-;40525:8;40573:5;40569:2;40565:14;40544:35;;40492:94;;;:::o;40592:237::-;40732:34;40728:1;40720:6;40716:14;40709:58;40801:20;40796:2;40788:6;40784:15;40777:45;40592:237;:::o;40835:225::-;40975:34;40971:1;40963:6;40959:14;40952:58;41044:8;41039:2;41031:6;41027:15;41020:33;40835:225;:::o;41066:178::-;41206:30;41202:1;41194:6;41190:14;41183:54;41066:178;:::o;41250:223::-;41390:34;41386:1;41378:6;41374:14;41367:58;41459:6;41454:2;41446:6;41442:15;41435:31;41250:223;:::o;41479:175::-;41619:27;41615:1;41607:6;41603:14;41596:51;41479:175;:::o;41660:231::-;41800:34;41796:1;41788:6;41784:14;41777:58;41869:14;41864:2;41856:6;41852:15;41845:39;41660:231;:::o;41897:243::-;42037:34;42033:1;42025:6;42021:14;42014:58;42106:26;42101:2;42093:6;42089:15;42082:51;41897:243;:::o;42146:229::-;42286:34;42282:1;42274:6;42270:14;42263:58;42355:12;42350:2;42342:6;42338:15;42331:37;42146:229;:::o;42381:228::-;42521:34;42517:1;42509:6;42505:14;42498:58;42590:11;42585:2;42577:6;42573:15;42566:36;42381:228;:::o;42615:176::-;42755:28;42751:1;42743:6;42739:14;42732:52;42615:176;:::o;42797:172::-;42937:24;42933:1;42925:6;42921:14;42914:48;42797:172;:::o;42975:182::-;43115:34;43111:1;43103:6;43099:14;43092:58;42975:182;:::o;43163:176::-;43303:28;43299:1;43291:6;43287:14;43280:52;43163:176;:::o;43345:231::-;43485:34;43481:1;43473:6;43469:14;43462:58;43554:14;43549:2;43541:6;43537:15;43530:39;43345:231;:::o;43582:182::-;43722:34;43718:1;43710:6;43706:14;43699:58;43582:182;:::o;43770:173::-;43910:25;43906:1;43898:6;43894:14;43887:49;43770:173;:::o;43949:228::-;44089:34;44085:1;44077:6;44073:14;44066:58;44158:11;44153:2;44145:6;44141:15;44134:36;43949:228;:::o;44183:234::-;44323:34;44319:1;44311:6;44307:14;44300:58;44392:17;44387:2;44379:6;44375:15;44368:42;44183:234;:::o;44423:220::-;44563:34;44559:1;44551:6;44547:14;44540:58;44632:3;44627:2;44619:6;44615:15;44608:28;44423:220;:::o;44649:114::-;;:::o;44769:236::-;44909:34;44905:1;44897:6;44893:14;44886:58;44978:19;44973:2;44965:6;44961:15;44954:44;44769:236;:::o;45011:177::-;45151:29;45147:1;45139:6;45135:14;45128:53;45011:177;:::o;45194:::-;45334:29;45330:1;45322:6;45318:14;45311:53;45194:177;:::o;45377:181::-;45517:33;45513:1;45505:6;45501:14;45494:57;45377:181;:::o;45564:122::-;45637:24;45655:5;45637:24;:::i;:::-;45630:5;45627:35;45617:63;;45676:1;45673;45666:12;45617:63;45564:122;:::o;45692:116::-;45762:21;45777:5;45762:21;:::i;:::-;45755:5;45752:32;45742:60;;45798:1;45795;45788:12;45742:60;45692:116;:::o;45814:122::-;45887:24;45905:5;45887:24;:::i;:::-;45880:5;45877:35;45867:63;;45926:1;45923;45916:12;45867:63;45814:122;:::o;45942:120::-;46014:23;46031:5;46014:23;:::i;:::-;46007:5;46004:34;45994:62;;46052:1;46049;46042:12;45994:62;45942:120;:::o;46068:122::-;46141:24;46159:5;46141:24;:::i;:::-;46134:5;46131:35;46121:63;;46180:1;46177;46170:12;46121:63;46068:122;:::o

Swarm Source

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