ETH Price: $2,516.49 (+0.73%)

Hyper Jellyz (MOTHERSHIP)
 

Overview

TokenID

1684

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

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:
MasterchefMasatoshi

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: Templates/includes/IReverseRegistrar.sol



pragma solidity >=0.8.4;

interface IReverseRegistrar {
    function setDefaultResolver(address resolver) external;

    function claim(address owner) external returns (bytes32);

    function claimForAddr(
        address addr,
        address owner,
        address resolver
    ) external returns (bytes32);

    function claimWithResolver(address owner, address resolver)
        external
        returns (bytes32);

    function setName(string memory name) external returns (bytes32);

    function setNameForAddr(
        address addr,
        address owner,
        address resolver,
        string memory name
    ) external returns (bytes32);

    function node(address addr) external pure returns (bytes32);
}
// File: @openzeppelin/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            /// @solidity memory-safe-assembly
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

// File: Templates/includes/ERC721.sol


// Creator: Chiru Labs

pragma solidity ^0.8.10;









/**
 * @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..).
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721 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 private currentIndex = 0;

    uint256 internal immutable maxBatchSize;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Base URI
    string private _baseURI;

    // 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) private _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;

    /**
     * @dev
     * `maxBatchSize` refers to how much a minter can mint at a time.
     */
    constructor(
        string memory name_,
        string memory symbol_,
        uint256 maxBatchSize_
    ) {
        require(maxBatchSize_ > 0, "b");
        _name = name_;
        _symbol = symbol_;
        maxBatchSize = maxBatchSize_;
    }

    /**
     * @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(), "g");
        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), "b");
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx = 0;
        address currOwnershipAddr = address(0);
        for (uint256 i = 0; 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("u");
    }

    /**
     * @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), "0");
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), "0");
        return uint256(_addressData[owner].numberMinted);
    }

    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), "t");

        uint256 lowestTokenToCheck;
        if (tokenId >= maxBatchSize) {
            lowestTokenToCheck = tokenId - maxBatchSize + 1;
        }

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

        revert("o");
    }

    /**
     * @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), "z");

        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() public view virtual returns (string memory) {
        return _baseURI;
    }

    /**
     * @dev Internal function to set the base URI for all token IDs. It is
     * automatically added as a prefix to the value returned in {tokenURI},
     * or to the token ID if {tokenURI} is empty.
     */
    function _setBaseURI(string memory baseURI_) internal virtual {
        _baseURI = baseURI_;
    }



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

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "a"
        );

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        require(_exists(tokenId), "a");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), "a");

        _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),
            "z"
        );
    }

    /**
     * @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 Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` cannot be larger than the max batch size.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), "0");
        // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
        require(!_exists(startTokenId), "a");
        require(quantity <= maxBatchSize, "m");

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

        AddressData memory addressData = _addressData[to];
        _addressData[to] = AddressData(
            addressData.balance + uint128(quantity),
            addressData.numberMinted + uint128(quantity)
        );
        _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

        uint256 updatedIndex = startTokenId;

        for (uint256 i = 0; i < quantity; i++) {
            emit Transfer(address(0), to, updatedIndex);
            require(
                _checkOnERC721Received(address(0), to, updatedIndex, _data),
                "z"
            );
            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, "a");

        require(prevOwnership.addr == from, "o");
        require(to != address(0), "0");

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        _addressData[from].balance -= 1;
        _addressData[to].balance += 1;
        _ownerships[tokenId] = TokenOwnership(to, 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] = TokenOwnership(prevOwnership.addr, 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);
    }

    uint256 public nextOwnerToExplicitlySet = 0;

    /**
     * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
     */
    function _setOwnersExplicit(uint256 quantity) internal {
        uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
        require(quantity > 0, "q");
        uint256 endIndex = oldNextOwnerToSet + quantity - 1;
        if (endIndex > currentIndex - 1) {
            endIndex = currentIndex - 1;
        }
        // We know if the last one in the group exists, all in the group exist, due to serial ordering.
        require(_exists(endIndex), "n");
        for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
            if (_ownerships[i].addr == address(0)) {
                TokenOwnership memory ownership = ownershipOf(i);
                _ownerships[i] = TokenOwnership(ownership.addr, ownership.startTimestamp);
            }
        }
        nextOwnerToExplicitlySet = endIndex + 1;
    }

    /**
     * @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("z");
                } 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 {}
}
// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

// File: Templates/HyperJellyz.sol


/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........................@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@.....................................@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@.............................................@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@...................................................@@@@@@@@@@@@@@
@@@@@@@@@@@@.........................@@@@@@..........................@@@@@@@@@@@
@@@@@@@@@@.....................@@@@@@@@@@@@@@@@@@......................@@@@@@@@@
@@@@@@@@....................@@@@@@@@@@@@@@@@@@@@@@@@.....................@@@@@@@
@@@@@@....................@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....................@@@@@
@@@@@...................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....................@@@@
@@@@....................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....................@@@
@@@....................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....................@@
@@.....................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....................@
@@.....................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....................@
@......................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....................@
@......................@@@..#@@@@@@@@@@@@@@@@@@@@@@@,..@@@.....................@
@......................@@@.....@@@@@@@@@@@@@@@@@@@.....@@@.....................@
@......................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....................@
@......................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....................@
@@..................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..............@
@@............@@@@@@@@..(@@@@@@@@@@@@@@@@@@@@@@.@@@@@@@@@@@....................@
@@@...................@@@@@@@@@@@@@@@@@@@@@.@@@..@@@@@@@@@@@@.................@@
@@@@................@@....@@@@@@...@@@@@.@@.@@...@@@@@@@@..@@@...............@@@
@@@@@...................@@@...@@..@@@@@@.@@.@@..@@.@@...@...@@@.............@@@@
@@@@@@.................@@@...@@...@@..@@....@@..@@..@@..@@...@@............@@@@@
@@@@@@@@...............@@@.......@@@..@@.......@@@..........@@@..........@@@@@@@
@@@@@@@@@@.............@@@........%...@@........@@(....................@@@@@@@@@
@@@@@@@@@@@@.....................................@@..................@@@@@@@@@@@
@@@@@@@@@@@@@@@...................................................@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@.............................................@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@.....................................@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
pragma solidity ^0.8.10;






/**
 * @title MasterchefMasatoshi
 * NFT + DAO = NEW META
 * Vitalik, remove contract size limit pls
 */
contract MasterchefMasatoshi is ERC721, Ownable {
  using ECDSA for bytes32;
  string public PROVENANCE;
  bool provenanceSet;

  uint256 public mintPrice;
  uint256 public maxPossibleSupply;
  uint256 public allowListMintPrice;
  uint256 public maxAllowedMints;

  address public immutable currency;
  address immutable wrappedNativeCoinAddress;

  address private signerAddress;
  bool public paused;

  address immutable ENSReverseRegistrar = 0x084b1c3C81545d370f3634392De611CaaBFf8148;

  enum MintStatus {
    PreMint,
    AllowList,
    Public,
    Finished
  }

  MintStatus public mintStatus = MintStatus.PreMint;

  mapping (address => uint256) totalMintsPerAddress;

  constructor(
      string memory _name,
      string memory _symbol,
      uint256 _maxPossibleSupply,
      uint256 _mintPrice,
      uint256 _allowListMintPrice,
      uint256 _maxAllowedMints,
      address _signerAddress,
      address _currency,
      address _wrappedNativeCoinAddress
  ) ERC721(_name, _symbol, _maxAllowedMints) {
    maxPossibleSupply = _maxPossibleSupply;
    mintPrice = _mintPrice;
    allowListMintPrice = _allowListMintPrice;
    maxAllowedMints = _maxAllowedMints;
    signerAddress = _signerAddress;
    currency = _currency;
    wrappedNativeCoinAddress = _wrappedNativeCoinAddress;
  }

  function flipPaused() external onlyOwner {
    paused = !paused;
  }

  function preMint(uint amount) public onlyOwner {
    require(mintStatus == MintStatus.PreMint, "s");
    require(totalSupply() + amount <= maxPossibleSupply, "m");  
    _safeMint(msg.sender, amount);
  }

  function setProvenanceHash(string memory provenanceHash) public onlyOwner {
    require(!provenanceSet);
    PROVENANCE = provenanceHash;
    provenanceSet = true;
  }

  function setBaseURI(string memory baseURI) public onlyOwner {
    _setBaseURI(baseURI);
  }
  
  function changeMintStatus(MintStatus _status) external onlyOwner {
    require(_status != MintStatus.PreMint);
    mintStatus = _status;
  }

  function mintAllowList(
    bytes32 messageHash,
    bytes calldata signature,
    uint amount
  ) public payable {
    require(mintStatus == MintStatus.AllowList && !paused, "s");
    require(totalSupply() + amount <= maxPossibleSupply, "m");
    require(hashMessage(msg.sender, address(this)) == messageHash, "i");
    require(verifyAddressSigner(messageHash, signature), "f");
    require(totalMintsPerAddress[msg.sender] + amount <= maxAllowedMints, "l");

    if (currency == wrappedNativeCoinAddress) {
      require(allowListMintPrice * amount <= msg.value, "a");
    } else {
      IERC20 _currency = IERC20(currency);
      _currency.transferFrom(msg.sender, address(this), amount * allowListMintPrice);
    }

    totalMintsPerAddress[msg.sender] = totalMintsPerAddress[msg.sender] + amount;
    _safeMint(msg.sender, amount);
  }

  function mintPublic(uint amount) public payable {
    require(mintStatus == MintStatus.Public && !paused, "s");
    require(totalSupply() + amount <= maxPossibleSupply, "m");
    require(totalMintsPerAddress[msg.sender] + amount <= maxAllowedMints, "l");

    if (currency == wrappedNativeCoinAddress) {
      require(mintPrice * amount <= msg.value, "a");
    } else {
      IERC20 _currency = IERC20(currency);
      _currency.transferFrom(msg.sender, address(this), amount * mintPrice);
    }

    totalMintsPerAddress[msg.sender] = totalMintsPerAddress[msg.sender] + amount;
    _safeMint(msg.sender, amount);

    if (totalSupply() == maxPossibleSupply) {
      mintStatus = MintStatus.Finished;
    }
  }

  function addReverseENSRecord(string memory name) external onlyOwner{
    IReverseRegistrar(ENSReverseRegistrar).setName(name);
  }

  receive() external payable {
    mintPublic(msg.value / mintPrice);
  }

  function verifyAddressSigner(bytes32 messageHash, bytes memory signature) private view returns (bool) {
    return signerAddress == messageHash.toEthSignedMessageHash().recover(signature);
  }

  function hashMessage(address sender, address thisContract) public pure returns (bytes32) {
    return keccak256(abi.encodePacked(sender, thisContract));
  }

  function withdraw() external onlyOwner() {
    uint balance = address(this).balance;
    payable(msg.sender).transfer(balance);
  }

  function withdrawTokens(address tokenAddress) external onlyOwner() {
    IERC20(tokenAddress).transfer(msg.sender, IERC20(tokenAddress).balanceOf(address(this)));
  }
}

// The High Table

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_maxPossibleSupply","type":"uint256"},{"internalType":"uint256","name":"_mintPrice","type":"uint256"},{"internalType":"uint256","name":"_allowListMintPrice","type":"uint256"},{"internalType":"uint256","name":"_maxAllowedMints","type":"uint256"},{"internalType":"address","name":"_signerAddress","type":"address"},{"internalType":"address","name":"_currency","type":"address"},{"internalType":"address","name":"_wrappedNativeCoinAddress","type":"address"}],"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":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"addReverseENSRecord","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allowListMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum MasterchefMasatoshi.MintStatus","name":"_status","type":"uint8"}],"name":"changeMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currency","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"thisContract","type":"address"}],"name":"hashMessage","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","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":"maxAllowedMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPossibleSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"messageHash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintAllowList","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintStatus","outputs":[{"internalType":"enum MasterchefMasatoshi.MintStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"preMint","outputs":[],"stateMutability":"nonpayable","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":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","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":[{"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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

