ETH Price: $3,306.54 (+2.05%)
Gas: 4 Gwei

Token

KenkyoGetaways ($KKG)
 

Overview

Max Total Supply

334 $KKG

Holders

165

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
mo3tschik.eth
Balance
1 $KKG
0xf81C87FBd6b5801BF3dAb670783a4aC73546CF36
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:
KenkyoGetaways

Compiler Version
v0.8.0+commit.c7dfd78e

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-29
*/

// SPDX-License-Identifier: MIT
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 simultaneously proven to be a part of a merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _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}
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _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 sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * _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}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _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)
        }
    }
}

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

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


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


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);
}


pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

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);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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);
            }
        }
    }
}

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

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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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);
    }
}

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128.
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        return currentIndex;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), 'ERC721A: global index out of bounds');
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), 'ERC721A: owner index out of bounds');
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        revert('ERC721A: unable to get token of owner by index');
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), 'ERC721A: number minted query for the zero address');
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

        unchecked {
            for (uint256 curr = tokenId; curr >= 0; curr--) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (ownership.addr != address(0)) {
                    return ownership;
                }
            }
        }

        revert('ERC721A: unable to determine the owner of token');
    }

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        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 override {
        address owner = ERC721A.ownerOf(tokenId);
        require(to != owner, 'ERC721A: approval to current owner');

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), 'ERC721A: approve to caller');

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721A: 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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

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

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

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

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe) {
                    require(
                        _checkOnERC721Received(address(0), to, updatedIndex, _data),
                        'ERC721A: transfer to non ERC721Receiver implementer'
                    );
                }

                updatedIndex++;
            }

            currentIndex = updatedIndex;
        }

        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved');

        require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner');
        require(to != address(0), 'ERC721A: transfer to the zero address');

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                if (_exists(nextTokenId)) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert('ERC721A: transfer to non ERC721Receiver implementer');
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     */
     
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

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