61010060405260008055600060085573084b1c3c81545d370f3634392de611caabff814873ffffffffffffffffffffffffffffffffffffffff1660e09073ffffffffffffffffffffffffffffffffffffffff168152506000601060156101000a81548160ff021916908360038111156200007e576200007d620002f0565b5b02179055503480156200009057600080fd5b5060405162005ed138038062005ed18339818101604052810190620000b6919062000552565b88888560008111620000ff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000f690620006d0565b60405180910390fd5b826001908162000110919062000933565b50816002908162000122919062000933565b5080608081815250505050506200014e620001426200022260201b60201c565b6200022a60201b60201c565b86600d8190555085600c8190555084600e8190555083600f8190555082601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505050505050505050505062000a1a565b600033905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000388826200033d565b810181811067ffffffffffffffff82111715620003aa57620003a96200034e565b5b80604052505050565b6000620003bf6200031f565b9050620003cd82826200037d565b919050565b600067ffffffffffffffff821115620003f057620003ef6200034e565b5b620003fb826200033d565b9050602081019050919050565b60005b83811015620004285780820151818401526020810190506200040b565b60008484015250505050565b60006200044b6200044584620003d2565b620003b3565b9050828152602081018484840111156200046a576200046962000338565b5b6200047784828562000408565b509392505050565b600082601f83011262000497576200049662000333565b5b8151620004a984826020860162000434565b91505092915050565b6000819050919050565b620004c781620004b2565b8114620004d357600080fd5b50565b600081519050620004e781620004bc565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200051a82620004ed565b9050919050565b6200052c816200050d565b81146200053857600080fd5b50565b6000815190506200054c8162000521565b92915050565b60008060008060008060008060006101208a8c03121562000578576200057762000329565b5b60008a015167ffffffffffffffff8111156200059957620005986200032e565b5b620005a78c828d016200047f565b99505060208a015167ffffffffffffffff811115620005cb57620005ca6200032e565b5b620005d98c828d016200047f565b9850506040620005ec8c828d01620004d6565b9750506060620005ff8c828d01620004d6565b9650506080620006128c828d01620004d6565b95505060a0620006258c828d01620004d6565b94505060c0620006388c828d016200053b565b93505060e06200064b8c828d016200053b565b9250506101006200065f8c828d016200053b565b9150509295985092959850929598565b600082825260208201905092915050565b7f6200000000000000000000000000000000000000000000000000000000000000600082015250565b6000620006b86001836200066f565b9150620006c58262000680565b602082019050919050565b60006020820190508181036000830152620006eb81620006a9565b9050919050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200074557607f821691505b6020821081036200075b576200075a620006fd565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620007c57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000786565b620007d1868362000786565b95508019841693508086168417925050509392505050565b6000819050919050565b6000620008146200080e6200080884620004b2565b620007e9565b620004b2565b9050919050565b6000819050919050565b6200083083620007f3565b620008486200083f826200081b565b84845462000793565b825550505050565b600090565b6200085f62000850565b6200086c81848462000825565b505050565b5b8181101562000894576200088860008262000855565b60018101905062000872565b5050565b601f821115620008e357620008ad8162000761565b620008b88462000776565b81016020851015620008c8578190505b620008e0620008d78562000776565b83018262000871565b50505b505050565b600082821c905092915050565b60006200090860001984600802620008e8565b1980831691505092915050565b6000620009238383620008f5565b9150826002028217905092915050565b6200093e82620006f2565b67ffffffffffffffff8111156200095a57620009596200034e565b5b6200096682546200072c565b6200097382828562000898565b600060209050601f831160018114620009ab576000841562000996578287015190505b620009a2858262000915565b86555062000a12565b601f198416620009bb8662000761565b60005b82811015620009e557848901518255600182019150602085019450602081019050620009be565b8683101562000a05578489015162000a01601f891682620008f5565b8355505b6001600288020188555050505b505050505050565b60805160a05160c05160e05161544c62000a8560003960006120a8015260008181610ac00152611d7b015260008181610af701528181610b8a01528181611db201528181611e450152612148015260008181612a6c01528181612a9501526130fd015261544c6000f3fe60806040526004361061023f5760003560e01c806368855b641161012e578063a22cb465116100ab578063dfb5259c1161006f578063dfb5259c14610873578063e5a6b10f1461089c578063e985e9c5146108c7578063efd0cbf914610904578063f2fde38b146109205761025c565b8063a22cb4651461079d578063a9cbd06d146107c6578063b88d4fde146107e2578063c87b56dd1461080b578063d7224ba0146108485761025c565b80637cac2602116100f25780637cac2602146106ca5780638ad433ac146106f35780638da5cb5b1461071c57806395d89b41146107475780639da3f8fd146107725761025c565b806368855b64146105e35780636c0360eb1461060e5780636c82054b1461063957806370a0823114610676578063715018a6146106b35761025c565b80633ccfd60b116101bc57806355f804b31161018057806355f804b3146104fc5780635c975abb146105255780636352211e146105505780636373a6b11461058d5780636817c76c146105b85761025c565b80633ccfd60b1461042b57806342842e0e1461044257806344fead9e1461046b57806349df728c146104965780634f6ccce7146104bf5761025c565b806318160ddd1161020357806318160ddd1461035857806323b872dd146103835780632f745c59146103ac578063333171bb146103e9578063386b7691146104005761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b314610306578063109695231461032f5761025c565b3661025c5761025a600c5434610255919061396c565b610949565b005b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613a09565b610d12565b6040516102959190613a51565b60405180910390f35b3480156102aa57600080fd5b506102b3610e5c565b6040516102c09190613afc565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190613b4a565b610eee565b6040516102fd9190613bb8565b60405180910390f35b34801561031257600080fd5b5061032d60048036038101906103289190613bff565b610f73565b005b34801561033b57600080fd5b5061035660048036038101906103519190613d74565b61108b565b005b34801561036457600080fd5b5061036d6110db565b60405161037a9190613dcc565b60405180910390f35b34801561038f57600080fd5b506103aa60048036038101906103a59190613de7565b6110e4565b005b3480156103b857600080fd5b506103d360048036038101906103ce9190613bff565b6110f4565b6040516103e09190613dcc565b60405180910390f35b3480156103f557600080fd5b506103fe6112f0565b005b34801561040c57600080fd5b50610415611324565b6040516104229190613dcc565b60405180910390f35b34801561043757600080fd5b5061044061132a565b005b34801561044e57600080fd5b5061046960048036038101906104649190613de7565b611381565b005b34801561047757600080fd5b506104806113a1565b60405161048d9190613dcc565b60405180910390f35b3480156104a257600080fd5b506104bd60048036038101906104b89190613e3a565b6113a7565b005b3480156104cb57600080fd5b506104e660048036038101906104e19190613b4a565b6114aa565b6040516104f39190613dcc565b60405180910390f35b34801561050857600080fd5b50610523600480360381019061051e9190613d74565b6114fd565b005b34801561053157600080fd5b5061053a611511565b6040516105479190613a51565b60405180910390f35b34801561055c57600080fd5b5061057760048036038101906105729190613b4a565b611524565b6040516105849190613bb8565b60405180910390f35b34801561059957600080fd5b506105a261153a565b6040516105af9190613afc565b60405180910390f35b3480156105c457600080fd5b506105cd6115c8565b6040516105da9190613dcc565b60405180910390f35b3480156105ef57600080fd5b506105f86115ce565b6040516106059190613dcc565b60405180910390f35b34801561061a57600080fd5b506106236115d4565b6040516106309190613afc565b60405180910390f35b34801561064557600080fd5b50610660600480360381019061065b9190613e67565b611666565b60405161066d9190613ec0565b60405180910390f35b34801561068257600080fd5b5061069d60048036038101906106989190613e3a565b611699565b6040516106aa9190613dcc565b60405180910390f35b3480156106bf57600080fd5b506106c8611781565b005b3480156106d657600080fd5b506106f160048036038101906106ec9190613f00565b611795565b005b3480156106ff57600080fd5b5061071a60048036038101906107159190613b4a565b6117fb565b005b34801561072857600080fd5b506107316118dd565b60405161073e9190613bb8565b60405180910390f35b34801561075357600080fd5b5061075c611907565b6040516107699190613afc565b60405180910390f35b34801561077e57600080fd5b50610787611999565b6040516107949190613fa4565b60405180910390f35b3480156107a957600080fd5b506107c460048036038101906107bf9190613feb565b6119ac565b005b6107e060048036038101906107db91906140b7565b611b2c565b005b3480156107ee57600080fd5b50610809600480360381019061080491906141cc565b611f94565b005b34801561081757600080fd5b50610832600480360381019061082d9190613b4a565b611ff0565b60405161083f9190613afc565b60405180910390f35b34801561085457600080fd5b5061085d612098565b60405161086a9190613dcc565b60405180910390f35b34801561087f57600080fd5b5061089a60048036038101906108959190613d74565b61209e565b005b3480156108a857600080fd5b506108b1612146565b6040516108be9190613bb8565b60405180910390f35b3480156108d357600080fd5b506108ee60048036038101906108e99190613e67565b61216a565b6040516108fb9190613a51565b60405180910390f35b61091e60048036038101906109199190613b4a565b610949565b005b34801561092c57600080fd5b5061094760048036038101906109429190613e3a565b6121fe565b005b6002600381111561095d5761095c613f2d565b5b601060159054906101000a900460ff16600381111561097f5761097e613f2d565b5b1480156109995750601060149054906101000a900460ff16155b6109d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cf9061429b565b60405180910390fd5b600d54816109e46110db565b6109ee91906142bb565b1115610a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a269061433b565b60405180910390fd5b600f5481601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610a7d91906142bb565b1115610abe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab5906143a7565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1603610b86573481600c54610b4091906143c7565b1115610b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7890614455565b60405180910390fd5b610c3b565b60007f000000000000000000000000000000000000000000000000000000000000000090508073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330600c5486610bd791906143c7565b6040518463ffffffff1660e01b8152600401610bf593929190614475565b6020604051808303816000875af1158015610c14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3891906144c1565b50505b80601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c8691906142bb565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610cd33382612281565b600d54610cde6110db565b03610d0f576003601060156101000a81548160ff02191690836003811115610d0957610d08613f2d565b5b02179055505b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ddd57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e4557507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e555750610e548261229f565b5b9050919050565b606060018054610e6b9061451d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e979061451d565b8015610ee45780601f10610eb957610100808354040283529160200191610ee4565b820191906000526020600020905b815481529060010190602001808311610ec757829003601f168201915b5050505050905090565b6000610ef982612309565b610f38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2f90614455565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f7e82611524565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe59061459a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661100d612316565b73ffffffffffffffffffffffffffffffffffffffff16148061103c575061103b81611036612316565b61216a565b5b61107b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107290614455565b60405180910390fd5b61108683838361231e565b505050565b6110936123d0565b600b60009054906101000a900460ff16156110ad57600080fd5b80600a90816110bc9190614766565b506001600b60006101000a81548160ff02191690831515021790555050565b60008054905090565b6110ef83838361244e565b505050565b60006110ff83611699565b8210611140576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113790614884565b60405180910390fd5b600061114a6110db565b905060008060005b838110156112ae576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461124457806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361129a5786840361128b5781955050505050506112ea565b8380611296906148a4565b9450505b5080806112a6906148a4565b915050611152565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e190614938565b60405180910390fd5b92915050565b6112f86123d0565b601060149054906101000a900460ff1615601060146101000a81548160ff021916908315150217905550565b600d5481565b6113326123d0565b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561137d573d6000803e3d6000fd5b5050565b61139c83838360405180602001604052806000815250611f94565b505050565b600f5481565b6113af6123d0565b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114059190613bb8565b602060405180830381865afa158015611422573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611446919061496d565b6040518363ffffffff1660e01b815260040161146392919061499a565b6020604051808303816000875af1158015611482573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a691906144c1565b5050565b60006114b46110db565b82106114f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ec90614a0f565b60405180910390fd5b819050919050565b6115056123d0565b61150e81612a05565b50565b601060149054906101000a900460ff1681565b600061152f82612a18565b600001519050919050565b600a80546115479061451d565b80601f01602080910402602001604051908101604052809291908181526020018280546115739061451d565b80156115c05780601f10611595576101008083540402835291602001916115c0565b820191906000526020600020905b8154815290600101906020018083116115a357829003601f168201915b505050505081565b600c5481565b600e5481565b6060600380546115e39061451d565b80601f016020809104026020016040519081016040528092919081815260200182805461160f9061451d565b801561165c5780601f106116315761010080835404028352916020019161165c565b820191906000526020600020905b81548152906001019060200180831161163f57829003601f168201915b5050505050905090565b6000828260405160200161167b929190614a77565b60405160208183030381529060405280519060200120905092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611709576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170090614aef565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6117896123d0565b6117936000612c1b565b565b61179d6123d0565b600060038111156117b1576117b0613f2d565b5b8160038111156117c4576117c3613f2d565b5b036117ce57600080fd5b80601060156101000a81548160ff021916908360038111156117f3576117f2613f2d565b5b021790555050565b6118036123d0565b6000600381111561181757611816613f2d565b5b601060159054906101000a900460ff16600381111561183957611838613f2d565b5b14611879576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118709061429b565b60405180910390fd5b600d54816118856110db565b61188f91906142bb565b11156118d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c79061433b565b60405180910390fd5b6118da3382612281565b50565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546119169061451d565b80601f01602080910402602001604051908101604052809291908181526020018280546119429061451d565b801561198f5780601f106119645761010080835404028352916020019161198f565b820191906000526020600020905b81548152906001019060200180831161197257829003601f168201915b5050505050905090565b601060159054906101000a900460ff1681565b6119b4612316565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1890614455565b60405180910390fd5b8060076000611a2e612316565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611adb612316565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b209190613a51565b60405180910390a35050565b60016003811115611b4057611b3f613f2d565b5b601060159054906101000a900460ff166003811115611b6257611b61613f2d565b5b148015611b7c5750601060149054906101000a900460ff16155b611bbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb29061429b565b60405180910390fd5b600d5481611bc76110db565b611bd191906142bb565b1115611c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c099061433b565b60405180910390fd5b83611c1d3330611666565b14611c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5490614b5b565b60405180910390fd5b611cab8484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612ce1565b611cea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce190614bc7565b60405180910390fd5b600f5481601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d3891906142bb565b1115611d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d70906143a7565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1603611e41573481600e54611dfb91906143c7565b1115611e3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3390614455565b60405180910390fd5b611ef6565b60007f000000000000000000000000000000000000000000000000000000000000000090508073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330600e5486611e9291906143c7565b6040518463ffffffff1660e01b8152600401611eb093929190614475565b6020604051808303816000875af1158015611ecf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef391906144c1565b50505b80601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f4191906142bb565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611f8e3382612281565b50505050565b611f9f84848461244e565b611fab84848484612d56565b611fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe190614c33565b60405180910390fd5b50505050565b6060611ffb82612309565b61203a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203190614c33565b60405180910390fd5b6000600380546120499061451d565b9050116120655760405180602001604052806000815250612091565b600361207083612edd565b604051602001612081929190614d12565b6040516020818303038152906040525b9050919050565b60085481565b6120a66123d0565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c47f0027826040518263ffffffff1660e01b81526004016120ff9190613afc565b6020604051808303816000875af115801561211e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121429190614d4b565b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122066123d0565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226c90614dea565b60405180910390fd5b61227e81612c1b565b50565b61229b82826040518060200160405280600081525061303d565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6123d8612316565b73ffffffffffffffffffffffffffffffffffffffff166123f66118dd565b73ffffffffffffffffffffffffffffffffffffffff161461244c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244390614e56565b60405180910390fd5b565b600061245982612a18565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612480612316565b73ffffffffffffffffffffffffffffffffffffffff1614806124dc57506124a5612316565b73ffffffffffffffffffffffffffffffffffffffff166124c484610eee565b73ffffffffffffffffffffffffffffffffffffffff16145b806124f857506124f782600001516124f2612316565b61216a565b5b90508061253a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253190614455565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146125ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a39061459a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361261b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261290614aef565b60405180910390fd5b612628858585600161351b565b612638600084846000015161231e565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166126a69190614e92565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff1661274a9190614ed6565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600060018461285091906142bb565b9050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612995576128c581612309565b15612994576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506004600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129fd8686866001613521565b505050505050565b8060039081612a149190614766565b5050565b612a206138ca565b612a2982612309565b612a68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5f90614f66565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000008310612acc5760017f000000000000000000000000000000000000000000000000000000000000000084612abf9190614f86565b612ac991906142bb565b90505b60008390505b818110612bda576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612bc657809350505050612c16565b508080612bd290614fba565b915050612ad2565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0d9061459a565b60405180910390fd5b919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612cfe82612cf085613527565b61355790919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b6000612d778473ffffffffffffffffffffffffffffffffffffffff1661357e565b15612ed0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612da0612316565b8786866040518563ffffffff1660e01b8152600401612dc29493929190615038565b6020604051808303816000875af1925050508015612dfe57506040513d601f19601f82011682018060405250810190612dfb9190615099565b60015b612e80573d8060008114612e2e576040519150601f19603f3d011682016040523d82523d6000602084013e612e33565b606091505b506000815103612e78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6f90614c33565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ed5565b600190505b949350505050565b606060008203612f24576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613038565b600082905060005b60008214612f56578080612f3f906148a4565b915050600a82612f4f919061396c565b9150612f2c565b60008167ffffffffffffffff811115612f7257612f71613c49565b5b6040519080825280601f01601f191660200182016040528015612fa45781602001600182028036833780820191505090505b5090505b6000851461303157600182612fbd9190614f86565b9150600a85612fcc91906150c6565b6030612fd891906142bb565b60f81b818381518110612fee57612fed6150f7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561302a919061396c565b9450612fa8565b8093505050505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036130b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a990614aef565b60405180910390fd5b6130bb81612309565b156130fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f290614455565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000083111561315e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131559061433b565b60405180910390fd5b61316b600085838661351b565b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516132689190614ed6565b6fffffffffffffffffffffffffffffffff16815260200185836020015161328f9190614ed6565b6fffffffffffffffffffffffffffffffff16815250600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b858110156134fe57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461349e6000888488612d56565b6134dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134d490614c33565b60405180910390fd5b81806134e8906148a4565b92505080806134f6906148a4565b91505061342d565b50806000819055506135136000878588613521565b505050505050565b50505050565b50505050565b60008160405160200161353a9190615193565b604051602081830303815290604052805190602001209050919050565b600080600061356685856135a1565b91509150613573816135f2565b819250505092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008060418351036135e25760008060006020860151925060408601519150606086015160001a90506135d6878285856137be565b945094505050506135eb565b60006002915091505b9250929050565b6000600481111561360657613605613f2d565b5b81600481111561361957613618613f2d565b5b03156137bb576001600481111561363357613632613f2d565b5b81600481111561364657613645613f2d565b5b03613686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161367d90615205565b60405180910390fd5b6002600481111561369a57613699613f2d565b5b8160048111156136ad576136ac613f2d565b5b036136ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136e490615271565b60405180910390fd5b6003600481111561370157613700613f2d565b5b81600481111561371457613713613f2d565b5b03613754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161374b90615303565b60405180910390fd5b60048081111561376757613766613f2d565b5b81600481111561377a57613779613f2d565b5b036137ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137b190615395565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156137f95760006003915091506138c1565b601b8560ff16141580156138115750601c8560ff1614155b156138235760006004915091506138c1565b60006001878787876040516000815260200160405260405161384894939291906153d1565b6020604051602081039080840390855afa15801561386a573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036138b8576000600192509250506138c1565b80600092509250505b94509492505050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061397782613904565b915061398283613904565b9250826139925761399161390e565b5b828204905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6139e6816139b1565b81146139f157600080fd5b50565b600081359050613a03816139dd565b92915050565b600060208284031215613a1f57613a1e6139a7565b5b6000613a2d848285016139f4565b91505092915050565b60008115159050919050565b613a4b81613a36565b82525050565b6000602082019050613a666000830184613a42565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613aa6578082015181840152602081019050613a8b565b60008484015250505050565b6000601f19601f8301169050919050565b6000613ace82613a6c565b613ad88185613a77565b9350613ae8818560208601613a88565b613af181613ab2565b840191505092915050565b60006020820190508181036000830152613b168184613ac3565b905092915050565b613b2781613904565b8114613b3257600080fd5b50565b600081359050613b4481613b1e565b92915050565b600060208284031215613b6057613b5f6139a7565b5b6000613b6e84828501613b35565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613ba282613b77565b9050919050565b613bb281613b97565b82525050565b6000602082019050613bcd6000830184613ba9565b92915050565b613bdc81613b97565b8114613be757600080fd5b50565b600081359050613bf981613bd3565b92915050565b60008060408385031215613c1657613c156139a7565b5b6000613c2485828601613bea565b9250506020613c3585828601613b35565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613c8182613ab2565b810181811067ffffffffffffffff82111715613ca057613c9f613c49565b5b80604052505050565b6000613cb361399d565b9050613cbf8282613c78565b919050565b600067ffffffffffffffff821115613cdf57613cde613c49565b5b613ce882613ab2565b9050602081019050919050565b82818337600083830152505050565b6000613d17613d1284613cc4565b613ca9565b905082815260208101848484011115613d3357613d32613c44565b5b613d3e848285613cf5565b509392505050565b600082601f830112613d5b57613d5a613c3f565b5b8135613d6b848260208601613d04565b91505092915050565b600060208284031215613d8a57613d896139a7565b5b600082013567ffffffffffffffff811115613da857613da76139ac565b5b613db484828501613d46565b91505092915050565b613dc681613904565b82525050565b6000602082019050613de16000830184613dbd565b92915050565b600080600060608486031215613e0057613dff6139a7565b5b6000613e0e86828701613bea565b9350506020613e1f86828701613bea565b9250506040613e3086828701613b35565b9150509250925092565b600060208284031215613e5057613e4f6139a7565b5b6000613e5e84828501613bea565b91505092915050565b60008060408385031215613e7e57613e7d6139a7565b5b6000613e8c85828601613bea565b9250506020613e9d85828601613bea565b9150509250929050565b6000819050919050565b613eba81613ea7565b82525050565b6000602082019050613ed56000830184613eb1565b92915050565b60048110613ee857600080fd5b50565b600081359050613efa81613edb565b92915050565b600060208284031215613f1657613f156139a7565b5b6000613f2484828501613eeb565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110613f6d57613f6c613f2d565b5b50565b6000819050613f7e82613f5c565b919050565b6000613f8e82613f70565b9050919050565b613f9e81613f83565b82525050565b6000602082019050613fb96000830184613f95565b92915050565b613fc881613a36565b8114613fd357600080fd5b50565b600081359050613fe581613fbf565b92915050565b60008060408385031215614002576140016139a7565b5b600061401085828601613bea565b925050602061402185828601613fd6565b9150509250929050565b61403481613ea7565b811461403f57600080fd5b50565b6000813590506140518161402b565b92915050565b600080fd5b600080fd5b60008083601f84011261407757614076613c3f565b5b8235905067ffffffffffffffff81111561409457614093614057565b5b6020830191508360018202830111156140b0576140af61405c565b5b9250929050565b600080600080606085870312156140d1576140d06139a7565b5b60006140df87828801614042565b945050602085013567ffffffffffffffff811115614100576140ff6139ac565b5b61410c87828801614061565b9350935050604061411f87828801613b35565b91505092959194509250565b600067ffffffffffffffff82111561414657614145613c49565b5b61414f82613ab2565b9050602081019050919050565b600061416f61416a8461412b565b613ca9565b90508281526020810184848401111561418b5761418a613c44565b5b614196848285613cf5565b509392505050565b600082601f8301126141b3576141b2613c3f565b5b81356141c384826020860161415c565b91505092915050565b600080600080608085870312156141e6576141e56139a7565b5b60006141f487828801613bea565b945050602061420587828801613bea565b935050604061421687828801613b35565b925050606085013567ffffffffffffffff811115614237576142366139ac565b5b6142438782880161419e565b91505092959194509250565b7f7300000000000000000000000000000000000000000000000000000000000000600082015250565b6000614285600183613a77565b91506142908261424f565b602082019050919050565b600060208201905081810360008301526142b481614278565b9050919050565b60006142c682613904565b91506142d183613904565b92508282019050808211156142e9576142e861393d565b5b92915050565b7f6d00000000000000000000000000000000000000000000000000000000000000600082015250565b6000614325600183613a77565b9150614330826142ef565b602082019050919050565b6000602082019050818103600083015261435481614318565b9050919050565b7f6c00000000000000000000000000000000000000000000000000000000000000600082015250565b6000614391600183613a77565b915061439c8261435b565b602082019050919050565b600060208201905081810360008301526143c081614384565b9050919050565b60006143d282613904565b91506143dd83613904565b92508282026143eb81613904565b915082820484148315176144025761440161393d565b5b5092915050565b7f6100000000000000000000000000000000000000000000000000000000000000600082015250565b600061443f600183613a77565b915061444a82614409565b602082019050919050565b6000602082019050818103600083015261446e81614432565b9050919050565b600060608201905061448a6000830186613ba9565b6144976020830185613ba9565b6144a46040830184613dbd565b949350505050565b6000815190506144bb81613fbf565b92915050565b6000602082840312156144d7576144d66139a7565b5b60006144e5848285016144ac565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061453557607f821691505b602082108103614548576145476144ee565b5b50919050565b7f6f00000000000000000000000000000000000000000000000000000000000000600082015250565b6000614584600183613a77565b915061458f8261454e565b602082019050919050565b600060208201905081810360008301526145b381614577565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261461c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826145df565b61462686836145df565b95508019841693508086168417925050509392505050565b6000819050919050565b600061466361465e61465984613904565b61463e565b613904565b9050919050565b6000819050919050565b61467d83614648565b6146916146898261466a565b8484546145ec565b825550505050565b600090565b6146a6614699565b6146b1818484614674565b505050565b5b818110156146d5576146ca60008261469e565b6001810190506146b7565b5050565b601f82111561471a576146eb816145ba565b6146f4846145cf565b81016020851015614703578190505b61471761470f856145cf565b8301826146b6565b50505b505050565b600082821c905092915050565b600061473d6000198460080261471f565b1980831691505092915050565b6000614756838361472c565b9150826002028217905092915050565b61476f82613a6c565b67ffffffffffffffff81111561478857614787613c49565b5b614792825461451d565b61479d8282856146d9565b600060209050601f8311600181146147d057600084156147be578287015190505b6147c8858261474a565b865550614830565b601f1984166147de866145ba565b60005b82811015614806578489015182556001820191506020850194506020810190506147e1565b86831015614823578489015161481f601f89168261472c565b8355505b6001600288020188555050505b505050505050565b7f6200000000000000000000000000000000000000000000000000000000000000600082015250565b600061486e600183613a77565b915061487982614838565b602082019050919050565b6000602082019050818103600083015261489d81614861565b9050919050565b60006148af82613904565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148e1576148e061393d565b5b600182019050919050565b7f7500000000000000000000000000000000000000000000000000000000000000600082015250565b6000614922600183613a77565b915061492d826148ec565b602082019050919050565b6000602082019050818103600083015261495181614915565b9050919050565b60008151905061496781613b1e565b92915050565b600060208284031215614983576149826139a7565b5b600061499184828501614958565b91505092915050565b60006040820190506149af6000830185613ba9565b6149bc6020830184613dbd565b9392505050565b7f6700000000000000000000000000000000000000000000000000000000000000600082015250565b60006149f9600183613a77565b9150614a04826149c3565b602082019050919050565b60006020820190508181036000830152614a28816149ec565b9050919050565b60008160601b9050919050565b6000614a4782614a2f565b9050919050565b6000614a5982614a3c565b9050919050565b614a71614a6c82613b97565b614a4e565b82525050565b6000614a838285614a60565b601482019150614a938284614a60565b6014820191508190509392505050565b7f3000000000000000000000000000000000000000000000000000000000000000600082015250565b6000614ad9600183613a77565b9150614ae482614aa3565b602082019050919050565b60006020820190508181036000830152614b0881614acc565b9050919050565b7f6900000000000000000000000000000000000000000000000000000000000000600082015250565b6000614b45600183613a77565b9150614b5082614b0f565b602082019050919050565b60006020820190508181036000830152614b7481614b38565b9050919050565b7f6600000000000000000000000000000000000000000000000000000000000000600082015250565b6000614bb1600183613a77565b9150614bbc82614b7b565b602082019050919050565b60006020820190508181036000830152614be081614ba4565b9050919050565b7f7a00000000000000000000000000000000000000000000000000000000000000600082015250565b6000614c1d600183613a77565b9150614c2882614be7565b602082019050919050565b60006020820190508181036000830152614c4c81614c10565b9050919050565b600081905092915050565b60008154614c6b8161451d565b614c758186614c53565b94506001821660008114614c905760018114614ca557614cd8565b60ff1983168652811515820286019350614cd8565b614cae856145ba565b60005b83811015614cd057815481890152600182019150602081019050614cb1565b838801955050505b50505092915050565b6000614cec82613a6c565b614cf68185614c53565b9350614d06818560208601613a88565b80840191505092915050565b6000614d1e8285614c5e565b9150614d2a8284614ce1565b91508190509392505050565b600081519050614d458161402b565b92915050565b600060208284031215614d6157614d606139a7565b5b6000614d6f84828501614d36565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614dd4602683613a77565b9150614ddf82614d78565b604082019050919050565b60006020820190508181036000830152614e0381614dc7565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614e40602083613a77565b9150614e4b82614e0a565b602082019050919050565b60006020820190508181036000830152614e6f81614e33565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6000614e9d82614e76565b9150614ea883614e76565b925082820390506fffffffffffffffffffffffffffffffff811115614ed057614ecf61393d565b5b92915050565b6000614ee182614e76565b9150614eec83614e76565b925082820190506fffffffffffffffffffffffffffffffff811115614f1457614f1361393d565b5b92915050565b7f7400000000000000000000000000000000000000000000000000000000000000600082015250565b6000614f50600183613a77565b9150614f5b82614f1a565b602082019050919050565b60006020820190508181036000830152614f7f81614f43565b9050919050565b6000614f9182613904565b9150614f9c83613904565b9250828203905081811115614fb457614fb361393d565b5b92915050565b6000614fc582613904565b915060008203614fd857614fd761393d565b5b600182039050919050565b600081519050919050565b600082825260208201905092915050565b600061500a82614fe3565b6150148185614fee565b9350615024818560208601613a88565b61502d81613ab2565b840191505092915050565b600060808201905061504d6000830187613ba9565b61505a6020830186613ba9565b6150676040830185613dbd565b81810360608301526150798184614fff565b905095945050505050565b600081519050615093816139dd565b92915050565b6000602082840312156150af576150ae6139a7565b5b60006150bd84828501615084565b91505092915050565b60006150d182613904565b91506150dc83613904565b9250826150ec576150eb61390e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b600061515c601c83614c53565b915061516782615126565b601c82019050919050565b6000819050919050565b61518d61518882613ea7565b615172565b82525050565b600061519e8261514f565b91506151aa828461517c565b60208201915081905092915050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006151ef601883613a77565b91506151fa826151b9565b602082019050919050565b6000602082019050818103600083015261521e816151e2565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b600061525b601f83613a77565b915061526682615225565b602082019050919050565b6000602082019050818103600083015261528a8161524e565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006152ed602283613a77565b91506152f882615291565b604082019050919050565b6000602082019050818103600083015261531c816152e0565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061537f602283613a77565b915061538a82615323565b604082019050919050565b600060208201905081810360008301526153ae81615372565b9050919050565b600060ff82169050919050565b6153cb816153b5565b82525050565b60006080820190506153e66000830187613eb1565b6153f360208301866153c2565b6154006040830185613eb1565b61540d6060830184613eb1565b9594505050505056fea2646970667358221220b07128e9715407934b6a3945a43d1917698e62372d14f9204c0d9c10b86d9b5a64736f6c63430008110033000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000000000000000032000000000000000000000000a1e4320d53bd7d5884be548f0ccb95b8b4732e8b000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000c4879706572204a656c6c797a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d4f544845525348495000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061023f5760003560e01c806368855b641161012e578063a22cb465116100ab578063dfb5259c1161006f578063dfb5259c14610873578063e5a6b10f1461089c578063e985e9c5146108c7578063efd0cbf914610904578063f2fde38b146109205761025c565b8063a22cb4651461079d578063a9cbd06d146107c6578063b88d4fde146107e2578063c87b56dd1461080b578063d7224ba0146108485761025c565b80637cac2602116100f25780637cac2602146106ca5780638ad433ac146106f35780638da5cb5b1461071c57806395d89b41146107475780639da3f8fd146107725761025c565b806368855b64146105e35780636c0360eb1461060e5780636c82054b1461063957806370a0823114610676578063715018a6146106b35761025c565b80633ccfd60b116101bc57806355f804b31161018057806355f804b3146104fc5780635c975abb146105255780636352211e146105505780636373a6b11461058d5780636817c76c146105b85761025c565b80633ccfd60b1461042b57806342842e0e1461044257806344fead9e1461046b57806349df728c146104965780634f6ccce7146104bf5761025c565b806318160ddd1161020357806318160ddd1461035857806323b872dd146103835780632f745c59146103ac578063333171bb146103e9578063386b7691146104005761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b314610306578063109695231461032f5761025c565b3661025c5761025a600c5434610255919061396c565b610949565b005b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613a09565b610d12565b6040516102959190613a51565b60405180910390f35b3480156102aa57600080fd5b506102b3610e5c565b6040516102c09190613afc565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190613b4a565b610eee565b6040516102fd9190613bb8565b60405180910390f35b34801561031257600080fd5b5061032d60048036038101906103289190613bff565b610f73565b005b34801561033b57600080fd5b5061035660048036038101906103519190613d74565b61108b565b005b34801561036457600080fd5b5061036d6110db565b60405161037a9190613dcc565b60405180910390f35b34801561038f57600080fd5b506103aa60048036038101906103a59190613de7565b6110e4565b005b3480156103b857600080fd5b506103d360048036038101906103ce9190613bff565b6110f4565b6040516103e09190613dcc565b60405180910390f35b3480156103f557600080fd5b506103fe6112f0565b005b34801561040c57600080fd5b50610415611324565b6040516104229190613dcc565b60405180910390f35b34801561043757600080fd5b5061044061132a565b005b34801561044e57600080fd5b5061046960048036038101906104649190613de7565b611381565b005b34801561047757600080fd5b506104806113a1565b60405161048d9190613dcc565b60405180910390f35b3480156104a257600080fd5b506104bd60048036038101906104b89190613e3a565b6113a7565b005b3480156104cb57600080fd5b506104e660048036038101906104e19190613b4a565b6114aa565b6040516104f39190613dcc565b60405180910390f35b34801561050857600080fd5b50610523600480360381019061051e9190613d74565b6114fd565b005b34801561053157600080fd5b5061053a611511565b6040516105479190613a51565b60405180910390f35b34801561055c57600080fd5b5061057760048036038101906105729190613b4a565b611524565b6040516105849190613bb8565b60405180910390f35b34801561059957600080fd5b506105a261153a565b6040516105af9190613afc565b60405180910390f35b3480156105c457600080fd5b506105cd6115c8565b6040516105da9190613dcc565b60405180910390f35b3480156105ef57600080fd5b506105f86115ce565b6040516106059190613dcc565b60405180910390f35b34801561061a57600080fd5b506106236115d4565b6040516106309190613afc565b60405180910390f35b34801561064557600080fd5b50610660600480360381019061065b9190613e67565b611666565b60405161066d9190613ec0565b60405180910390f35b34801561068257600080fd5b5061069d60048036038101906106989190613e3a565b611699565b6040516106aa9190613dcc565b60405180910390f35b3480156106bf57600080fd5b506106c8611781565b005b3480156106d657600080fd5b506106f160048036038101906106ec9190613f00565b611795565b005b3480156106ff57600080fd5b5061071a60048036038101906107159190613b4a565b6117fb565b005b34801561072857600080fd5b506107316118dd565b60405161073e9190613bb8565b60405180910390f35b34801561075357600080fd5b5061075c611907565b6040516107699190613afc565b60405180910390f35b34801561077e57600080fd5b50610787611999565b6040516107949190613fa4565b60405180910390f35b3480156107a957600080fd5b506107c460048036038101906107bf9190613feb565b6119ac565b005b6107e060048036038101906107db91906140b7565b611b2c565b005b3480156107ee57600080fd5b50610809600480360381019061080491906141cc565b611f94565b005b34801561081757600080fd5b50610832600480360381019061082d9190613b4a565b611ff0565b60405161083f9190613afc565b60405180910390f35b34801561085457600080fd5b5061085d612098565b60405161086a9190613dcc565b60405180910390f35b34801561087f57600080fd5b5061089a60048036038101906108959190613d74565b61209e565b005b3480156108a857600080fd5b506108b1612146565b6040516108be9190613bb8565b60405180910390f35b3480156108d357600080fd5b506108ee60048036038101906108e99190613e67565b61216a565b6040516108fb9190613a51565b60405180910390f35b61091e60048036038101906109199190613b4a565b610949565b005b34801561092c57600080fd5b5061094760048036038101906109429190613e3a565b6121fe565b005b6002600381111561095d5761095c613f2d565b5b601060159054906101000a900460ff16600381111561097f5761097e613f2d565b5b1480156109995750601060149054906101000a900460ff16155b6109d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cf9061429b565b60405180910390fd5b600d54816109e46110db565b6109ee91906142bb565b1115610a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a269061433b565b60405180910390fd5b600f5481601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610a7d91906142bb565b1115610abe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab5906143a7565b60405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1603610b86573481600c54610b4091906143c7565b1115610b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7890614455565b60405180910390fd5b610c3b565b60007f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290508073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330600c5486610bd791906143c7565b6040518463ffffffff1660e01b8152600401610bf593929190614475565b6020604051808303816000875af1158015610c14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3891906144c1565b50505b80601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c8691906142bb565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610cd33382612281565b600d54610cde6110db565b03610d0f576003601060156101000a81548160ff02191690836003811115610d0957610d08613f2d565b5b02179055505b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ddd57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e4557507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e555750610e548261229f565b5b9050919050565b606060018054610e6b9061451d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e979061451d565b8015610ee45780601f10610eb957610100808354040283529160200191610ee4565b820191906000526020600020905b815481529060010190602001808311610ec757829003601f168201915b5050505050905090565b6000610ef982612309565b610f38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2f90614455565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f7e82611524565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe59061459a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661100d612316565b73ffffffffffffffffffffffffffffffffffffffff16148061103c575061103b81611036612316565b61216a565b5b61107b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107290614455565b60405180910390fd5b61108683838361231e565b505050565b6110936123d0565b600b60009054906101000a900460ff16156110ad57600080fd5b80600a90816110bc9190614766565b506001600b60006101000a81548160ff02191690831515021790555050565b60008054905090565b6110ef83838361244e565b505050565b60006110ff83611699565b8210611140576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113790614884565b60405180910390fd5b600061114a6110db565b905060008060005b838110156112ae576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461124457806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361129a5786840361128b5781955050505050506112ea565b8380611296906148a4565b9450505b5080806112a6906148a4565b915050611152565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e190614938565b60405180910390fd5b92915050565b6112f86123d0565b601060149054906101000a900460ff1615601060146101000a81548160ff021916908315150217905550565b600d5481565b6113326123d0565b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561137d573d6000803e3d6000fd5b5050565b61139c83838360405180602001604052806000815250611f94565b505050565b600f5481565b6113af6123d0565b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114059190613bb8565b602060405180830381865afa158015611422573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611446919061496d565b6040518363ffffffff1660e01b815260040161146392919061499a565b6020604051808303816000875af1158015611482573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a691906144c1565b5050565b60006114b46110db565b82106114f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ec90614a0f565b60405180910390fd5b819050919050565b6115056123d0565b61150e81612a05565b50565b601060149054906101000a900460ff1681565b600061152f82612a18565b600001519050919050565b600a80546115479061451d565b80601f01602080910402602001604051908101604052809291908181526020018280546115739061451d565b80156115c05780601f10611595576101008083540402835291602001916115c0565b820191906000526020600020905b8154815290600101906020018083116115a357829003601f168201915b505050505081565b600c5481565b600e5481565b6060600380546115e39061451d565b80601f016020809104026020016040519081016040528092919081815260200182805461160f9061451d565b801561165c5780601f106116315761010080835404028352916020019161165c565b820191906000526020600020905b81548152906001019060200180831161163f57829003601f168201915b5050505050905090565b6000828260405160200161167b929190614a77565b60405160208183030381529060405280519060200120905092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611709576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170090614aef565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6117896123d0565b6117936000612c1b565b565b61179d6123d0565b600060038111156117b1576117b0613f2d565b5b8160038111156117c4576117c3613f2d565b5b036117ce57600080fd5b80601060156101000a81548160ff021916908360038111156117f3576117f2613f2d565b5b021790555050565b6118036123d0565b6000600381111561181757611816613f2d565b5b601060159054906101000a900460ff16600381111561183957611838613f2d565b5b14611879576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118709061429b565b60405180910390fd5b600d54816118856110db565b61188f91906142bb565b11156118d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c79061433b565b60405180910390fd5b6118da3382612281565b50565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546119169061451d565b80601f01602080910402602001604051908101604052809291908181526020018280546119429061451d565b801561198f5780601f106119645761010080835404028352916020019161198f565b820191906000526020600020905b81548152906001019060200180831161197257829003601f168201915b5050505050905090565b601060159054906101000a900460ff1681565b6119b4612316565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1890614455565b60405180910390fd5b8060076000611a2e612316565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611adb612316565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b209190613a51565b60405180910390a35050565b60016003811115611b4057611b3f613f2d565b5b601060159054906101000a900460ff166003811115611b6257611b61613f2d565b5b148015611b7c5750601060149054906101000a900460ff16155b611bbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb29061429b565b60405180910390fd5b600d5481611bc76110db565b611bd191906142bb565b1115611c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c099061433b565b60405180910390fd5b83611c1d3330611666565b14611c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5490614b5b565b60405180910390fd5b611cab8484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612ce1565b611cea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce190614bc7565b60405180910390fd5b600f5481601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d3891906142bb565b1115611d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d70906143a7565b60405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1603611e41573481600e54611dfb91906143c7565b1115611e3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3390614455565b60405180910390fd5b611ef6565b60007f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290508073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330600e5486611e9291906143c7565b6040518463ffffffff1660e01b8152600401611eb093929190614475565b6020604051808303816000875af1158015611ecf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef391906144c1565b50505b80601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f4191906142bb565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611f8e3382612281565b50505050565b611f9f84848461244e565b611fab84848484612d56565b611fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe190614c33565b60405180910390fd5b50505050565b6060611ffb82612309565b61203a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203190614c33565b60405180910390fd5b6000600380546120499061451d565b9050116120655760405180602001604052806000815250612091565b600361207083612edd565b604051602001612081929190614d12565b6040516020818303038152906040525b9050919050565b60085481565b6120a66123d0565b7f000000000000000000000000084b1c3c81545d370f3634392de611caabff814873ffffffffffffffffffffffffffffffffffffffff1663c47f0027826040518263ffffffff1660e01b81526004016120ff9190613afc565b6020604051808303816000875af115801561211e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121429190614d4b565b5050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122066123d0565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226c90614dea565b60405180910390fd5b61227e81612c1b565b50565b61229b82826040518060200160405280600081525061303d565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6123d8612316565b73ffffffffffffffffffffffffffffffffffffffff166123f66118dd565b73ffffffffffffffffffffffffffffffffffffffff161461244c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244390614e56565b60405180910390fd5b565b600061245982612a18565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612480612316565b73ffffffffffffffffffffffffffffffffffffffff1614806124dc57506124a5612316565b73ffffffffffffffffffffffffffffffffffffffff166124c484610eee565b73ffffffffffffffffffffffffffffffffffffffff16145b806124f857506124f782600001516124f2612316565b61216a565b5b90508061253a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253190614455565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146125ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a39061459a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361261b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261290614aef565b60405180910390fd5b612628858585600161351b565b612638600084846000015161231e565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166126a69190614e92565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff1661274a9190614ed6565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600060018461285091906142bb565b9050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612995576128c581612309565b15612994576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506004600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129fd8686866001613521565b505050505050565b8060039081612a149190614766565b5050565b612a206138ca565b612a2982612309565b612a68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5f90614f66565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000328310612acc5760017f000000000000000000000000000000000000000000000000000000000000003284612abf9190614f86565b612ac991906142bb565b90505b60008390505b818110612bda576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612bc657809350505050612c16565b508080612bd290614fba565b915050612ad2565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0d9061459a565b60405180910390fd5b919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612cfe82612cf085613527565b61355790919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b6000612d778473ffffffffffffffffffffffffffffffffffffffff1661357e565b15612ed0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612da0612316565b8786866040518563ffffffff1660e01b8152600401612dc29493929190615038565b6020604051808303816000875af1925050508015612dfe57506040513d601f19601f82011682018060405250810190612dfb9190615099565b60015b612e80573d8060008114612e2e576040519150601f19603f3d011682016040523d82523d6000602084013e612e33565b606091505b506000815103612e78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6f90614c33565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ed5565b600190505b949350505050565b606060008203612f24576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613038565b600082905060005b60008214612f56578080612f3f906148a4565b915050600a82612f4f919061396c565b9150612f2c565b60008167ffffffffffffffff811115612f7257612f71613c49565b5b6040519080825280601f01601f191660200182016040528015612fa45781602001600182028036833780820191505090505b5090505b6000851461303157600182612fbd9190614f86565b9150600a85612fcc91906150c6565b6030612fd891906142bb565b60f81b818381518110612fee57612fed6150f7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561302a919061396c565b9450612fa8565b8093505050505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036130b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a990614aef565b60405180910390fd5b6130bb81612309565b156130fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f290614455565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000003283111561315e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131559061433b565b60405180910390fd5b61316b600085838661351b565b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516132689190614ed6565b6fffffffffffffffffffffffffffffffff16815260200185836020015161328f9190614ed6565b6fffffffffffffffffffffffffffffffff16815250600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b858110156134fe57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461349e6000888488612d56565b6134dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134d490614c33565b60405180910390fd5b81806134e8906148a4565b92505080806134f6906148a4565b91505061342d565b50806000819055506135136000878588613521565b505050505050565b50505050565b50505050565b60008160405160200161353a9190615193565b604051602081830303815290604052805190602001209050919050565b600080600061356685856135a1565b91509150613573816135f2565b819250505092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008060418351036135e25760008060006020860151925060408601519150606086015160001a90506135d6878285856137be565b945094505050506135eb565b60006002915091505b9250929050565b6000600481111561360657613605613f2d565b5b81600481111561361957613618613f2d565b5b03156137bb576001600481111561363357613632613f2d565b5b81600481111561364657613645613f2d565b5b03613686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161367d90615205565b60405180910390fd5b6002600481111561369a57613699613f2d565b5b8160048111156136ad576136ac613f2d565b5b036136ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136e490615271565b60405180910390fd5b6003600481111561370157613700613f2d565b5b81600481111561371457613713613f2d565b5b03613754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161374b90615303565b60405180910390fd5b60048081111561376757613766613f2d565b5b81600481111561377a57613779613f2d565b5b036137ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137b190615395565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156137f95760006003915091506138c1565b601b8560ff16141580156138115750601c8560ff1614155b156138235760006004915091506138c1565b60006001878787876040516000815260200160405260405161384894939291906153d1565b6020604051602081039080840390855afa15801561386a573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036138b8576000600192509250506138c1565b80600092509250505b94509492505050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061397782613904565b915061398283613904565b9250826139925761399161390e565b5b828204905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6139e6816139b1565b81146139f157600080fd5b50565b600081359050613a03816139dd565b92915050565b600060208284031215613a1f57613a1e6139a7565b5b6000613a2d848285016139f4565b91505092915050565b60008115159050919050565b613a4b81613a36565b82525050565b6000602082019050613a666000830184613a42565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613aa6578082015181840152602081019050613a8b565b60008484015250505050565b6000601f19601f8301169050919050565b6000613ace82613a6c565b613ad88185613a77565b9350613ae8818560208601613a88565b613af181613ab2565b840191505092915050565b60006020820190508181036000830152613b168184613ac3565b905092915050565b613b2781613904565b8114613b3257600080fd5b50565b600081359050613b4481613b1e565b92915050565b600060208284031215613b6057613b5f6139a7565b5b6000613b6e84828501613b35565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613ba282613b77565b9050919050565b613bb281613b97565b82525050565b6000602082019050613bcd6000830184613ba9565b92915050565b613bdc81613b97565b8114613be757600080fd5b50565b600081359050613bf981613bd3565b92915050565b60008060408385031215613c1657613c156139a7565b5b6000613c2485828601613bea565b9250506020613c3585828601613b35565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613c8182613ab2565b810181811067ffffffffffffffff82111715613ca057613c9f613c49565b5b80604052505050565b6000613cb361399d565b9050613cbf8282613c78565b919050565b600067ffffffffffffffff821115613cdf57613cde613c49565b5b613ce882613ab2565b9050602081019050919050565b82818337600083830152505050565b6000613d17613d1284613cc4565b613ca9565b905082815260208101848484011115613d3357613d32613c44565b5b613d3e848285613cf5565b509392505050565b600082601f830112613d5b57613d5a613c3f565b5b8135613d6b848260208601613d04565b91505092915050565b600060208284031215613d8a57613d896139a7565b5b600082013567ffffffffffffffff811115613da857613da76139ac565b5b613db484828501613d46565b91505092915050565b613dc681613904565b82525050565b6000602082019050613de16000830184613dbd565b92915050565b600080600060608486031215613e0057613dff6139a7565b5b6000613e0e86828701613bea565b9350506020613e1f86828701613bea565b9250506040613e3086828701613b35565b9150509250925092565b600060208284031215613e5057613e4f6139a7565b5b6000613e5e84828501613bea565b91505092915050565b60008060408385031215613e7e57613e7d6139a7565b5b6000613e8c85828601613bea565b9250506020613e9d85828601613bea565b9150509250929050565b6000819050919050565b613eba81613ea7565b82525050565b6000602082019050613ed56000830184613eb1565b92915050565b60048110613ee857600080fd5b50565b600081359050613efa81613edb565b92915050565b600060208284031215613f1657613f156139a7565b5b6000613f2484828501613eeb565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110613f6d57613f6c613f2d565b5b50565b6000819050613f7e82613f5c565b919050565b6000613f8e82613f70565b9050919050565b613f9e81613f83565b82525050565b6000602082019050613fb96000830184613f95565b92915050565b613fc881613a36565b8114613fd357600080fd5b50565b600081359050613fe581613fbf565b92915050565b60008060408385031215614002576140016139a7565b5b600061401085828601613bea565b925050602061402185828601613fd6565b9150509250929050565b61403481613ea7565b811461403f57600080fd5b50565b6000813590506140518161402b565b92915050565b600080fd5b600080fd5b60008083601f84011261407757614076613c3f565b5b8235905067ffffffffffffffff81111561409457614093614057565b5b6020830191508360018202830111156140b0576140af61405c565b5b9250929050565b600080600080606085870312156140d1576140d06139a7565b5b60006140df87828801614042565b945050602085013567ffffffffffffffff811115614100576140ff6139ac565b5b61410c87828801614061565b9350935050604061411f87828801613b35565b91505092959194509250565b600067ffffffffffffffff82111561414657614145613c49565b5b61414f82613ab2565b9050602081019050919050565b600061416f61416a8461412b565b613ca9565b90508281526020810184848401111561418b5761418a613c44565b5b614196848285613cf5565b509392505050565b600082601f8301126141b3576141b2613c3f565b5b81356141c384826020860161415c565b91505092915050565b600080600080608085870312156141e6576141e56139a7565b5b60006141f487828801613bea565b945050602061420587828801613bea565b935050604061421687828801613b35565b925050606085013567ffffffffffffffff811115614237576142366139ac565b5b6142438782880161419e565b91505092959194509250565b7f7300000000000000000000000000000000000000000000000000000000000000600082015250565b6000614285600183613a77565b91506142908261424f565b602082019050919050565b600060208201905081810360008301526142b481614278565b9050919050565b60006142c682613904565b91506142d183613904565b92508282019050808211156142e9576142e861393d565b5b92915050565b7f6d00000000000000000000000000000000000000000000000000000000000000600082015250565b6000614325600183613a77565b9150614330826142ef565b602082019050919050565b6000602082019050818103600083015261435481614318565b9050919050565b7f6c00000000000000000000000000000000000000000000000000000000000000600082015250565b6000614391600183613a77565b915061439c8261435b565b602082019050919050565b600060208201905081810360008301526143c081614384565b9050919050565b60006143d282613904565b91506143dd83613904565b92508282026143eb81613904565b915082820484148315176144025761440161393d565b5b5092915050565b7f6100000000000000000000000000000000000000000000000000000000000000600082015250565b600061443f600183613a77565b915061444a82614409565b602082019050919050565b6000602082019050818103600083015261446e81614432565b9050919050565b600060608201905061448a6000830186613ba9565b6144976020830185613ba9565b6144a46040830184613dbd565b949350505050565b6000815190506144bb81613fbf565b92915050565b6000602082840312156144d7576144d66139a7565b5b60006144e5848285016144ac565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061453557607f821691505b602082108103614548576145476144ee565b5b50919050565b7f6f00000000000000000000000000000000000000000000000000000000000000600082015250565b6000614584600183613a77565b915061458f8261454e565b602082019050919050565b600060208201905081810360008301526145b381614577565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261461c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826145df565b61462686836145df565b95508019841693508086168417925050509392505050565b6000819050919050565b600061466361465e61465984613904565b61463e565b613904565b9050919050565b6000819050919050565b61467d83614648565b6146916146898261466a565b8484546145ec565b825550505050565b600090565b6146a6614699565b6146b1818484614674565b505050565b5b818110156146d5576146ca60008261469e565b6001810190506146b7565b5050565b601f82111561471a576146eb816145ba565b6146f4846145cf565b81016020851015614703578190505b61471761470f856145cf565b8301826146b6565b50505b505050565b600082821c905092915050565b600061473d6000198460080261471f565b1980831691505092915050565b6000614756838361472c565b9150826002028217905092915050565b61476f82613a6c565b67ffffffffffffffff81111561478857614787613c49565b5b614792825461451d565b61479d8282856146d9565b600060209050601f8311600181146147d057600084156147be578287015190505b6147c8858261474a565b865550614830565b601f1984166147de866145ba565b60005b82811015614806578489015182556001820191506020850194506020810190506147e1565b86831015614823578489015161481f601f89168261472c565b8355505b6001600288020188555050505b505050505050565b7f6200000000000000000000000000000000000000000000000000000000000000600082015250565b600061486e600183613a77565b915061487982614838565b602082019050919050565b6000602082019050818103600083015261489d81614861565b9050919050565b60006148af82613904565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148e1576148e061393d565b5b600182019050919050565b7f7500000000000000000000000000000000000000000000000000000000000000600082015250565b6000614922600183613a77565b915061492d826148ec565b602082019050919050565b6000602082019050818103600083015261495181614915565b9050919050565b60008151905061496781613b1e565b92915050565b600060208284031215614983576149826139a7565b5b600061499184828501614958565b91505092915050565b60006040820190506149af6000830185613ba9565b6149bc6020830184613dbd565b9392505050565b7f6700000000000000000000000000000000000000000000000000000000000000600082015250565b60006149f9600183613a77565b9150614a04826149c3565b602082019050919050565b60006020820190508181036000830152614a28816149ec565b9050919050565b60008160601b9050919050565b6000614a4782614a2f565b9050919050565b6000614a5982614a3c565b9050919050565b614a71614a6c82613b97565b614a4e565b82525050565b6000614a838285614a60565b601482019150614a938284614a60565b6014820191508190509392505050565b7f3000000000000000000000000000000000000000000000000000000000000000600082015250565b6000614ad9600183613a77565b9150614ae482614aa3565b602082019050919050565b60006020820190508181036000830152614b0881614acc565b9050919050565b7f6900000000000000000000000000000000000000000000000000000000000000600082015250565b6000614b45600183613a77565b9150614b5082614b0f565b602082019050919050565b60006020820190508181036000830152614b7481614b38565b9050919050565b7f6600000000000000000000000000000000000000000000000000000000000000600082015250565b6000614bb1600183613a77565b9150614bbc82614b7b565b602082019050919050565b60006020820190508181036000830152614be081614ba4565b9050919050565b7f7a00000000000000000000000000000000000000000000000000000000000000600082015250565b6000614c1d600183613a77565b9150614c2882614be7565b602082019050919050565b60006020820190508181036000830152614c4c81614c10565b9050919050565b600081905092915050565b60008154614c6b8161451d565b614c758186614c53565b94506001821660008114614c905760018114614ca557614cd8565b60ff1983168652811515820286019350614cd8565b614cae856145ba565b60005b83811015614cd057815481890152600182019150602081019050614cb1565b838801955050505b50505092915050565b6000614cec82613a6c565b614cf68185614c53565b9350614d06818560208601613a88565b80840191505092915050565b6000614d1e8285614c5e565b9150614d2a8284614ce1565b91508190509392505050565b600081519050614d458161402b565b92915050565b600060208284031215614d6157614d606139a7565b5b6000614d6f84828501614d36565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614dd4602683613a77565b9150614ddf82614d78565b604082019050919050565b60006020820190508181036000830152614e0381614dc7565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614e40602083613a77565b9150614e4b82614e0a565b602082019050919050565b60006020820190508181036000830152614e6f81614e33565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6000614e9d82614e76565b9150614ea883614e76565b925082820390506fffffffffffffffffffffffffffffffff811115614ed057614ecf61393d565b5b92915050565b6000614ee182614e76565b9150614eec83614e76565b925082820190506fffffffffffffffffffffffffffffffff811115614f1457614f1361393d565b5b92915050565b7f7400000000000000000000000000000000000000000000000000000000000000600082015250565b6000614f50600183613a77565b9150614f5b82614f1a565b602082019050919050565b60006020820190508181036000830152614f7f81614f43565b9050919050565b6000614f9182613904565b9150614f9c83613904565b9250828203905081811115614fb457614fb361393d565b5b92915050565b6000614fc582613904565b915060008203614fd857614fd761393d565b5b600182039050919050565b600081519050919050565b600082825260208201905092915050565b600061500a82614fe3565b6150148185614fee565b9350615024818560208601613a88565b61502d81613ab2565b840191505092915050565b600060808201905061504d6000830187613ba9565b61505a6020830186613ba9565b6150676040830185613dbd565b81810360608301526150798184614fff565b905095945050505050565b600081519050615093816139dd565b92915050565b6000602082840312156150af576150ae6139a7565b5b60006150bd84828501615084565b91505092915050565b60006150d182613904565b91506150dc83613904565b9250826150ec576150eb61390e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b600061515c601c83614c53565b915061516782615126565b601c82019050919050565b6000819050919050565b61518d61518882613ea7565b615172565b82525050565b600061519e8261514f565b91506151aa828461517c565b60208201915081905092915050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006151ef601883613a77565b91506151fa826151b9565b602082019050919050565b6000602082019050818103600083015261521e816151e2565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b600061525b601f83613a77565b915061526682615225565b602082019050919050565b6000602082019050818103600083015261528a8161524e565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006152ed602283613a77565b91506152f882615291565b604082019050919050565b6000602082019050818103600083015261531c816152e0565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061537f602283613a77565b915061538a82615323565b604082019050919050565b600060208201905081810360008301526153ae81615372565b9050919050565b600060ff82169050919050565b6153cb816153b5565b82525050565b60006080820190506153e66000830187613eb1565b6153f360208301866153c2565b6154006040830185613eb1565b61540d6060830184613eb1565b9594505050505056fea2646970667358221220b07128e9715407934b6a3945a43d1917698e62372d14f9204c0d9c10b86d9b5a64736f6c63430008110033

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

000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000000000000000032000000000000000000000000a1e4320d53bd7d5884be548f0ccb95b8b4732e8b000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000c4879706572204a656c6c797a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d4f544845525348495000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Hyper Jellyz
Arg [1] : _symbol (string): MOTHERSHIP
Arg [2] : _maxPossibleSupply (uint256): 10000
Arg [3] : _mintPrice (uint256): 10000000000000000
Arg [4] : _allowListMintPrice (uint256): 10000000000000000
Arg [5] : _maxAllowedMints (uint256): 50
Arg [6] : _signerAddress (address): 0xA1E4320D53BD7d5884Be548f0CCb95B8B4732e8b
Arg [7] : _currency (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [8] : _wrappedNativeCoinAddress (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2

-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [2] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [3] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [4] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000032
Arg [6] : 000000000000000000000000a1e4320d53bd7d5884be548f0ccb95b8b4732e8b
Arg [7] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [8] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [9] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [10] : 4879706572204a656c6c797a0000000000000000000000000000000000000000
Arg [11] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [12] : 4d4f544845525348495000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

55888:4560:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59728:33;59751:9;;59739;:21;;;;:::i;:::-;59728:10;:33::i;:::-;55888:4560;;;;;37874:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39502:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41221:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40832:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57529:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36427:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42028:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37057:745;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57239:70;;;;;;;;;;;;;:::i;:::-;;56052:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60137:134;;;;;;;;;;;;;:::i;:::-;;42261:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56127:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60277:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36604:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57706:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56285:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39311:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55969:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56023;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56089:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40339:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59973:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38310:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52259:103;;;;;;;;;;;;;:::i;:::-;;57807:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57315:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51611:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39671:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56484:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41463:263;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57956:860;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42509:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39846:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46854:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59556:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56164:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41797:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58822:728;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52517:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58822:728;58899:17;58885:31;;;;;;;;:::i;:::-;;:10;;;;;;;;;;;:31;;;;;;;;:::i;:::-;;;:42;;;;;58921:6;;;;;;;;;;;58920:7;58885:42;58877:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;58974:17;;58964:6;58948:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:43;;58940:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;59057:15;;59047:6;59012:20;:32;59033:10;59012:32;;;;;;;;;;;;;;;;:41;;;;:::i;:::-;:60;;59004:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;59103:24;59091:36;;:8;:36;;;59087:240;;59168:9;59158:6;59146:9;;:18;;;;:::i;:::-;:31;;59138:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;59087:240;;;59206:16;59232:8;59206:35;;59250:9;:22;;;59273:10;59293:4;59309:9;;59300:6;:18;;;;:::i;:::-;59250:69;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;59197:130;59087:240;59405:6;59370:20;:32;59391:10;59370:32;;;;;;;;;;;;;;;;:41;;;;:::i;:::-;59335:20;:32;59356:10;59335:32;;;;;;;;;;;;;;;:76;;;;59418:29;59428:10;59440:6;59418:9;:29::i;:::-;59477:17;;59460:13;:11;:13::i;:::-;:34;59456:89;;59518:19;59505:10;;:32;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;59456:89;58822:728;:::o;37874:372::-;37976:4;38028:25;38013:40;;;:11;:40;;;;:105;;;;38085:33;38070:48;;;:11;:48;;;;38013:105;:172;;;;38150:35;38135:50;;;:11;:50;;;;38013:172;:225;;;;38202:36;38226:11;38202:23;:36::i;:::-;38013:225;37993:245;;37874:372;;;:::o;39502:100::-;39556:13;39589:5;39582:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39502:100;:::o;41221:170::-;41289:7;41317:16;41325:7;41317;:16::i;:::-;41309:30;;;;;;;;;;;;:::i;:::-;;;;;;;;;41359:15;:24;41375:7;41359:24;;;;;;;;;;;;;;;;;;;;;41352:31;;41221:170;;;:::o;40832:323::-;40905:13;40921:23;40936:7;40921:14;:23::i;:::-;40905:39;;40969:5;40963:11;;:2;:11;;;40955:25;;;;;;;;;;;;:::i;:::-;;;;;;;;;41031:5;41015:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;41040:37;41057:5;41064:12;:10;:12::i;:::-;41040:16;:37::i;:::-;41015:62;40993:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;41119:28;41128:2;41132:7;41141:5;41119:8;:28::i;:::-;40894:261;40832:323;;:::o;57529:171::-;51497:13;:11;:13::i;:::-;57619::::1;;;;;;;;;;;57618:14;57610:23;;;::::0;::::1;;57653:14;57640:10;:27;;;;;;:::i;:::-;;57690:4;57674:13;;:20;;;;;;;;;;;;;;;;;;57529:171:::0;:::o;36427:100::-;36480:7;36507:12;;36500:19;;36427:100;:::o;42028:162::-;42154:28;42164:4;42170:2;42174:7;42154:9;:28::i;:::-;42028:162;;;:::o;37057:745::-;37146:7;37182:16;37192:5;37182:9;:16::i;:::-;37174:5;:24;37166:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;37215:22;37240:13;:11;:13::i;:::-;37215:38;;37264:19;37298:25;37352:9;37347:426;37371:14;37367:1;:18;37347:426;;;37407:31;37441:11;:14;37453:1;37441:14;;;;;;;;;;;37407:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37500:1;37474:28;;:9;:14;;;:28;;;37470:103;;37543:9;:14;;;37523:34;;37470:103;37612:5;37591:26;;:17;:26;;;37587:175;;37657:5;37642:11;:20;37638:77;;37694:1;37687:8;;;;;;;;;37638:77;37733:13;;;;;:::i;:::-;;;;37587:175;37392:381;37387:3;;;;;:::i;:::-;;;;37347:426;;;;37783:11;;;;;;;;;;:::i;:::-;;;;;;;;37057:745;;;;;:::o;57239:70::-;51497:13;:11;:13::i;:::-;57297:6:::1;;;;;;;;;;;57296:7;57287:6;;:16;;;;;;;;;;;;;;;;;;57239:70::o:0;56052:32::-;;;;:::o;60137:134::-;51497:13;:11;:13::i;:::-;60185:12:::1;60200:21;60185:36;;60236:10;60228:28;;:37;60257:7;60228:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;60178:93;60137:134::o:0;42261:177::-;42391:39;42408:4;42414:2;42418:7;42391:39;;;;;;;;;;;;:16;:39::i;:::-;42261:177;;;:::o;56127:30::-;;;;:::o;60277:168::-;51497:13;:11;:13::i;:::-;60358:12:::1;60351:29;;;60381:10;60400:12;60393:30;;;60432:4;60393:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60351:88;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;60277:168:::0;:::o;36604:153::-;36671:7;36707:13;:11;:13::i;:::-;36699:5;:21;36691:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;36744:5;36737:12;;36604:153;;;:::o;57706:93::-;51497:13;:11;:13::i;:::-;57773:20:::1;57785:7;57773:11;:20::i;:::-;57706:93:::0;:::o;56285:18::-;;;;;;;;;;;;;:::o;39311:124::-;39375:7;39402:20;39414:7;39402:11;:20::i;:::-;:25;;;39395:32;;39311:124;;;:::o;55969:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56023:::-;;;;:::o;56089:33::-;;;;:::o;40339:97::-;40387:13;40420:8;40413:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40339:97;:::o;59973:158::-;60053:7;60103:6;60111:12;60086:38;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60076:49;;;;;;60069:56;;59973:158;;;;:::o;38310:179::-;38374:7;38419:1;38402:19;;:5;:19;;;38394:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;38453:12;:19;38466:5;38453:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;38445:36;;38438:43;;38310:179;;;:::o;52259:103::-;51497:13;:11;:13::i;:::-;52324:30:::1;52351:1;52324:18;:30::i;:::-;52259:103::o:0;57807:143::-;51497:13;:11;:13::i;:::-;57898:18:::1;57887:29;;;;;;;;:::i;:::-;;:7;:29;;;;;;;;:::i;:::-;;::::0;57879:38:::1;;;::::0;::::1;;57937:7;57924:10;;:20;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;57807:143:::0;:::o;57315:208::-;51497:13;:11;:13::i;:::-;57391:18:::1;57377:32;;;;;;;;:::i;:::-;;:10;;;;;;;;;;;:32;;;;;;;;:::i;:::-;;;57369:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;57456:17;;57446:6;57430:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:43;;57422:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;57488:29;57498:10;57510:6;57488:9;:29::i;:::-;57315:208:::0;:::o;51611:87::-;51657:7;51684:6;;;;;;;;;;;51677:13;;51611:87;:::o;39671:104::-;39727:13;39760:7;39753:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39671:104;:::o;56484:49::-;;;;;;;;;;;;;:::o;41463:263::-;41570:12;:10;:12::i;:::-;41558:24;;:8;:24;;;41550:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;41646:8;41601:18;:32;41620:12;:10;:12::i;:::-;41601:32;;;;;;;;;;;;;;;:42;41634:8;41601:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;41699:8;41670:48;;41685:12;:10;:12::i;:::-;41670:48;;;41709:8;41670:48;;;;;;:::i;:::-;;;;;;;;41463:263;;:::o;57956:860::-;58103:20;58089:34;;;;;;;;:::i;:::-;;:10;;;;;;;;;;;:34;;;;;;;;:::i;:::-;;;:45;;;;;58128:6;;;;;;;;;;;58127:7;58089:45;58081:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;58181:17;;58171:6;58155:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:43;;58147:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;58261:11;58219:38;58231:10;58251:4;58219:11;:38::i;:::-;:53;58211:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;58293:43;58313:11;58326:9;;58293:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:19;:43::i;:::-;58285:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;58402:15;;58392:6;58357:20;:32;58378:10;58357:32;;;;;;;;;;;;;;;;:41;;;;:::i;:::-;:60;;58349:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;58448:24;58436:36;;:8;:36;;;58432:258;;58522:9;58512:6;58491:18;;:27;;;;:::i;:::-;:40;;58483:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;58432:258;;;58560:16;58586:8;58560:35;;58604:9;:22;;;58627:10;58647:4;58663:18;;58654:6;:27;;;;:::i;:::-;58604:78;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;58551:139;58432:258;58768:6;58733:20;:32;58754:10;58733:32;;;;;;;;;;;;;;;;:41;;;;:::i;:::-;58698:20;:32;58719:10;58698:32;;;;;;;;;;;;;;;:76;;;;58781:29;58791:10;58803:6;58781:9;:29::i;:::-;57956:860;;;;:::o;42509:305::-;42668:28;42678:4;42684:2;42688:7;42668:9;:28::i;:::-;42729:48;42752:4;42758:2;42762:7;42771:5;42729:22;:48::i;:::-;42707:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;42509:305;;;;:::o;39846:245::-;39919:13;39953:16;39961:7;39953;:16::i;:::-;39945:30;;;;;;;;;;;;:::i;:::-;;;;;;;;;40020:1;40001:8;39995:22;;;;;:::i;:::-;;;:26;:88;;;;;;;;;;;;;;;;;40048:8;40058:18;:7;:16;:18::i;:::-;40031:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39995:88;39988:95;;39846:245;;;:::o;46854:43::-;;;;:::o;59556:132::-;51497:13;:11;:13::i;:::-;59648:19:::1;59630:46;;;59677:4;59630:52;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;59556:132:::0;:::o;56164:33::-;;;:::o;41797:164::-;41894:4;41918:18;:25;41937:5;41918:25;;;;;;;;;;;;;;;:35;41944:8;41918:35;;;;;;;;;;;;;;;;;;;;;;;;;41911:42;;41797:164;;;;:::o;52517:201::-;51497:13;:11;:13::i;:::-;52626:1:::1;52606:22;;:8;:22;;::::0;52598:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;52682:28;52701:8;52682:18;:28::i;:::-;52517:201:::0;:::o;43188:104::-;43257:27;43267:2;43271:8;43257:27;;;;;;;;;;;;:9;:27::i;:::-;43188:104;;:::o;11389:157::-;11474:4;11513:25;11498:40;;;:11;:40;;;;11491:47;;11389:157;;;:::o;43069:111::-;43126:4;43160:12;;43150:7;:22;43143:29;;43069:111;;;:::o;34153:98::-;34206:7;34233:10;34226:17;;34153:98;:::o;46650:196::-;46792:2;46765:15;:24;46781:7;46765:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;46830:7;46826:2;46810:28;;46819:5;46810:28;;;;;;;;;;;;46650:196;;;:::o;51776:132::-;51851:12;:10;:12::i;:::-;51840:23;;:7;:5;:7::i;:::-;:23;;;51832:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51776:132::o;45080:1452::-;45195:35;45233:20;45245:7;45233:11;:20::i;:::-;45195:58;;45266:22;45308:13;:18;;;45292:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;45367:12;:10;:12::i;:::-;45343:36;;:20;45355:7;45343:11;:20::i;:::-;:36;;;45292:87;:154;;;;45396:50;45413:13;:18;;;45433:12;:10;:12::i;:::-;45396:16;:50::i;:::-;45292:154;45266:181;;45468:17;45460:31;;;;;;;;;;;;:::i;:::-;;;;;;;;;45534:4;45512:26;;:13;:18;;;:26;;;45504:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;45577:1;45563:16;;:2;:16;;;45555:30;;;;;;;;;;;;:::i;:::-;;;;;;;;;45598:43;45620:4;45626:2;45630:7;45639:1;45598:21;:43::i;:::-;45706:49;45723:1;45727:7;45736:13;:18;;;45706:8;:49::i;:::-;45798:1;45768:12;:18;45781:4;45768:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;45838:1;45810:12;:16;45823:2;45810:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;45873:43;;;;;;;;45888:2;45873:43;;;;;;45899:15;45873:43;;;;;45850:11;:20;45862:7;45850:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46156:19;46188:1;46178:7;:11;;;;:::i;:::-;46156:33;;46245:1;46204:43;;:11;:24;46216:11;46204:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;46200:227;;46268:20;46276:11;46268:7;:20::i;:::-;46264:152;;;46336:64;;;;;;;;46351:13;:18;;;46336:64;;;;;;46371:13;:28;;;46336:64;;;;;46309:11;:24;46321:11;46309:24;;;;;;;;;;;:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46264:152;46200:227;46463:7;46459:2;46444:27;;46453:4;46444:27;;;;;;;;;;;;46482:42;46503:4;46509:2;46513:7;46522:1;46482:20;:42::i;:::-;45184:1348;;;45080:1452;;;:::o;40666:100::-;40750:8;40739;:19;;;;;;:::i;:::-;;40666:100;:::o;38686:563::-;38747:21;;:::i;:::-;38789:16;38797:7;38789;:16::i;:::-;38781:30;;;;;;;;;;;;:::i;:::-;;;;;;;;;38824:26;38876:12;38865:7;:23;38861:103;;38951:1;38936:12;38926:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;38905:47;;38861:103;38981:12;38996:7;38981:22;;38976:242;39013:18;39005:4;:26;38976:242;;39056:31;39090:11;:17;39102:4;39090:17;;;;;;;;;;;39056:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39152:1;39126:28;;:9;:14;;;:28;;;39122:85;;39182:9;39175:16;;;;;;;39122:85;39041:177;39033:6;;;;;:::i;:::-;;;;38976:242;;;;39230:11;;;;;;;;;;:::i;:::-;;;;;;;;38686:563;;;;:::o;52878:191::-;52952:16;52971:6;;;;;;;;;;;52952:25;;52997:8;52988:6;;:17;;;;;;;;;;;;;;;;;;53052:8;53021:40;;53042:8;53021:40;;;;;;;;;;;;52941:128;52878:191;:::o;59773:194::-;59869:4;59906:55;59951:9;59906:36;:11;:34;:36::i;:::-;:44;;:55;;;;:::i;:::-;59889:72;;:13;;;;;;;;;;;:72;;;59882:79;;59773:194;;;;:::o;48400:754::-;48555:4;48576:15;:2;:13;;;:15::i;:::-;48572:575;;;48628:2;48612:36;;;48649:12;:10;:12::i;:::-;48663:4;48669:7;48678:5;48612:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;48608:484;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48875:1;48858:6;:13;:18;48854:223;;48901:11;;;;;;;;;;:::i;:::-;;;;;;;;48854:223;49027:6;49021:13;49012:6;49008:2;49004:15;48997:38;48608:484;48745:45;;;48735:55;;;:6;:55;;;;48728:62;;;;;48572:575;49131:4;49124:11;;48400:754;;;;;;;:::o;19555:723::-;19611:13;19841:1;19832:5;:10;19828:53;;19859:10;;;;;;;;;;;;;;;;;;;;;19828:53;19891:12;19906:5;19891:20;;19922:14;19947:78;19962:1;19954:4;:9;19947:78;;19980:8;;;;;:::i;:::-;;;;20011:2;20003:10;;;;;:::i;:::-;;;19947:78;;;20035:19;20067:6;20057:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20035:39;;20085:154;20101:1;20092:5;:10;20085:154;;20129:1;20119:11;;;;;:::i;:::-;;;20196:2;20188:5;:10;;;;:::i;:::-;20175:2;:24;;;;:::i;:::-;20162:39;;20145:6;20152;20145:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;20225:2;20216:11;;;;;:::i;:::-;;;20085:154;;;20263:6;20249:21;;;;;19555:723;;;;:::o;43569:1257::-;43692:20;43715:12;;43692:35;;43760:1;43746:16;;:2;:16;;;43738:30;;;;;;;;;;;;:::i;:::-;;;;;;;;;43913:21;43921:12;43913:7;:21::i;:::-;43912:22;43904:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;43971:12;43959:8;:24;;43951:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;44002:61;44032:1;44036:2;44040:12;44054:8;44002:21;:61::i;:::-;44076:30;44109:12;:16;44122:2;44109:16;;;;;;;;;;;;;;;44076:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44155:135;;;;;;;;44211:8;44181:11;:19;;;:39;;;;:::i;:::-;44155:135;;;;;;44270:8;44235:11;:24;;;:44;;;;:::i;:::-;44155:135;;;;;44136:12;:16;44149:2;44136:16;;;;;;;;;;;;;;;:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44329:43;;;;;;;;44344:2;44329:43;;;;;;44355:15;44329:43;;;;;44301:11;:25;44313:12;44301:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44385:20;44408:12;44385:35;;44438:9;44433:275;44457:8;44453:1;:12;44433:275;;;44517:12;44513:2;44492:38;;44509:1;44492:38;;;;;;;;;;;;44571:59;44602:1;44606:2;44610:12;44624:5;44571:22;:59::i;:::-;44545:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;44682:14;;;;;:::i;:::-;;;;44467:3;;;;;:::i;:::-;;;;44433:275;;;;44735:12;44720;:27;;;;44758:60;44787:1;44791:2;44795:12;44809:8;44758:20;:60::i;:::-;43681:1145;;;43569:1257;;;:::o;49642:159::-;;;;;:::o;50213:158::-;;;;;:::o;29280:269::-;29349:7;29535:4;29482:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;29472:69;;;;;;29465:76;;29280:269;;;:::o;25478:231::-;25556:7;25577:17;25596:18;25618:27;25629:4;25635:9;25618:10;:27::i;:::-;25576:69;;;;25656:18;25668:5;25656:11;:18::i;:::-;25692:9;25685:16;;;;25478:231;;;;:::o;1233:326::-;1293:4;1550:1;1528:7;:19;;;:23;1521:30;;1233:326;;;:::o;23929:747::-;24010:7;24019:12;24068:2;24048:9;:16;:22;24044:625;;24087:9;24111;24135:7;24392:4;24381:9;24377:20;24371:27;24366:32;;24442:4;24431:9;24427:20;24421:27;24416:32;;24500:4;24489:9;24485:20;24479:27;24476:1;24471:36;24466:41;;24543:25;24554:4;24560:1;24563;24566;24543:10;:25::i;:::-;24536:32;;;;;;;;;24044:625;24617:1;24621:35;24601:56;;;;23929:747;;;;;;:::o;22200:643::-;22278:20;22269:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;22265:571;22315:7;22265:571;22376:29;22367:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;22363:473;;22422:34;;;;;;;;;;:::i;:::-;;;;;;;;22363:473;22487:35;22478:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;22474:362;;22539:41;;;;;;;;;;:::i;:::-;;;;;;;;22474:362;22611:30;22602:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;22598:238;;22658:44;;;;;;;;;;:::i;:::-;;;;;;;;22598:238;22733:30;22724:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;22720:116;;22780:44;;;;;;;;;;:::i;:::-;;;;;;;;22720:116;22200:643;;:::o;26930:1632::-;27061:7;27070:12;27995:66;27990:1;27982:10;;:79;27978:163;;;28094:1;28098:30;28078:51;;;;;;27978:163;28160:2;28155:1;:7;;;;:18;;;;;28171:2;28166:1;:7;;;;28155:18;28151:102;;;28206:1;28210:30;28190:51;;;;;;28151:102;28350:14;28367:24;28377:4;28383:1;28386;28389;28367:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28350:41;;28424:1;28406:20;;:6;:20;;;28402:103;;28459:1;28463:29;28443:50;;;;;;;28402:103;28525:6;28533:20;28517:37;;;;;26930:1632;;;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:180::-;138:77;135:1;128:88;235:4;232:1;225:15;259:4;256:1;249:15;276:180;324:77;321:1;314:88;421:4;418:1;411:15;445:4;442:1;435:15;462:185;502:1;519:20;537:1;519:20;:::i;:::-;514:25;;553:20;571:1;553:20;:::i;:::-;548:25;;592:1;582:35;;597:18;;:::i;:::-;582:35;639:1;636;632:9;627:14;;462:185;;;;:::o;653:75::-;686:6;719:2;713:9;703:19;;653:75;:::o;734:117::-;843:1;840;833:12;857:117;966:1;963;956:12;980:149;1016:7;1056:66;1049:5;1045:78;1034:89;;980:149;;;:::o;1135:120::-;1207:23;1224:5;1207:23;:::i;:::-;1200:5;1197:34;1187:62;;1245:1;1242;1235:12;1187:62;1135:120;:::o;1261:137::-;1306:5;1344:6;1331:20;1322:29;;1360:32;1386:5;1360:32;:::i;:::-;1261:137;;;;:::o;1404:327::-;1462:6;1511:2;1499:9;1490:7;1486:23;1482:32;1479:119;;;1517:79;;:::i;:::-;1479:119;1637:1;1662:52;1706:7;1697:6;1686:9;1682:22;1662:52;:::i;:::-;1652:62;;1608:116;1404:327;;;;:::o;1737:90::-;1771:7;1814:5;1807:13;1800:21;1789:32;;1737:90;;;:::o;1833:109::-;1914:21;1929:5;1914:21;:::i;:::-;1909:3;1902:34;1833:109;;:::o;1948:210::-;2035:4;2073:2;2062:9;2058:18;2050:26;;2086:65;2148:1;2137:9;2133:17;2124:6;2086:65;:::i;:::-;1948:210;;;;:::o;2164:99::-;2216:6;2250:5;2244:12;2234:22;;2164:99;;;:::o;2269:169::-;2353:11;2387:6;2382:3;2375:19;2427:4;2422:3;2418:14;2403:29;;2269:169;;;;:::o;2444:246::-;2525:1;2535:113;2549:6;2546:1;2543:13;2535:113;;;2634:1;2629:3;2625:11;2619:18;2615:1;2610:3;2606:11;2599:39;2571:2;2568:1;2564:10;2559:15;;2535:113;;;2682:1;2673:6;2668:3;2664:16;2657:27;2506:184;2444:246;;;:::o;2696:102::-;2737:6;2788:2;2784:7;2779:2;2772:5;2768:14;2764:28;2754:38;;2696:102;;;:::o;2804:377::-;2892:3;2920:39;2953:5;2920:39;:::i;:::-;2975:71;3039:6;3034:3;2975:71;:::i;:::-;2968:78;;3055:65;3113:6;3108:3;3101:4;3094:5;3090:16;3055:65;:::i;:::-;3145:29;3167:6;3145:29;:::i;:::-;3140:3;3136:39;3129:46;;2896:285;2804:377;;;;:::o;3187:313::-;3300:4;3338:2;3327:9;3323:18;3315:26;;3387:9;3381:4;3377:20;3373:1;3362:9;3358:17;3351:47;3415:78;3488:4;3479:6;3415:78;:::i;:::-;3407:86;;3187:313;;;;:::o;3506:122::-;3579:24;3597:5;3579:24;:::i;:::-;3572:5;3569:35;3559:63;;3618:1;3615;3608:12;3559:63;3506:122;:::o;3634:139::-;3680:5;3718:6;3705:20;3696:29;;3734:33;3761:5;3734:33;:::i;:::-;3634:139;;;;:::o;3779:329::-;3838:6;3887:2;3875:9;3866:7;3862:23;3858:32;3855:119;;;3893:79;;:::i;:::-;3855:119;4013:1;4038:53;4083:7;4074:6;4063:9;4059:22;4038:53;:::i;:::-;4028:63;;3984:117;3779:329;;;;:::o;4114:126::-;4151:7;4191:42;4184:5;4180:54;4169:65;;4114:126;;;:::o;4246:96::-;4283:7;4312:24;4330:5;4312:24;:::i;:::-;4301:35;;4246:96;;;:::o;4348:118::-;4435:24;4453:5;4435:24;:::i;:::-;4430:3;4423:37;4348:118;;:::o;4472:222::-;4565:4;4603:2;4592:9;4588:18;4580:26;;4616:71;4684:1;4673:9;4669:17;4660:6;4616:71;:::i;:::-;4472:222;;;;:::o;4700:122::-;4773:24;4791:5;4773:24;:::i;:::-;4766:5;4763:35;4753:63;;4812:1;4809;4802:12;4753:63;4700:122;:::o;4828:139::-;4874:5;4912:6;4899:20;4890:29;;4928:33;4955:5;4928:33;:::i;:::-;4828:139;;;;:::o;4973:474::-;5041:6;5049;5098:2;5086:9;5077:7;5073:23;5069:32;5066:119;;;5104:79;;:::i;:::-;5066:119;5224:1;5249:53;5294:7;5285:6;5274:9;5270:22;5249:53;:::i;:::-;5239:63;;5195:117;5351:2;5377:53;5422:7;5413:6;5402:9;5398:22;5377:53;:::i;:::-;5367:63;;5322:118;4973:474;;;;;:::o;5453:117::-;5562:1;5559;5552:12;5576:117;5685:1;5682;5675:12;5699:180;5747:77;5744:1;5737:88;5844:4;5841:1;5834:15;5868:4;5865:1;5858:15;5885:281;5968:27;5990:4;5968:27;:::i;:::-;5960:6;5956:40;6098:6;6086:10;6083:22;6062:18;6050:10;6047:34;6044:62;6041:88;;;6109:18;;:::i;:::-;6041:88;6149:10;6145:2;6138:22;5928:238;5885:281;;:::o;6172:129::-;6206:6;6233:20;;:::i;:::-;6223:30;;6262:33;6290:4;6282:6;6262:33;:::i;:::-;6172:129;;;:::o;6307:308::-;6369:4;6459:18;6451:6;6448:30;6445:56;;;6481:18;;:::i;:::-;6445:56;6519:29;6541:6;6519:29;:::i;:::-;6511:37;;6603:4;6597;6593:15;6585:23;;6307:308;;;:::o;6621:146::-;6718:6;6713:3;6708;6695:30;6759:1;6750:6;6745:3;6741:16;6734:27;6621:146;;;:::o;6773:425::-;6851:5;6876:66;6892:49;6934:6;6892:49;:::i;:::-;6876:66;:::i;:::-;6867:75;;6965:6;6958:5;6951:21;7003:4;6996:5;6992:16;7041:3;7032:6;7027:3;7023:16;7020:25;7017:112;;;7048:79;;:::i;:::-;7017:112;7138:54;7185:6;7180:3;7175;7138:54;:::i;:::-;6857:341;6773:425;;;;;:::o;7218:340::-;7274:5;7323:3;7316:4;7308:6;7304:17;7300:27;7290:122;;7331:79;;:::i;:::-;7290:122;7448:6;7435:20;7473:79;7548:3;7540:6;7533:4;7525:6;7521:17;7473:79;:::i;:::-;7464:88;;7280:278;7218:340;;;;:::o;7564:509::-;7633:6;7682:2;7670:9;7661:7;7657:23;7653:32;7650:119;;;7688:79;;:::i;:::-;7650:119;7836:1;7825:9;7821:17;7808:31;7866:18;7858:6;7855:30;7852:117;;;7888:79;;:::i;:::-;7852:117;7993:63;8048:7;8039:6;8028:9;8024:22;7993:63;:::i;:::-;7983:73;;7779:287;7564:509;;;;:::o;8079:118::-;8166:24;8184:5;8166:24;:::i;:::-;8161:3;8154:37;8079:118;;:::o;8203:222::-;8296:4;8334:2;8323:9;8319:18;8311:26;;8347:71;8415:1;8404:9;8400:17;8391:6;8347:71;:::i;:::-;8203:222;;;;:::o;8431:619::-;8508:6;8516;8524;8573:2;8561:9;8552:7;8548:23;8544:32;8541:119;;;8579:79;;:::i;:::-;8541:119;8699:1;8724:53;8769:7;8760:6;8749:9;8745:22;8724:53;:::i;:::-;8714:63;;8670:117;8826:2;8852:53;8897:7;8888:6;8877:9;8873:22;8852:53;:::i;:::-;8842:63;;8797:118;8954:2;8980:53;9025:7;9016:6;9005:9;9001:22;8980:53;:::i;:::-;8970:63;;8925:118;8431:619;;;;;:::o;9056:329::-;9115:6;9164:2;9152:9;9143:7;9139:23;9135:32;9132:119;;;9170:79;;:::i;:::-;9132:119;9290:1;9315:53;9360:7;9351:6;9340:9;9336:22;9315:53;:::i;:::-;9305:63;;9261:117;9056:329;;;;:::o;9391:474::-;9459:6;9467;9516:2;9504:9;9495:7;9491:23;9487:32;9484:119;;;9522:79;;:::i;:::-;9484:119;9642:1;9667:53;9712:7;9703:6;9692:9;9688:22;9667:53;:::i;:::-;9657:63;;9613:117;9769:2;9795:53;9840:7;9831:6;9820:9;9816:22;9795:53;:::i;:::-;9785:63;;9740:118;9391:474;;;;;:::o;9871:77::-;9908:7;9937:5;9926:16;;9871:77;;;:::o;9954:118::-;10041:24;10059:5;10041:24;:::i;:::-;10036:3;10029:37;9954:118;;:::o;10078:222::-;10171:4;10209:2;10198:9;10194:18;10186:26;;10222:71;10290:1;10279:9;10275:17;10266:6;10222:71;:::i;:::-;10078:222;;;;:::o;10306:114::-;10394:1;10387:5;10384:12;10374:40;;10410:1;10407;10400:12;10374:40;10306:114;:::o;10426:169::-;10487:5;10525:6;10512:20;10503:29;;10541:48;10583:5;10541:48;:::i;:::-;10426:169;;;;:::o;10601:359::-;10675:6;10724:2;10712:9;10703:7;10699:23;10695:32;10692:119;;;10730:79;;:::i;:::-;10692:119;10850:1;10875:68;10935:7;10926:6;10915:9;10911:22;10875:68;:::i;:::-;10865:78;;10821:132;10601:359;;;;:::o;10966:180::-;11014:77;11011:1;11004:88;11111:4;11108:1;11101:15;11135:4;11132:1;11125:15;11152:120;11240:1;11233:5;11230:12;11220:46;;11246:18;;:::i;:::-;11220:46;11152:120;:::o;11278:141::-;11330:7;11359:5;11348:16;;11365:48;11407:5;11365:48;:::i;:::-;11278:141;;;:::o;11425:::-;11488:9;11521:39;11554:5;11521:39;:::i;:::-;11508:52;;11425:141;;;:::o;11572:157::-;11672:50;11716:5;11672:50;:::i;:::-;11667:3;11660:63;11572:157;;:::o;11735:248::-;11841:4;11879:2;11868:9;11864:18;11856:26;;11892:84;11973:1;11962:9;11958:17;11949:6;11892:84;:::i;:::-;11735:248;;;;:::o;11989:116::-;12059:21;12074:5;12059:21;:::i;:::-;12052:5;12049:32;12039:60;;12095:1;12092;12085:12;12039:60;11989:116;:::o;12111:133::-;12154:5;12192:6;12179:20;12170:29;;12208:30;12232:5;12208:30;:::i;:::-;12111:133;;;;:::o;12250:468::-;12315:6;12323;12372:2;12360:9;12351:7;12347:23;12343:32;12340:119;;;12378:79;;:::i;:::-;12340:119;12498:1;12523:53;12568:7;12559:6;12548:9;12544:22;12523:53;:::i;:::-;12513:63;;12469:117;12625:2;12651:50;12693:7;12684:6;12673:9;12669:22;12651:50;:::i;:::-;12641:60;;12596:115;12250:468;;;;;:::o;12724:122::-;12797:24;12815:5;12797:24;:::i;:::-;12790:5;12787:35;12777:63;;12836:1;12833;12826:12;12777:63;12724:122;:::o;12852:139::-;12898:5;12936:6;12923:20;12914:29;;12952:33;12979:5;12952:33;:::i;:::-;12852:139;;;;:::o;12997:117::-;13106:1;13103;13096:12;13120:117;13229:1;13226;13219:12;13256:552;13313:8;13323:6;13373:3;13366:4;13358:6;13354:17;13350:27;13340:122;;13381:79;;:::i;:::-;13340:122;13494:6;13481:20;13471:30;;13524:18;13516:6;13513:30;13510:117;;;13546:79;;:::i;:::-;13510:117;13660:4;13652:6;13648:17;13636:29;;13714:3;13706:4;13698:6;13694:17;13684:8;13680:32;13677:41;13674:128;;;13721:79;;:::i;:::-;13674:128;13256:552;;;;;:::o;13814:817::-;13902:6;13910;13918;13926;13975:2;13963:9;13954:7;13950:23;13946:32;13943:119;;;13981:79;;:::i;:::-;13943:119;14101:1;14126:53;14171:7;14162:6;14151:9;14147:22;14126:53;:::i;:::-;14116:63;;14072:117;14256:2;14245:9;14241:18;14228:32;14287:18;14279:6;14276:30;14273:117;;;14309:79;;:::i;:::-;14273:117;14422:64;14478:7;14469:6;14458:9;14454:22;14422:64;:::i;:::-;14404:82;;;;14199:297;14535:2;14561:53;14606:7;14597:6;14586:9;14582:22;14561:53;:::i;:::-;14551:63;;14506:118;13814:817;;;;;;;:::o;14637:307::-;14698:4;14788:18;14780:6;14777:30;14774:56;;;14810:18;;:::i;:::-;14774:56;14848:29;14870:6;14848:29;:::i;:::-;14840:37;;14932:4;14926;14922:15;14914:23;;14637:307;;;:::o;14950:423::-;15027:5;15052:65;15068:48;15109:6;15068:48;:::i;:::-;15052:65;:::i;:::-;15043:74;;15140:6;15133:5;15126:21;15178:4;15171:5;15167:16;15216:3;15207:6;15202:3;15198:16;15195:25;15192:112;;;15223:79;;:::i;:::-;15192:112;15313:54;15360:6;15355:3;15350;15313:54;:::i;:::-;15033:340;14950:423;;;;;:::o;15392:338::-;15447:5;15496:3;15489:4;15481:6;15477:17;15473:27;15463:122;;15504:79;;:::i;:::-;15463:122;15621:6;15608:20;15646:78;15720:3;15712:6;15705:4;15697:6;15693:17;15646:78;:::i;:::-;15637:87;;15453:277;15392:338;;;;:::o;15736:943::-;15831:6;15839;15847;15855;15904:3;15892:9;15883:7;15879:23;15875:33;15872:120;;;15911:79;;:::i;:::-;15872:120;16031:1;16056:53;16101:7;16092:6;16081:9;16077:22;16056:53;:::i;:::-;16046:63;;16002:117;16158:2;16184:53;16229:7;16220:6;16209:9;16205:22;16184:53;:::i;:::-;16174:63;;16129:118;16286:2;16312:53;16357:7;16348:6;16337:9;16333:22;16312:53;:::i;:::-;16302:63;;16257:118;16442:2;16431:9;16427:18;16414:32;16473:18;16465:6;16462:30;16459:117;;;16495:79;;:::i;:::-;16459:117;16600:62;16654:7;16645:6;16634:9;16630:22;16600:62;:::i;:::-;16590:72;;16385:287;15736:943;;;;;;;:::o;16685:151::-;16825:3;16821:1;16813:6;16809:14;16802:27;16685:151;:::o;16842:365::-;16984:3;17005:66;17069:1;17064:3;17005:66;:::i;:::-;16998:73;;17080:93;17169:3;17080:93;:::i;:::-;17198:2;17193:3;17189:12;17182:19;;16842:365;;;:::o;17213:419::-;17379:4;17417:2;17406:9;17402:18;17394:26;;17466:9;17460:4;17456:20;17452:1;17441:9;17437:17;17430:47;17494:131;17620:4;17494:131;:::i;:::-;17486:139;;17213:419;;;:::o;17638:191::-;17678:3;17697:20;17715:1;17697:20;:::i;:::-;17692:25;;17731:20;17749:1;17731:20;:::i;:::-;17726:25;;17774:1;17771;17767:9;17760:16;;17795:3;17792:1;17789:10;17786:36;;;17802:18;;:::i;:::-;17786:36;17638:191;;;;:::o;17835:151::-;17975:3;17971:1;17963:6;17959:14;17952:27;17835:151;:::o;17992:365::-;18134:3;18155:66;18219:1;18214:3;18155:66;:::i;:::-;18148:73;;18230:93;18319:3;18230:93;:::i;:::-;18348:2;18343:3;18339:12;18332:19;;17992:365;;;:::o;18363:419::-;18529:4;18567:2;18556:9;18552:18;18544:26;;18616:9;18610:4;18606:20;18602:1;18591:9;18587:17;18580:47;18644:131;18770:4;18644:131;:::i;:::-;18636:139;;18363:419;;;:::o;18788:151::-;18928:3;18924:1;18916:6;18912:14;18905:27;18788:151;:::o;18945:365::-;19087:3;19108:66;19172:1;19167:3;19108:66;:::i;:::-;19101:73;;19183:93;19272:3;19183:93;:::i;:::-;19301:2;19296:3;19292:12;19285:19;;18945:365;;;:::o;19316:419::-;19482:4;19520:2;19509:9;19505:18;19497:26;;19569:9;19563:4;19559:20;19555:1;19544:9;19540:17;19533:47;19597:131;19723:4;19597:131;:::i;:::-;19589:139;;19316:419;;;:::o;19741:410::-;19781:7;19804:20;19822:1;19804:20;:::i;:::-;19799:25;;19838:20;19856:1;19838:20;:::i;:::-;19833:25;;19893:1;19890;19886:9;19915:30;19933:11;19915:30;:::i;:::-;19904:41;;20094:1;20085:7;20081:15;20078:1;20075:22;20055:1;20048:9;20028:83;20005:139;;20124:18;;:::i;:::-;20005:139;19789:362;19741:410;;;;:::o;20157:151::-;20297:3;20293:1;20285:6;20281:14;20274:27;20157:151;:::o;20314:365::-;20456:3;20477:66;20541:1;20536:3;20477:66;:::i;:::-;20470:73;;20552:93;20641:3;20552:93;:::i;:::-;20670:2;20665:3;20661:12;20654:19;;20314:365;;;:::o;20685:419::-;20851:4;20889:2;20878:9;20874:18;20866:26;;20938:9;20932:4;20928:20;20924:1;20913:9;20909:17;20902:47;20966:131;21092:4;20966:131;:::i;:::-;20958:139;;20685:419;;;:::o;21110:442::-;21259:4;21297:2;21286:9;21282:18;21274:26;;21310:71;21378:1;21367:9;21363:17;21354:6;21310:71;:::i;:::-;21391:72;21459:2;21448:9;21444:18;21435:6;21391:72;:::i;:::-;21473;21541:2;21530:9;21526:18;21517:6;21473:72;:::i;:::-;21110:442;;;;;;:::o;21558:137::-;21612:5;21643:6;21637:13;21628:22;;21659:30;21683:5;21659:30;:::i;:::-;21558:137;;;;:::o;21701:345::-;21768:6;21817:2;21805:9;21796:7;21792:23;21788:32;21785:119;;;21823:79;;:::i;:::-;21785:119;21943:1;21968:61;22021:7;22012:6;22001:9;21997:22;21968:61;:::i;:::-;21958:71;;21914:125;21701:345;;;;:::o;22052:180::-;22100:77;22097:1;22090:88;22197:4;22194:1;22187:15;22221:4;22218:1;22211:15;22238:320;22282:6;22319:1;22313:4;22309:12;22299:22;;22366:1;22360:4;22356:12;22387:18;22377:81;;22443:4;22435:6;22431:17;22421:27;;22377:81;22505:2;22497:6;22494:14;22474:18;22471:38;22468:84;;22524:18;;:::i;:::-;22468:84;22289:269;22238:320;;;:::o;22564:151::-;22704:3;22700:1;22692:6;22688:14;22681:27;22564:151;:::o;22721:365::-;22863:3;22884:66;22948:1;22943:3;22884:66;:::i;:::-;22877:73;;22959:93;23048:3;22959:93;:::i;:::-;23077:2;23072:3;23068:12;23061:19;;22721:365;;;:::o;23092:419::-;23258:4;23296:2;23285:9;23281:18;23273:26;;23345:9;23339:4;23335:20;23331:1;23320:9;23316:17;23309:47;23373:131;23499:4;23373:131;:::i;:::-;23365:139;;23092:419;;;:::o;23517:141::-;23566:4;23589:3;23581:11;;23612:3;23609:1;23602:14;23646:4;23643:1;23633:18;23625:26;;23517:141;;;:::o;23664:93::-;23701:6;23748:2;23743;23736:5;23732:14;23728:23;23718:33;;23664:93;;;:::o;23763:107::-;23807:8;23857:5;23851:4;23847:16;23826:37;;23763:107;;;;:::o;23876:393::-;23945:6;23995:1;23983:10;23979:18;24018:97;24048:66;24037:9;24018:97;:::i;:::-;24136:39;24166:8;24155:9;24136:39;:::i;:::-;24124:51;;24208:4;24204:9;24197:5;24193:21;24184:30;;24257:4;24247:8;24243:19;24236:5;24233:30;24223:40;;23952:317;;23876:393;;;;;:::o;24275:60::-;24303:3;24324:5;24317:12;;24275:60;;;:::o;24341:142::-;24391:9;24424:53;24442:34;24451:24;24469:5;24451:24;:::i;:::-;24442:34;:::i;:::-;24424:53;:::i;:::-;24411:66;;24341:142;;;:::o;24489:75::-;24532:3;24553:5;24546:12;;24489:75;;;:::o;24570:269::-;24680:39;24711:7;24680:39;:::i;:::-;24741:91;24790:41;24814:16;24790:41;:::i;:::-;24782:6;24775:4;24769:11;24741:91;:::i;:::-;24735:4;24728:105;24646:193;24570:269;;;:::o;24845:73::-;24890:3;24845:73;:::o;24924:189::-;25001:32;;:::i;:::-;25042:65;25100:6;25092;25086:4;25042:65;:::i;:::-;24977:136;24924:189;;:::o;25119:186::-;25179:120;25196:3;25189:5;25186:14;25179:120;;;25250:39;25287:1;25280:5;25250:39;:::i;:::-;25223:1;25216:5;25212:13;25203:22;;25179:120;;;25119:186;;:::o;25311:543::-;25412:2;25407:3;25404:11;25401:446;;;25446:38;25478:5;25446:38;:::i;:::-;25530:29;25548:10;25530:29;:::i;:::-;25520:8;25516:44;25713:2;25701:10;25698:18;25695:49;;;25734:8;25719:23;;25695:49;25757:80;25813:22;25831:3;25813:22;:::i;:::-;25803:8;25799:37;25786:11;25757:80;:::i;:::-;25416:431;;25401:446;25311:543;;;:::o;25860:117::-;25914:8;25964:5;25958:4;25954:16;25933:37;;25860:117;;;;:::o;25983:169::-;26027:6;26060:51;26108:1;26104:6;26096:5;26093:1;26089:13;26060:51;:::i;:::-;26056:56;26141:4;26135;26131:15;26121:25;;26034:118;25983:169;;;;:::o;26157:295::-;26233:4;26379:29;26404:3;26398:4;26379:29;:::i;:::-;26371:37;;26441:3;26438:1;26434:11;26428:4;26425:21;26417:29;;26157:295;;;;:::o;26457:1395::-;26574:37;26607:3;26574:37;:::i;:::-;26676:18;26668:6;26665:30;26662:56;;;26698:18;;:::i;:::-;26662:56;26742:38;26774:4;26768:11;26742:38;:::i;:::-;26827:67;26887:6;26879;26873:4;26827:67;:::i;:::-;26921:1;26945:4;26932:17;;26977:2;26969:6;26966:14;26994:1;26989:618;;;;27651:1;27668:6;27665:77;;;27717:9;27712:3;27708:19;27702:26;27693:35;;27665:77;27768:67;27828:6;27821:5;27768:67;:::i;:::-;27762:4;27755:81;27624:222;26959:887;;26989:618;27041:4;27037:9;27029:6;27025:22;27075:37;27107:4;27075:37;:::i;:::-;27134:1;27148:208;27162:7;27159:1;27156:14;27148:208;;;27241:9;27236:3;27232:19;27226:26;27218:6;27211:42;27292:1;27284:6;27280:14;27270:24;;27339:2;27328:9;27324:18;27311:31;;27185:4;27182:1;27178:12;27173:17;;27148:208;;;27384:6;27375:7;27372:19;27369:179;;;27442:9;27437:3;27433:19;27427:26;27485:48;27527:4;27519:6;27515:17;27504:9;27485:48;:::i;:::-;27477:6;27470:64;27392:156;27369:179;27594:1;27590;27582:6;27578:14;27574:22;27568:4;27561:36;26996:611;;;26959:887;;26549:1303;;;26457:1395;;:::o;27858:151::-;27998:3;27994:1;27986:6;27982:14;27975:27;27858:151;:::o;28015:365::-;28157:3;28178:66;28242:1;28237:3;28178:66;:::i;:::-;28171:73;;28253:93;28342:3;28253:93;:::i;:::-;28371:2;28366:3;28362:12;28355:19;;28015:365;;;:::o;28386:419::-;28552:4;28590:2;28579:9;28575:18;28567:26;;28639:9;28633:4;28629:20;28625:1;28614:9;28610:17;28603:47;28667:131;28793:4;28667:131;:::i;:::-;28659:139;;28386:419;;;:::o;28811:233::-;28850:3;28873:24;28891:5;28873:24;:::i;:::-;28864:33;;28919:66;28912:5;28909:77;28906:103;;28989:18;;:::i;:::-;28906:103;29036:1;29029:5;29025:13;29018:20;;28811:233;;;:::o;29050:151::-;29190:3;29186:1;29178:6;29174:14;29167:27;29050:151;:::o;29207:365::-;29349:3;29370:66;29434:1;29429:3;29370:66;:::i;:::-;29363:73;;29445:93;29534:3;29445:93;:::i;:::-;29563:2;29558:3;29554:12;29547:19;;29207:365;;;:::o;29578:419::-;29744:4;29782:2;29771:9;29767:18;29759:26;;29831:9;29825:4;29821:20;29817:1;29806:9;29802:17;29795:47;29859:131;29985:4;29859:131;:::i;:::-;29851:139;;29578:419;;;:::o;30003:143::-;30060:5;30091:6;30085:13;30076:22;;30107:33;30134:5;30107:33;:::i;:::-;30003:143;;;;:::o;30152:351::-;30222:6;30271:2;30259:9;30250:7;30246:23;30242:32;30239:119;;;30277:79;;:::i;:::-;30239:119;30397:1;30422:64;30478:7;30469:6;30458:9;30454:22;30422:64;:::i;:::-;30412:74;;30368:128;30152:351;;;;:::o;30509:332::-;30630:4;30668:2;30657:9;30653:18;30645:26;;30681:71;30749:1;30738:9;30734:17;30725:6;30681:71;:::i;:::-;30762:72;30830:2;30819:9;30815:18;30806:6;30762:72;:::i;:::-;30509:332;;;;;:::o;30847:151::-;30987:3;30983:1;30975:6;30971:14;30964:27;30847:151;:::o;31004:365::-;31146:3;31167:66;31231:1;31226:3;31167:66;:::i;:::-;31160:73;;31242:93;31331:3;31242:93;:::i;:::-;31360:2;31355:3;31351:12;31344:19;;31004:365;;;:::o;31375:419::-;31541:4;31579:2;31568:9;31564:18;31556:26;;31628:9;31622:4;31618:20;31614:1;31603:9;31599:17;31592:47;31656:131;31782:4;31656:131;:::i;:::-;31648:139;;31375:419;;;:::o;31800:94::-;31833:8;31881:5;31877:2;31873:14;31852:35;;31800:94;;;:::o;31900:::-;31939:7;31968:20;31982:5;31968:20;:::i;:::-;31957:31;;31900:94;;;:::o;32000:100::-;32039:7;32068:26;32088:5;32068:26;:::i;:::-;32057:37;;32000:100;;;:::o;32106:157::-;32211:45;32231:24;32249:5;32231:24;:::i;:::-;32211:45;:::i;:::-;32206:3;32199:58;32106:157;;:::o;32269:397::-;32409:3;32424:75;32495:3;32486:6;32424:75;:::i;:::-;32524:2;32519:3;32515:12;32508:19;;32537:75;32608:3;32599:6;32537:75;:::i;:::-;32637:2;32632:3;32628:12;32621:19;;32657:3;32650:10;;32269:397;;;;;:::o;32672:151::-;32812:3;32808:1;32800:6;32796:14;32789:27;32672:151;:::o;32829:365::-;32971:3;32992:66;33056:1;33051:3;32992:66;:::i;:::-;32985:73;;33067:93;33156:3;33067:93;:::i;:::-;33185:2;33180:3;33176:12;33169:19;;32829:365;;;:::o;33200:419::-;33366:4;33404:2;33393:9;33389:18;33381:26;;33453:9;33447:4;33443:20;33439:1;33428:9;33424:17;33417:47;33481:131;33607:4;33481:131;:::i;:::-;33473:139;;33200:419;;;:::o;33625:151::-;33765:3;33761:1;33753:6;33749:14;33742:27;33625:151;:::o;33782:365::-;33924:3;33945:66;34009:1;34004:3;33945:66;:::i;:::-;33938:73;;34020:93;34109:3;34020:93;:::i;:::-;34138:2;34133:3;34129:12;34122:19;;33782:365;;;:::o;34153:419::-;34319:4;34357:2;34346:9;34342:18;34334:26;;34406:9;34400:4;34396:20;34392:1;34381:9;34377:17;34370:47;34434:131;34560:4;34434:131;:::i;:::-;34426:139;;34153:419;;;:::o;34578:151::-;34718:3;34714:1;34706:6;34702:14;34695:27;34578:151;:::o;34735:365::-;34877:3;34898:66;34962:1;34957:3;34898:66;:::i;:::-;34891:73;;34973:93;35062:3;34973:93;:::i;:::-;35091:2;35086:3;35082:12;35075:19;;34735:365;;;:::o;35106:419::-;35272:4;35310:2;35299:9;35295:18;35287:26;;35359:9;35353:4;35349:20;35345:1;35334:9;35330:17;35323:47;35387:131;35513:4;35387:131;:::i;:::-;35379:139;;35106:419;;;:::o;35531:151::-;35671:3;35667:1;35659:6;35655:14;35648:27;35531:151;:::o;35688:365::-;35830:3;35851:66;35915:1;35910:3;35851:66;:::i;:::-;35844:73;;35926:93;36015:3;35926:93;:::i;:::-;36044:2;36039:3;36035:12;36028:19;;35688:365;;;:::o;36059:419::-;36225:4;36263:2;36252:9;36248:18;36240:26;;36312:9;36306:4;36302:20;36298:1;36287:9;36283:17;36276:47;36340:131;36466:4;36340:131;:::i;:::-;36332:139;;36059:419;;;:::o;36484:148::-;36586:11;36623:3;36608:18;;36484:148;;;;:::o;36662:874::-;36765:3;36802:5;36796:12;36831:36;36857:9;36831:36;:::i;:::-;36883:89;36965:6;36960:3;36883:89;:::i;:::-;36876:96;;37003:1;36992:9;36988:17;37019:1;37014:166;;;;37194:1;37189:341;;;;36981:549;;37014:166;37098:4;37094:9;37083;37079:25;37074:3;37067:38;37160:6;37153:14;37146:22;37138:6;37134:35;37129:3;37125:45;37118:52;;37014:166;;37189:341;37256:38;37288:5;37256:38;:::i;:::-;37316:1;37330:154;37344:6;37341:1;37338:13;37330:154;;;37418:7;37412:14;37408:1;37403:3;37399:11;37392:35;37468:1;37459:7;37455:15;37444:26;;37366:4;37363:1;37359:12;37354:17;;37330:154;;;37513:6;37508:3;37504:16;37497:23;;37196:334;;36981:549;;36769:767;;36662:874;;;;:::o;37542:390::-;37648:3;37676:39;37709:5;37676:39;:::i;:::-;37731:89;37813:6;37808:3;37731:89;:::i;:::-;37724:96;;37829:65;37887:6;37882:3;37875:4;37868:5;37864:16;37829:65;:::i;:::-;37919:6;37914:3;37910:16;37903:23;;37652:280;37542:390;;;;:::o;37938:429::-;38115:3;38137:92;38225:3;38216:6;38137:92;:::i;:::-;38130:99;;38246:95;38337:3;38328:6;38246:95;:::i;:::-;38239:102;;38358:3;38351:10;;37938:429;;;;;:::o;38373:143::-;38430:5;38461:6;38455:13;38446:22;;38477:33;38504:5;38477:33;:::i;:::-;38373:143;;;;:::o;38522:351::-;38592:6;38641:2;38629:9;38620:7;38616:23;38612:32;38609:119;;;38647:79;;:::i;:::-;38609:119;38767:1;38792:64;38848:7;38839:6;38828:9;38824:22;38792:64;:::i;:::-;38782:74;;38738:128;38522:351;;;;:::o;38879:225::-;39019:34;39015:1;39007:6;39003:14;38996:58;39088:8;39083:2;39075:6;39071:15;39064:33;38879:225;:::o;39110:366::-;39252:3;39273:67;39337:2;39332:3;39273:67;:::i;:::-;39266:74;;39349:93;39438:3;39349:93;:::i;:::-;39467:2;39462:3;39458:12;39451:19;;39110:366;;;:::o;39482:419::-;39648:4;39686:2;39675:9;39671:18;39663:26;;39735:9;39729:4;39725:20;39721:1;39710:9;39706:17;39699:47;39763:131;39889:4;39763:131;:::i;:::-;39755:139;;39482:419;;;:::o;39907:182::-;40047:34;40043:1;40035:6;40031:14;40024:58;39907:182;:::o;40095:366::-;40237:3;40258:67;40322:2;40317:3;40258:67;:::i;:::-;40251:74;;40334:93;40423:3;40334:93;:::i;:::-;40452:2;40447:3;40443:12;40436:19;;40095:366;;;:::o;40467:419::-;40633:4;40671:2;40660:9;40656:18;40648:26;;40720:9;40714:4;40710:20;40706:1;40695:9;40691:17;40684:47;40748:131;40874:4;40748:131;:::i;:::-;40740:139;;40467:419;;;:::o;40892:118::-;40929:7;40969:34;40962:5;40958:46;40947:57;;40892:118;;;:::o;41016:227::-;41056:4;41076:20;41094:1;41076:20;:::i;:::-;41071:25;;41110:20;41128:1;41110:20;:::i;:::-;41105:25;;41154:1;41151;41147:9;41139:17;;41178:34;41172:4;41169:44;41166:70;;;41216:18;;:::i;:::-;41166:70;41016:227;;;;:::o;41249:224::-;41289:3;41308:20;41326:1;41308:20;:::i;:::-;41303:25;;41342:20;41360:1;41342:20;:::i;:::-;41337:25;;41385:1;41382;41378:9;41371:16;;41408:34;41403:3;41400:43;41397:69;;;41446:18;;:::i;:::-;41397:69;41249:224;;;;:::o;41479:151::-;41619:3;41615:1;41607:6;41603:14;41596:27;41479:151;:::o;41636:365::-;41778:3;41799:66;41863:1;41858:3;41799:66;:::i;:::-;41792:73;;41874:93;41963:3;41874:93;:::i;:::-;41992:2;41987:3;41983:12;41976:19;;41636:365;;;:::o;42007:419::-;42173:4;42211:2;42200:9;42196:18;42188:26;;42260:9;42254:4;42250:20;42246:1;42235:9;42231:17;42224:47;42288:131;42414:4;42288:131;:::i;:::-;42280:139;;42007:419;;;:::o;42432:194::-;42472:4;42492:20;42510:1;42492:20;:::i;:::-;42487:25;;42526:20;42544:1;42526:20;:::i;:::-;42521:25;;42570:1;42567;42563:9;42555:17;;42594:1;42588:4;42585:11;42582:37;;;42599:18;;:::i;:::-;42582:37;42432:194;;;;:::o;42632:171::-;42671:3;42694:24;42712:5;42694:24;:::i;:::-;42685:33;;42740:4;42733:5;42730:15;42727:41;;42748:18;;:::i;:::-;42727:41;42795:1;42788:5;42784:13;42777:20;;42632:171;;;:::o;42809:98::-;42860:6;42894:5;42888:12;42878:22;;42809:98;;;:::o;42913:168::-;42996:11;43030:6;43025:3;43018:19;43070:4;43065:3;43061:14;43046:29;;42913:168;;;;:::o;43087:373::-;43173:3;43201:38;43233:5;43201:38;:::i;:::-;43255:70;43318:6;43313:3;43255:70;:::i;:::-;43248:77;;43334:65;43392:6;43387:3;43380:4;43373:5;43369:16;43334:65;:::i;:::-;43424:29;43446:6;43424:29;:::i;:::-;43419:3;43415:39;43408:46;;43177:283;43087:373;;;;:::o;43466:640::-;43661:4;43699:3;43688:9;43684:19;43676:27;;43713:71;43781:1;43770:9;43766:17;43757:6;43713:71;:::i;:::-;43794:72;43862:2;43851:9;43847:18;43838:6;43794:72;:::i;:::-;43876;43944:2;43933:9;43929:18;43920:6;43876:72;:::i;:::-;43995:9;43989:4;43985:20;43980:2;43969:9;43965:18;43958:48;44023:76;44094:4;44085:6;44023:76;:::i;:::-;44015:84;;43466:640;;;;;;;:::o;44112:141::-;44168:5;44199:6;44193:13;44184:22;;44215:32;44241:5;44215:32;:::i;:::-;44112:141;;;;:::o;44259:349::-;44328:6;44377:2;44365:9;44356:7;44352:23;44348:32;44345:119;;;44383:79;;:::i;:::-;44345:119;44503:1;44528:63;44583:7;44574:6;44563:9;44559:22;44528:63;:::i;:::-;44518:73;;44474:127;44259:349;;;;:::o;44614:176::-;44646:1;44663:20;44681:1;44663:20;:::i;:::-;44658:25;;44697:20;44715:1;44697:20;:::i;:::-;44692:25;;44736:1;44726:35;;44741:18;;:::i;:::-;44726:35;44782:1;44779;44775:9;44770:14;;44614:176;;;;:::o;44796:180::-;44844:77;44841:1;44834:88;44941:4;44938:1;44931:15;44965:4;44962:1;44955:15;44982:214;45122:66;45118:1;45110:6;45106:14;45099:90;44982:214;:::o;45202:402::-;45362:3;45383:85;45465:2;45460:3;45383:85;:::i;:::-;45376:92;;45477:93;45566:3;45477:93;:::i;:::-;45595:2;45590:3;45586:12;45579:19;;45202:402;;;:::o;45610:79::-;45649:7;45678:5;45667:16;;45610:79;;;:::o;45695:157::-;45800:45;45820:24;45838:5;45820:24;:::i;:::-;45800:45;:::i;:::-;45795:3;45788:58;45695:157;;:::o;45858:522::-;46071:3;46093:148;46237:3;46093:148;:::i;:::-;46086:155;;46251:75;46322:3;46313:6;46251:75;:::i;:::-;46351:2;46346:3;46342:12;46335:19;;46371:3;46364:10;;45858:522;;;;:::o;46386:174::-;46526:26;46522:1;46514:6;46510:14;46503:50;46386:174;:::o;46566:366::-;46708:3;46729:67;46793:2;46788:3;46729:67;:::i;:::-;46722:74;;46805:93;46894:3;46805:93;:::i;:::-;46923:2;46918:3;46914:12;46907:19;;46566:366;;;:::o;46938:419::-;47104:4;47142:2;47131:9;47127:18;47119:26;;47191:9;47185:4;47181:20;47177:1;47166:9;47162:17;47155:47;47219:131;47345:4;47219:131;:::i;:::-;47211:139;;46938:419;;;:::o;47363:181::-;47503:33;47499:1;47491:6;47487:14;47480:57;47363:181;:::o;47550:366::-;47692:3;47713:67;47777:2;47772:3;47713:67;:::i;:::-;47706:74;;47789:93;47878:3;47789:93;:::i;:::-;47907:2;47902:3;47898:12;47891:19;;47550:366;;;:::o;47922:419::-;48088:4;48126:2;48115:9;48111:18;48103:26;;48175:9;48169:4;48165:20;48161:1;48150:9;48146:17;48139:47;48203:131;48329:4;48203:131;:::i;:::-;48195:139;;47922:419;;;:::o;48347:221::-;48487:34;48483:1;48475:6;48471:14;48464:58;48556:4;48551:2;48543:6;48539:15;48532:29;48347:221;:::o;48574:366::-;48716:3;48737:67;48801:2;48796:3;48737:67;:::i;:::-;48730:74;;48813:93;48902:3;48813:93;:::i;:::-;48931:2;48926:3;48922:12;48915:19;;48574:366;;;:::o;48946:419::-;49112:4;49150:2;49139:9;49135:18;49127:26;;49199:9;49193:4;49189:20;49185:1;49174:9;49170:17;49163:47;49227:131;49353:4;49227:131;:::i;:::-;49219:139;;48946:419;;;:::o;49371:221::-;49511:34;49507:1;49499:6;49495:14;49488:58;49580:4;49575:2;49567:6;49563:15;49556:29;49371:221;:::o;49598:366::-;49740:3;49761:67;49825:2;49820:3;49761:67;:::i;:::-;49754:74;;49837:93;49926:3;49837:93;:::i;:::-;49955:2;49950:3;49946:12;49939:19;;49598:366;;;:::o;49970:419::-;50136:4;50174:2;50163:9;50159:18;50151:26;;50223:9;50217:4;50213:20;50209:1;50198:9;50194:17;50187:47;50251:131;50377:4;50251:131;:::i;:::-;50243:139;;49970:419;;;:::o;50395:86::-;50430:7;50470:4;50463:5;50459:16;50448:27;;50395:86;;;:::o;50487:112::-;50570:22;50586:5;50570:22;:::i;:::-;50565:3;50558:35;50487:112;;:::o;50605:545::-;50778:4;50816:3;50805:9;50801:19;50793:27;;50830:71;50898:1;50887:9;50883:17;50874:6;50830:71;:::i;:::-;50911:68;50975:2;50964:9;50960:18;50951:6;50911:68;:::i;:::-;50989:72;51057:2;51046:9;51042:18;51033:6;50989:72;:::i;:::-;51071;51139:2;51128:9;51124:18;51115:6;51071:72;:::i;:::-;50605:545;;;;;;;:::o

Swarm Source

ipfs://b07128e9715407934b6a3945a43d1917698e62372d14f9204c0d9c10b86d9b5a
Loading...
Loading
Loading...
Loading
[ 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.