library SafeMath {

    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {

            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }


    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

library Counters {
    struct Counter {

        uint256 _value; 
    }

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

pragma solidity ^0.8.0;

contract KenkyoGetaways is Ownable, ERC721A, ReentrancyGuard {  
    using Strings for uint256;
    bytes32 public merkleRoot = 0x2e0636acdcdbabe53705266c06b4af9f6a1c7441c4033327341b9902a0bb9291;

    string private _baseURIextended = "";

    bool public pauseMint = true;

    uint256 public constant MAX_NFT_SUPPLY = 777;
    address public kenkyoContract = 0x58091d4c4f8F37A103789Dc0341616717a6F31cf;
    uint256 public nftKenkyoGetawaysHoldAmount = 0;
    
    constructor() ERC721A("KenkyoGetaways", "$KKG") {
    }

    function mintNFTForOwner(uint256 amount) public onlyOwner {
        require(!pauseMint, "Paused!");
        require(totalSupply() < MAX_NFT_SUPPLY, "Sale has already ended");

        _safeMint(msg.sender, amount);
    }

    function walletHoldsNFT (address _wallet) public view returns (uint256) {
        return IERC721(kenkyoContract).balanceOf(_wallet);
    }

    function walletGetawaysHolds (address _wallet) public view returns (uint256) {
        return IERC721(address(this)).balanceOf(_wallet);
    }

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

    function mintNFT(uint256 _quantity, bytes32[] calldata merkleProof) public payable {
        bytes32 node = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(merkleProof, merkleRoot, node), "invalid proof");
        uint256 nftHoldAmount = walletHoldsNFT(msg.sender);
        nftKenkyoGetawaysHoldAmount = walletGetawaysHolds(msg.sender);

        // require(nftHoldAmount > 0, "Not NFT holder!");
        require(_quantity > 0 && _quantity + nftKenkyoGetawaysHoldAmount <= nftHoldAmount, "You can not mint anymore");
        require(!pauseMint, "Paused!");
        require(totalSupply() + _quantity < MAX_NFT_SUPPLY, "Sale has already ended");

        _safeMint(msg.sender, _quantity);
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        return bytes(_baseURIextended).length > 0 ? string(abi.encodePacked(_baseURIextended, tokenId.toString(), ".json")) : "";
    }

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

    function setBaseURI(string memory baseURI_) external onlyOwner() {
        _baseURIextended = baseURI_;
    }

    function tokenMinted() public view returns (uint256) {
        return totalSupply();
    }

    function pause() public onlyOwner {
        pauseMint = true;
    }

    function unPause() public onlyOwner {
        pauseMint = false;
    }

    function getOwnershipData(uint256 tokenId)
        external
        view
        returns (TokenOwnership memory)
    {
        return ownershipOf(tokenId);
    }

    function setKenkyoContract (address _contract) external onlyOwner() {
        kenkyoContract = _contract;
    }
}

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":[],"name":"MAX_NFT_SUPPLY","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"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":"kenkyoContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintNFTForOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftKenkyoGetawaysHoldAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"setKenkyoContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"walletGetawaysHolds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"walletHoldsNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040527f2e0636acdcdbabe53705266c06b4af9f6a1c7441c4033327341b9902a0bb929160001b60095560405180602001604052806000815250600a90805190602001906200005292919062000270565b506001600b60006101000a81548160ff0219169083151502179055507358091d4c4f8f37a103789dc0341616717a6f31cf600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600c55348015620000d557600080fd5b506040518060400160405280600e81526020017f4b656e6b796f47657461776179730000000000000000000000000000000000008152506040518060400160405280600481526020017f244b4b47000000000000000000000000000000000000000000000000000000008152506200016262000156620001a460201b60201c565b620001ac60201b60201c565b81600290805190602001906200017a92919062000270565b5080600390805190602001906200019392919062000270565b505050600160088190555062000385565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200027e9062000320565b90600052602060002090601f016020900481019282620002a25760008555620002ee565b82601f10620002bd57805160ff1916838001178555620002ee565b82800160010185558215620002ee579182015b82811115620002ed578251825591602001919060010190620002d0565b5b509050620002fd919062000301565b5090565b5b808211156200031c57600081600090555060010162000302565b5090565b600060028204905060018216806200033957607f821691505b6020821081141562000350576200034f62000356565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6145ee80620003956000396000f3fe6080604052600436106102045760003560e01c80637f7bbb7011610118578063b5077f44116100a0578063d1417cd71161006f578063d1417cd71461077b578063d62fd296146107b8578063e985e9c5146107d4578063f2fde38b14610811578063f7b188a51461083a57610204565b8063b5077f44146106bf578063b88d4fde146106ea578063c87b56dd14610713578063cd85cdb51461075057610204565b806395d89b41116100e757806395d89b41146105da5780639635635514610605578063976c2a5014610630578063a22cb4651461066d578063ad236d4c1461069657610204565b80637f7bbb70146105305780638456cb591461055b5780638da5cb5b146105725780639231ab2a1461059d57610204565b80632f745c591161019b57806355f804b31161016a57806355f804b31461044d5780636352211e1461047657806370a08231146104b3578063715018a6146104f05780637cb647591461050757610204565b80632f745c59146103815780633461fc79146103be57806342842e0e146103e75780634f6ccce71461041057610204565b806313c21cd0116101d757806313c21cd0146102d757806318160ddd1461030257806323b872dd1461032d5780632eb4a7ab1461035657610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b919061317f565b610851565b60405161023d9190613db5565b60405180910390f35b34801561025257600080fd5b5061025b61099b565b6040516102689190613deb565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613212565b610a2d565b6040516102a59190613d4e565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d0919061311a565b610ab2565b005b3480156102e357600080fd5b506102ec610bcb565b6040516102f99190613d4e565b60405180910390f35b34801561030e57600080fd5b50610317610bf1565b6040516103249190614108565b60405180910390f35b34801561033957600080fd5b50610354600480360381019061034f9190613014565b610bfb565b005b34801561036257600080fd5b5061036b610c0b565b6040516103789190613dd0565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a3919061311a565b610c11565b6040516103b59190614108565b60405180910390f35b3480156103ca57600080fd5b506103e560048036038101906103e09190612faf565b610e03565b005b3480156103f357600080fd5b5061040e60048036038101906104099190613014565b610ec3565b005b34801561041c57600080fd5b5061043760048036038101906104329190613212565b610ee3565b6040516104449190614108565b60405180910390f35b34801561045957600080fd5b50610474600480360381019061046f91906131d1565b610f36565b005b34801561048257600080fd5b5061049d60048036038101906104989190613212565b610fcc565b6040516104aa9190613d4e565b60405180910390f35b3480156104bf57600080fd5b506104da60048036038101906104d59190612faf565b610fe2565b6040516104e79190614108565b60405180910390f35b3480156104fc57600080fd5b506105056110cb565b005b34801561051357600080fd5b5061052e60048036038101906105299190613156565b611153565b005b34801561053c57600080fd5b506105456111d9565b6040516105529190614108565b60405180910390f35b34801561056757600080fd5b506105706111df565b005b34801561057e57600080fd5b50610587611278565b6040516105949190613d4e565b60405180910390f35b3480156105a957600080fd5b506105c460048036038101906105bf9190613212565b6112a1565b6040516105d191906140ed565b60405180910390f35b3480156105e657600080fd5b506105ef6112b9565b6040516105fc9190613deb565b60405180910390f35b34801561061157600080fd5b5061061a61134b565b6040516106279190614108565b60405180910390f35b34801561063c57600080fd5b5061065760048036038101906106529190612faf565b61135a565b6040516106649190614108565b60405180910390f35b34801561067957600080fd5b50610694600480360381019061068f91906130de565b61140e565b005b3480156106a257600080fd5b506106bd60048036038101906106b89190613212565b61158f565b005b3480156106cb57600080fd5b506106d46116b3565b6040516106e19190614108565b60405180910390f35b3480156106f657600080fd5b50610711600480360381019061070c9190613063565b6116b9565b005b34801561071f57600080fd5b5061073a60048036038101906107359190613212565b611715565b6040516107479190613deb565b60405180910390f35b34801561075c57600080fd5b506107656117bd565b6040516107729190613db5565b60405180910390f35b34801561078757600080fd5b506107a2600480360381019061079d9190612faf565b6117d0565b6040516107af9190614108565b60405180910390f35b6107d260048036038101906107cd9190613264565b611862565b005b3480156107e057600080fd5b506107fb60048036038101906107f69190612fd8565b611a49565b6040516108089190613db5565b60405180910390f35b34801561081d57600080fd5b5061083860048036038101906108339190612faf565b611add565b005b34801561084657600080fd5b5061084f611bd5565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061091c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061098457507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610994575061099382611c6e565b5b9050919050565b6060600280546109aa9061439b565b80601f01602080910402602001604051908101604052809291908181526020018280546109d69061439b565b8015610a235780601f106109f857610100808354040283529160200191610a23565b820191906000526020600020905b815481529060010190602001808311610a0657829003601f168201915b5050505050905090565b6000610a3882611cd8565b610a77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6e906140cd565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610abd82610fcc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2590613fed565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b4d611ce6565b73ffffffffffffffffffffffffffffffffffffffff161480610b7c5750610b7b81610b76611ce6565b611a49565b5b610bbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb290613ecd565b60405180910390fd5b610bc6838383611cee565b505050565b600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600154905090565b610c06838383611da0565b505050565b60095481565b6000610c1c83610fe2565b8210610c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5490613e0d565b60405180910390fd5b6000610c67610bf1565b905060008060005b83811015610dc1576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610d6157806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610db35786841415610daa578195505050505050610dfd565b83806001019450505b508080600101915050610c6f565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df49061408d565b60405180910390fd5b92915050565b610e0b611ce6565b73ffffffffffffffffffffffffffffffffffffffff16610e29611278565b73ffffffffffffffffffffffffffffffffffffffff1614610e7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7690613f2d565b60405180910390fd5b80600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610ede838383604051806020016040528060008152506116b9565b505050565b6000610eed610bf1565b8210610f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2590613e6d565b60405180910390fd5b819050919050565b610f3e611ce6565b73ffffffffffffffffffffffffffffffffffffffff16610f5c611278565b73ffffffffffffffffffffffffffffffffffffffff1614610fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa990613f2d565b60405180910390fd5b80600a9080519060200190610fc8929190612d25565b5050565b6000610fd7826122e0565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104a90613eed565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6110d3611ce6565b73ffffffffffffffffffffffffffffffffffffffff166110f1611278565b73ffffffffffffffffffffffffffffffffffffffff1614611147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113e90613f2d565b60405180910390fd5b611151600061247a565b565b61115b611ce6565b73ffffffffffffffffffffffffffffffffffffffff16611179611278565b73ffffffffffffffffffffffffffffffffffffffff16146111cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c690613f2d565b60405180910390fd5b8060098190555050565b600c5481565b6111e7611ce6565b73ffffffffffffffffffffffffffffffffffffffff16611205611278565b73ffffffffffffffffffffffffffffffffffffffff161461125b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125290613f2d565b60405180910390fd5b6001600b60006101000a81548160ff021916908315150217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112a9612dab565b6112b2826122e0565b9050919050565b6060600380546112c89061439b565b80601f01602080910402602001604051908101604052809291908181526020018280546112f49061439b565b80156113415780601f1061131657610100808354040283529160200191611341565b820191906000526020600020905b81548152906001019060200180831161132457829003601f168201915b5050505050905090565b6000611355610bf1565b905090565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b81526004016113b79190613d4e565b60206040518083038186803b1580156113cf57600080fd5b505afa1580156113e3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611407919061323b565b9050919050565b611416611ce6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147b90613f6d565b60405180910390fd5b8060076000611491611ce6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661153e611ce6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115839190613db5565b60405180910390a35050565b611597611ce6565b73ffffffffffffffffffffffffffffffffffffffff166115b5611278565b73ffffffffffffffffffffffffffffffffffffffff161461160b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160290613f2d565b60405180910390fd5b600b60009054906101000a900460ff161561165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290613ead565b60405180910390fd5b610309611666610bf1565b106116a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169d90613fcd565b60405180910390fd5b6116b0338261253e565b50565b61030981565b6116c4848484611da0565b6116d08484848461255c565b61170f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117069061400d565b60405180910390fd5b50505050565b606061172082611cd8565b61175f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175690613f4d565b60405180910390fd5b6000600a805461176e9061439b565b90501161178a57604051806020016040528060008152506117b6565b600a611795836126f3565b6040516020016117a6929190613d1f565b6040516020818303038152906040525b9050919050565b600b60009054906101000a900460ff1681565b60003073ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b815260040161180b9190613d4e565b60206040518083038186803b15801561182357600080fd5b505afa158015611837573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185b919061323b565b9050919050565b6000336040516020016118759190613d04565b6040516020818303038152906040528051906020012090506118db838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600954836128a0565b61191a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119119061402d565b60405180910390fd5b60006119253361135a565b9050611930336117d0565b600c81905550600085118015611953575080600c5486611950919061420c565b11155b611992576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198990613fad565b60405180910390fd5b600b60009054906101000a900460ff16156119e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d990613ead565b60405180910390fd5b610309856119ee610bf1565b6119f8919061420c565b10611a38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2f90613fcd565b60405180910390fd5b611a42338661253e565b5050505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ae5611ce6565b73ffffffffffffffffffffffffffffffffffffffff16611b03611278565b73ffffffffffffffffffffffffffffffffffffffff1614611b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5090613f2d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc090613e2d565b60405180910390fd5b611bd28161247a565b50565b611bdd611ce6565b73ffffffffffffffffffffffffffffffffffffffff16611bfb611278565b73ffffffffffffffffffffffffffffffffffffffff1614611c51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4890613f2d565b60405180910390fd5b6000600b60006101000a81548160ff021916908315150217905550565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611dab826122e0565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611dd2611ce6565b73ffffffffffffffffffffffffffffffffffffffff161480611e2e5750611df7611ce6565b73ffffffffffffffffffffffffffffffffffffffff16611e1684610a2d565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e4a5750611e498260000151611e44611ce6565b611a49565b5b905080611e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8390613f8d565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611efe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef590613f0d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6590613e8d565b60405180910390fd5b611f7b85858560016128b7565b611f8b6000848460000151611cee565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612270576121cf81611cd8565b1561226f5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122d985858560016128bd565b5050505050565b6122e8612dab565b6122f182611cd8565b612330576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232790613e4d565b60405180910390fd5b60008290505b60008110612439576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461242a578092505050612475565b50808060019003915050612336565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246c906140ad565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6125588282604051806020016040528060008152506128c3565b5050565b600061257d8473ffffffffffffffffffffffffffffffffffffffff166128d5565b156126e6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125a6611ce6565b8786866040518563ffffffff1660e01b81526004016125c89493929190613d69565b602060405180830381600087803b1580156125e257600080fd5b505af192505050801561261357506040513d601f19601f8201168201806040525081019061261091906131a8565b60015b612696573d8060008114612643576040519150601f19603f3d011682016040523d82523d6000602084013e612648565b606091505b5060008151141561268e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126859061400d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506126eb565b600190505b949350505050565b6060600082141561273b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061289b565b600082905060005b6000821461276d578080612756906143cd565b915050600a826127669190614262565b9150612743565b60008167ffffffffffffffff8111156127af577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156127e15781602001600182028036833780820191505090505b5090505b60008514612894576001826127fa9190614293565b9150600a85612809919061443a565b6030612815919061420c565b60f81b818381518110612851577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561288d9190614262565b94506127e5565b8093505050505b919050565b6000826128ad85846128e8565b1490509392505050565b50505050565b50505050565b6128d08383836001612964565b505050565b600080823b905060008111915050919050565b60008082905060005b84518110156129595761294482868381518110612937577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612ce3565b91508080612951906143cd565b9150506128f1565b508091505092915050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156129db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d29061404d565b60405180910390fd5b6000841415612a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a169061406d565b60405180910390fd5b612a2c60008683876128b7565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015612cc657818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315612cb157612c71600088848861255c565b612cb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca79061400d565b60405180910390fd5b5b81806001019250508080600101915050612bfa565b508060018190555050612cdc60008683876128bd565b5050505050565b6000818310612cfb57612cf68284612d0e565b612d06565b612d058383612d0e565b5b905092915050565b600082600052816020526040600020905092915050565b828054612d319061439b565b90600052602060002090601f016020900481019282612d535760008555612d9a565b82601f10612d6c57805160ff1916838001178555612d9a565b82800160010185558215612d9a579182015b82811115612d99578251825591602001919060010190612d7e565b5b509050612da79190612de5565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612dfe576000816000905550600101612de6565b5090565b6000612e15612e1084614154565b614123565b905082815260208101848484011115612e2d57600080fd5b612e38848285614359565b509392505050565b6000612e53612e4e84614184565b614123565b905082815260208101848484011115612e6b57600080fd5b612e76848285614359565b509392505050565b600081359050612e8d81614545565b92915050565b60008083601f840112612ea557600080fd5b8235905067ffffffffffffffff811115612ebe57600080fd5b602083019150836020820283011115612ed657600080fd5b9250929050565b600081359050612eec8161455c565b92915050565b600081359050612f0181614573565b92915050565b600081359050612f168161458a565b92915050565b600081519050612f2b8161458a565b92915050565b600082601f830112612f4257600080fd5b8135612f52848260208601612e02565b91505092915050565b600082601f830112612f6c57600080fd5b8135612f7c848260208601612e40565b91505092915050565b600081359050612f94816145a1565b92915050565b600081519050612fa9816145a1565b92915050565b600060208284031215612fc157600080fd5b6000612fcf84828501612e7e565b91505092915050565b60008060408385031215612feb57600080fd5b6000612ff985828601612e7e565b925050602061300a85828601612e7e565b9150509250929050565b60008060006060848603121561302957600080fd5b600061303786828701612e7e565b935050602061304886828701612e7e565b925050604061305986828701612f85565b9150509250925092565b6000806000806080858703121561307957600080fd5b600061308787828801612e7e565b945050602061309887828801612e7e565b93505060406130a987828801612f85565b925050606085013567ffffffffffffffff8111156130c657600080fd5b6130d287828801612f31565b91505092959194509250565b600080604083850312156130f157600080fd5b60006130ff85828601612e7e565b925050602061311085828601612edd565b9150509250929050565b6000806040838503121561312d57600080fd5b600061313b85828601612e7e565b925050602061314c85828601612f85565b9150509250929050565b60006020828403121561316857600080fd5b600061317684828501612ef2565b91505092915050565b60006020828403121561319157600080fd5b600061319f84828501612f07565b91505092915050565b6000602082840312156131ba57600080fd5b60006131c884828501612f1c565b91505092915050565b6000602082840312156131e357600080fd5b600082013567ffffffffffffffff8111156131fd57600080fd5b61320984828501612f5b565b91505092915050565b60006020828403121561322457600080fd5b600061323284828501612f85565b91505092915050565b60006020828403121561324d57600080fd5b600061325b84828501612f9a565b91505092915050565b60008060006040848603121561327957600080fd5b600061328786828701612f85565b935050602084013567ffffffffffffffff8111156132a457600080fd5b6132b086828701612e93565b92509250509250925092565b6132c5816142c7565b82525050565b6132d4816142c7565b82525050565b6132eb6132e6826142c7565b614416565b82525050565b6132fa816142d9565b82525050565b613309816142e5565b82525050565b600061331a826141c9565b61332481856141df565b9350613334818560208601614368565b61333d81614527565b840191505092915050565b6000613353826141d4565b61335d81856141f0565b935061336d818560208601614368565b61337681614527565b840191505092915050565b600061338c826141d4565b6133968185614201565b93506133a6818560208601614368565b80840191505092915050565b600081546133bf8161439b565b6133c98186614201565b945060018216600081146133e457600181146133f557613428565b60ff19831686528186019350613428565b6133fe856141b4565b60005b8381101561342057815481890152600182019150602081019050613401565b838801955050505b50505092915050565b600061343e6022836141f0565b91507f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006134a46026836141f0565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061350a602a836141f0565b91507f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008301527f74656e7420746f6b656e000000000000000000000000000000000000000000006020830152604082019050919050565b60006135706023836141f0565b91507f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008301527f6e647300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006135d66025836141f0565b91507f455243373231413a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061363c6007836141f0565b91507f50617573656421000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061367c6039836141f0565b91507f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006020830152604082019050919050565b60006136e2602b836141f0565b91507f455243373231413a2062616c616e636520717565727920666f7220746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b60006137486026836141f0565b91507f455243373231413a207472616e736665722066726f6d20696e636f727265637460008301527f206f776e657200000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006137ae600583614201565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b60006137ee6020836141f0565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061382e602f836141f0565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613894601a836141f0565b91507f455243373231413a20617070726f766520746f2063616c6c65720000000000006000830152602082019050919050565b60006138d46032836141f0565b91507f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008301527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006020830152604082019050919050565b600061393a6018836141f0565b91507f596f752063616e206e6f74206d696e7420616e796d6f726500000000000000006000830152602082019050919050565b600061397a6016836141f0565b91507f53616c652068617320616c726561647920656e646564000000000000000000006000830152602082019050919050565b60006139ba6022836141f0565b91507f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008301527f65720000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a206033836141f0565b91507f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008301527f6563656976657220696d706c656d656e746572000000000000000000000000006020830152604082019050919050565b6000613a86600d836141f0565b91507f696e76616c69642070726f6f66000000000000000000000000000000000000006000830152602082019050919050565b6000613ac66021836141f0565b91507f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b2c6028836141f0565b91507f455243373231413a207175616e74697479206d7573742062652067726561746560008301527f72207468616e20300000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b92602e836141f0565b91507f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008301527f6f776e657220627920696e6465780000000000000000000000000000000000006020830152604082019050919050565b6000613bf8602f836141f0565b91507f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008301527f206f776e6572206f6620746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613c5e602d836141f0565b91507f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008301527f78697374656e7420746f6b656e000000000000000000000000000000000000006020830152604082019050919050565b604082016000820151613ccd60008501826132bc565b506020820151613ce06020850182613cf5565b50505050565b613cef8161433b565b82525050565b613cfe81614345565b82525050565b6000613d1082846132da565b60148201915081905092915050565b6000613d2b82856133b2565b9150613d378284613381565b9150613d42826137a1565b91508190509392505050565b6000602082019050613d6360008301846132cb565b92915050565b6000608082019050613d7e60008301876132cb565b613d8b60208301866132cb565b613d986040830185613ce6565b8181036060830152613daa818461330f565b905095945050505050565b6000602082019050613dca60008301846132f1565b92915050565b6000602082019050613de56000830184613300565b92915050565b60006020820190508181036000830152613e058184613348565b905092915050565b60006020820190508181036000830152613e2681613431565b9050919050565b60006020820190508181036000830152613e4681613497565b9050919050565b60006020820190508181036000830152613e66816134fd565b9050919050565b60006020820190508181036000830152613e8681613563565b9050919050565b60006020820190508181036000830152613ea6816135c9565b9050919050565b60006020820190508181036000830152613ec68161362f565b9050919050565b60006020820190508181036000830152613ee68161366f565b9050919050565b60006020820190508181036000830152613f06816136d5565b9050919050565b60006020820190508181036000830152613f268161373b565b9050919050565b60006020820190508181036000830152613f46816137e1565b9050919050565b60006020820190508181036000830152613f6681613821565b9050919050565b60006020820190508181036000830152613f8681613887565b9050919050565b60006020820190508181036000830152613fa6816138c7565b9050919050565b60006020820190508181036000830152613fc68161392d565b9050919050565b60006020820190508181036000830152613fe68161396d565b9050919050565b60006020820190508181036000830152614006816139ad565b9050919050565b6000602082019050818103600083015261402681613a13565b9050919050565b6000602082019050818103600083015261404681613a79565b9050919050565b6000602082019050818103600083015261406681613ab9565b9050919050565b6000602082019050818103600083015261408681613b1f565b9050919050565b600060208201905081810360008301526140a681613b85565b9050919050565b600060208201905081810360008301526140c681613beb565b9050919050565b600060208201905081810360008301526140e681613c51565b9050919050565b60006040820190506141026000830184613cb7565b92915050565b600060208201905061411d6000830184613ce6565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561414a576141496144f8565b5b8060405250919050565b600067ffffffffffffffff82111561416f5761416e6144f8565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561419f5761419e6144f8565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006142178261433b565b91506142228361433b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142575761425661446b565b5b828201905092915050565b600061426d8261433b565b91506142788361433b565b9250826142885761428761449a565b5b828204905092915050565b600061429e8261433b565b91506142a98361433b565b9250828210156142bc576142bb61446b565b5b828203905092915050565b60006142d28261431b565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561438657808201518184015260208101905061436b565b83811115614395576000848401525b50505050565b600060028204905060018216806143b357607f821691505b602082108114156143c7576143c66144c9565b5b50919050565b60006143d88261433b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561440b5761440a61446b565b5b600182019050919050565b600061442182614428565b9050919050565b600061443382614538565b9050919050565b60006144458261433b565b91506144508361433b565b9250826144605761445f61449a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b61454e816142c7565b811461455957600080fd5b50565b614565816142d9565b811461457057600080fd5b50565b61457c816142e5565b811461458757600080fd5b50565b614593816142ef565b811461459e57600080fd5b50565b6145aa8161433b565b81146145b557600080fd5b5056fea2646970667358221220785610a558b6344037620d822149ee2a5bd2797c32dcb78eca9b7922de5f44e364736f6c63430008000033

Deployed Bytecode

0x6080604052600436106102045760003560e01c80637f7bbb7011610118578063b5077f44116100a0578063d1417cd71161006f578063d1417cd71461077b578063d62fd296146107b8578063e985e9c5146107d4578063f2fde38b14610811578063f7b188a51461083a57610204565b8063b5077f44146106bf578063b88d4fde146106ea578063c87b56dd14610713578063cd85cdb51461075057610204565b806395d89b41116100e757806395d89b41146105da5780639635635514610605578063976c2a5014610630578063a22cb4651461066d578063ad236d4c1461069657610204565b80637f7bbb70146105305780638456cb591461055b5780638da5cb5b146105725780639231ab2a1461059d57610204565b80632f745c591161019b57806355f804b31161016a57806355f804b31461044d5780636352211e1461047657806370a08231146104b3578063715018a6146104f05780637cb647591461050757610204565b80632f745c59146103815780633461fc79146103be57806342842e0e146103e75780634f6ccce71461041057610204565b806313c21cd0116101d757806313c21cd0146102d757806318160ddd1461030257806323b872dd1461032d5780632eb4a7ab1461035657610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b919061317f565b610851565b60405161023d9190613db5565b60405180910390f35b34801561025257600080fd5b5061025b61099b565b6040516102689190613deb565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613212565b610a2d565b6040516102a59190613d4e565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d0919061311a565b610ab2565b005b3480156102e357600080fd5b506102ec610bcb565b6040516102f99190613d4e565b60405180910390f35b34801561030e57600080fd5b50610317610bf1565b6040516103249190614108565b60405180910390f35b34801561033957600080fd5b50610354600480360381019061034f9190613014565b610bfb565b005b34801561036257600080fd5b5061036b610c0b565b6040516103789190613dd0565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a3919061311a565b610c11565b6040516103b59190614108565b60405180910390f35b3480156103ca57600080fd5b506103e560048036038101906103e09190612faf565b610e03565b005b3480156103f357600080fd5b5061040e60048036038101906104099190613014565b610ec3565b005b34801561041c57600080fd5b5061043760048036038101906104329190613212565b610ee3565b6040516104449190614108565b60405180910390f35b34801561045957600080fd5b50610474600480360381019061046f91906131d1565b610f36565b005b34801561048257600080fd5b5061049d60048036038101906104989190613212565b610fcc565b6040516104aa9190613d4e565b60405180910390f35b3480156104bf57600080fd5b506104da60048036038101906104d59190612faf565b610fe2565b6040516104e79190614108565b60405180910390f35b3480156104fc57600080fd5b506105056110cb565b005b34801561051357600080fd5b5061052e60048036038101906105299190613156565b611153565b005b34801561053c57600080fd5b506105456111d9565b6040516105529190614108565b60405180910390f35b34801561056757600080fd5b506105706111df565b005b34801561057e57600080fd5b50610587611278565b6040516105949190613d4e565b60405180910390f35b3480156105a957600080fd5b506105c460048036038101906105bf9190613212565b6112a1565b6040516105d191906140ed565b60405180910390f35b3480156105e657600080fd5b506105ef6112b9565b6040516105fc9190613deb565b60405180910390f35b34801561061157600080fd5b5061061a61134b565b6040516106279190614108565b60405180910390f35b34801561063c57600080fd5b5061065760048036038101906106529190612faf565b61135a565b6040516106649190614108565b60405180910390f35b34801561067957600080fd5b50610694600480360381019061068f91906130de565b61140e565b005b3480156106a257600080fd5b506106bd60048036038101906106b89190613212565b61158f565b005b3480156106cb57600080fd5b506106d46116b3565b6040516106e19190614108565b60405180910390f35b3480156106f657600080fd5b50610711600480360381019061070c9190613063565b6116b9565b005b34801561071f57600080fd5b5061073a60048036038101906107359190613212565b611715565b6040516107479190613deb565b60405180910390f35b34801561075c57600080fd5b506107656117bd565b6040516107729190613db5565b60405180910390f35b34801561078757600080fd5b506107a2600480360381019061079d9190612faf565b6117d0565b6040516107af9190614108565b60405180910390f35b6107d260048036038101906107cd9190613264565b611862565b005b3480156107e057600080fd5b506107fb60048036038101906107f69190612fd8565b611a49565b6040516108089190613db5565b60405180910390f35b34801561081d57600080fd5b5061083860048036038101906108339190612faf565b611add565b005b34801561084657600080fd5b5061084f611bd5565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061091c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061098457507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610994575061099382611c6e565b5b9050919050565b6060600280546109aa9061439b565b80601f01602080910402602001604051908101604052809291908181526020018280546109d69061439b565b8015610a235780601f106109f857610100808354040283529160200191610a23565b820191906000526020600020905b815481529060010190602001808311610a0657829003601f168201915b5050505050905090565b6000610a3882611cd8565b610a77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6e906140cd565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610abd82610fcc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2590613fed565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b4d611ce6565b73ffffffffffffffffffffffffffffffffffffffff161480610b7c5750610b7b81610b76611ce6565b611a49565b5b610bbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb290613ecd565b60405180910390fd5b610bc6838383611cee565b505050565b600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600154905090565b610c06838383611da0565b505050565b60095481565b6000610c1c83610fe2565b8210610c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5490613e0d565b60405180910390fd5b6000610c67610bf1565b905060008060005b83811015610dc1576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610d6157806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610db35786841415610daa578195505050505050610dfd565b83806001019450505b508080600101915050610c6f565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df49061408d565b60405180910390fd5b92915050565b610e0b611ce6565b73ffffffffffffffffffffffffffffffffffffffff16610e29611278565b73ffffffffffffffffffffffffffffffffffffffff1614610e7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7690613f2d565b60405180910390fd5b80600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610ede838383604051806020016040528060008152506116b9565b505050565b6000610eed610bf1565b8210610f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2590613e6d565b60405180910390fd5b819050919050565b610f3e611ce6565b73ffffffffffffffffffffffffffffffffffffffff16610f5c611278565b73ffffffffffffffffffffffffffffffffffffffff1614610fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa990613f2d565b60405180910390fd5b80600a9080519060200190610fc8929190612d25565b5050565b6000610fd7826122e0565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104a90613eed565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6110d3611ce6565b73ffffffffffffffffffffffffffffffffffffffff166110f1611278565b73ffffffffffffffffffffffffffffffffffffffff1614611147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113e90613f2d565b60405180910390fd5b611151600061247a565b565b61115b611ce6565b73ffffffffffffffffffffffffffffffffffffffff16611179611278565b73ffffffffffffffffffffffffffffffffffffffff16146111cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c690613f2d565b60405180910390fd5b8060098190555050565b600c5481565b6111e7611ce6565b73ffffffffffffffffffffffffffffffffffffffff16611205611278565b73ffffffffffffffffffffffffffffffffffffffff161461125b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125290613f2d565b60405180910390fd5b6001600b60006101000a81548160ff021916908315150217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112a9612dab565b6112b2826122e0565b9050919050565b6060600380546112c89061439b565b80601f01602080910402602001604051908101604052809291908181526020018280546112f49061439b565b80156113415780601f1061131657610100808354040283529160200191611341565b820191906000526020600020905b81548152906001019060200180831161132457829003601f168201915b5050505050905090565b6000611355610bf1565b905090565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b81526004016113b79190613d4e565b60206040518083038186803b1580156113cf57600080fd5b505afa1580156113e3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611407919061323b565b9050919050565b611416611ce6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147b90613f6d565b60405180910390fd5b8060076000611491611ce6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661153e611ce6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115839190613db5565b60405180910390a35050565b611597611ce6565b73ffffffffffffffffffffffffffffffffffffffff166115b5611278565b73ffffffffffffffffffffffffffffffffffffffff161461160b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160290613f2d565b60405180910390fd5b600b60009054906101000a900460ff161561165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290613ead565b60405180910390fd5b610309611666610bf1565b106116a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169d90613fcd565b60405180910390fd5b6116b0338261253e565b50565b61030981565b6116c4848484611da0565b6116d08484848461255c565b61170f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117069061400d565b60405180910390fd5b50505050565b606061172082611cd8565b61175f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175690613f4d565b60405180910390fd5b6000600a805461176e9061439b565b90501161178a57604051806020016040528060008152506117b6565b600a611795836126f3565b6040516020016117a6929190613d1f565b6040516020818303038152906040525b9050919050565b600b60009054906101000a900460ff1681565b60003073ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b815260040161180b9190613d4e565b60206040518083038186803b15801561182357600080fd5b505afa158015611837573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185b919061323b565b9050919050565b6000336040516020016118759190613d04565b6040516020818303038152906040528051906020012090506118db838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600954836128a0565b61191a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119119061402d565b60405180910390fd5b60006119253361135a565b9050611930336117d0565b600c81905550600085118015611953575080600c5486611950919061420c565b11155b611992576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198990613fad565b60405180910390fd5b600b60009054906101000a900460ff16156119e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d990613ead565b60405180910390fd5b610309856119ee610bf1565b6119f8919061420c565b10611a38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2f90613fcd565b60405180910390fd5b611a42338661253e565b5050505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ae5611ce6565b73ffffffffffffffffffffffffffffffffffffffff16611b03611278565b73ffffffffffffffffffffffffffffffffffffffff1614611b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5090613f2d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc090613e2d565b60405180910390fd5b611bd28161247a565b50565b611bdd611ce6565b73ffffffffffffffffffffffffffffffffffffffff16611bfb611278565b73ffffffffffffffffffffffffffffffffffffffff1614611c51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4890613f2d565b60405180910390fd5b6000600b60006101000a81548160ff021916908315150217905550565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611dab826122e0565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611dd2611ce6565b73ffffffffffffffffffffffffffffffffffffffff161480611e2e5750611df7611ce6565b73ffffffffffffffffffffffffffffffffffffffff16611e1684610a2d565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e4a5750611e498260000151611e44611ce6565b611a49565b5b905080611e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8390613f8d565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611efe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef590613f0d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6590613e8d565b60405180910390fd5b611f7b85858560016128b7565b611f8b6000848460000151611cee565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612270576121cf81611cd8565b1561226f5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122d985858560016128bd565b5050505050565b6122e8612dab565b6122f182611cd8565b612330576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232790613e4d565b60405180910390fd5b60008290505b60008110612439576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461242a578092505050612475565b50808060019003915050612336565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246c906140ad565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6125588282604051806020016040528060008152506128c3565b5050565b600061257d8473ffffffffffffffffffffffffffffffffffffffff166128d5565b156126e6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125a6611ce6565b8786866040518563ffffffff1660e01b81526004016125c89493929190613d69565b602060405180830381600087803b1580156125e257600080fd5b505af192505050801561261357506040513d601f19601f8201168201806040525081019061261091906131a8565b60015b612696573d8060008114612643576040519150601f19603f3d011682016040523d82523d6000602084013e612648565b606091505b5060008151141561268e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126859061400d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506126eb565b600190505b949350505050565b6060600082141561273b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061289b565b600082905060005b6000821461276d578080612756906143cd565b915050600a826127669190614262565b9150612743565b60008167ffffffffffffffff8111156127af577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156127e15781602001600182028036833780820191505090505b5090505b60008514612894576001826127fa9190614293565b9150600a85612809919061443a565b6030612815919061420c565b60f81b818381518110612851577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561288d9190614262565b94506127e5565b8093505050505b919050565b6000826128ad85846128e8565b1490509392505050565b50505050565b50505050565b6128d08383836001612964565b505050565b600080823b905060008111915050919050565b60008082905060005b84518110156129595761294482868381518110612937577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612ce3565b91508080612951906143cd565b9150506128f1565b508091505092915050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156129db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d29061404d565b60405180910390fd5b6000841415612a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a169061406d565b60405180910390fd5b612a2c60008683876128b7565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015612cc657818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315612cb157612c71600088848861255c565b612cb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca79061400d565b60405180910390fd5b5b81806001019250508080600101915050612bfa565b508060018190555050612cdc60008683876128bd565b5050505050565b6000818310612cfb57612cf68284612d0e565b612d06565b612d058383612d0e565b5b905092915050565b600082600052816020526040600020905092915050565b828054612d319061439b565b90600052602060002090601f016020900481019282612d535760008555612d9a565b82601f10612d6c57805160ff1916838001178555612d9a565b82800160010185558215612d9a579182015b82811115612d99578251825591602001919060010190612d7e565b5b509050612da79190612de5565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612dfe576000816000905550600101612de6565b5090565b6000612e15612e1084614154565b614123565b905082815260208101848484011115612e2d57600080fd5b612e38848285614359565b509392505050565b6000612e53612e4e84614184565b614123565b905082815260208101848484011115612e6b57600080fd5b612e76848285614359565b509392505050565b600081359050612e8d81614545565b92915050565b60008083601f840112612ea557600080fd5b8235905067ffffffffffffffff811115612ebe57600080fd5b602083019150836020820283011115612ed657600080fd5b9250929050565b600081359050612eec8161455c565b92915050565b600081359050612f0181614573565b92915050565b600081359050612f168161458a565b92915050565b600081519050612f2b8161458a565b92915050565b600082601f830112612f4257600080fd5b8135612f52848260208601612e02565b91505092915050565b600082601f830112612f6c57600080fd5b8135612f7c848260208601612e40565b91505092915050565b600081359050612f94816145a1565b92915050565b600081519050612fa9816145a1565b92915050565b600060208284031215612fc157600080fd5b6000612fcf84828501612e7e565b91505092915050565b60008060408385031215612feb57600080fd5b6000612ff985828601612e7e565b925050602061300a85828601612e7e565b9150509250929050565b60008060006060848603121561302957600080fd5b600061303786828701612e7e565b935050602061304886828701612e7e565b925050604061305986828701612f85565b9150509250925092565b6000806000806080858703121561307957600080fd5b600061308787828801612e7e565b945050602061309887828801612e7e565b93505060406130a987828801612f85565b925050606085013567ffffffffffffffff8111156130c657600080fd5b6130d287828801612f31565b91505092959194509250565b600080604083850312156130f157600080fd5b60006130ff85828601612e7e565b925050602061311085828601612edd565b9150509250929050565b6000806040838503121561312d57600080fd5b600061313b85828601612e7e565b925050602061314c85828601612f85565b9150509250929050565b60006020828403121561316857600080fd5b600061317684828501612ef2565b91505092915050565b60006020828403121561319157600080fd5b600061319f84828501612f07565b91505092915050565b6000602082840312156131ba57600080fd5b60006131c884828501612f1c565b91505092915050565b6000602082840312156131e357600080fd5b600082013567ffffffffffffffff8111156131fd57600080fd5b61320984828501612f5b565b91505092915050565b60006020828403121561322457600080fd5b600061323284828501612f85565b91505092915050565b60006020828403121561324d57600080fd5b600061325b84828501612f9a565b91505092915050565b60008060006040848603121561327957600080fd5b600061328786828701612f85565b935050602084013567ffffffffffffffff8111156132a457600080fd5b6132b086828701612e93565b92509250509250925092565b6132c5816142c7565b82525050565b6132d4816142c7565b82525050565b6132eb6132e6826142c7565b614416565b82525050565b6132fa816142d9565b82525050565b613309816142e5565b82525050565b600061331a826141c9565b61332481856141df565b9350613334818560208601614368565b61333d81614527565b840191505092915050565b6000613353826141d4565b61335d81856141f0565b935061336d818560208601614368565b61337681614527565b840191505092915050565b600061338c826141d4565b6133968185614201565b93506133a6818560208601614368565b80840191505092915050565b600081546133bf8161439b565b6133c98186614201565b945060018216600081146133e457600181146133f557613428565b60ff19831686528186019350613428565b6133fe856141b4565b60005b8381101561342057815481890152600182019150602081019050613401565b838801955050505b50505092915050565b600061343e6022836141f0565b91507f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006134a46026836141f0565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061350a602a836141f0565b91507f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008301527f74656e7420746f6b656e000000000000000000000000000000000000000000006020830152604082019050919050565b60006135706023836141f0565b91507f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008301527f6e647300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006135d66025836141f0565b91507f455243373231413a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061363c6007836141f0565b91507f50617573656421000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061367c6039836141f0565b91507f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006020830152604082019050919050565b60006136e2602b836141f0565b91507f455243373231413a2062616c616e636520717565727920666f7220746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b60006137486026836141f0565b91507f455243373231413a207472616e736665722066726f6d20696e636f727265637460008301527f206f776e657200000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006137ae600583614201565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b60006137ee6020836141f0565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061382e602f836141f0565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613894601a836141f0565b91507f455243373231413a20617070726f766520746f2063616c6c65720000000000006000830152602082019050919050565b60006138d46032836141f0565b91507f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008301527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006020830152604082019050919050565b600061393a6018836141f0565b91507f596f752063616e206e6f74206d696e7420616e796d6f726500000000000000006000830152602082019050919050565b600061397a6016836141f0565b91507f53616c652068617320616c726561647920656e646564000000000000000000006000830152602082019050919050565b60006139ba6022836141f0565b91507f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008301527f65720000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a206033836141f0565b91507f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008301527f6563656976657220696d706c656d656e746572000000000000000000000000006020830152604082019050919050565b6000613a86600d836141f0565b91507f696e76616c69642070726f6f66000000000000000000000000000000000000006000830152602082019050919050565b6000613ac66021836141f0565b91507f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b2c6028836141f0565b91507f455243373231413a207175616e74697479206d7573742062652067726561746560008301527f72207468616e20300000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b92602e836141f0565b91507f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008301527f6f776e657220627920696e6465780000000000000000000000000000000000006020830152604082019050919050565b6000613bf8602f836141f0565b91507f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008301527f206f776e6572206f6620746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613c5e602d836141f0565b91507f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008301527f78697374656e7420746f6b656e000000000000000000000000000000000000006020830152604082019050919050565b604082016000820151613ccd60008501826132bc565b506020820151613ce06020850182613cf5565b50505050565b613cef8161433b565b82525050565b613cfe81614345565b82525050565b6000613d1082846132da565b60148201915081905092915050565b6000613d2b82856133b2565b9150613d378284613381565b9150613d42826137a1565b91508190509392505050565b6000602082019050613d6360008301846132cb565b92915050565b6000608082019050613d7e60008301876132cb565b613d8b60208301866132cb565b613d986040830185613ce6565b8181036060830152613daa818461330f565b905095945050505050565b6000602082019050613dca60008301846132f1565b92915050565b6000602082019050613de56000830184613300565b92915050565b60006020820190508181036000830152613e058184613348565b905092915050565b60006020820190508181036000830152613e2681613431565b9050919050565b60006020820190508181036000830152613e4681613497565b9050919050565b60006020820190508181036000830152613e66816134fd565b9050919050565b60006020820190508181036000830152613e8681613563565b9050919050565b60006020820190508181036000830152613ea6816135c9565b9050919050565b60006020820190508181036000830152613ec68161362f565b9050919050565b60006020820190508181036000830152613ee68161366f565b9050919050565b60006020820190508181036000830152613f06816136d5565b9050919050565b60006020820190508181036000830152613f268161373b565b9050919050565b60006020820190508181036000830152613f46816137e1565b9050919050565b60006020820190508181036000830152613f6681613821565b9050919050565b60006020820190508181036000830152613f8681613887565b9050919050565b60006020820190508181036000830152613fa6816138c7565b9050919050565b60006020820190508181036000830152613fc68161392d565b9050919050565b60006020820190508181036000830152613fe68161396d565b9050919050565b60006020820190508181036000830152614006816139ad565b9050919050565b6000602082019050818103600083015261402681613a13565b9050919050565b6000602082019050818103600083015261404681613a79565b9050919050565b6000602082019050818103600083015261406681613ab9565b9050919050565b6000602082019050818103600083015261408681613b1f565b9050919050565b600060208201905081810360008301526140a681613b85565b9050919050565b600060208201905081810360008301526140c681613beb565b9050919050565b600060208201905081810360008301526140e681613c51565b9050919050565b60006040820190506141026000830184613cb7565b92915050565b600060208201905061411d6000830184613ce6565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561414a576141496144f8565b5b8060405250919050565b600067ffffffffffffffff82111561416f5761416e6144f8565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561419f5761419e6144f8565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006142178261433b565b91506142228361433b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142575761425661446b565b5b828201905092915050565b600061426d8261433b565b91506142788361433b565b9250826142885761428761449a565b5b828204905092915050565b600061429e8261433b565b91506142a98361433b565b9250828210156142bc576142bb61446b565b5b828203905092915050565b60006142d28261431b565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561438657808201518184015260208101905061436b565b83811115614395576000848401525b50505050565b600060028204905060018216806143b357607f821691505b602082108114156143c7576143c66144c9565b5b50919050565b60006143d88261433b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561440b5761440a61446b565b5b600182019050919050565b600061442182614428565b9050919050565b600061443382614538565b9050919050565b60006144458261433b565b91506144508361433b565b9250826144605761445f61449a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b61454e816142c7565b811461455957600080fd5b50565b614565816142d9565b811461457057600080fd5b50565b61457c816142e5565b811461458757600080fd5b50565b614593816142ef565b811461459e57600080fd5b50565b6145aa8161433b565b81146145b557600080fd5b5056fea2646970667358221220785610a558b6344037620d822149ee2a5bd2797c32dcb78eca9b7922de5f44e364736f6c63430008000033

Deployed Bytecode Sourcemap

53124:3033:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37069:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38955:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40517:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40038:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53462:74;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35326:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41393:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53226:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35990:1007;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56041:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41626:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35503:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55490:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38764:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37505:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28357:94;;;;;;;;;;;;;:::i;:::-;;54199:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53543:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55709:69;;;;;;;;;;;;;:::i;:::-;;27706:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55866:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39124:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55609:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53899:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40803:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53666:225;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53411:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41874:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55051:306;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53374:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54047:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54312:731;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41162:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28606:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55786:72;;;;;;;;;;;;;:::i;:::-;;37069:372;37171:4;37223:25;37208:40;;;:11;:40;;;;:105;;;;37280:33;37265:48;;;:11;:48;;;;37208:105;:172;;;;37345:35;37330:50;;;:11;:50;;;;37208:172;:225;;;;37397:36;37421:11;37397:23;:36::i;:::-;37208:225;37188:245;;37069:372;;;:::o;38955:100::-;39009:13;39042:5;39035:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38955:100;:::o;40517:214::-;40585:7;40613:16;40621:7;40613;:16::i;:::-;40605:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;40699:15;:24;40715:7;40699:24;;;;;;;;;;;;;;;;;;;;;40692:31;;40517:214;;;:::o;40038:413::-;40111:13;40127:24;40143:7;40127:15;:24::i;:::-;40111:40;;40176:5;40170:11;;:2;:11;;;;40162:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;40271:5;40255:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;40280:37;40297:5;40304:12;:10;:12::i;:::-;40280:16;:37::i;:::-;40255:62;40233:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;40415:28;40424:2;40428:7;40437:5;40415:8;:28::i;:::-;40038:413;;;:::o;53462:74::-;;;;;;;;;;;;;:::o;35326:100::-;35379:7;35406:12;;35399:19;;35326:100;:::o;41393:162::-;41519:28;41529:4;41535:2;41539:7;41519:9;:28::i;:::-;41393:162;;;:::o;53226:94::-;;;;:::o;35990:1007::-;36079:7;36115:16;36125:5;36115:9;:16::i;:::-;36107:5;:24;36099:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;36181:22;36206:13;:11;:13::i;:::-;36181:38;;36230:19;36260:25;36449:9;36444:466;36464:14;36460:1;:18;36444:466;;;36504:31;36538:11;:14;36550:1;36538:14;;;;;;;;;;;36504:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36601:1;36575:28;;:9;:14;;;:28;;;36571:111;;36648:9;:14;;;36628:34;;36571:111;36725:5;36704:26;;:17;:26;;;36700:195;;;36774:5;36759:11;:20;36755:85;;;36815:1;36808:8;;;;;;;;;36755:85;36862:13;;;;;;;36700:195;36444:466;36480:3;;;;;;;36444:466;;;;36933:56;;;;;;;;;;:::i;:::-;;;;;;;;35990:1007;;;;;:::o;56041:113::-;27937:12;:10;:12::i;:::-;27926:23;;:7;:5;:7::i;:::-;:23;;;27918:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56137:9:::1;56120:14;;:26;;;;;;;;;;;;;;;;;;56041:113:::0;:::o;41626:177::-;41756:39;41773:4;41779:2;41783:7;41756:39;;;;;;;;;;;;:16;:39::i;:::-;41626:177;;;:::o;35503:187::-;35570:7;35606:13;:11;:13::i;:::-;35598:5;:21;35590:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;35677:5;35670:12;;35503:187;;;:::o;55490:111::-;27937:12;:10;:12::i;:::-;27926:23;;:7;:5;:7::i;:::-;:23;;;27918:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55585:8:::1;55566:16;:27;;;;;;;;;;;;:::i;:::-;;55490:111:::0;:::o;38764:124::-;38828:7;38855:20;38867:7;38855:11;:20::i;:::-;:25;;;38848:32;;38764:124;;;:::o;37505:221::-;37569:7;37614:1;37597:19;;:5;:19;;;;37589:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;37690:12;:19;37703:5;37690:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;37682:36;;37675:43;;37505:221;;;:::o;28357:94::-;27937:12;:10;:12::i;:::-;27926:23;;:7;:5;:7::i;:::-;:23;;;27918:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28422:21:::1;28440:1;28422:9;:21::i;:::-;28357:94::o:0;54199:105::-;27937:12;:10;:12::i;:::-;27926:23;;:7;:5;:7::i;:::-;:23;;;27918:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54285:11:::1;54272:10;:24;;;;54199:105:::0;:::o;53543:46::-;;;;:::o;55709:69::-;27937:12;:10;:12::i;:::-;27926:23;;:7;:5;:7::i;:::-;:23;;;27918:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55766:4:::1;55754:9;;:16;;;;;;;;;;;;;;;;;;55709:69::o:0;27706:87::-;27752:7;27779:6;;;;;;;;;;;27772:13;;27706:87;:::o;55866:167::-;55959:21;;:::i;:::-;56005:20;56017:7;56005:11;:20::i;:::-;55998:27;;55866:167;;;:::o;39124:104::-;39180:13;39213:7;39206:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39124:104;:::o;55609:92::-;55653:7;55680:13;:11;:13::i;:::-;55673:20;;55609:92;:::o;53899:140::-;53962:7;53997:14;;;;;;;;;;;53989:33;;;54023:7;53989:42;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53982:49;;53899:140;;;:::o;40803:288::-;40910:12;:10;:12::i;:::-;40898:24;;:8;:24;;;;40890:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;41011:8;40966:18;:32;40985:12;:10;:12::i;:::-;40966:32;;;;;;;;;;;;;;;:42;40999:8;40966:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;41064:8;41035:48;;41050:12;:10;:12::i;:::-;41035:48;;;41074:8;41035:48;;;;;;:::i;:::-;;;;;;;;40803:288;;:::o;53666:225::-;27937:12;:10;:12::i;:::-;27926:23;;:7;:5;:7::i;:::-;:23;;;27918:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53744:9:::1;;;;;;;;;;;53743:10;53735:30;;;;;;;;;;;;:::i;:::-;;;;;;;;;53452:3;53784:13;:11;:13::i;:::-;:30;53776:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;53854:29;53864:10;53876:6;53854:9;:29::i;:::-;53666:225:::0;:::o;53411:44::-;53452:3;53411:44;:::o;41874:355::-;42033:28;42043:4;42049:2;42053:7;42033:9;:28::i;:::-;42094:48;42117:4;42123:2;42127:7;42136:5;42094:22;:48::i;:::-;42072:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;41874:355;;;;:::o;55051:306::-;55116:13;55150:16;55158:7;55150;:16::i;:::-;55142:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;55269:1;55242:16;55236:30;;;;;:::i;:::-;;;:34;:113;;;;;;;;;;;;;;;;;55297:16;55315:18;:7;:16;:18::i;:::-;55280:63;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55236:113;55229:120;;55051:306;;;:::o;53374:28::-;;;;;;;;;;;;;:::o;54047:144::-;54115:7;54158:4;54142:32;;;54175:7;54142:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54135:48;;54047:144;;;:::o;54312:731::-;54406:12;54448:10;54431:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;54421:39;;;;;;54406:54;;54479:49;54498:11;;54479:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54511:10;;54523:4;54479:18;:49::i;:::-;54471:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;54557:21;54581:26;54596:10;54581:14;:26::i;:::-;54557:50;;54648:31;54668:10;54648:19;:31::i;:::-;54618:27;:61;;;;54771:1;54759:9;:13;:73;;;;;54819:13;54788:27;;54776:9;:39;;;;:::i;:::-;:56;;54759:73;54751:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;54881:9;;;;;;;;;;;54880:10;54872:30;;;;;;;;;;;;:::i;:::-;;;;;;;;;53452:3;54937:9;54921:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:42;54913:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;55003:32;55013:10;55025:9;55003;:32::i;:::-;54312:731;;;;;:::o;41162:164::-;41259:4;41283:18;:25;41302:5;41283:25;;;;;;;;;;;;;;;:35;41309:8;41283:35;;;;;;;;;;;;;;;;;;;;;;;;;41276:42;;41162:164;;;;:::o;28606:192::-;27937:12;:10;:12::i;:::-;27926:23;;:7;:5;:7::i;:::-;:23;;;27918:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28715:1:::1;28695:22;;:8;:22;;;;28687:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28771:19;28781:8;28771:9;:19::i;:::-;28606:192:::0;:::o;55786:72::-;27937:12;:10;:12::i;:::-;27926:23;;:7;:5;:7::i;:::-;:23;;;27918:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55845:5:::1;55833:9;;:17;;;;;;;;;;;;;;;;;;55786:72::o:0;26605:157::-;26690:4;26729:25;26714:40;;;:11;:40;;;;26707:47;;26605:157;;;:::o;42484:111::-;42541:4;42575:12;;42565:7;:22;42558:29;;42484:111;;;:::o;9969:98::-;10022:7;10049:10;10042:17;;9969:98;:::o;47404:196::-;47546:2;47519:15;:24;47535:7;47519:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;47584:7;47580:2;47564:28;;47573:5;47564:28;;;;;;;;;;;;47404:196;;;:::o;45284:2002::-;45399:35;45437:20;45449:7;45437:11;:20::i;:::-;45399:58;;45470:22;45512:13;:18;;;45496:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;45571:12;:10;:12::i;:::-;45547:36;;:20;45559:7;45547:11;:20::i;:::-;:36;;;45496:87;:154;;;;45600:50;45617:13;:18;;;45637:12;:10;:12::i;:::-;45600:16;:50::i;:::-;45496:154;45470:181;;45672:17;45664:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;45787:4;45765:26;;:13;:18;;;:26;;;45757:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;45867:1;45853:16;;:2;:16;;;;45845:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;45924:43;45946:4;45952:2;45956:7;45965:1;45924:21;:43::i;:::-;46032:49;46049:1;46053:7;46062:13;:18;;;46032:8;:49::i;:::-;46407:1;46377:12;:18;46390:4;46377:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46451:1;46423:12;:16;46436:2;46423:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46497:2;46469:11;:20;46481:7;46469:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;46559:15;46514:11;:20;46526:7;46514:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;46827:19;46859:1;46849:7;:11;46827:33;;46920:1;46879:43;;:11;:24;46891:11;46879:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;46875:295;;;46947:20;46955:11;46947:7;:20::i;:::-;46943:212;;;47024:13;:18;;;46992:11;:24;47004:11;46992:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;47107:13;:28;;;47065:11;:24;47077:11;47065:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;46943:212;46875:295;45284:2002;47217:7;47213:2;47198:27;;47207:4;47198:27;;;;;;;;;;;;47236:42;47257:4;47263:2;47267:7;47276:1;47236:20;:42::i;:::-;45284:2002;;;;;:::o;38165:537::-;38226:21;;:::i;:::-;38268:16;38276:7;38268;:16::i;:::-;38260:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;38374:12;38389:7;38374:22;;38369:245;38406:1;38398:4;:9;38369:245;;38436:31;38470:11;:17;38482:4;38470:17;;;;;;;;;;;38436:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38536:1;38510:28;;:9;:14;;;:28;;;38506:93;;38570:9;38563:16;;;;;;38506:93;38369:245;38409:6;;;;;;;;38369:245;;;;38637:57;;;;;;;;;;:::i;:::-;;;;;;;;38165:537;;;;:::o;28806:173::-;28862:16;28881:6;;;;;;;;;;;28862:25;;28907:8;28898:6;;:17;;;;;;;;;;;;;;;;;;28962:8;28931:40;;28952:8;28931:40;;;;;;;;;;;;28806:173;;:::o;42603:104::-;42672:27;42682:2;42686:8;42672:27;;;;;;;;;;;;:9;:27::i;:::-;42603:104;;:::o;48165:804::-;48320:4;48341:15;:2;:13;;;:15::i;:::-;48337:625;;;48393:2;48377:36;;;48414:12;:10;:12::i;:::-;48428:4;48434:7;48443:5;48377:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;48373:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48640:1;48623:6;:13;:18;48619:273;;;48666:61;;;;;;;;;;:::i;:::-;;;;;;;;48619:273;48842:6;48836:13;48827:6;48823:2;48819:15;48812:38;48373:534;48510:45;;;48500:55;;;:6;:55;;;;48493:62;;;;;48337:625;48946:4;48939:11;;48165:804;;;;;;;:::o;31862:723::-;31918:13;32148:1;32139:5;:10;32135:53;;;32166:10;;;;;;;;;;;;;;;;;;;;;32135:53;32198:12;32213:5;32198:20;;32229:14;32254:78;32269:1;32261:4;:9;32254:78;;32287:8;;;;;:::i;:::-;;;;32318:2;32310:10;;;;;:::i;:::-;;;32254:78;;;32342:19;32374:6;32364:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32342:39;;32392:154;32408:1;32399:5;:10;32392:154;;32436:1;32426:11;;;;;:::i;:::-;;;32503:2;32495:5;:10;;;;:::i;:::-;32482:2;:24;;;;:::i;:::-;32469:39;;32452:6;32459;32452:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;32532:2;32523:11;;;;;:::i;:::-;;;32392:154;;;32570:6;32556:21;;;;;31862:723;;;;:::o;1091:190::-;1216:4;1269;1240:25;1253:5;1260:4;1240:12;:25::i;:::-;:33;1233:40;;1091:190;;;;;:::o;49464:159::-;;;;;:::o;50035:158::-;;;;;:::o;43070:163::-;43193:32;43199:2;43203:8;43213:5;43220:4;43193:5;:32::i;:::-;43070:163;;;:::o;18766:387::-;18826:4;19034:12;19101:7;19089:20;19081:28;;19144:1;19137:4;:8;19130:15;;;18766:387;;;:::o;1958:296::-;2041:7;2061:20;2084:4;2061:27;;2104:9;2099:118;2123:5;:12;2119:1;:16;2099:118;;;2172:33;2182:12;2196:5;2202:1;2196:8;;;;;;;;;;;;;;;;;;;;;;2172:9;:33::i;:::-;2157:48;;2137:3;;;;;:::i;:::-;;;;2099:118;;;;2234:12;2227:19;;;1958:296;;;;:::o;43492:1538::-;43631:20;43654:12;;43631:35;;43699:1;43685:16;;:2;:16;;;;43677:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;43770:1;43758:8;:13;;43750:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;43829:61;43859:1;43863:2;43867:12;43881:8;43829:21;:61::i;:::-;44204:8;44168:12;:16;44181:2;44168:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44269:8;44228:12;:16;44241:2;44228:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44328:2;44295:11;:25;44307:12;44295:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;44395:15;44345:11;:25;44357:12;44345:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;44428:20;44451:12;44428:35;;44485:9;44480:415;44500:8;44496:1;:12;44480:415;;;44564:12;44560:2;44539:38;;44556:1;44539:38;;;;;;;;;;;;44600:4;44596:249;;;44663:59;44694:1;44698:2;44702:12;44716:5;44663:22;:59::i;:::-;44629:196;;;;;;;;;;;;:::i;:::-;;;;;;;;;44596:249;44865:14;;;;;;;44510:3;;;;;;;44480:415;;;;44926:12;44911;:27;;;;43492:1538;44962:60;44991:1;44995:2;44999:12;45013:8;44962:20;:60::i;:::-;43492:1538;;;;;:::o;8998:149::-;9061:7;9092:1;9088;:5;:51;;9119:20;9134:1;9137;9119:14;:20::i;:::-;9088:51;;;9096:20;9111:1;9114;9096:14;:20::i;:::-;9088:51;9081:58;;8998:149;;;;:::o;9155:268::-;9223:13;9330:1;9324:4;9317:15;9359:1;9353:4;9346:15;9400:4;9394;9384:21;9375:30;;9302:114;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;867:367::-;;;1000:3;993:4;985:6;981:17;977:27;967:2;;1018:1;1015;1008:12;967:2;1054:6;1041:20;1031:30;;1084:18;1076:6;1073:30;1070:2;;;1116:1;1113;1106:12;1070:2;1153:4;1145:6;1141:17;1129:29;;1207:3;1199:4;1191:6;1187:17;1177:8;1173:32;1170:41;1167:2;;;1224:1;1221;1214:12;1167:2;957:277;;;;;:::o;1240:133::-;;1321:6;1308:20;1299:29;;1337:30;1361:5;1337:30;:::i;:::-;1289:84;;;;:::o;1379:139::-;;1463:6;1450:20;1441:29;;1479:33;1506:5;1479:33;:::i;:::-;1431:87;;;;:::o;1524:137::-;;1607:6;1594:20;1585:29;;1623:32;1649:5;1623:32;:::i;:::-;1575:86;;;;:::o;1667:141::-;;1754:6;1748:13;1739:22;;1770:32;1796:5;1770:32;:::i;:::-;1729:79;;;;:::o;1827:271::-;;1931:3;1924:4;1916:6;1912:17;1908:27;1898:2;;1949:1;1946;1939:12;1898:2;1989:6;1976:20;2014:78;2088:3;2080:6;2073:4;2065:6;2061:17;2014:78;:::i;:::-;2005:87;;1888:210;;;;;:::o;2118:273::-;;2223:3;2216:4;2208:6;2204:17;2200:27;2190:2;;2241:1;2238;2231:12;2190:2;2281:6;2268:20;2306:79;2381:3;2373:6;2366:4;2358:6;2354:17;2306:79;:::i;:::-;2297:88;;2180:211;;;;;:::o;2397:139::-;;2481:6;2468:20;2459:29;;2497:33;2524:5;2497:33;:::i;:::-;2449:87;;;;:::o;2542:143::-;;2630:6;2624:13;2615:22;;2646:33;2673:5;2646:33;:::i;:::-;2605:80;;;;:::o;2691:262::-;;2799:2;2787:9;2778:7;2774:23;2770:32;2767:2;;;2815:1;2812;2805:12;2767:2;2858:1;2883:53;2928:7;2919:6;2908:9;2904:22;2883:53;:::i;:::-;2873:63;;2829:117;2757:196;;;;:::o;2959:407::-;;;3084:2;3072:9;3063:7;3059:23;3055:32;3052:2;;;3100:1;3097;3090:12;3052:2;3143:1;3168:53;3213:7;3204:6;3193:9;3189:22;3168:53;:::i;:::-;3158:63;;3114:117;3270:2;3296:53;3341:7;3332:6;3321:9;3317:22;3296:53;:::i;:::-;3286:63;;3241:118;3042:324;;;;;:::o;3372:552::-;;;;3514:2;3502:9;3493:7;3489:23;3485:32;3482:2;;;3530:1;3527;3520:12;3482:2;3573:1;3598:53;3643:7;3634:6;3623:9;3619:22;3598:53;:::i;:::-;3588:63;;3544:117;3700:2;3726:53;3771:7;3762:6;3751:9;3747:22;3726:53;:::i;:::-;3716:63;;3671:118;3828:2;3854:53;3899:7;3890:6;3879:9;3875:22;3854:53;:::i;:::-;3844:63;;3799:118;3472:452;;;;;:::o;3930:809::-;;;;;4098:3;4086:9;4077:7;4073:23;4069:33;4066:2;;;4115:1;4112;4105:12;4066:2;4158:1;4183:53;4228:7;4219:6;4208:9;4204:22;4183:53;:::i;:::-;4173:63;;4129:117;4285:2;4311:53;4356:7;4347:6;4336:9;4332:22;4311:53;:::i;:::-;4301:63;;4256:118;4413:2;4439:53;4484:7;4475:6;4464:9;4460:22;4439:53;:::i;:::-;4429:63;;4384:118;4569:2;4558:9;4554:18;4541:32;4600:18;4592:6;4589:30;4586:2;;;4632:1;4629;4622:12;4586:2;4660:62;4714:7;4705:6;4694:9;4690:22;4660:62;:::i;:::-;4650:72;;4512:220;4056:683;;;;;;;:::o;4745:401::-;;;4867:2;4855:9;4846:7;4842:23;4838:32;4835:2;;;4883:1;4880;4873:12;4835:2;4926:1;4951:53;4996:7;4987:6;4976:9;4972:22;4951:53;:::i;:::-;4941:63;;4897:117;5053:2;5079:50;5121:7;5112:6;5101:9;5097:22;5079:50;:::i;:::-;5069:60;;5024:115;4825:321;;;;;:::o;5152:407::-;;;5277:2;5265:9;5256:7;5252:23;5248:32;5245:2;;;5293:1;5290;5283:12;5245:2;5336:1;5361:53;5406:7;5397:6;5386:9;5382:22;5361:53;:::i;:::-;5351:63;;5307:117;5463:2;5489:53;5534:7;5525:6;5514:9;5510:22;5489:53;:::i;:::-;5479:63;;5434:118;5235:324;;;;;:::o;5565:262::-;;5673:2;5661:9;5652:7;5648:23;5644:32;5641:2;;;5689:1;5686;5679:12;5641:2;5732:1;5757:53;5802:7;5793:6;5782:9;5778:22;5757:53;:::i;:::-;5747:63;;5703:117;5631:196;;;;:::o;5833:260::-;;5940:2;5928:9;5919:7;5915:23;5911:32;5908:2;;;5956:1;5953;5946:12;5908:2;5999:1;6024:52;6068:7;6059:6;6048:9;6044:22;6024:52;:::i;:::-;6014:62;;5970:116;5898:195;;;;:::o;6099:282::-;;6217:2;6205:9;6196:7;6192:23;6188:32;6185:2;;;6233:1;6230;6223:12;6185:2;6276:1;6301:63;6356:7;6347:6;6336:9;6332:22;6301:63;:::i;:::-;6291:73;;6247:127;6175:206;;;;:::o;6387:375::-;;6505:2;6493:9;6484:7;6480:23;6476:32;6473:2;;;6521:1;6518;6511:12;6473:2;6592:1;6581:9;6577:17;6564:31;6622:18;6614:6;6611:30;6608:2;;;6654:1;6651;6644:12;6608:2;6682:63;6737:7;6728:6;6717:9;6713:22;6682:63;:::i;:::-;6672:73;;6535:220;6463:299;;;;:::o;6768:262::-;;6876:2;6864:9;6855:7;6851:23;6847:32;6844:2;;;6892:1;6889;6882:12;6844:2;6935:1;6960:53;7005:7;6996:6;6985:9;6981:22;6960:53;:::i;:::-;6950:63;;6906:117;6834:196;;;;:::o;7036:284::-;;7155:2;7143:9;7134:7;7130:23;7126:32;7123:2;;;7171:1;7168;7161:12;7123:2;7214:1;7239:64;7295:7;7286:6;7275:9;7271:22;7239:64;:::i;:::-;7229:74;;7185:128;7113:207;;;;:::o;7326:570::-;;;;7486:2;7474:9;7465:7;7461:23;7457:32;7454:2;;;7502:1;7499;7492:12;7454:2;7545:1;7570:53;7615:7;7606:6;7595:9;7591:22;7570:53;:::i;:::-;7560:63;;7516:117;7700:2;7689:9;7685:18;7672:32;7731:18;7723:6;7720:30;7717:2;;;7763:1;7760;7753:12;7717:2;7799:80;7871:7;7862:6;7851:9;7847:22;7799:80;:::i;:::-;7781:98;;;;7643:246;7444:452;;;;;:::o;7902:108::-;7979:24;7997:5;7979:24;:::i;:::-;7974:3;7967:37;7957:53;;:::o;8016:118::-;8103:24;8121:5;8103:24;:::i;:::-;8098:3;8091:37;8081:53;;:::o;8140:157::-;8245:45;8265:24;8283:5;8265:24;:::i;:::-;8245:45;:::i;:::-;8240:3;8233:58;8223:74;;:::o;8303:109::-;8384:21;8399:5;8384:21;:::i;:::-;8379:3;8372:34;8362:50;;:::o;8418:118::-;8505:24;8523:5;8505:24;:::i;:::-;8500:3;8493:37;8483:53;;:::o;8542:360::-;;8656:38;8688:5;8656:38;:::i;:::-;8710:70;8773:6;8768:3;8710:70;:::i;:::-;8703:77;;8789:52;8834:6;8829:3;8822:4;8815:5;8811:16;8789:52;:::i;:::-;8866:29;8888:6;8866:29;:::i;:::-;8861:3;8857:39;8850:46;;8632:270;;;;;:::o;8908:364::-;;9024:39;9057:5;9024:39;:::i;:::-;9079:71;9143:6;9138:3;9079:71;:::i;:::-;9072:78;;9159:52;9204:6;9199:3;9192:4;9185:5;9181:16;9159:52;:::i;:::-;9236:29;9258:6;9236:29;:::i;:::-;9231:3;9227:39;9220:46;;9000:272;;;;;:::o;9278:377::-;;9412:39;9445:5;9412:39;:::i;:::-;9467:89;9549:6;9544:3;9467:89;:::i;:::-;9460:96;;9565:52;9610:6;9605:3;9598:4;9591:5;9587:16;9565:52;:::i;:::-;9642:6;9637:3;9633:16;9626:23;;9388:267;;;;;:::o;9685:845::-;;9825:5;9819:12;9854:36;9880:9;9854:36;:::i;:::-;9906:89;9988:6;9983:3;9906:89;:::i;:::-;9899:96;;10026:1;10015:9;10011:17;10042:1;10037:137;;;;10188:1;10183:341;;;;10004:520;;10037:137;10121:4;10117:9;10106;10102:25;10097:3;10090:38;10157:6;10152:3;10148:16;10141:23;;10037:137;;10183:341;10250:38;10282:5;10250:38;:::i;:::-;10310:1;10324:154;10338:6;10335:1;10332:13;10324:154;;;10412:7;10406:14;10402:1;10397:3;10393:11;10386:35;10462:1;10453:7;10449:15;10438:26;;10360:4;10357:1;10353:12;10348:17;;10324:154;;;10507:6;10502:3;10498:16;10491:23;;10190:334;;10004:520;;9792:738;;;;;;:::o;10536:366::-;;10699:67;10763:2;10758:3;10699:67;:::i;:::-;10692:74;;10796:34;10792:1;10787:3;10783:11;10776:55;10862:4;10857:2;10852:3;10848:12;10841:26;10893:2;10888:3;10884:12;10877:19;;10682:220;;;:::o;10908:370::-;;11071:67;11135:2;11130:3;11071:67;:::i;:::-;11064:74;;11168:34;11164:1;11159:3;11155:11;11148:55;11234:8;11229:2;11224:3;11220:12;11213:30;11269:2;11264:3;11260:12;11253:19;;11054:224;;;:::o;11284:374::-;;11447:67;11511:2;11506:3;11447:67;:::i;:::-;11440:74;;11544:34;11540:1;11535:3;11531:11;11524:55;11610:12;11605:2;11600:3;11596:12;11589:34;11649:2;11644:3;11640:12;11633:19;;11430:228;;;:::o;11664:367::-;;11827:67;11891:2;11886:3;11827:67;:::i;:::-;11820:74;;11924:34;11920:1;11915:3;11911:11;11904:55;11990:5;11985:2;11980:3;11976:12;11969:27;12022:2;12017:3;12013:12;12006:19;;11810:221;;;:::o;12037:369::-;;12200:67;12264:2;12259:3;12200:67;:::i;:::-;12193:74;;12297:34;12293:1;12288:3;12284:11;12277:55;12363:7;12358:2;12353:3;12349:12;12342:29;12397:2;12392:3;12388:12;12381:19;;12183:223;;;:::o;12412:304::-;;12575:66;12639:1;12634:3;12575:66;:::i;:::-;12568:73;;12671:9;12667:1;12662:3;12658:11;12651:30;12707:2;12702:3;12698:12;12691:19;;12558:158;;;:::o;12722:389::-;;12885:67;12949:2;12944:3;12885:67;:::i;:::-;12878:74;;12982:34;12978:1;12973:3;12969:11;12962:55;13048:27;13043:2;13038:3;13034:12;13027:49;13102:2;13097:3;13093:12;13086:19;;12868:243;;;:::o;13117:375::-;;13280:67;13344:2;13339:3;13280:67;:::i;:::-;13273:74;;13377:34;13373:1;13368:3;13364:11;13357:55;13443:13;13438:2;13433:3;13429:12;13422:35;13483:2;13478:3;13474:12;13467:19;;13263:229;;;:::o;13498:370::-;;13661:67;13725:2;13720:3;13661:67;:::i;:::-;13654:74;;13758:34;13754:1;13749:3;13745:11;13738:55;13824:8;13819:2;13814:3;13810:12;13803:30;13859:2;13854:3;13850:12;13843:19;;13644:224;;;:::o;13874:337::-;;14055:84;14137:1;14132:3;14055:84;:::i;:::-;14048:91;;14169:7;14165:1;14160:3;14156:11;14149:28;14203:1;14198:3;14194:11;14187:18;;14038:173;;;:::o;14217:330::-;;14380:67;14444:2;14439:3;14380:67;:::i;:::-;14373:74;;14477:34;14473:1;14468:3;14464:11;14457:55;14538:2;14533:3;14529:12;14522:19;;14363:184;;;:::o;14553:379::-;;14716:67;14780:2;14775:3;14716:67;:::i;:::-;14709:74;;14813:34;14809:1;14804:3;14800:11;14793:55;14879:17;14874:2;14869:3;14865:12;14858:39;14923:2;14918:3;14914:12;14907:19;;14699:233;;;:::o;14938:324::-;;15101:67;15165:2;15160:3;15101:67;:::i;:::-;15094:74;;15198:28;15194:1;15189:3;15185:11;15178:49;15253:2;15248:3;15244:12;15237:19;;15084:178;;;:::o;15268:382::-;;15431:67;15495:2;15490:3;15431:67;:::i;:::-;15424:74;;15528:34;15524:1;15519:3;15515:11;15508:55;15594:20;15589:2;15584:3;15580:12;15573:42;15641:2;15636:3;15632:12;15625:19;;15414:236;;;:::o;15656:322::-;;15819:67;15883:2;15878:3;15819:67;:::i;:::-;15812:74;;15916:26;15912:1;15907:3;15903:11;15896:47;15969:2;15964:3;15960:12;15953:19;;15802:176;;;:::o;15984:320::-;;16147:67;16211:2;16206:3;16147:67;:::i;:::-;16140:74;;16244:24;16240:1;16235:3;16231:11;16224:45;16295:2;16290:3;16286:12;16279:19;;16130:174;;;:::o;16310:366::-;;16473:67;16537:2;16532:3;16473:67;:::i;:::-;16466:74;;16570:34;16566:1;16561:3;16557:11;16550:55;16636:4;16631:2;16626:3;16622:12;16615:26;16667:2;16662:3;16658:12;16651:19;;16456:220;;;:::o;16682:383::-;;16845:67;16909:2;16904:3;16845:67;:::i;:::-;16838:74;;16942:34;16938:1;16933:3;16929:11;16922:55;17008:21;17003:2;16998:3;16994:12;16987:43;17056:2;17051:3;17047:12;17040:19;;16828:237;;;:::o;17071:311::-;;17234:67;17298:2;17293:3;17234:67;:::i;:::-;17227:74;;17331:15;17327:1;17322:3;17318:11;17311:36;17373:2;17368:3;17364:12;17357:19;;17217:165;;;:::o;17388:365::-;;17551:67;17615:2;17610:3;17551:67;:::i;:::-;17544:74;;17648:34;17644:1;17639:3;17635:11;17628:55;17714:3;17709:2;17704:3;17700:12;17693:25;17744:2;17739:3;17735:12;17728:19;;17534:219;;;:::o;17759:372::-;;17922:67;17986:2;17981:3;17922:67;:::i;:::-;17915:74;;18019:34;18015:1;18010:3;18006:11;17999:55;18085:10;18080:2;18075:3;18071:12;18064:32;18122:2;18117:3;18113:12;18106:19;;17905:226;;;:::o;18137:378::-;;18300:67;18364:2;18359:3;18300:67;:::i;:::-;18293:74;;18397:34;18393:1;18388:3;18384:11;18377:55;18463:16;18458:2;18453:3;18449:12;18442:38;18506:2;18501:3;18497:12;18490:19;;18283:232;;;:::o;18521:379::-;;18684:67;18748:2;18743:3;18684:67;:::i;:::-;18677:74;;18781:34;18777:1;18772:3;18768:11;18761:55;18847:17;18842:2;18837:3;18833:12;18826:39;18891:2;18886:3;18882:12;18875:19;;18667:233;;;:::o;18906:377::-;;19069:67;19133:2;19128:3;19069:67;:::i;:::-;19062:74;;19166:34;19162:1;19157:3;19153:11;19146:55;19232:15;19227:2;19222:3;19218:12;19211:37;19274:2;19269:3;19265:12;19258:19;;19052:231;;;:::o;19359:529::-;19520:4;19515:3;19511:14;19607:4;19600:5;19596:16;19590:23;19626:63;19683:4;19678:3;19674:14;19660:12;19626:63;:::i;:::-;19535:164;19791:4;19784:5;19780:16;19774:23;19810:61;19865:4;19860:3;19856:14;19842:12;19810:61;:::i;:::-;19709:172;19489:399;;;:::o;19894:118::-;19981:24;19999:5;19981:24;:::i;:::-;19976:3;19969:37;19959:53;;:::o;20018:105::-;20093:23;20110:5;20093:23;:::i;:::-;20088:3;20081:36;20071:52;;:::o;20129:256::-;;20256:75;20327:3;20318:6;20256:75;:::i;:::-;20356:2;20351:3;20347:12;20340:19;;20376:3;20369:10;;20245:140;;;;:::o;20391:695::-;;20691:92;20779:3;20770:6;20691:92;:::i;:::-;20684:99;;20800:95;20891:3;20882:6;20800:95;:::i;:::-;20793:102;;20912:148;21056:3;20912:148;:::i;:::-;20905:155;;21077:3;21070:10;;20673:413;;;;;:::o;21092:222::-;;21223:2;21212:9;21208:18;21200:26;;21236:71;21304:1;21293:9;21289:17;21280:6;21236:71;:::i;:::-;21190:124;;;;:::o;21320:640::-;;21553:3;21542:9;21538:19;21530:27;;21567:71;21635:1;21624:9;21620:17;21611:6;21567:71;:::i;:::-;21648:72;21716:2;21705:9;21701:18;21692:6;21648:72;:::i;:::-;21730;21798:2;21787:9;21783:18;21774:6;21730:72;:::i;:::-;21849:9;21843:4;21839:20;21834:2;21823:9;21819:18;21812:48;21877:76;21948:4;21939:6;21877:76;:::i;:::-;21869:84;;21520:440;;;;;;;:::o;21966:210::-;;22091:2;22080:9;22076:18;22068:26;;22104:65;22166:1;22155:9;22151:17;22142:6;22104:65;:::i;:::-;22058:118;;;;:::o;22182:222::-;;22313:2;22302:9;22298:18;22290:26;;22326:71;22394:1;22383:9;22379:17;22370:6;22326:71;:::i;:::-;22280:124;;;;:::o;22410:313::-;;22561:2;22550:9;22546:18;22538:26;;22610:9;22604:4;22600:20;22596:1;22585:9;22581:17;22574:47;22638:78;22711:4;22702:6;22638:78;:::i;:::-;22630:86;;22528:195;;;;:::o;22729:419::-;;22933:2;22922:9;22918:18;22910:26;;22982:9;22976:4;22972:20;22968:1;22957:9;22953:17;22946:47;23010:131;23136:4;23010:131;:::i;:::-;23002:139;;22900:248;;;:::o;23154:419::-;;23358:2;23347:9;23343:18;23335:26;;23407:9;23401:4;23397:20;23393:1;23382:9;23378:17;23371:47;23435:131;23561:4;23435:131;:::i;:::-;23427:139;;23325:248;;;:::o;23579:419::-;;23783:2;23772:9;23768:18;23760:26;;23832:9;23826:4;23822:20;23818:1;23807:9;23803:17;23796:47;23860:131;23986:4;23860:131;:::i;:::-;23852:139;;23750:248;;;:::o;24004:419::-;;24208:2;24197:9;24193:18;24185:26;;24257:9;24251:4;24247:20;24243:1;24232:9;24228:17;24221:47;24285:131;24411:4;24285:131;:::i;:::-;24277:139;;24175:248;;;:::o;24429:419::-;;24633:2;24622:9;24618:18;24610:26;;24682:9;24676:4;24672:20;24668:1;24657:9;24653:17;24646:47;24710:131;24836:4;24710:131;:::i;:::-;24702:139;;24600:248;;;:::o;24854:419::-;;25058:2;25047:9;25043:18;25035:26;;25107:9;25101:4;25097:20;25093:1;25082:9;25078:17;25071:47;25135:131;25261:4;25135:131;:::i;:::-;25127:139;;25025:248;;;:::o;25279:419::-;;25483:2;25472:9;25468:18;25460:26;;25532:9;25526:4;25522:20;25518:1;25507:9;25503:17;25496:47;25560:131;25686:4;25560:131;:::i;:::-;25552:139;;25450:248;;;:::o;25704:419::-;;25908:2;25897:9;25893:18;25885:26;;25957:9;25951:4;25947:20;25943:1;25932:9;25928:17;25921:47;25985:131;26111:4;25985:131;:::i;:::-;25977:139;;25875:248;;;:::o;26129:419::-;;26333:2;26322:9;26318:18;26310:26;;26382:9;26376:4;26372:20;26368:1;26357:9;26353:17;26346:47;26410:131;26536:4;26410:131;:::i;:::-;26402:139;;26300:248;;;:::o;26554:419::-;;26758:2;26747:9;26743:18;26735:26;;26807:9;26801:4;26797:20;26793:1;26782:9;26778:17;26771:47;26835:131;26961:4;26835:131;:::i;:::-;26827:139;;26725:248;;;:::o;26979:419::-;;27183:2;27172:9;27168:18;27160:26;;27232:9;27226:4;27222:20;27218:1;27207:9;27203:17;27196:47;27260:131;27386:4;27260:131;:::i;:::-;27252:139;;27150:248;;;:::o;27404:419::-;;27608:2;27597:9;27593:18;27585:26;;27657:9;27651:4;27647:20;27643:1;27632:9;27628:17;27621:47;27685:131;27811:4;27685:131;:::i;:::-;27677:139;;27575:248;;;:::o;27829:419::-;;28033:2;28022:9;28018:18;28010:26;;28082:9;28076:4;28072:20;28068:1;28057:9;28053:17;28046:47;28110:131;28236:4;28110:131;:::i;:::-;28102:139;;28000:248;;;:::o;28254:419::-;;28458:2;28447:9;28443:18;28435:26;;28507:9;28501:4;28497:20;28493:1;28482:9;28478:17;28471:47;28535:131;28661:4;28535:131;:::i;:::-;28527:139;;28425:248;;;:::o;28679:419::-;;28883:2;28872:9;28868:18;28860:26;;28932:9;28926:4;28922:20;28918:1;28907:9;28903:17;28896:47;28960:131;29086:4;28960:131;:::i;:::-;28952:139;;28850:248;;;:::o;29104:419::-;;29308:2;29297:9;29293:18;29285:26;;29357:9;29351:4;29347:20;29343:1;29332:9;29328:17;29321:47;29385:131;29511:4;29385:131;:::i;:::-;29377:139;;29275:248;;;:::o;29529:419::-;;29733:2;29722:9;29718:18;29710:26;;29782:9;29776:4;29772:20;29768:1;29757:9;29753:17;29746:47;29810:131;29936:4;29810:131;:::i;:::-;29802:139;;29700:248;;;:::o;29954:419::-;;30158:2;30147:9;30143:18;30135:26;;30207:9;30201:4;30197:20;30193:1;30182:9;30178:17;30171:47;30235:131;30361:4;30235:131;:::i;:::-;30227:139;;30125:248;;;:::o;30379:419::-;;30583:2;30572:9;30568:18;30560:26;;30632:9;30626:4;30622:20;30618:1;30607:9;30603:17;30596:47;30660:131;30786:4;30660:131;:::i;:::-;30652:139;;30550:248;;;:::o;30804:419::-;;31008:2;30997:9;30993:18;30985:26;;31057:9;31051:4;31047:20;31043:1;31032:9;31028:17;31021:47;31085:131;31211:4;31085:131;:::i;:::-;31077:139;;30975:248;;;:::o;31229:419::-;;31433:2;31422:9;31418:18;31410:26;;31482:9;31476:4;31472:20;31468:1;31457:9;31453:17;31446:47;31510:131;31636:4;31510:131;:::i;:::-;31502:139;;31400:248;;;:::o;31654:419::-;;31858:2;31847:9;31843:18;31835:26;;31907:9;31901:4;31897:20;31893:1;31882:9;31878:17;31871:47;31935:131;32061:4;31935:131;:::i;:::-;31927:139;;31825:248;;;:::o;32079:419::-;;32283:2;32272:9;32268:18;32260:26;;32332:9;32326:4;32322:20;32318:1;32307:9;32303:17;32296:47;32360:131;32486:4;32360:131;:::i;:::-;32352:139;;32250:248;;;:::o;32504:350::-;;32699:2;32688:9;32684:18;32676:26;;32712:135;32844:1;32833:9;32829:17;32820:6;32712:135;:::i;:::-;32666:188;;;;:::o;32860:222::-;;32991:2;32980:9;32976:18;32968:26;;33004:71;33072:1;33061:9;33057:17;33048:6;33004:71;:::i;:::-;32958:124;;;;:::o;33088:283::-;;33154:2;33148:9;33138:19;;33196:4;33188:6;33184:17;33303:6;33291:10;33288:22;33267:18;33255:10;33252:34;33249:62;33246:2;;;33314:18;;:::i;:::-;33246:2;33354:10;33350:2;33343:22;33128:243;;;;:::o;33377:331::-;;33528:18;33520:6;33517:30;33514:2;;;33550:18;;:::i;:::-;33514:2;33635:4;33631:9;33624:4;33616:6;33612:17;33608:33;33600:41;;33696:4;33690;33686:15;33678:23;;33443:265;;;:::o;33714:332::-;;33866:18;33858:6;33855:30;33852:2;;;33888:18;;:::i;:::-;33852:2;33973:4;33969:9;33962:4;33954:6;33950:17;33946:33;33938:41;;34034:4;34028;34024:15;34016:23;;33781:265;;;:::o;34052:141::-;;34124:3;34116:11;;34147:3;34144:1;34137:14;34181:4;34178:1;34168:18;34160:26;;34106:87;;;:::o;34199:98::-;;34284:5;34278:12;34268:22;;34257:40;;;:::o;34303:99::-;;34389:5;34383:12;34373:22;;34362:40;;;:::o;34408:168::-;;34525:6;34520:3;34513:19;34565:4;34560:3;34556:14;34541:29;;34503:73;;;;:::o;34582:169::-;;34700:6;34695:3;34688:19;34740:4;34735:3;34731:14;34716:29;;34678:73;;;;:::o;34757:148::-;;34896:3;34881:18;;34871:34;;;;:::o;34911:305::-;;34970:20;34988:1;34970:20;:::i;:::-;34965:25;;35004:20;35022:1;35004:20;:::i;:::-;34999:25;;35158:1;35090:66;35086:74;35083:1;35080:81;35077:2;;;35164:18;;:::i;:::-;35077:2;35208:1;35205;35201:9;35194:16;;34955:261;;;;:::o;35222:185::-;;35279:20;35297:1;35279:20;:::i;:::-;35274:25;;35313:20;35331:1;35313:20;:::i;:::-;35308:25;;35352:1;35342:2;;35357:18;;:::i;:::-;35342:2;35399:1;35396;35392:9;35387:14;;35264:143;;;;:::o;35413:191::-;;35473:20;35491:1;35473:20;:::i;:::-;35468:25;;35507:20;35525:1;35507:20;:::i;:::-;35502:25;;35546:1;35543;35540:8;35537:2;;;35551:18;;:::i;:::-;35537:2;35596:1;35593;35589:9;35581:17;;35458:146;;;;:::o;35610:96::-;;35676:24;35694:5;35676:24;:::i;:::-;35665:35;;35655:51;;;:::o;35712:90::-;;35789:5;35782:13;35775:21;35764:32;;35754:48;;;:::o;35808:77::-;;35874:5;35863:16;;35853:32;;;:::o;35891:149::-;;35967:66;35960:5;35956:78;35945:89;;35935:105;;;:::o;36046:126::-;;36123:42;36116:5;36112:54;36101:65;;36091:81;;;:::o;36178:77::-;;36244:5;36233:16;;36223:32;;;:::o;36261:101::-;;36337:18;36330:5;36326:30;36315:41;;36305:57;;;:::o;36368:154::-;36452:6;36447:3;36442;36429:30;36514:1;36505:6;36500:3;36496:16;36489:27;36419:103;;;:::o;36528:307::-;36596:1;36606:113;36620:6;36617:1;36614:13;36606:113;;;36705:1;36700:3;36696:11;36690:18;36686:1;36681:3;36677:11;36670:39;36642:2;36639:1;36635:10;36630:15;;36606:113;;;36737:6;36734:1;36731:13;36728:2;;;36817:1;36808:6;36803:3;36799:16;36792:27;36728:2;36577:258;;;;:::o;36841:320::-;;36922:1;36916:4;36912:12;36902:22;;36969:1;36963:4;36959:12;36990:18;36980:2;;37046:4;37038:6;37034:17;37024:27;;36980:2;37108;37100:6;37097:14;37077:18;37074:38;37071:2;;;37127:18;;:::i;:::-;37071:2;36892:269;;;;:::o;37167:233::-;;37229:24;37247:5;37229:24;:::i;:::-;37220:33;;37275:66;37268:5;37265:77;37262:2;;;37345:18;;:::i;:::-;37262:2;37392:1;37385:5;37381:13;37374:20;;37210:190;;;:::o;37406:100::-;;37474:26;37494:5;37474:26;:::i;:::-;37463:37;;37453:53;;;:::o;37512:94::-;;37580:20;37594:5;37580:20;:::i;:::-;37569:31;;37559:47;;;:::o;37612:176::-;;37661:20;37679:1;37661:20;:::i;:::-;37656:25;;37695:20;37713:1;37695:20;:::i;:::-;37690:25;;37734:1;37724:2;;37739:18;;:::i;:::-;37724:2;37780:1;37777;37773:9;37768:14;;37646:142;;;;:::o;37794:180::-;37842:77;37839:1;37832:88;37939:4;37936:1;37929:15;37963:4;37960:1;37953:15;37980:180;38028:77;38025:1;38018:88;38125:4;38122:1;38115:15;38149:4;38146:1;38139:15;38166:180;38214:77;38211:1;38204:88;38311:4;38308:1;38301:15;38335:4;38332:1;38325:15;38352:180;38400:77;38397:1;38390:88;38497:4;38494:1;38487:15;38521:4;38518:1;38511:15;38538:102;;38630:2;38626:7;38621:2;38614:5;38610:14;38606:28;38596:38;;38586:54;;;:::o;38646:94::-;;38727:5;38723:2;38719:14;38698:35;;38688:52;;;:::o;38746:122::-;38819:24;38837:5;38819:24;:::i;:::-;38812:5;38809:35;38799:2;;38858:1;38855;38848:12;38799:2;38789:79;:::o;38874:116::-;38944:21;38959:5;38944:21;:::i;:::-;38937:5;38934:32;38924:2;;38980:1;38977;38970:12;38924:2;38914:76;:::o;38996:122::-;39069:24;39087:5;39069:24;:::i;:::-;39062:5;39059:35;39049:2;;39108:1;39105;39098:12;39049:2;39039:79;:::o;39124:120::-;39196:23;39213:5;39196:23;:::i;:::-;39189:5;39186:34;39176:2;;39234:1;39231;39224:12;39176:2;39166:78;:::o;39250:122::-;39323:24;39341:5;39323:24;:::i;:::-;39316:5;39313:35;39303:2;;39362:1;39359;39352:12;39303:2;39293:79;:::o

Swarm Source

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