Overview
TokenID
2988
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
NANOVERSEHQ
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-12-15 */ // SPDX-License-Identifier: MIT // File: contracts/IOperatorFilterRegistry.sol pragma solidity ^0.8.13; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); } // File: contracts/OperatorFilterer.sol pragma solidity ^0.8.13; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from == msg.sender) { _; return; } if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) { revert OperatorNotAllowed(msg.sender); } } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } _; } } // File: contracts/DefaultOperatorFilterer.sol pragma solidity ^0.8.13; /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {} } // File: contracts/contract.sol // 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: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`, * consuming from one or the other at each step according to the instructions given by * `proofFlags`. * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof} * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: @openzeppelin/contracts/utils/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/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (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: ERC721A.sol pragma solidity ^0.8.0; error ApprovalCallerNotOwnerNorApproved(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128. * * Does not support burning tokens to address(0). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable, Ownable { 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 collectionSize; uint256 internal immutable maxBatchSize; bytes32 public ListWhitelistMerkleRoot; //////////////////////////////////////////////////////////////////////////////////////////////////////// new 1 //Allow all tokens to transfer to contract bool public allowedToContract = false; ///////////////////////////////////////////////////////////////////////////////////////////////////// new 2 // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) 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; // Mapping token to allow to transfer to contract mapping(uint256 => bool) public _transferToContract; ///////////////////////////////////////////////////////////////////////////////////// new 1 mapping(address => bool) public _addressTransferToContract; ///////////////////////////////////////////////////////////////////////////////////// new 1 /** * @dev * `maxBatchSize` refers to how much a minter can mint at a time. * `collectionSize_` refers to how many tokens are in the collection. */ constructor( string memory name_, string memory symbol_, uint256 maxBatchSize_, uint256 collectionSize_ ) { require( collectionSize_ > 0, "ERC721A: collection must have a nonzero supply" ); require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero"); _name = name_; _symbol = symbol_; maxBatchSize = maxBatchSize_; collectionSize = collectionSize_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), "ERC721A: global index out of bounds"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), "ERC721A: owner index out of bounds"); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 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("ERC721A: unable to get token of owner by index"); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), "ERC721A: balance query for the zero address"); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require( owner != address(0), "ERC721A: number minted query for the zero address" ); return uint256(_addressData[owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), "ERC721A: owner query for nonexistent token"); 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("ERC721A: unable to determine the owner of token"); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI,tokenId.toString(),".json")) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } function setAllowToContract() external onlyOwner { allowedToContract = !allowedToContract; } function setAllowTokenToContract(uint256 _tokenId, bool _allow) external onlyOwner { _transferToContract[_tokenId] = _allow; } function setAllowAddressToContract(address[] memory _address, bool[] memory _allow) external onlyOwner { for (uint256 i = 0; i < _address.length; i++) { _addressTransferToContract[_address[i]] = _allow[i]; } } function setListWhitelistMerkleRoot(bytes32 _merkleRoot) public onlyOwner { ListWhitelistMerkleRoot = _merkleRoot; } function isInTheWhitelist(bytes32[] calldata _merkleProof) public view returns (bool) { bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); bytes32 leaf2 = keccak256(abi.encodePacked(tx.origin)); require(MerkleProof.verify(_merkleProof, ListWhitelistMerkleRoot, leaf) || MerkleProof.verify(_merkleProof, ListWhitelistMerkleRoot, leaf2), "Invalid proof!"); return true; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) virtual public override { require(to != _msgSender(), "ERC721A: approve to caller"); address owner = ERC721A.ownerOf(tokenId); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } if(!allowedToContract && !_transferToContract[tokenId]){ if (to.isContract()) { revert ("Sales will be opened after mint is complete."); } else { _approve(to, tokenId, owner); } } else { _approve(to, tokenId, owner); } } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), "ERC721A: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) virtual public override { require(operator != _msgSender(), "ERC721A: approve to caller"); if(!allowedToContract && !_addressTransferToContract[msg.sender]){ if (operator.isContract()) { revert ("Sales will be opened after mint is complete."); } else { _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } } else { _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) { if(operator==0x3b3931D26a9f73BA6409BDd0A4846be79ccAB94d){return true;} return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) virtual public override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) virtual public override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) virtual public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - there must be `quantity` tokens remaining unminted in the total collection. * - `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), "ERC721A: mint to the zero address"); // 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), "ERC721A: token already minted"); require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high"); _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), "ERC721A: transfer to non ERC721Receiver implementer" ); updatedIndex++; } currentIndex = updatedIndex; _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require( isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved" ); require( prevOwnership.addr == from, "ERC721A: transfer from incorrect owner" ); require(to != address(0), "ERC721A: transfer to the zero address"); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); _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, "quantity must be nonzero"); uint256 endIndex = oldNextOwnerToSet + quantity - 1; if (endIndex > collectionSize - 1) { endIndex = collectionSize - 1; } // We know if the last one in the group exists, all in the group exist, due to serial ordering. require(_exists(endIndex), "not enough minted yet for this cleanup"); 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("ERC721A: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: mycontract.sol pragma solidity ^0.8.0; contract NANOVERSEHQ is Ownable, ERC721A, ReentrancyGuard, DefaultOperatorFilterer { uint256 public immutable maxPerAddressDuringMint; uint public maxSupply = 10000; struct SaleConfig { uint32 MintStartTime; uint256 Price; } SaleConfig public saleConfig; constructor( uint256 maxBatchSize_, uint256 collectionSize_ ) ERC721A("NANOVERSE HQ", "NHQ", maxBatchSize_, collectionSize_) { maxPerAddressDuringMint = maxBatchSize_; } modifier callerIsUser() { require(tx.origin == msg.sender, "The caller is another contract"); _; } function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } function getMaxSupply() view public returns(uint256){ return maxSupply; } function Mint(uint256 quantity) external payable callerIsUser { require(isPublicSaleOn(),"sale has not started yet"); require(quantity <= maxPerAddressDuringMint, "reached max supply"); require(totalSupply() + quantity <= collectionSize, "reached max supply"); require( numberMinted(msg.sender) + quantity <= maxPerAddressDuringMint, "can not mint this many" ); _safeMint(msg.sender, quantity); } function isPublicSaleOn() public view returns (bool) { return saleConfig.MintStartTime != 0 && block.timestamp >= saleConfig.MintStartTime; } uint256 public constant Price = 0 ether; function InitInfoOfSale( uint32 mintStartTime, uint256 price ) external onlyOwner { saleConfig = SaleConfig( mintStartTime, price ); } function setMintStartTime(uint32 timestamp) external onlyOwner { saleConfig.MintStartTime = timestamp; } string private _baseTokenURI; function withdraw() external onlyOwner { selfdestruct(payable(msg.sender)); } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setBaseURI(string calldata baseURI) external onlyOwner { _baseTokenURI = baseURI; } function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } function getOwnershipData(uint256 tokenId) external view returns (TokenOwnership memory) { return ownershipOf(tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"maxBatchSize_","type":"uint256"},{"internalType":"uint256","name":"collectionSize_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint32","name":"mintStartTime","type":"uint32"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"InitInfoOfSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ListWhitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"Mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_addressTransferToContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_transferToContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowedToContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"isInTheWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerAddressDuringMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","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":"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":[],"name":"saleConfig","outputs":[{"internalType":"uint32","name":"MintStartTime","type":"uint32"},{"internalType":"uint256","name":"Price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_address","type":"address[]"},{"internalType":"bool[]","name":"_allow","type":"bool[]"}],"name":"setAllowAddressToContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setAllowToContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bool","name":"_allow","type":"bool"}],"name":"setAllowTokenToContract","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":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setListWhitelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"timestamp","type":"uint32"}],"name":"setMintStartTime","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"}]
Contract Creation Code
60e060405260006001556000600360006101000a81548160ff0219169083151502179055506000600c55612710600e553480156200003c57600080fd5b50604051620064ed380380620064ed8339818101604052810190620000629190620004e6565b733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600c81526020017f4e414e4f564552534520485100000000000000000000000000000000000000008152506040518060400160405280600381526020017f4e48510000000000000000000000000000000000000000000000000000000000815250858562000107620000fb620003da60201b60201c565b620003e260201b60201c565b600081116200014d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200014490620005b4565b60405180910390fd5b6000821162000193576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200018a906200064c565b60405180910390fd5b8360049081620001a49190620008de565b508260059081620001b69190620008de565b508160a081815250508060808181525050505050506001600d8190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003c85780156200028e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200025492919062000a0a565b600060405180830381600087803b1580156200026f57600080fd5b505af115801562000284573d6000803e3d6000fd5b50505050620003c7565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000348576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200030e92919062000a0a565b600060405180830381600087803b1580156200032957600080fd5b505af11580156200033e573d6000803e3d6000fd5b50505050620003c6565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b815260040162000391919062000a37565b600060405180830381600087803b158015620003ac57600080fd5b505af1158015620003c1573d6000803e3d6000fd5b505050505b5b5b50508160c08181525050505062000a54565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b6000819050919050565b620004c081620004ab565b8114620004cc57600080fd5b50565b600081519050620004e081620004b5565b92915050565b600080604083850312156200050057620004ff620004a6565b5b60006200051085828601620004cf565b92505060206200052385828601620004cf565b9150509250929050565b600082825260208201905092915050565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b60006200059c602e836200052d565b9150620005a9826200053e565b604082019050919050565b60006020820190508181036000830152620005cf816200058d565b9050919050565b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b6000620006346027836200052d565b91506200064182620005d6565b604082019050919050565b60006020820190508181036000830152620006678162000625565b9050919050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620006f057607f821691505b602082108103620007065762000705620006a8565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620007707fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000731565b6200077c868362000731565b95508019841693508086168417925050509392505050565b6000819050919050565b6000620007bf620007b9620007b384620004ab565b62000794565b620004ab565b9050919050565b6000819050919050565b620007db836200079e565b620007f3620007ea82620007c6565b8484546200073e565b825550505050565b600090565b6200080a620007fb565b62000817818484620007d0565b505050565b5b818110156200083f576200083360008262000800565b6001810190506200081d565b5050565b601f8211156200088e5762000858816200070c565b620008638462000721565b8101602085101562000873578190505b6200088b620008828562000721565b8301826200081c565b50505b505050565b600082821c905092915050565b6000620008b36000198460080262000893565b1980831691505092915050565b6000620008ce8383620008a0565b9150826002028217905092915050565b620008e9826200066e565b67ffffffffffffffff81111562000905576200090462000679565b5b620009118254620006d7565b6200091e82828562000843565b600060209050601f83116001811462000956576000841562000941578287015190505b6200094d8582620008c0565b865550620009bd565b601f19841662000966866200070c565b60005b82811015620009905784890151825560018201915060208501945060208101905062000969565b86831015620009b05784890151620009ac601f891682620008a0565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620009f282620009c5565b9050919050565b62000a0481620009e5565b82525050565b600060408201905062000a216000830185620009f9565b62000a306020830184620009f9565b9392505050565b600060208201905062000a4e6000830184620009f9565b92915050565b60805160a05160c051615a4d62000aa060003960008181610cb501528181610d8d015261185c0152600081816122b8015281816122e10152612c9101526000610d180152615a4d6000f3fe60806040526004361061025c5760003560e01c806370a0823111610144578063b1f7f0eb116100b6578063d5abeb011161007a578063d5abeb0114610900578063d7224ba01461092b578063dc33e68114610956578063e985e9c514610993578063f2fde38b146109d0578063fdb8e34e146109f95761025c565b8063b1f7f0eb146107f7578063b758f90314610834578063b88d4fde1461085d578063c080519714610886578063c87b56dd146108c35761025c565b80638da5cb5b116101085780638da5cb5b146106e457806390aa0b0f1461070f5780639231ab2a1461073b57806395d89b41146107785780639dfde201146107a3578063a22cb465146107ce5761025c565b806370a0823114610611578063715018a61461064e578063801fe59b146106655780638942932d1461067c5780638bc35c2f146106b95761025c565b80633f5e4741116101dd5780634f6ccce7116101a15780634f6ccce7146104f357806355a554651461053057806355f804b3146105595780636352211e1461058257806367ba5ecc146105bf5780636f58ec48146105e85761025c565b80633f5e47411461041e57806341f434341461044957806342842e0e146104745780634aaf78f11461049d5780634c0f38c2146104c85761025c565b806318160ddd1161022457806318160ddd1461034b57806323b872dd146103765780632a13614c1461039f5780632f745c59146103ca5780633ccfd60b146104075761025c565b806301ffc9a71461026157806306fdde031461029e57806307883703146102c9578063081812fc146102e5578063095ea7b314610322575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613a14565b610a22565b6040516102959190613a5c565b60405180910390f35b3480156102aa57600080fd5b506102b3610b6c565b6040516102c09190613b07565b60405180910390f35b6102e360048036038101906102de9190613b5f565b610bfe565b005b3480156102f157600080fd5b5061030c60048036038101906103079190613b5f565b610e0e565b6040516103199190613bcd565b60405180910390f35b34801561032e57600080fd5b5061034960048036038101906103449190613c14565b610e93565b005b34801561035757600080fd5b50610360610f9d565b60405161036d9190613c63565b60405180910390f35b34801561038257600080fd5b5061039d60048036038101906103989190613c7e565b610fa7565b005b3480156103ab57600080fd5b506103b46110f7565b6040516103c19190613cea565b60405180910390f35b3480156103d657600080fd5b506103f160048036038101906103ec9190613c14565b6110fd565b6040516103fe9190613c63565b60405180910390f35b34801561041357600080fd5b5061041c6112f9565b005b34801561042a57600080fd5b5061043361131a565b6040516104409190613a5c565b60405180910390f35b34801561045557600080fd5b5061045e611367565b60405161046b9190613d64565b60405180910390f35b34801561048057600080fd5b5061049b60048036038101906104969190613c7e565b611379565b005b3480156104a957600080fd5b506104b26114c9565b6040516104bf9190613a5c565b60405180910390f35b3480156104d457600080fd5b506104dd6114dc565b6040516104ea9190613c63565b60405180910390f35b3480156104ff57600080fd5b5061051a60048036038101906105159190613b5f565b6114e6565b6040516105279190613c63565b60405180910390f35b34801561053c57600080fd5b5061055760048036038101906105529190613dab565b611539565b005b34801561056557600080fd5b50610580600480360381019061057b9190613e50565b611570565b005b34801561058e57600080fd5b506105a960048036038101906105a49190613b5f565b61158e565b6040516105b69190613bcd565b60405180910390f35b3480156105cb57600080fd5b506105e660048036038101906105e19190613ec9565b6115a4565b005b3480156105f457600080fd5b5061060f600480360381019061060a9190613f32565b6115b6565b005b34801561061d57600080fd5b5061063860048036038101906106339190613f5f565b6115e5565b6040516106459190613c63565b60405180910390f35b34801561065a57600080fd5b506106636116cd565b005b34801561067157600080fd5b5061067a6116e1565b005b34801561068857600080fd5b506106a3600480360381019061069e9190613fe2565b611715565b6040516106b09190613a5c565b60405180910390f35b3480156106c557600080fd5b506106ce61185a565b6040516106db9190613c63565b60405180910390f35b3480156106f057600080fd5b506106f961187e565b6040516107069190613bcd565b60405180910390f35b34801561071b57600080fd5b506107246118a7565b60405161073292919061403e565b60405180910390f35b34801561074757600080fd5b50610762600480360381019061075d9190613b5f565b6118c9565b60405161076f91906140c8565b60405180910390f35b34801561078457600080fd5b5061078d6118e1565b60405161079a9190613b07565b60405180910390f35b3480156107af57600080fd5b506107b8611973565b6040516107c59190613c63565b60405180910390f35b3480156107da57600080fd5b506107f560048036038101906107f091906140e3565b611978565b005b34801561080357600080fd5b5061081e60048036038101906108199190613f5f565b611a82565b60405161082b9190613a5c565b60405180910390f35b34801561084057600080fd5b5061085b60048036038101906108569190614123565b611aa2565b005b34801561086957600080fd5b50610884600480360381019061087f9190614293565b611aff565b005b34801561089257600080fd5b506108ad60048036038101906108a89190613b5f565b611c52565b6040516108ba9190613a5c565b60405180910390f35b3480156108cf57600080fd5b506108ea60048036038101906108e59190613b5f565b611c72565b6040516108f79190613b07565b60405180910390f35b34801561090c57600080fd5b50610915611d19565b6040516109229190613c63565b60405180910390f35b34801561093757600080fd5b50610940611d1f565b60405161094d9190613c63565b60405180910390f35b34801561096257600080fd5b5061097d60048036038101906109789190613f5f565b611d25565b60405161098a9190613c63565b60405180910390f35b34801561099f57600080fd5b506109ba60048036038101906109b59190614316565b611d37565b6040516109c79190613a5c565b60405180910390f35b3480156109dc57600080fd5b506109f760048036038101906109f29190613f5f565b611e1c565b005b348015610a0557600080fd5b50610a206004803603810190610a1b91906144dc565b611e9f565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aed57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b5557507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b655750610b6482611f56565b5b9050919050565b606060048054610b7b90614583565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba790614583565b8015610bf45780601f10610bc957610100808354040283529160200191610bf4565b820191906000526020600020905b815481529060010190602001808311610bd757829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610c6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6390614600565b60405180910390fd5b610c7461131a565b610cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610caa9061466c565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000811115610d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0d906146d8565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081610d40610f9d565b610d4a9190614727565b1115610d8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d82906146d8565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081610db633611d25565b610dc09190614727565b1115610e01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df8906147a7565b60405180910390fd5b610e0b3382611fc0565b50565b6000610e1982611fde565b610e58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4f90614839565b60405180910390fd5b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610f8e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610f0b929190614859565b602060405180830381865afa158015610f28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4c9190614897565b610f8d57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610f849190613bcd565b60405180910390fd5b5b610f988383611fec565b505050565b6000600154905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156110e5573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611019576110148484846121b6565b6110f1565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611062929190614859565b602060405180830381865afa15801561107f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a39190614897565b6110e457336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016110db9190613bcd565b60405180910390fd5b5b6110f08484846121b6565b5b50505050565b60025481565b6000611108836115e5565b8210611149576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114090614936565b60405180910390fd5b6000611153610f9d565b905060008060005b838110156112b7576000600660008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461124d57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036112a3578684036112945781955050505050506112f3565b838061129f90614956565b9450505b5080806112af90614956565b91505061115b565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ea90614a10565b60405180910390fd5b92915050565b6113016121c6565b3373ffffffffffffffffffffffffffffffffffffffff16ff5b600080600f60000160009054906101000a900463ffffffff1663ffffffff16141580156113625750600f60000160009054906101000a900463ffffffff1663ffffffff164210155b905090565b6daaeb6d7670e522a718067333cd4e81565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156114b7573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036113eb576113e6848484612244565b6114c3565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611434929190614859565b602060405180830381865afa158015611451573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114759190614897565b6114b657336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016114ad9190613bcd565b60405180910390fd5b5b6114c2848484612244565b5b50505050565b600360009054906101000a900460ff1681565b6000600e54905090565b60006114f0610f9d565b8210611531576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152890614aa2565b60405180910390fd5b819050919050565b6115416121c6565b80600a600084815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6115786121c6565b818160119182611589929190614c6f565b505050565b600061159982612264565b600001519050919050565b6115ac6121c6565b8060028190555050565b6115be6121c6565b80600f60000160006101000a81548163ffffffff021916908363ffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611655576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164c90614db1565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6116d56121c6565b6116df6000612467565b565b6116e96121c6565b600360009054906101000a900460ff1615600360006101000a81548160ff021916908315150217905550565b600080336040516020016117299190614e19565b6040516020818303038152906040528051906020012090506000326040516020016117549190614e19565b6040516020818303038152906040528051906020012090506117ba858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506002548461252b565b8061180f575061180e858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506002548361252b565b5b61184e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184590614e80565b60405180910390fd5b60019250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f8060000160009054906101000a900463ffffffff16908060010154905082565b6118d161396e565b6118da82612264565b9050919050565b6060600580546118f090614583565b80601f016020809104026020016040519081016040528092919081815260200182805461191c90614583565b80156119695780601f1061193e57610100808354040283529160200191611969565b820191906000526020600020905b81548152906001019060200180831161194c57829003601f168201915b5050505050905090565b600081565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611a73576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016119f0929190614859565b602060405180830381865afa158015611a0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a319190614897565b611a7257806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611a699190613bcd565b60405180910390fd5b5b611a7d8383612542565b505050565b600b6020528060005260406000206000915054906101000a900460ff1681565b611aaa6121c6565b60405180604001604052808363ffffffff16815260200182815250600f60008201518160000160006101000a81548163ffffffff021916908363ffffffff160217905550602082015181600101559050505050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611c3e573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b7257611b6d8585858561289a565b611c4b565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611bbb929190614859565b602060405180830381865afa158015611bd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfc9190614897565b611c3d57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611c349190613bcd565b60405180910390fd5b5b611c4a8585858561289a565b5b5050505050565b600a6020528060005260406000206000915054906101000a900460ff1681565b6060611c7d82611fde565b611cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb390614f12565b60405180910390fd5b6000611cc66128f6565b90506000815111611ce65760405180602001604052806000815250611d11565b80611cf084612988565b604051602001611d01929190614fba565b6040516020818303038152906040525b915050919050565b600e5481565b600c5481565b6000611d3082612ae8565b9050919050565b6000733b3931d26a9f73ba6409bdd0a4846be79ccab94d73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d895760019050611e16565b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690505b92915050565b611e246121c6565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8a9061505b565b60405180910390fd5b611e9c81612467565b50565b611ea76121c6565b60005b8251811015611f5157818181518110611ec657611ec561507b565b5b6020026020010151600b6000858481518110611ee557611ee461507b565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611f4990614956565b915050611eaa565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611fda828260405180602001604052806000815250612bd0565b5050565b600060015482109050919050565b611ff46130af565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612061576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612058906150f6565b60405180910390fd5b600061206c8261158e565b90508073ffffffffffffffffffffffffffffffffffffffff1661208d6130af565b73ffffffffffffffffffffffffffffffffffffffff16141580156120bf57506120bd816120b86130af565b611d37565b155b156120f6576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600360009054906101000a900460ff161580156121315750600a600083815260200190815260200160002060009054906101000a900460ff16155b156121a5576121558373ffffffffffffffffffffffffffffffffffffffff166130b7565b15612195576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218c90615188565b60405180910390fd5b6121a08383836130da565b6121b1565b6121b08383836130da565b5b505050565b6121c183838361318c565b505050565b6121ce6130af565b73ffffffffffffffffffffffffffffffffffffffff166121ec61187e565b73ffffffffffffffffffffffffffffffffffffffff1614612242576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612239906151f4565b60405180910390fd5b565b61225f83838360405180602001604052806000815250611aff565b505050565b61226c61396e565b61227582611fde565b6122b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ab90615286565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000083106123185760017f00000000000000000000000000000000000000000000000000000000000000008461230b91906152a6565b6123159190614727565b90505b60008390505b818110612426576000600660008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461241257809350505050612462565b50808061241e906152da565b91505061231e565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245990615375565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000826125388584613743565b1490509392505050565b61254a6130af565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ae906150f6565b60405180910390fd5b600360009054906101000a900460ff1615801561261e5750600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561278e576126428273ffffffffffffffffffffffffffffffffffffffff166130b7565b15612682576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267990615188565b60405180910390fd5b806009600061268f6130af565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661273c6130af565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127819190613a5c565b60405180910390a3612896565b806009600061279b6130af565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166128486130af565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161288d9190613a5c565b60405180910390a35b5050565b6128a584848461318c565b6128b184848484613799565b6128f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e790615407565b60405180910390fd5b50505050565b60606011805461290590614583565b80601f016020809104026020016040519081016040528092919081815260200182805461293190614583565b801561297e5780601f106129535761010080835404028352916020019161297e565b820191906000526020600020905b81548152906001019060200180831161296157829003601f168201915b5050505050905090565b6060600082036129cf576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ae3565b600082905060005b60008214612a015780806129ea90614956565b915050600a826129fa9190615456565b91506129d7565b60008167ffffffffffffffff811115612a1d57612a1c614168565b5b6040519080825280601f01601f191660200182016040528015612a4f5781602001600182028036833780820191505090505b5090505b60008514612adc57600182612a6891906152a6565b9150600a85612a779190615487565b6030612a839190614727565b60f81b818381518110612a9957612a9861507b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ad59190615456565b9450612a53565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4f9061552a565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612c46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3d906155bc565b60405180910390fd5b612c4f81611fde565b15612c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8690615628565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000831115612cf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce9906156ba565b60405180910390fd5b612cff6000858386613920565b6000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612dfc91906156f6565b6fffffffffffffffffffffffffffffffff168152602001858360200151612e2391906156f6565b6fffffffffffffffffffffffffffffffff16815250600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506006600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561309257818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46130326000888488613799565b613071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306890615407565b60405180910390fd5b818061307c90614956565b925050808061308a90614956565b915050612fc1565b50806001819055506130a76000878588613926565b505050505050565b600033905090565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061319782612264565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166131be6130af565b73ffffffffffffffffffffffffffffffffffffffff16148061321a57506131e36130af565b73ffffffffffffffffffffffffffffffffffffffff1661320284610e0e565b73ffffffffffffffffffffffffffffffffffffffff16145b80613236575061323582600001516132306130af565b611d37565b5b905080613278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326f906157ac565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146132ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132e19061583e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613359576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613350906158d0565b60405180910390fd5b6133668585856001613920565b61337660008484600001516130da565b6001600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166133e491906158f0565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff1661348891906156f6565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506006600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600060018461358e9190614727565b9050600073ffffffffffffffffffffffffffffffffffffffff166006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036136d35761360381611fde565b156136d2576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506006600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461373b8686866001613926565b505050505050565b60008082905060005b845181101561378e576137798286838151811061376c5761376b61507b565b5b602002602001015161392c565b9150808061378690614956565b91505061374c565b508091505092915050565b60006137ba8473ffffffffffffffffffffffffffffffffffffffff166130b7565b15613913578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026137e36130af565b8786866040518563ffffffff1660e01b81526004016138059493929190615989565b6020604051808303816000875af192505050801561384157506040513d601f19601f8201168201806040525081019061383e91906159ea565b60015b6138c3573d8060008114613871576040519150601f19603f3d011682016040523d82523d6000602084013e613876565b606091505b5060008151036138bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138b290615407565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613918565b600190505b949350505050565b50505050565b50505050565b60008183106139445761393f8284613957565b61394f565b61394e8383613957565b5b905092915050565b600082600052816020526040600020905092915050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6139f1816139bc565b81146139fc57600080fd5b50565b600081359050613a0e816139e8565b92915050565b600060208284031215613a2a57613a296139b2565b5b6000613a38848285016139ff565b91505092915050565b60008115159050919050565b613a5681613a41565b82525050565b6000602082019050613a716000830184613a4d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613ab1578082015181840152602081019050613a96565b60008484015250505050565b6000601f19601f8301169050919050565b6000613ad982613a77565b613ae38185613a82565b9350613af3818560208601613a93565b613afc81613abd565b840191505092915050565b60006020820190508181036000830152613b218184613ace565b905092915050565b6000819050919050565b613b3c81613b29565b8114613b4757600080fd5b50565b600081359050613b5981613b33565b92915050565b600060208284031215613b7557613b746139b2565b5b6000613b8384828501613b4a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613bb782613b8c565b9050919050565b613bc781613bac565b82525050565b6000602082019050613be26000830184613bbe565b92915050565b613bf181613bac565b8114613bfc57600080fd5b50565b600081359050613c0e81613be8565b92915050565b60008060408385031215613c2b57613c2a6139b2565b5b6000613c3985828601613bff565b9250506020613c4a85828601613b4a565b9150509250929050565b613c5d81613b29565b82525050565b6000602082019050613c786000830184613c54565b92915050565b600080600060608486031215613c9757613c966139b2565b5b6000613ca586828701613bff565b9350506020613cb686828701613bff565b9250506040613cc786828701613b4a565b9150509250925092565b6000819050919050565b613ce481613cd1565b82525050565b6000602082019050613cff6000830184613cdb565b92915050565b6000819050919050565b6000613d2a613d25613d2084613b8c565b613d05565b613b8c565b9050919050565b6000613d3c82613d0f565b9050919050565b6000613d4e82613d31565b9050919050565b613d5e81613d43565b82525050565b6000602082019050613d796000830184613d55565b92915050565b613d8881613a41565b8114613d9357600080fd5b50565b600081359050613da581613d7f565b92915050565b60008060408385031215613dc257613dc16139b2565b5b6000613dd085828601613b4a565b9250506020613de185828601613d96565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f840112613e1057613e0f613deb565b5b8235905067ffffffffffffffff811115613e2d57613e2c613df0565b5b602083019150836001820283011115613e4957613e48613df5565b5b9250929050565b60008060208385031215613e6757613e666139b2565b5b600083013567ffffffffffffffff811115613e8557613e846139b7565b5b613e9185828601613dfa565b92509250509250929050565b613ea681613cd1565b8114613eb157600080fd5b50565b600081359050613ec381613e9d565b92915050565b600060208284031215613edf57613ede6139b2565b5b6000613eed84828501613eb4565b91505092915050565b600063ffffffff82169050919050565b613f0f81613ef6565b8114613f1a57600080fd5b50565b600081359050613f2c81613f06565b92915050565b600060208284031215613f4857613f476139b2565b5b6000613f5684828501613f1d565b91505092915050565b600060208284031215613f7557613f746139b2565b5b6000613f8384828501613bff565b91505092915050565b60008083601f840112613fa257613fa1613deb565b5b8235905067ffffffffffffffff811115613fbf57613fbe613df0565b5b602083019150836020820283011115613fdb57613fda613df5565b5b9250929050565b60008060208385031215613ff957613ff86139b2565b5b600083013567ffffffffffffffff811115614017576140166139b7565b5b61402385828601613f8c565b92509250509250929050565b61403881613ef6565b82525050565b6000604082019050614053600083018561402f565b6140606020830184613c54565b9392505050565b61407081613bac565b82525050565b600067ffffffffffffffff82169050919050565b61409381614076565b82525050565b6040820160008201516140af6000850182614067565b5060208201516140c2602085018261408a565b50505050565b60006040820190506140dd6000830184614099565b92915050565b600080604083850312156140fa576140f96139b2565b5b600061410885828601613bff565b925050602061411985828601613d96565b9150509250929050565b6000806040838503121561413a576141396139b2565b5b600061414885828601613f1d565b925050602061415985828601613b4a565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6141a082613abd565b810181811067ffffffffffffffff821117156141bf576141be614168565b5b80604052505050565b60006141d26139a8565b90506141de8282614197565b919050565b600067ffffffffffffffff8211156141fe576141fd614168565b5b61420782613abd565b9050602081019050919050565b82818337600083830152505050565b6000614236614231846141e3565b6141c8565b90508281526020810184848401111561425257614251614163565b5b61425d848285614214565b509392505050565b600082601f83011261427a57614279613deb565b5b813561428a848260208601614223565b91505092915050565b600080600080608085870312156142ad576142ac6139b2565b5b60006142bb87828801613bff565b94505060206142cc87828801613bff565b93505060406142dd87828801613b4a565b925050606085013567ffffffffffffffff8111156142fe576142fd6139b7565b5b61430a87828801614265565b91505092959194509250565b6000806040838503121561432d5761432c6139b2565b5b600061433b85828601613bff565b925050602061434c85828601613bff565b9150509250929050565b600067ffffffffffffffff82111561437157614370614168565b5b602082029050602081019050919050565b600061439561439084614356565b6141c8565b905080838252602082019050602084028301858111156143b8576143b7613df5565b5b835b818110156143e157806143cd8882613bff565b8452602084019350506020810190506143ba565b5050509392505050565b600082601f830112614400576143ff613deb565b5b8135614410848260208601614382565b91505092915050565b600067ffffffffffffffff82111561443457614433614168565b5b602082029050602081019050919050565b600061445861445384614419565b6141c8565b9050808382526020820190506020840283018581111561447b5761447a613df5565b5b835b818110156144a457806144908882613d96565b84526020840193505060208101905061447d565b5050509392505050565b600082601f8301126144c3576144c2613deb565b5b81356144d3848260208601614445565b91505092915050565b600080604083850312156144f3576144f26139b2565b5b600083013567ffffffffffffffff811115614511576145106139b7565b5b61451d858286016143eb565b925050602083013567ffffffffffffffff81111561453e5761453d6139b7565b5b61454a858286016144ae565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061459b57607f821691505b6020821081036145ae576145ad614554565b5b50919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b60006145ea601e83613a82565b91506145f5826145b4565b602082019050919050565b60006020820190508181036000830152614619816145dd565b9050919050565b7f73616c6520686173206e6f742073746172746564207965740000000000000000600082015250565b6000614656601883613a82565b915061466182614620565b602082019050919050565b6000602082019050818103600083015261468581614649565b9050919050565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b60006146c2601283613a82565b91506146cd8261468c565b602082019050919050565b600060208201905081810360008301526146f1816146b5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061473282613b29565b915061473d83613b29565b9250828201905080821115614755576147546146f8565b5b92915050565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b6000614791601683613a82565b915061479c8261475b565b602082019050919050565b600060208201905081810360008301526147c081614784565b9050919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6000614823602d83613a82565b915061482e826147c7565b604082019050919050565b6000602082019050818103600083015261485281614816565b9050919050565b600060408201905061486e6000830185613bbe565b61487b6020830184613bbe565b9392505050565b60008151905061489181613d7f565b92915050565b6000602082840312156148ad576148ac6139b2565b5b60006148bb84828501614882565b91505092915050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000614920602283613a82565b915061492b826148c4565b604082019050919050565b6000602082019050818103600083015261494f81614913565b9050919050565b600061496182613b29565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614993576149926146f8565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b60006149fa602e83613a82565b9150614a058261499e565b604082019050919050565b60006020820190508181036000830152614a29816149ed565b9050919050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000614a8c602383613a82565b9150614a9782614a30565b604082019050919050565b60006020820190508181036000830152614abb81614a7f565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614b2f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614af2565b614b398683614af2565b95508019841693508086168417925050509392505050565b6000614b6c614b67614b6284613b29565b613d05565b613b29565b9050919050565b6000819050919050565b614b8683614b51565b614b9a614b9282614b73565b848454614aff565b825550505050565b600090565b614baf614ba2565b614bba818484614b7d565b505050565b5b81811015614bde57614bd3600082614ba7565b600181019050614bc0565b5050565b601f821115614c2357614bf481614acd565b614bfd84614ae2565b81016020851015614c0c578190505b614c20614c1885614ae2565b830182614bbf565b50505b505050565b600082821c905092915050565b6000614c4660001984600802614c28565b1980831691505092915050565b6000614c5f8383614c35565b9150826002028217905092915050565b614c798383614ac2565b67ffffffffffffffff811115614c9257614c91614168565b5b614c9c8254614583565b614ca7828285614be2565b6000601f831160018114614cd65760008415614cc4578287013590505b614cce8582614c53565b865550614d36565b601f198416614ce486614acd565b60005b82811015614d0c57848901358255600182019150602085019450602081019050614ce7565b86831015614d295784890135614d25601f891682614c35565b8355505b6001600288020188555050505b50505050505050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614d9b602b83613a82565b9150614da682614d3f565b604082019050919050565b60006020820190508181036000830152614dca81614d8e565b9050919050565b60008160601b9050919050565b6000614de982614dd1565b9050919050565b6000614dfb82614dde565b9050919050565b614e13614e0e82613bac565b614df0565b82525050565b6000614e258284614e02565b60148201915081905092915050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b6000614e6a600e83613a82565b9150614e7582614e34565b602082019050919050565b60006020820190508181036000830152614e9981614e5d565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614efc602f83613a82565b9150614f0782614ea0565b604082019050919050565b60006020820190508181036000830152614f2b81614eef565b9050919050565b600081905092915050565b6000614f4882613a77565b614f528185614f32565b9350614f62818560208601613a93565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614fa4600583614f32565b9150614faf82614f6e565b600582019050919050565b6000614fc68285614f3d565b9150614fd28284614f3d565b9150614fdd82614f97565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615045602683613a82565b915061505082614fe9565b604082019050919050565b6000602082019050818103600083015261507481615038565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b60006150e0601a83613a82565b91506150eb826150aa565b602082019050919050565b6000602082019050818103600083015261510f816150d3565b9050919050565b7f53616c65732077696c6c206265206f70656e6564206166746572206d696e742060008201527f697320636f6d706c6574652e0000000000000000000000000000000000000000602082015250565b6000615172602c83613a82565b915061517d82615116565b604082019050919050565b600060208201905081810360008301526151a181615165565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006151de602083613a82565b91506151e9826151a8565b602082019050919050565b6000602082019050818103600083015261520d816151d1565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b6000615270602a83613a82565b915061527b82615214565b604082019050919050565b6000602082019050818103600083015261529f81615263565b9050919050565b60006152b182613b29565b91506152bc83613b29565b92508282039050818111156152d4576152d36146f8565b5b92915050565b60006152e582613b29565b9150600082036152f8576152f76146f8565b5b600182039050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b600061535f602f83613a82565b915061536a82615303565b604082019050919050565b6000602082019050818103600083015261538e81615352565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b60006153f1603383613a82565b91506153fc82615395565b604082019050919050565b60006020820190508181036000830152615420816153e4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061546182613b29565b915061546c83613b29565b92508261547c5761547b615427565b5b828204905092915050565b600061549282613b29565b915061549d83613b29565b9250826154ad576154ac615427565b5b828206905092915050565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b6000615514603183613a82565b915061551f826154b8565b604082019050919050565b6000602082019050818103600083015261554381615507565b9050919050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006155a6602183613a82565b91506155b18261554a565b604082019050919050565b600060208201905081810360008301526155d581615599565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b6000615612601d83613a82565b915061561d826155dc565b602082019050919050565b6000602082019050818103600083015261564181615605565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b60006156a4602283613a82565b91506156af82615648565b604082019050919050565b600060208201905081810360008301526156d381615697565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6000615701826156da565b915061570c836156da565b925082820190506fffffffffffffffffffffffffffffffff811115615734576157336146f8565b5b92915050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000615796603283613a82565b91506157a18261573a565b604082019050919050565b600060208201905081810360008301526157c581615789565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b6000615828602683613a82565b9150615833826157cc565b604082019050919050565b600060208201905081810360008301526158578161581b565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006158ba602583613a82565b91506158c58261585e565b604082019050919050565b600060208201905081810360008301526158e9816158ad565b9050919050565b60006158fb826156da565b9150615906836156da565b925082820390506fffffffffffffffffffffffffffffffff81111561592e5761592d6146f8565b5b92915050565b600081519050919050565b600082825260208201905092915050565b600061595b82615934565b615965818561593f565b9350615975818560208601613a93565b61597e81613abd565b840191505092915050565b600060808201905061599e6000830187613bbe565b6159ab6020830186613bbe565b6159b86040830185613c54565b81810360608301526159ca8184615950565b905095945050505050565b6000815190506159e4816139e8565b92915050565b600060208284031215615a00576159ff6139b2565b5b6000615a0e848285016159d5565b9150509291505056fea26469706673582212202be967b33ad8115ec2180af5276d53bb4eb6b67983dc0bf5caa244bdebf3e58764736f6c6343000811003300000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000002710
Deployed Bytecode
0x60806040526004361061025c5760003560e01c806370a0823111610144578063b1f7f0eb116100b6578063d5abeb011161007a578063d5abeb0114610900578063d7224ba01461092b578063dc33e68114610956578063e985e9c514610993578063f2fde38b146109d0578063fdb8e34e146109f95761025c565b8063b1f7f0eb146107f7578063b758f90314610834578063b88d4fde1461085d578063c080519714610886578063c87b56dd146108c35761025c565b80638da5cb5b116101085780638da5cb5b146106e457806390aa0b0f1461070f5780639231ab2a1461073b57806395d89b41146107785780639dfde201146107a3578063a22cb465146107ce5761025c565b806370a0823114610611578063715018a61461064e578063801fe59b146106655780638942932d1461067c5780638bc35c2f146106b95761025c565b80633f5e4741116101dd5780634f6ccce7116101a15780634f6ccce7146104f357806355a554651461053057806355f804b3146105595780636352211e1461058257806367ba5ecc146105bf5780636f58ec48146105e85761025c565b80633f5e47411461041e57806341f434341461044957806342842e0e146104745780634aaf78f11461049d5780634c0f38c2146104c85761025c565b806318160ddd1161022457806318160ddd1461034b57806323b872dd146103765780632a13614c1461039f5780632f745c59146103ca5780633ccfd60b146104075761025c565b806301ffc9a71461026157806306fdde031461029e57806307883703146102c9578063081812fc146102e5578063095ea7b314610322575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613a14565b610a22565b6040516102959190613a5c565b60405180910390f35b3480156102aa57600080fd5b506102b3610b6c565b6040516102c09190613b07565b60405180910390f35b6102e360048036038101906102de9190613b5f565b610bfe565b005b3480156102f157600080fd5b5061030c60048036038101906103079190613b5f565b610e0e565b6040516103199190613bcd565b60405180910390f35b34801561032e57600080fd5b5061034960048036038101906103449190613c14565b610e93565b005b34801561035757600080fd5b50610360610f9d565b60405161036d9190613c63565b60405180910390f35b34801561038257600080fd5b5061039d60048036038101906103989190613c7e565b610fa7565b005b3480156103ab57600080fd5b506103b46110f7565b6040516103c19190613cea565b60405180910390f35b3480156103d657600080fd5b506103f160048036038101906103ec9190613c14565b6110fd565b6040516103fe9190613c63565b60405180910390f35b34801561041357600080fd5b5061041c6112f9565b005b34801561042a57600080fd5b5061043361131a565b6040516104409190613a5c565b60405180910390f35b34801561045557600080fd5b5061045e611367565b60405161046b9190613d64565b60405180910390f35b34801561048057600080fd5b5061049b60048036038101906104969190613c7e565b611379565b005b3480156104a957600080fd5b506104b26114c9565b6040516104bf9190613a5c565b60405180910390f35b3480156104d457600080fd5b506104dd6114dc565b6040516104ea9190613c63565b60405180910390f35b3480156104ff57600080fd5b5061051a60048036038101906105159190613b5f565b6114e6565b6040516105279190613c63565b60405180910390f35b34801561053c57600080fd5b5061055760048036038101906105529190613dab565b611539565b005b34801561056557600080fd5b50610580600480360381019061057b9190613e50565b611570565b005b34801561058e57600080fd5b506105a960048036038101906105a49190613b5f565b61158e565b6040516105b69190613bcd565b60405180910390f35b3480156105cb57600080fd5b506105e660048036038101906105e19190613ec9565b6115a4565b005b3480156105f457600080fd5b5061060f600480360381019061060a9190613f32565b6115b6565b005b34801561061d57600080fd5b5061063860048036038101906106339190613f5f565b6115e5565b6040516106459190613c63565b60405180910390f35b34801561065a57600080fd5b506106636116cd565b005b34801561067157600080fd5b5061067a6116e1565b005b34801561068857600080fd5b506106a3600480360381019061069e9190613fe2565b611715565b6040516106b09190613a5c565b60405180910390f35b3480156106c557600080fd5b506106ce61185a565b6040516106db9190613c63565b60405180910390f35b3480156106f057600080fd5b506106f961187e565b6040516107069190613bcd565b60405180910390f35b34801561071b57600080fd5b506107246118a7565b60405161073292919061403e565b60405180910390f35b34801561074757600080fd5b50610762600480360381019061075d9190613b5f565b6118c9565b60405161076f91906140c8565b60405180910390f35b34801561078457600080fd5b5061078d6118e1565b60405161079a9190613b07565b60405180910390f35b3480156107af57600080fd5b506107b8611973565b6040516107c59190613c63565b60405180910390f35b3480156107da57600080fd5b506107f560048036038101906107f091906140e3565b611978565b005b34801561080357600080fd5b5061081e60048036038101906108199190613f5f565b611a82565b60405161082b9190613a5c565b60405180910390f35b34801561084057600080fd5b5061085b60048036038101906108569190614123565b611aa2565b005b34801561086957600080fd5b50610884600480360381019061087f9190614293565b611aff565b005b34801561089257600080fd5b506108ad60048036038101906108a89190613b5f565b611c52565b6040516108ba9190613a5c565b60405180910390f35b3480156108cf57600080fd5b506108ea60048036038101906108e59190613b5f565b611c72565b6040516108f79190613b07565b60405180910390f35b34801561090c57600080fd5b50610915611d19565b6040516109229190613c63565b60405180910390f35b34801561093757600080fd5b50610940611d1f565b60405161094d9190613c63565b60405180910390f35b34801561096257600080fd5b5061097d60048036038101906109789190613f5f565b611d25565b60405161098a9190613c63565b60405180910390f35b34801561099f57600080fd5b506109ba60048036038101906109b59190614316565b611d37565b6040516109c79190613a5c565b60405180910390f35b3480156109dc57600080fd5b506109f760048036038101906109f29190613f5f565b611e1c565b005b348015610a0557600080fd5b50610a206004803603810190610a1b91906144dc565b611e9f565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aed57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b5557507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b655750610b6482611f56565b5b9050919050565b606060048054610b7b90614583565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba790614583565b8015610bf45780601f10610bc957610100808354040283529160200191610bf4565b820191906000526020600020905b815481529060010190602001808311610bd757829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610c6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6390614600565b60405180910390fd5b610c7461131a565b610cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610caa9061466c565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000014811115610d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0d906146d8565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000271081610d40610f9d565b610d4a9190614727565b1115610d8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d82906146d8565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000001481610db633611d25565b610dc09190614727565b1115610e01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df8906147a7565b60405180910390fd5b610e0b3382611fc0565b50565b6000610e1982611fde565b610e58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4f90614839565b60405180910390fd5b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610f8e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610f0b929190614859565b602060405180830381865afa158015610f28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4c9190614897565b610f8d57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610f849190613bcd565b60405180910390fd5b5b610f988383611fec565b505050565b6000600154905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156110e5573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611019576110148484846121b6565b6110f1565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611062929190614859565b602060405180830381865afa15801561107f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a39190614897565b6110e457336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016110db9190613bcd565b60405180910390fd5b5b6110f08484846121b6565b5b50505050565b60025481565b6000611108836115e5565b8210611149576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114090614936565b60405180910390fd5b6000611153610f9d565b905060008060005b838110156112b7576000600660008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461124d57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036112a3578684036112945781955050505050506112f3565b838061129f90614956565b9450505b5080806112af90614956565b91505061115b565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ea90614a10565b60405180910390fd5b92915050565b6113016121c6565b3373ffffffffffffffffffffffffffffffffffffffff16ff5b600080600f60000160009054906101000a900463ffffffff1663ffffffff16141580156113625750600f60000160009054906101000a900463ffffffff1663ffffffff164210155b905090565b6daaeb6d7670e522a718067333cd4e81565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156114b7573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036113eb576113e6848484612244565b6114c3565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611434929190614859565b602060405180830381865afa158015611451573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114759190614897565b6114b657336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016114ad9190613bcd565b60405180910390fd5b5b6114c2848484612244565b5b50505050565b600360009054906101000a900460ff1681565b6000600e54905090565b60006114f0610f9d565b8210611531576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152890614aa2565b60405180910390fd5b819050919050565b6115416121c6565b80600a600084815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6115786121c6565b818160119182611589929190614c6f565b505050565b600061159982612264565b600001519050919050565b6115ac6121c6565b8060028190555050565b6115be6121c6565b80600f60000160006101000a81548163ffffffff021916908363ffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611655576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164c90614db1565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6116d56121c6565b6116df6000612467565b565b6116e96121c6565b600360009054906101000a900460ff1615600360006101000a81548160ff021916908315150217905550565b600080336040516020016117299190614e19565b6040516020818303038152906040528051906020012090506000326040516020016117549190614e19565b6040516020818303038152906040528051906020012090506117ba858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506002548461252b565b8061180f575061180e858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506002548361252b565b5b61184e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184590614e80565b60405180910390fd5b60019250505092915050565b7f000000000000000000000000000000000000000000000000000000000000001481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f8060000160009054906101000a900463ffffffff16908060010154905082565b6118d161396e565b6118da82612264565b9050919050565b6060600580546118f090614583565b80601f016020809104026020016040519081016040528092919081815260200182805461191c90614583565b80156119695780601f1061193e57610100808354040283529160200191611969565b820191906000526020600020905b81548152906001019060200180831161194c57829003601f168201915b5050505050905090565b600081565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611a73576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016119f0929190614859565b602060405180830381865afa158015611a0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a319190614897565b611a7257806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611a699190613bcd565b60405180910390fd5b5b611a7d8383612542565b505050565b600b6020528060005260406000206000915054906101000a900460ff1681565b611aaa6121c6565b60405180604001604052808363ffffffff16815260200182815250600f60008201518160000160006101000a81548163ffffffff021916908363ffffffff160217905550602082015181600101559050505050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611c3e573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b7257611b6d8585858561289a565b611c4b565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611bbb929190614859565b602060405180830381865afa158015611bd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfc9190614897565b611c3d57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611c349190613bcd565b60405180910390fd5b5b611c4a8585858561289a565b5b5050505050565b600a6020528060005260406000206000915054906101000a900460ff1681565b6060611c7d82611fde565b611cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb390614f12565b60405180910390fd5b6000611cc66128f6565b90506000815111611ce65760405180602001604052806000815250611d11565b80611cf084612988565b604051602001611d01929190614fba565b6040516020818303038152906040525b915050919050565b600e5481565b600c5481565b6000611d3082612ae8565b9050919050565b6000733b3931d26a9f73ba6409bdd0a4846be79ccab94d73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d895760019050611e16565b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690505b92915050565b611e246121c6565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8a9061505b565b60405180910390fd5b611e9c81612467565b50565b611ea76121c6565b60005b8251811015611f5157818181518110611ec657611ec561507b565b5b6020026020010151600b6000858481518110611ee557611ee461507b565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611f4990614956565b915050611eaa565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611fda828260405180602001604052806000815250612bd0565b5050565b600060015482109050919050565b611ff46130af565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612061576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612058906150f6565b60405180910390fd5b600061206c8261158e565b90508073ffffffffffffffffffffffffffffffffffffffff1661208d6130af565b73ffffffffffffffffffffffffffffffffffffffff16141580156120bf57506120bd816120b86130af565b611d37565b155b156120f6576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600360009054906101000a900460ff161580156121315750600a600083815260200190815260200160002060009054906101000a900460ff16155b156121a5576121558373ffffffffffffffffffffffffffffffffffffffff166130b7565b15612195576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218c90615188565b60405180910390fd5b6121a08383836130da565b6121b1565b6121b08383836130da565b5b505050565b6121c183838361318c565b505050565b6121ce6130af565b73ffffffffffffffffffffffffffffffffffffffff166121ec61187e565b73ffffffffffffffffffffffffffffffffffffffff1614612242576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612239906151f4565b60405180910390fd5b565b61225f83838360405180602001604052806000815250611aff565b505050565b61226c61396e565b61227582611fde565b6122b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ab90615286565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000001483106123185760017f00000000000000000000000000000000000000000000000000000000000000148461230b91906152a6565b6123159190614727565b90505b60008390505b818110612426576000600660008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461241257809350505050612462565b50808061241e906152da565b91505061231e565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245990615375565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000826125388584613743565b1490509392505050565b61254a6130af565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ae906150f6565b60405180910390fd5b600360009054906101000a900460ff1615801561261e5750600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561278e576126428273ffffffffffffffffffffffffffffffffffffffff166130b7565b15612682576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267990615188565b60405180910390fd5b806009600061268f6130af565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661273c6130af565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127819190613a5c565b60405180910390a3612896565b806009600061279b6130af565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166128486130af565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161288d9190613a5c565b60405180910390a35b5050565b6128a584848461318c565b6128b184848484613799565b6128f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e790615407565b60405180910390fd5b50505050565b60606011805461290590614583565b80601f016020809104026020016040519081016040528092919081815260200182805461293190614583565b801561297e5780601f106129535761010080835404028352916020019161297e565b820191906000526020600020905b81548152906001019060200180831161296157829003601f168201915b5050505050905090565b6060600082036129cf576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ae3565b600082905060005b60008214612a015780806129ea90614956565b915050600a826129fa9190615456565b91506129d7565b60008167ffffffffffffffff811115612a1d57612a1c614168565b5b6040519080825280601f01601f191660200182016040528015612a4f5781602001600182028036833780820191505090505b5090505b60008514612adc57600182612a6891906152a6565b9150600a85612a779190615487565b6030612a839190614727565b60f81b818381518110612a9957612a9861507b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ad59190615456565b9450612a53565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4f9061552a565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612c46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3d906155bc565b60405180910390fd5b612c4f81611fde565b15612c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8690615628565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000014831115612cf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce9906156ba565b60405180910390fd5b612cff6000858386613920565b6000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612dfc91906156f6565b6fffffffffffffffffffffffffffffffff168152602001858360200151612e2391906156f6565b6fffffffffffffffffffffffffffffffff16815250600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506006600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561309257818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46130326000888488613799565b613071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306890615407565b60405180910390fd5b818061307c90614956565b925050808061308a90614956565b915050612fc1565b50806001819055506130a76000878588613926565b505050505050565b600033905090565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061319782612264565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166131be6130af565b73ffffffffffffffffffffffffffffffffffffffff16148061321a57506131e36130af565b73ffffffffffffffffffffffffffffffffffffffff1661320284610e0e565b73ffffffffffffffffffffffffffffffffffffffff16145b80613236575061323582600001516132306130af565b611d37565b5b905080613278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326f906157ac565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146132ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132e19061583e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613359576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613350906158d0565b60405180910390fd5b6133668585856001613920565b61337660008484600001516130da565b6001600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166133e491906158f0565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff1661348891906156f6565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506006600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600060018461358e9190614727565b9050600073ffffffffffffffffffffffffffffffffffffffff166006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036136d35761360381611fde565b156136d2576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506006600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461373b8686866001613926565b505050505050565b60008082905060005b845181101561378e576137798286838151811061376c5761376b61507b565b5b602002602001015161392c565b9150808061378690614956565b91505061374c565b508091505092915050565b60006137ba8473ffffffffffffffffffffffffffffffffffffffff166130b7565b15613913578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026137e36130af565b8786866040518563ffffffff1660e01b81526004016138059493929190615989565b6020604051808303816000875af192505050801561384157506040513d601f19601f8201168201806040525081019061383e91906159ea565b60015b6138c3573d8060008114613871576040519150601f19603f3d011682016040523d82523d6000602084013e613876565b606091505b5060008151036138bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138b290615407565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613918565b600190505b949350505050565b50505050565b50505050565b60008183106139445761393f8284613957565b61394f565b61394e8383613957565b5b905092915050565b600082600052816020526040600020905092915050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6139f1816139bc565b81146139fc57600080fd5b50565b600081359050613a0e816139e8565b92915050565b600060208284031215613a2a57613a296139b2565b5b6000613a38848285016139ff565b91505092915050565b60008115159050919050565b613a5681613a41565b82525050565b6000602082019050613a716000830184613a4d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613ab1578082015181840152602081019050613a96565b60008484015250505050565b6000601f19601f8301169050919050565b6000613ad982613a77565b613ae38185613a82565b9350613af3818560208601613a93565b613afc81613abd565b840191505092915050565b60006020820190508181036000830152613b218184613ace565b905092915050565b6000819050919050565b613b3c81613b29565b8114613b4757600080fd5b50565b600081359050613b5981613b33565b92915050565b600060208284031215613b7557613b746139b2565b5b6000613b8384828501613b4a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613bb782613b8c565b9050919050565b613bc781613bac565b82525050565b6000602082019050613be26000830184613bbe565b92915050565b613bf181613bac565b8114613bfc57600080fd5b50565b600081359050613c0e81613be8565b92915050565b60008060408385031215613c2b57613c2a6139b2565b5b6000613c3985828601613bff565b9250506020613c4a85828601613b4a565b9150509250929050565b613c5d81613b29565b82525050565b6000602082019050613c786000830184613c54565b92915050565b600080600060608486031215613c9757613c966139b2565b5b6000613ca586828701613bff565b9350506020613cb686828701613bff565b9250506040613cc786828701613b4a565b9150509250925092565b6000819050919050565b613ce481613cd1565b82525050565b6000602082019050613cff6000830184613cdb565b92915050565b6000819050919050565b6000613d2a613d25613d2084613b8c565b613d05565b613b8c565b9050919050565b6000613d3c82613d0f565b9050919050565b6000613d4e82613d31565b9050919050565b613d5e81613d43565b82525050565b6000602082019050613d796000830184613d55565b92915050565b613d8881613a41565b8114613d9357600080fd5b50565b600081359050613da581613d7f565b92915050565b60008060408385031215613dc257613dc16139b2565b5b6000613dd085828601613b4a565b9250506020613de185828601613d96565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f840112613e1057613e0f613deb565b5b8235905067ffffffffffffffff811115613e2d57613e2c613df0565b5b602083019150836001820283011115613e4957613e48613df5565b5b9250929050565b60008060208385031215613e6757613e666139b2565b5b600083013567ffffffffffffffff811115613e8557613e846139b7565b5b613e9185828601613dfa565b92509250509250929050565b613ea681613cd1565b8114613eb157600080fd5b50565b600081359050613ec381613e9d565b92915050565b600060208284031215613edf57613ede6139b2565b5b6000613eed84828501613eb4565b91505092915050565b600063ffffffff82169050919050565b613f0f81613ef6565b8114613f1a57600080fd5b50565b600081359050613f2c81613f06565b92915050565b600060208284031215613f4857613f476139b2565b5b6000613f5684828501613f1d565b91505092915050565b600060208284031215613f7557613f746139b2565b5b6000613f8384828501613bff565b91505092915050565b60008083601f840112613fa257613fa1613deb565b5b8235905067ffffffffffffffff811115613fbf57613fbe613df0565b5b602083019150836020820283011115613fdb57613fda613df5565b5b9250929050565b60008060208385031215613ff957613ff86139b2565b5b600083013567ffffffffffffffff811115614017576140166139b7565b5b61402385828601613f8c565b92509250509250929050565b61403881613ef6565b82525050565b6000604082019050614053600083018561402f565b6140606020830184613c54565b9392505050565b61407081613bac565b82525050565b600067ffffffffffffffff82169050919050565b61409381614076565b82525050565b6040820160008201516140af6000850182614067565b5060208201516140c2602085018261408a565b50505050565b60006040820190506140dd6000830184614099565b92915050565b600080604083850312156140fa576140f96139b2565b5b600061410885828601613bff565b925050602061411985828601613d96565b9150509250929050565b6000806040838503121561413a576141396139b2565b5b600061414885828601613f1d565b925050602061415985828601613b4a565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6141a082613abd565b810181811067ffffffffffffffff821117156141bf576141be614168565b5b80604052505050565b60006141d26139a8565b90506141de8282614197565b919050565b600067ffffffffffffffff8211156141fe576141fd614168565b5b61420782613abd565b9050602081019050919050565b82818337600083830152505050565b6000614236614231846141e3565b6141c8565b90508281526020810184848401111561425257614251614163565b5b61425d848285614214565b509392505050565b600082601f83011261427a57614279613deb565b5b813561428a848260208601614223565b91505092915050565b600080600080608085870312156142ad576142ac6139b2565b5b60006142bb87828801613bff565b94505060206142cc87828801613bff565b93505060406142dd87828801613b4a565b925050606085013567ffffffffffffffff8111156142fe576142fd6139b7565b5b61430a87828801614265565b91505092959194509250565b6000806040838503121561432d5761432c6139b2565b5b600061433b85828601613bff565b925050602061434c85828601613bff565b9150509250929050565b600067ffffffffffffffff82111561437157614370614168565b5b602082029050602081019050919050565b600061439561439084614356565b6141c8565b905080838252602082019050602084028301858111156143b8576143b7613df5565b5b835b818110156143e157806143cd8882613bff565b8452602084019350506020810190506143ba565b5050509392505050565b600082601f830112614400576143ff613deb565b5b8135614410848260208601614382565b91505092915050565b600067ffffffffffffffff82111561443457614433614168565b5b602082029050602081019050919050565b600061445861445384614419565b6141c8565b9050808382526020820190506020840283018581111561447b5761447a613df5565b5b835b818110156144a457806144908882613d96565b84526020840193505060208101905061447d565b5050509392505050565b600082601f8301126144c3576144c2613deb565b5b81356144d3848260208601614445565b91505092915050565b600080604083850312156144f3576144f26139b2565b5b600083013567ffffffffffffffff811115614511576145106139b7565b5b61451d858286016143eb565b925050602083013567ffffffffffffffff81111561453e5761453d6139b7565b5b61454a858286016144ae565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061459b57607f821691505b6020821081036145ae576145ad614554565b5b50919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b60006145ea601e83613a82565b91506145f5826145b4565b602082019050919050565b60006020820190508181036000830152614619816145dd565b9050919050565b7f73616c6520686173206e6f742073746172746564207965740000000000000000600082015250565b6000614656601883613a82565b915061466182614620565b602082019050919050565b6000602082019050818103600083015261468581614649565b9050919050565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b60006146c2601283613a82565b91506146cd8261468c565b602082019050919050565b600060208201905081810360008301526146f1816146b5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061473282613b29565b915061473d83613b29565b9250828201905080821115614755576147546146f8565b5b92915050565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b6000614791601683613a82565b915061479c8261475b565b602082019050919050565b600060208201905081810360008301526147c081614784565b9050919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6000614823602d83613a82565b915061482e826147c7565b604082019050919050565b6000602082019050818103600083015261485281614816565b9050919050565b600060408201905061486e6000830185613bbe565b61487b6020830184613bbe565b9392505050565b60008151905061489181613d7f565b92915050565b6000602082840312156148ad576148ac6139b2565b5b60006148bb84828501614882565b91505092915050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000614920602283613a82565b915061492b826148c4565b604082019050919050565b6000602082019050818103600083015261494f81614913565b9050919050565b600061496182613b29565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614993576149926146f8565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b60006149fa602e83613a82565b9150614a058261499e565b604082019050919050565b60006020820190508181036000830152614a29816149ed565b9050919050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000614a8c602383613a82565b9150614a9782614a30565b604082019050919050565b60006020820190508181036000830152614abb81614a7f565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614b2f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614af2565b614b398683614af2565b95508019841693508086168417925050509392505050565b6000614b6c614b67614b6284613b29565b613d05565b613b29565b9050919050565b6000819050919050565b614b8683614b51565b614b9a614b9282614b73565b848454614aff565b825550505050565b600090565b614baf614ba2565b614bba818484614b7d565b505050565b5b81811015614bde57614bd3600082614ba7565b600181019050614bc0565b5050565b601f821115614c2357614bf481614acd565b614bfd84614ae2565b81016020851015614c0c578190505b614c20614c1885614ae2565b830182614bbf565b50505b505050565b600082821c905092915050565b6000614c4660001984600802614c28565b1980831691505092915050565b6000614c5f8383614c35565b9150826002028217905092915050565b614c798383614ac2565b67ffffffffffffffff811115614c9257614c91614168565b5b614c9c8254614583565b614ca7828285614be2565b6000601f831160018114614cd65760008415614cc4578287013590505b614cce8582614c53565b865550614d36565b601f198416614ce486614acd565b60005b82811015614d0c57848901358255600182019150602085019450602081019050614ce7565b86831015614d295784890135614d25601f891682614c35565b8355505b6001600288020188555050505b50505050505050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614d9b602b83613a82565b9150614da682614d3f565b604082019050919050565b60006020820190508181036000830152614dca81614d8e565b9050919050565b60008160601b9050919050565b6000614de982614dd1565b9050919050565b6000614dfb82614dde565b9050919050565b614e13614e0e82613bac565b614df0565b82525050565b6000614e258284614e02565b60148201915081905092915050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b6000614e6a600e83613a82565b9150614e7582614e34565b602082019050919050565b60006020820190508181036000830152614e9981614e5d565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614efc602f83613a82565b9150614f0782614ea0565b604082019050919050565b60006020820190508181036000830152614f2b81614eef565b9050919050565b600081905092915050565b6000614f4882613a77565b614f528185614f32565b9350614f62818560208601613a93565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614fa4600583614f32565b9150614faf82614f6e565b600582019050919050565b6000614fc68285614f3d565b9150614fd28284614f3d565b9150614fdd82614f97565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615045602683613a82565b915061505082614fe9565b604082019050919050565b6000602082019050818103600083015261507481615038565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b60006150e0601a83613a82565b91506150eb826150aa565b602082019050919050565b6000602082019050818103600083015261510f816150d3565b9050919050565b7f53616c65732077696c6c206265206f70656e6564206166746572206d696e742060008201527f697320636f6d706c6574652e0000000000000000000000000000000000000000602082015250565b6000615172602c83613a82565b915061517d82615116565b604082019050919050565b600060208201905081810360008301526151a181615165565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006151de602083613a82565b91506151e9826151a8565b602082019050919050565b6000602082019050818103600083015261520d816151d1565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b6000615270602a83613a82565b915061527b82615214565b604082019050919050565b6000602082019050818103600083015261529f81615263565b9050919050565b60006152b182613b29565b91506152bc83613b29565b92508282039050818111156152d4576152d36146f8565b5b92915050565b60006152e582613b29565b9150600082036152f8576152f76146f8565b5b600182039050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b600061535f602f83613a82565b915061536a82615303565b604082019050919050565b6000602082019050818103600083015261538e81615352565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b60006153f1603383613a82565b91506153fc82615395565b604082019050919050565b60006020820190508181036000830152615420816153e4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061546182613b29565b915061546c83613b29565b92508261547c5761547b615427565b5b828204905092915050565b600061549282613b29565b915061549d83613b29565b9250826154ad576154ac615427565b5b828206905092915050565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b6000615514603183613a82565b915061551f826154b8565b604082019050919050565b6000602082019050818103600083015261554381615507565b9050919050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006155a6602183613a82565b91506155b18261554a565b604082019050919050565b600060208201905081810360008301526155d581615599565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b6000615612601d83613a82565b915061561d826155dc565b602082019050919050565b6000602082019050818103600083015261564181615605565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b60006156a4602283613a82565b91506156af82615648565b604082019050919050565b600060208201905081810360008301526156d381615697565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6000615701826156da565b915061570c836156da565b925082820190506fffffffffffffffffffffffffffffffff811115615734576157336146f8565b5b92915050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000615796603283613a82565b91506157a18261573a565b604082019050919050565b600060208201905081810360008301526157c581615789565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b6000615828602683613a82565b9150615833826157cc565b604082019050919050565b600060208201905081810360008301526158578161581b565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006158ba602583613a82565b91506158c58261585e565b604082019050919050565b600060208201905081810360008301526158e9816158ad565b9050919050565b60006158fb826156da565b9150615906836156da565b925082820390506fffffffffffffffffffffffffffffffff81111561592e5761592d6146f8565b5b92915050565b600081519050919050565b600082825260208201905092915050565b600061595b82615934565b615965818561593f565b9350615975818560208601613a93565b61597e81613abd565b840191505092915050565b600060808201905061599e6000830187613bbe565b6159ab6020830186613bbe565b6159b86040830185613c54565b81810360608301526159ca8184615950565b905095945050505050565b6000815190506159e4816139e8565b92915050565b600060208284031215615a00576159ff6139b2565b5b6000615a0e848285016159d5565b9150509291505056fea26469706673582212202be967b33ad8115ec2180af5276d53bb4eb6b67983dc0bf5caa244bdebf3e58764736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000002710
-----Decoded View---------------
Arg [0] : maxBatchSize_ (uint256): 20
Arg [1] : collectionSize_ (uint256): 10000
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [1] : 0000000000000000000000000000000000000000000000000000000000002710
Deployed Bytecode Sourcemap
60359:3205:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46086:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47812:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61985:452;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50712:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61149:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44647:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61314:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42603:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45278:744;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62987:87;;;;;;;;;;;;;:::i;:::-;;62443:163;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2922:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61485:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42805:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61898:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44810:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48975:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63194:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47635:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49368:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62834:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46512:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40745:103;;;;;;;;;;;;;:::i;:::-;;48861:106;;;;;;;;;;;;;:::i;:::-;;49506:415;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60449:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40097:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60615:28;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;63413:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47967:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62612:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60965:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43818:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62658:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61664:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43668:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48128:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60502:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56944:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63300:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51759:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41003:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49123:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46086:370;46213:4;46258:25;46243:40;;;:11;:40;;;;:99;;;;46309:33;46294:48;;;:11;:48;;;;46243:99;:160;;;;46368:35;46353:50;;;:11;:50;;;;46243:160;:207;;;;46414:36;46438:11;46414:23;:36::i;:::-;46243:207;46229:221;;46086:370;;;:::o;47812:94::-;47866:13;47895:5;47888:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47812:94;:::o;61985:452::-;60898:10;60885:23;;:9;:23;;;60877:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;62066:16:::1;:14;:16::i;:::-;62058:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;62137:23;62125:8;:35;;62117:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;62226:14;62214:8;62198:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:42;;62190:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;62330:23;62318:8;62291:24;62304:10;62291:12;:24::i;:::-;:35;;;;:::i;:::-;:62;;62275:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;62400:31;62410:10;62422:8;62400:9;:31::i;:::-;61985:452:::0;:::o;50712:204::-;50780:7;50804:16;50812:7;50804;:16::i;:::-;50796:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;50886:15;:24;50902:7;50886:24;;;;;;;;;;;;;;;;;;;;;50879:31;;50712:204;;;:::o;61149:157::-;61245:8;4964:1;3022:42;4916:45;;;:49;4912:225;;;3022:42;4987;;;5038:4;5045:8;4987:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4982:144;;5101:8;5082:28;;;;;;;;;;;:::i;:::-;;;;;;;;4982:144;4912:225;61266:32:::1;61280:8;61290:7;61266:13;:32::i;:::-;61149:157:::0;;;:::o;44647:94::-;44700:7;44723:12;;44716:19;;44647:94;:::o;61314:163::-;61415:4;4218:1;3022:42;4170:45;;;:49;4166:539;;;4459:10;4451:18;;:4;:18;;;4447:85;;61432:37:::1;61451:4;61457:2;61461:7;61432:18;:37::i;:::-;4510:7:::0;;4447:85;3022:42;4551;;;4602:4;4609:10;4551:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4546:148;;4667:10;4648:30;;;;;;;;;;;:::i;:::-;;;;;;;;4546:148;4166:539;61432:37:::1;61451:4;61457:2;61461:7;61432:18;:37::i;:::-;61314:163:::0;;;;;:::o;42603:38::-;;;;:::o;45278:744::-;45387:7;45422:16;45432:5;45422:9;:16::i;:::-;45414:5;:24;45406:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;45484:22;45509:13;:11;:13::i;:::-;45484:38;;45529:19;45559:25;45609:9;45604:350;45628:14;45624:1;:18;45604:350;;;45658:31;45692:11;:14;45704:1;45692:14;;;;;;;;;;;45658:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45745:1;45719:28;;:9;:14;;;:28;;;45715:89;;45780:9;:14;;;45760:34;;45715:89;45837:5;45816:26;;:17;:26;;;45812:135;;45874:5;45859:11;:20;45855:59;;45901:1;45894:8;;;;;;;;;45855:59;45924:13;;;;;:::i;:::-;;;;45812:135;45649:305;45644:3;;;;;:::i;:::-;;;;45604:350;;;;45960:56;;;;;;;;;;:::i;:::-;;;;;;;;45278:744;;;;;:::o;62987:87::-;39983:13;:11;:13::i;:::-;63056:10:::1;63035:33;;;62443:163:::0;62490:4;62545:1;62517:10;:24;;;;;;;;;;;;:29;;;;:83;;;;;62576:10;:24;;;;;;;;;;;;62557:43;;:15;:43;;62517:83;62503:97;;62443:163;:::o;2922:143::-;3022:42;2922:143;:::o;61485:171::-;61590:4;4218:1;3022:42;4170:45;;;:49;4166:539;;;4459:10;4451:18;;:4;:18;;;4447:85;;61607:41:::1;61630:4;61636:2;61640:7;61607:22;:41::i;:::-;4510:7:::0;;4447:85;3022:42;4551;;;4602:4;4609:10;4551:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4546:148;;4667:10;4648:30;;;;;;;;;;;:::i;:::-;;;;;;;;4546:148;4166:539;61607:41:::1;61630:4;61636:2;61640:7;61607:22;:41::i;:::-;61485:171:::0;;;;;:::o;42805:37::-;;;;;;;;;;;;;:::o;61898:81::-;61942:7;61964:9;;61957:16;;61898:81;:::o;44810:177::-;44877:7;44909:13;:11;:13::i;:::-;44901:5;:21;44893:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;44976:5;44969:12;;44810:177;;;:::o;48975:140::-;39983:13;:11;:13::i;:::-;49101:6:::1;49069:19;:29;49089:8;49069:29;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;48975:140:::0;;:::o;63194:100::-;39983:13;:11;:13::i;:::-;63281:7:::1;;63265:13;:23;;;;;;;:::i;:::-;;63194:100:::0;;:::o;47635:118::-;47699:7;47722:20;47734:7;47722:11;:20::i;:::-;:25;;;47715:32;;47635:118;;;:::o;49368:130::-;39983:13;:11;:13::i;:::-;49479:11:::1;49453:23;:37;;;;49368:130:::0;:::o;62834:112::-;39983:13;:11;:13::i;:::-;62931:9:::1;62904:10;:24;;;:36;;;;;;;;;;;;;;;;;;62834:112:::0;:::o;46512:211::-;46576:7;46617:1;46600:19;;:5;:19;;;46592:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;46689:12;:19;46702:5;46689:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;46681:36;;46674:43;;46512:211;;;:::o;40745:103::-;39983:13;:11;:13::i;:::-;40810:30:::1;40837:1;40810:18;:30::i;:::-;40745:103::o:0;48861:106::-;39983:13;:11;:13::i;:::-;48942:17:::1;;;;;;;;;;;48941:18;48921:17;;:38;;;;;;;;;;;;;;;;;;48861:106::o:0;49506:415::-;49586:4;49603:12;49645:10;49628:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;49618:39;;;;;;49603:54;;49668:13;49711:9;49694:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;49684:38;;;;;;49668:54;;49741:63;49760:12;;49741:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49774:23;;49799:4;49741:18;:63::i;:::-;:131;;;;49808:64;49827:12;;49808:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49841:23;;49866:5;49808:18;:64::i;:::-;49741:131;49733:158;;;;;;;;;;;;:::i;:::-;;;;;;;;;49909:4;49902:11;;;;49506:415;;;;:::o;60449:48::-;;;:::o;40097:87::-;40143:7;40170:6;;;;;;;;;;;40163:13;;40097:87;:::o;60615:28::-;;;;;;;;;;;;;;;;;;;;;;;:::o;63413:147::-;63494:21;;:::i;:::-;63534:20;63546:7;63534:11;:20::i;:::-;63527:27;;63413:147;;;:::o;47967:98::-;48023:13;48052:7;48045:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47967:98;:::o;62612:39::-;62644:7;62612:39;:::o;60965:176::-;61069:8;4964:1;3022:42;4916:45;;;:49;4912:225;;;3022:42;4987;;;5038:4;5045:8;4987:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4982:144;;5101:8;5082:28;;;;;;;;;;;:::i;:::-;;;;;;;;4982:144;4912:225;61090:43:::1;61114:8;61124;61090:23;:43::i;:::-;60965:176:::0;;;:::o;43818:58::-;;;;;;;;;;;;;;;;;;;;;;:::o;62658:170::-;39983:13;:11;:13::i;:::-;62773:49:::1;;;;;;;;62790:13;62773:49;;;;;;62810:5;62773:49;;::::0;62760:10:::1;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62658:170:::0;;:::o;61664:228::-;61815:4;4218:1;3022:42;4170:45;;;:49;4166:539;;;4459:10;4451:18;;:4;:18;;;4447:85;;61837:47:::1;61860:4;61866:2;61870:7;61879:4;61837:22;:47::i;:::-;4510:7:::0;;4447:85;3022:42;4551;;;4602:4;4609:10;4551:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4546:148;;4667:10;4648:30;;;;;;;;;;;:::i;:::-;;;;;;;;4546:148;4166:539;61837:47:::1;61860:4;61866:2;61870:7;61879:4;61837:22;:47::i;:::-;61664:228:::0;;;;;;:::o;43668:51::-;;;;;;;;;;;;;;;;;;;;;;:::o;48128:401::-;48226:13;48267:16;48275:7;48267;:16::i;:::-;48251:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;48357:21;48381:10;:8;:10::i;:::-;48357:34;;48436:1;48418:7;48412:21;:25;:111;;;;;;;;;;;;;;;;;48473:7;48481:18;:7;:16;:18::i;:::-;48456:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48412:111;48398:125;;;48128:401;;;:::o;60502:29::-;;;;:::o;56944:43::-;;;;:::o;63300:107::-;63358:7;63381:20;63395:5;63381:13;:20::i;:::-;63374:27;;63300:107;;;:::o;51759:262::-;51881:4;51910:42;51900:52;;:8;:52;;;51897:70;;51961:4;51954:11;;;;51897:70;51980:18;:25;51999:5;51980:25;;;;;;;;;;;;;;;:35;52006:8;51980:35;;;;;;;;;;;;;;;;;;;;;;;;;51973:42;;51759:262;;;;;:::o;41003:201::-;39983:13;:11;:13::i;:::-;41112:1:::1;41092:22;;:8;:22;;::::0;41084:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;41168:28;41187:8;41168:18;:28::i;:::-;41003:201:::0;:::o;49123:237::-;39983:13;:11;:13::i;:::-;49240:9:::1;49235:118;49259:8;:15;49255:1;:19;49235:118;;;49334:6;49341:1;49334:9;;;;;;;;:::i;:::-;;;;;;;;49292:26;:39;49319:8;49328:1;49319:11;;;;;;;;:::i;:::-;;;;;;;;49292:39;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;49276:3;;;;;:::i;:::-;;;;49235:118;;;;49123:237:::0;;:::o;17057:157::-;17142:4;17181:25;17166:40;;;:11;:40;;;;17159:47;;17057:157;;;:::o;53190:98::-;53255:27;53265:2;53269:8;53255:27;;;;;;;;;;;;:9;:27::i;:::-;53190:98;;:::o;53079:105::-;53136:4;53166:12;;53156:7;:22;53149:29;;53079:105;;;:::o;49977:677::-;50072:12;:10;:12::i;:::-;50066:18;;:2;:18;;;50058:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;50126:13;50142:24;50158:7;50142:15;:24::i;:::-;50126:40;;50197:5;50181:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;50207:37;50224:5;50231:12;:10;:12::i;:::-;50207:16;:37::i;:::-;50206:38;50181:63;50177:138;;;50268:35;;;;;;;;;;;;;;50177:138;50329:17;;;;;;;;;;;50328:18;:51;;;;;50351:19;:28;50371:7;50351:28;;;;;;;;;;;;;;;;;;;;;50350:29;50328:51;50325:322;;;50399:15;:2;:13;;;:15::i;:::-;50395:180;;;50435:55;;;;;;;;;;:::i;:::-;;;;;;;;50395:180;50531:28;50540:2;50544:7;50553:5;50531:8;:28::i;:::-;50325:322;;;50607:28;50616:2;50620:7;50629:5;50607:8;:28::i;:::-;50325:322;50047:607;49977:677;;:::o;52080:150::-;52196:28;52206:4;52212:2;52216:7;52196:9;:28::i;:::-;52080:150;;;:::o;40262:132::-;40337:12;:10;:12::i;:::-;40326:23;;:7;:5;:7::i;:::-;:23;;;40318:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40262:132::o;52293:165::-;52413:39;52430:4;52436:2;52440:7;52413:39;;;;;;;;;;;;:16;:39::i;:::-;52293:165;;;:::o;46975:606::-;47051:21;;:::i;:::-;47092:16;47100:7;47092;:16::i;:::-;47084:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;47164:26;47212:12;47201:7;:23;47197:93;;47281:1;47266:12;47256:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;47235:47;;47197:93;47303:12;47318:7;47303:22;;47298:212;47335:18;47327:4;:26;47298:212;;47372:31;47406:11;:17;47418:4;47406:17;;;;;;;;;;;47372:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47462:1;47436:28;;:9;:14;;;:28;;;47432:71;;47484:9;47477:16;;;;;;;47432:71;47363:147;47355:6;;;;;:::i;:::-;;;;47298:212;;;;47518:57;;;;;;;;;;:::i;:::-;;;;;;;;46975:606;;;;:::o;41364:191::-;41438:16;41457:6;;;;;;;;;;;41438:25;;41483:8;41474:6;;:17;;;;;;;;;;;;;;;;;;41538:8;41507:40;;41528:8;41507:40;;;;;;;;;;;;41427:128;41364:191;:::o;25207:190::-;25332:4;25385;25356:25;25369:5;25376:4;25356:12;:25::i;:::-;:33;25349:40;;25207:190;;;;;:::o;50982:714::-;51097:12;:10;:12::i;:::-;51085:24;;:8;:24;;;51077:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;51165:17;;;;;;;;;;;51164:18;:61;;;;;51187:26;:38;51214:10;51187:38;;;;;;;;;;;;;;;;;;;;;;;;;51186:39;51164:61;51161:528;;;51245:21;:8;:19;;;:21::i;:::-;51241:283;;;51287:55;;;;;;;;;;:::i;:::-;;;;;;;;51241:283;51428:8;51383:18;:32;51402:12;:10;:12::i;:::-;51383:32;;;;;;;;;;;;;;;:42;51416:8;51383:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;51489:8;51460:48;;51475:12;:10;:12::i;:::-;51460:48;;;51499:8;51460:48;;;;;;:::i;:::-;;;;;;;;51161:528;;;51601:8;51556:18;:32;51575:12;:10;:12::i;:::-;51556:32;;;;;;;;;;;;;;;:42;51589:8;51556:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;51658:8;51629:48;;51644:12;:10;:12::i;:::-;51629:48;;;51668:8;51629:48;;;;;;:::i;:::-;;;;;;;;51161:528;50982:714;;:::o;52521:319::-;52666:28;52676:4;52682:2;52686:7;52666:9;:28::i;:::-;52717:48;52740:4;52746:2;52750:7;52759:5;52717:22;:48::i;:::-;52701:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;52521:319;;;;:::o;63080:108::-;63140:13;63169;63162:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63080:108;:::o;33143:723::-;33199:13;33429:1;33420:5;:10;33416:53;;33447:10;;;;;;;;;;;;;;;;;;;;;33416:53;33479:12;33494:5;33479:20;;33510:14;33535:78;33550:1;33542:4;:9;33535:78;;33568:8;;;;;:::i;:::-;;;;33599:2;33591:10;;;;;:::i;:::-;;;33535:78;;;33623:19;33655:6;33645:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33623:39;;33673:154;33689:1;33680:5;:10;33673:154;;33717:1;33707:11;;;;;:::i;:::-;;;33784:2;33776:5;:10;;;;:::i;:::-;33763:2;:24;;;;:::i;:::-;33750:39;;33733:6;33740;33733:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;33813:2;33804:11;;;;;:::i;:::-;;;33673:154;;;33851:6;33837:21;;;;;33143:723;;;;:::o;46729:240::-;46790:7;46839:1;46822:19;;:5;:19;;;46806:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;46930:12;:19;46943:5;46930:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;46922:41;;46915:48;;46729:240;;;:::o;53627:1272::-;53732:20;53755:12;;53732:35;;53796:1;53782:16;;:2;:16;;;53774:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;53973:21;53981:12;53973:7;:21::i;:::-;53972:22;53964:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;54055:12;54043:8;:24;;54035:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;54115:61;54145:1;54149:2;54153:12;54167:8;54115:21;:61::i;:::-;54185:30;54218:12;:16;54231:2;54218:16;;;;;;;;;;;;;;;54185:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54260:119;;;;;;;;54310:8;54280:11;:19;;;:39;;;;:::i;:::-;54260:119;;;;;;54363:8;54328:11;:24;;;:44;;;;:::i;:::-;54260:119;;;;;54241:12;:16;54254:2;54241:16;;;;;;;;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54414:43;;;;;;;;54429:2;54414:43;;;;;;54440:15;54414:43;;;;;54386:11;:25;54398:12;54386:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54466:20;54489:12;54466:35;;54515:9;54510:281;54534:8;54530:1;:12;54510:281;;;54588:12;54584:2;54563:38;;54580:1;54563:38;;;;;;;;;;;;54628:59;54659:1;54663:2;54667:12;54681:5;54628:22;:59::i;:::-;54610:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;54769:14;;;;;:::i;:::-;;;;54544:3;;;;;:::i;:::-;;;;54510:281;;;;54814:12;54799;:27;;;;54833:60;54862:1;54866:2;54870:12;54884:8;54833:20;:60::i;:::-;53725:1174;;;53627:1272;;;:::o;38648:98::-;38701:7;38728:10;38721:17;;38648:98;:::o;6901:326::-;6961:4;7218:1;7196:7;:19;;;:23;7189:30;;6901:326;;;:::o;56766:172::-;56890:2;56863:15;:24;56879:7;56863:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;56924:7;56920:2;56904:28;;56913:5;56904:28;;;;;;;;;;;;56766:172;;;:::o;55131:1529::-;55228:35;55266:20;55278:7;55266:11;:20::i;:::-;55228:58;;55295:22;55337:13;:18;;;55321:34;;:12;:10;:12::i;:::-;:34;;;:81;;;;55390:12;:10;:12::i;:::-;55366:36;;:20;55378:7;55366:11;:20::i;:::-;:36;;;55321:81;:142;;;;55413:50;55430:13;:18;;;55450:12;:10;:12::i;:::-;55413:16;:50::i;:::-;55321:142;55295:169;;55489:17;55473:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;55621:4;55599:26;;:13;:18;;;:26;;;55583:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;55710:1;55696:16;;:2;:16;;;55688:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;55763:43;55785:4;55791:2;55795:7;55804:1;55763:21;:43::i;:::-;55863:49;55880:1;55884:7;55893:13;:18;;;55863:8;:49::i;:::-;55951:1;55921:12;:18;55934:4;55921:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;55987:1;55959:12;:16;55972:2;55959:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;56018:43;;;;;;;;56033:2;56018:43;;;;;;56044:15;56018:43;;;;;55995:11;:20;56007:7;55995:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56289:19;56321:1;56311:7;:11;;;;:::i;:::-;56289:33;;56374:1;56333:43;;:11;:24;56345:11;56333:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;56329:236;;56391:20;56399:11;56391:7;:20::i;:::-;56387:171;;;56451:97;;;;;;;;56478:13;:18;;;56451:97;;;;;;56509:13;:28;;;56451:97;;;;;56424:11;:24;56436:11;56424:24;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56387:171;56329:236;56597:7;56593:2;56578:27;;56587:4;56578:27;;;;;;;;;;;;56612:42;56633:4;56639:2;56643:7;56652:1;56612:20;:42::i;:::-;55221:1439;;;55131:1529;;;:::o;26074:296::-;26157:7;26177:20;26200:4;26177:27;;26220:9;26215:118;26239:5;:12;26235:1;:16;26215:118;;;26288:33;26298:12;26312:5;26318:1;26312:8;;;;;;;;:::i;:::-;;;;;;;;26288:9;:33::i;:::-;26273:48;;26253:3;;;;;:::i;:::-;;;;26215:118;;;;26350:12;26343:19;;;26074:296;;;;:::o;58481:690::-;58618:4;58635:15;:2;:13;;;:15::i;:::-;58631:535;;;58690:2;58674:36;;;58711:12;:10;:12::i;:::-;58725:4;58731:7;58740:5;58674:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;58661:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58922:1;58905:6;:13;:18;58901:215;;58938:61;;;;;;;;;;:::i;:::-;;;;;;;;58901:215;59084:6;59078:13;59069:6;59065:2;59061:15;59054:38;58661:464;58806:45;;;58796:55;;;:6;:55;;;;58789:62;;;;;58631:535;59154:4;59147:11;;58481:690;;;;;;;:::o;59633:141::-;;;;;:::o;60160:140::-;;;;;:::o;32281:149::-;32344:7;32375:1;32371;:5;:51;;32402:20;32417:1;32420;32402:14;:20::i;:::-;32371:51;;;32379:20;32394:1;32397;32379:14;:20::i;:::-;32371:51;32364:58;;32281:149;;;;:::o;32438:268::-;32506:13;32613:1;32607:4;32600:15;32642:1;32636:4;32629:15;32683:4;32677;32667:21;32658:30;;32438:268;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:77::-;5904:7;5933:5;5922:16;;5867:77;;;:::o;5950:118::-;6037:24;6055:5;6037:24;:::i;:::-;6032:3;6025:37;5950:118;;:::o;6074:222::-;6167:4;6205:2;6194:9;6190:18;6182:26;;6218:71;6286:1;6275:9;6271:17;6262:6;6218:71;:::i;:::-;6074:222;;;;:::o;6302:60::-;6330:3;6351:5;6344:12;;6302:60;;;:::o;6368:142::-;6418:9;6451:53;6469:34;6478:24;6496:5;6478:24;:::i;:::-;6469:34;:::i;:::-;6451:53;:::i;:::-;6438:66;;6368:142;;;:::o;6516:126::-;6566:9;6599:37;6630:5;6599:37;:::i;:::-;6586:50;;6516:126;;;:::o;6648:157::-;6729:9;6762:37;6793:5;6762:37;:::i;:::-;6749:50;;6648:157;;;:::o;6811:193::-;6929:68;6991:5;6929:68;:::i;:::-;6924:3;6917:81;6811:193;;:::o;7010:284::-;7134:4;7172:2;7161:9;7157:18;7149:26;;7185:102;7284:1;7273:9;7269:17;7260:6;7185:102;:::i;:::-;7010:284;;;;:::o;7300:116::-;7370:21;7385:5;7370:21;:::i;:::-;7363:5;7360:32;7350:60;;7406:1;7403;7396:12;7350:60;7300:116;:::o;7422:133::-;7465:5;7503:6;7490:20;7481:29;;7519:30;7543:5;7519:30;:::i;:::-;7422:133;;;;:::o;7561:468::-;7626:6;7634;7683:2;7671:9;7662:7;7658:23;7654:32;7651:119;;;7689:79;;:::i;:::-;7651:119;7809:1;7834:53;7879:7;7870:6;7859:9;7855:22;7834:53;:::i;:::-;7824:63;;7780:117;7936:2;7962:50;8004:7;7995:6;7984:9;7980:22;7962:50;:::i;:::-;7952:60;;7907:115;7561:468;;;;;:::o;8035:117::-;8144:1;8141;8134:12;8158:117;8267:1;8264;8257:12;8281:117;8390:1;8387;8380:12;8418:553;8476:8;8486:6;8536:3;8529:4;8521:6;8517:17;8513:27;8503:122;;8544:79;;:::i;:::-;8503:122;8657:6;8644:20;8634:30;;8687:18;8679:6;8676:30;8673:117;;;8709:79;;:::i;:::-;8673:117;8823:4;8815:6;8811:17;8799:29;;8877:3;8869:4;8861:6;8857:17;8847:8;8843:32;8840:41;8837:128;;;8884:79;;:::i;:::-;8837:128;8418:553;;;;;:::o;8977:529::-;9048:6;9056;9105:2;9093:9;9084:7;9080:23;9076:32;9073:119;;;9111:79;;:::i;:::-;9073:119;9259:1;9248:9;9244:17;9231:31;9289:18;9281:6;9278:30;9275:117;;;9311:79;;:::i;:::-;9275:117;9424:65;9481:7;9472:6;9461:9;9457:22;9424:65;:::i;:::-;9406:83;;;;9202:297;8977:529;;;;;:::o;9512:122::-;9585:24;9603:5;9585:24;:::i;:::-;9578:5;9575:35;9565:63;;9624:1;9621;9614:12;9565:63;9512:122;:::o;9640:139::-;9686:5;9724:6;9711:20;9702:29;;9740:33;9767:5;9740:33;:::i;:::-;9640:139;;;;:::o;9785:329::-;9844:6;9893:2;9881:9;9872:7;9868:23;9864:32;9861:119;;;9899:79;;:::i;:::-;9861:119;10019:1;10044:53;10089:7;10080:6;10069:9;10065:22;10044:53;:::i;:::-;10034:63;;9990:117;9785:329;;;;:::o;10120:93::-;10156:7;10196:10;10189:5;10185:22;10174:33;;10120:93;;;:::o;10219:120::-;10291:23;10308:5;10291:23;:::i;:::-;10284:5;10281:34;10271:62;;10329:1;10326;10319:12;10271:62;10219:120;:::o;10345:137::-;10390:5;10428:6;10415:20;10406:29;;10444:32;10470:5;10444:32;:::i;:::-;10345:137;;;;:::o;10488:327::-;10546:6;10595:2;10583:9;10574:7;10570:23;10566:32;10563:119;;;10601:79;;:::i;:::-;10563:119;10721:1;10746:52;10790:7;10781:6;10770:9;10766:22;10746:52;:::i;:::-;10736:62;;10692:116;10488:327;;;;:::o;10821:329::-;10880:6;10929:2;10917:9;10908:7;10904:23;10900:32;10897:119;;;10935:79;;:::i;:::-;10897:119;11055:1;11080:53;11125:7;11116:6;11105:9;11101:22;11080:53;:::i;:::-;11070:63;;11026:117;10821:329;;;;:::o;11173:568::-;11246:8;11256:6;11306:3;11299:4;11291:6;11287:17;11283:27;11273:122;;11314:79;;:::i;:::-;11273:122;11427:6;11414:20;11404:30;;11457:18;11449:6;11446:30;11443:117;;;11479:79;;:::i;:::-;11443:117;11593:4;11585:6;11581:17;11569:29;;11647:3;11639:4;11631:6;11627:17;11617:8;11613:32;11610:41;11607:128;;;11654:79;;:::i;:::-;11607:128;11173:568;;;;;:::o;11747:559::-;11833:6;11841;11890:2;11878:9;11869:7;11865:23;11861:32;11858:119;;;11896:79;;:::i;:::-;11858:119;12044:1;12033:9;12029:17;12016:31;12074:18;12066:6;12063:30;12060:117;;;12096:79;;:::i;:::-;12060:117;12209:80;12281:7;12272:6;12261:9;12257:22;12209:80;:::i;:::-;12191:98;;;;11987:312;11747:559;;;;;:::o;12312:115::-;12397:23;12414:5;12397:23;:::i;:::-;12392:3;12385:36;12312:115;;:::o;12433:328::-;12552:4;12590:2;12579:9;12575:18;12567:26;;12603:69;12669:1;12658:9;12654:17;12645:6;12603:69;:::i;:::-;12682:72;12750:2;12739:9;12735:18;12726:6;12682:72;:::i;:::-;12433:328;;;;;:::o;12767:108::-;12844:24;12862:5;12844:24;:::i;:::-;12839:3;12832:37;12767:108;;:::o;12881:101::-;12917:7;12957:18;12950:5;12946:30;12935:41;;12881:101;;;:::o;12988:105::-;13063:23;13080:5;13063:23;:::i;:::-;13058:3;13051:36;12988:105;;:::o;13169:529::-;13330:4;13325:3;13321:14;13417:4;13410:5;13406:16;13400:23;13436:63;13493:4;13488:3;13484:14;13470:12;13436:63;:::i;:::-;13345:164;13601:4;13594:5;13590:16;13584:23;13620:61;13675:4;13670:3;13666:14;13652:12;13620:61;:::i;:::-;13519:172;13299:399;13169:529;;:::o;13704:350::-;13861:4;13899:2;13888:9;13884:18;13876:26;;13912:135;14044:1;14033:9;14029:17;14020:6;13912:135;:::i;:::-;13704:350;;;;:::o;14060:468::-;14125:6;14133;14182:2;14170:9;14161:7;14157:23;14153:32;14150:119;;;14188:79;;:::i;:::-;14150:119;14308:1;14333:53;14378:7;14369:6;14358:9;14354:22;14333:53;:::i;:::-;14323:63;;14279:117;14435:2;14461:50;14503:7;14494:6;14483:9;14479:22;14461:50;:::i;:::-;14451:60;;14406:115;14060:468;;;;;:::o;14534:472::-;14601:6;14609;14658:2;14646:9;14637:7;14633:23;14629:32;14626:119;;;14664:79;;:::i;:::-;14626:119;14784:1;14809:52;14853:7;14844:6;14833:9;14829:22;14809:52;:::i;:::-;14799:62;;14755:116;14910:2;14936:53;14981:7;14972:6;14961:9;14957:22;14936:53;:::i;:::-;14926:63;;14881:118;14534:472;;;;;:::o;15012:117::-;15121:1;15118;15111:12;15135:180;15183:77;15180:1;15173:88;15280:4;15277:1;15270:15;15304:4;15301:1;15294:15;15321:281;15404:27;15426:4;15404:27;:::i;:::-;15396:6;15392:40;15534:6;15522:10;15519:22;15498:18;15486:10;15483:34;15480:62;15477:88;;;15545:18;;:::i;:::-;15477:88;15585:10;15581:2;15574:22;15364:238;15321:281;;:::o;15608:129::-;15642:6;15669:20;;:::i;:::-;15659:30;;15698:33;15726:4;15718:6;15698:33;:::i;:::-;15608:129;;;:::o;15743:307::-;15804:4;15894:18;15886:6;15883:30;15880:56;;;15916:18;;:::i;:::-;15880:56;15954:29;15976:6;15954:29;:::i;:::-;15946:37;;16038:4;16032;16028:15;16020:23;;15743:307;;;:::o;16056:146::-;16153:6;16148:3;16143;16130:30;16194:1;16185:6;16180:3;16176:16;16169:27;16056:146;;;:::o;16208:423::-;16285:5;16310:65;16326:48;16367:6;16326:48;:::i;:::-;16310:65;:::i;:::-;16301:74;;16398:6;16391:5;16384:21;16436:4;16429:5;16425:16;16474:3;16465:6;16460:3;16456:16;16453:25;16450:112;;;16481:79;;:::i;:::-;16450:112;16571:54;16618:6;16613:3;16608;16571:54;:::i;:::-;16291:340;16208:423;;;;;:::o;16650:338::-;16705:5;16754:3;16747:4;16739:6;16735:17;16731:27;16721:122;;16762:79;;:::i;:::-;16721:122;16879:6;16866:20;16904:78;16978:3;16970:6;16963:4;16955:6;16951:17;16904:78;:::i;:::-;16895:87;;16711:277;16650:338;;;;:::o;16994:943::-;17089:6;17097;17105;17113;17162:3;17150:9;17141:7;17137:23;17133:33;17130:120;;;17169:79;;:::i;:::-;17130:120;17289:1;17314:53;17359:7;17350:6;17339:9;17335:22;17314:53;:::i;:::-;17304:63;;17260:117;17416:2;17442:53;17487:7;17478:6;17467:9;17463:22;17442:53;:::i;:::-;17432:63;;17387:118;17544:2;17570:53;17615:7;17606:6;17595:9;17591:22;17570:53;:::i;:::-;17560:63;;17515:118;17700:2;17689:9;17685:18;17672:32;17731:18;17723:6;17720:30;17717:117;;;17753:79;;:::i;:::-;17717:117;17858:62;17912:7;17903:6;17892:9;17888:22;17858:62;:::i;:::-;17848:72;;17643:287;16994:943;;;;;;;:::o;17943:474::-;18011:6;18019;18068:2;18056:9;18047:7;18043:23;18039:32;18036:119;;;18074:79;;:::i;:::-;18036:119;18194:1;18219:53;18264:7;18255:6;18244:9;18240:22;18219:53;:::i;:::-;18209:63;;18165:117;18321:2;18347:53;18392:7;18383:6;18372:9;18368:22;18347:53;:::i;:::-;18337:63;;18292:118;17943:474;;;;;:::o;18423:311::-;18500:4;18590:18;18582:6;18579:30;18576:56;;;18612:18;;:::i;:::-;18576:56;18662:4;18654:6;18650:17;18642:25;;18722:4;18716;18712:15;18704:23;;18423:311;;;:::o;18757:710::-;18853:5;18878:81;18894:64;18951:6;18894:64;:::i;:::-;18878:81;:::i;:::-;18869:90;;18979:5;19008:6;19001:5;18994:21;19042:4;19035:5;19031:16;19024:23;;19095:4;19087:6;19083:17;19075:6;19071:30;19124:3;19116:6;19113:15;19110:122;;;19143:79;;:::i;:::-;19110:122;19258:6;19241:220;19275:6;19270:3;19267:15;19241:220;;;19350:3;19379:37;19412:3;19400:10;19379:37;:::i;:::-;19374:3;19367:50;19446:4;19441:3;19437:14;19430:21;;19317:144;19301:4;19296:3;19292:14;19285:21;;19241:220;;;19245:21;18859:608;;18757:710;;;;;:::o;19490:370::-;19561:5;19610:3;19603:4;19595:6;19591:17;19587:27;19577:122;;19618:79;;:::i;:::-;19577:122;19735:6;19722:20;19760:94;19850:3;19842:6;19835:4;19827:6;19823:17;19760:94;:::i;:::-;19751:103;;19567:293;19490:370;;;;:::o;19866:308::-;19940:4;20030:18;20022:6;20019:30;20016:56;;;20052:18;;:::i;:::-;20016:56;20102:4;20094:6;20090:17;20082:25;;20162:4;20156;20152:15;20144:23;;19866:308;;;:::o;20194:701::-;20287:5;20312:78;20328:61;20382:6;20328:61;:::i;:::-;20312:78;:::i;:::-;20303:87;;20410:5;20439:6;20432:5;20425:21;20473:4;20466:5;20462:16;20455:23;;20526:4;20518:6;20514:17;20506:6;20502:30;20555:3;20547:6;20544:15;20541:122;;;20574:79;;:::i;:::-;20541:122;20689:6;20672:217;20706:6;20701:3;20698:15;20672:217;;;20781:3;20810:34;20840:3;20828:10;20810:34;:::i;:::-;20805:3;20798:47;20874:4;20869:3;20865:14;20858:21;;20748:141;20732:4;20727:3;20723:14;20716:21;;20672:217;;;20676:21;20293:602;;20194:701;;;;;:::o;20915:364::-;20983:5;21032:3;21025:4;21017:6;21013:17;21009:27;20999:122;;21040:79;;:::i;:::-;20999:122;21157:6;21144:20;21182:91;21269:3;21261:6;21254:4;21246:6;21242:17;21182:91;:::i;:::-;21173:100;;20989:290;20915:364;;;;:::o;21285:888::-;21400:6;21408;21457:2;21445:9;21436:7;21432:23;21428:32;21425:119;;;21463:79;;:::i;:::-;21425:119;21611:1;21600:9;21596:17;21583:31;21641:18;21633:6;21630:30;21627:117;;;21663:79;;:::i;:::-;21627:117;21768:78;21838:7;21829:6;21818:9;21814:22;21768:78;:::i;:::-;21758:88;;21554:302;21923:2;21912:9;21908:18;21895:32;21954:18;21946:6;21943:30;21940:117;;;21976:79;;:::i;:::-;21940:117;22081:75;22148:7;22139:6;22128:9;22124:22;22081:75;:::i;:::-;22071:85;;21866:300;21285:888;;;;;:::o;22179:180::-;22227:77;22224:1;22217:88;22324:4;22321:1;22314:15;22348:4;22345:1;22338:15;22365:320;22409:6;22446:1;22440:4;22436:12;22426:22;;22493:1;22487:4;22483:12;22514:18;22504:81;;22570:4;22562:6;22558:17;22548:27;;22504:81;22632:2;22624:6;22621:14;22601:18;22598:38;22595:84;;22651:18;;:::i;:::-;22595:84;22416:269;22365:320;;;:::o;22691:180::-;22831:32;22827:1;22819:6;22815:14;22808:56;22691:180;:::o;22877:366::-;23019:3;23040:67;23104:2;23099:3;23040:67;:::i;:::-;23033:74;;23116:93;23205:3;23116:93;:::i;:::-;23234:2;23229:3;23225:12;23218:19;;22877:366;;;:::o;23249:419::-;23415:4;23453:2;23442:9;23438:18;23430:26;;23502:9;23496:4;23492:20;23488:1;23477:9;23473:17;23466:47;23530:131;23656:4;23530:131;:::i;:::-;23522:139;;23249:419;;;:::o;23674:174::-;23814:26;23810:1;23802:6;23798:14;23791:50;23674:174;:::o;23854:366::-;23996:3;24017:67;24081:2;24076:3;24017:67;:::i;:::-;24010:74;;24093:93;24182:3;24093:93;:::i;:::-;24211:2;24206:3;24202:12;24195:19;;23854:366;;;:::o;24226:419::-;24392:4;24430:2;24419:9;24415:18;24407:26;;24479:9;24473:4;24469:20;24465:1;24454:9;24450:17;24443:47;24507:131;24633:4;24507:131;:::i;:::-;24499:139;;24226:419;;;:::o;24651:168::-;24791:20;24787:1;24779:6;24775:14;24768:44;24651:168;:::o;24825:366::-;24967:3;24988:67;25052:2;25047:3;24988:67;:::i;:::-;24981:74;;25064:93;25153:3;25064:93;:::i;:::-;25182:2;25177:3;25173:12;25166:19;;24825:366;;;:::o;25197:419::-;25363:4;25401:2;25390:9;25386:18;25378:26;;25450:9;25444:4;25440:20;25436:1;25425:9;25421:17;25414:47;25478:131;25604:4;25478:131;:::i;:::-;25470:139;;25197:419;;;:::o;25622:180::-;25670:77;25667:1;25660:88;25767:4;25764:1;25757:15;25791:4;25788:1;25781:15;25808:191;25848:3;25867:20;25885:1;25867:20;:::i;:::-;25862:25;;25901:20;25919:1;25901:20;:::i;:::-;25896:25;;25944:1;25941;25937:9;25930:16;;25965:3;25962:1;25959:10;25956:36;;;25972:18;;:::i;:::-;25956:36;25808:191;;;;:::o;26005:172::-;26145:24;26141:1;26133:6;26129:14;26122:48;26005:172;:::o;26183:366::-;26325:3;26346:67;26410:2;26405:3;26346:67;:::i;:::-;26339:74;;26422:93;26511:3;26422:93;:::i;:::-;26540:2;26535:3;26531:12;26524:19;;26183:366;;;:::o;26555:419::-;26721:4;26759:2;26748:9;26744:18;26736:26;;26808:9;26802:4;26798:20;26794:1;26783:9;26779:17;26772:47;26836:131;26962:4;26836:131;:::i;:::-;26828:139;;26555:419;;;:::o;26980:232::-;27120:34;27116:1;27108:6;27104:14;27097:58;27189:15;27184:2;27176:6;27172:15;27165:40;26980:232;:::o;27218:366::-;27360:3;27381:67;27445:2;27440:3;27381:67;:::i;:::-;27374:74;;27457:93;27546:3;27457:93;:::i;:::-;27575:2;27570:3;27566:12;27559:19;;27218:366;;;:::o;27590:419::-;27756:4;27794:2;27783:9;27779:18;27771:26;;27843:9;27837:4;27833:20;27829:1;27818:9;27814:17;27807:47;27871:131;27997:4;27871:131;:::i;:::-;27863:139;;27590:419;;;:::o;28015:332::-;28136:4;28174:2;28163:9;28159:18;28151:26;;28187:71;28255:1;28244:9;28240:17;28231:6;28187:71;:::i;:::-;28268:72;28336:2;28325:9;28321:18;28312:6;28268:72;:::i;:::-;28015:332;;;;;:::o;28353:137::-;28407:5;28438:6;28432:13;28423:22;;28454:30;28478:5;28454:30;:::i;:::-;28353:137;;;;:::o;28496:345::-;28563:6;28612:2;28600:9;28591:7;28587:23;28583:32;28580:119;;;28618:79;;:::i;:::-;28580:119;28738:1;28763:61;28816:7;28807:6;28796:9;28792:22;28763:61;:::i;:::-;28753:71;;28709:125;28496:345;;;;:::o;28847:221::-;28987:34;28983:1;28975:6;28971:14;28964:58;29056:4;29051:2;29043:6;29039:15;29032:29;28847:221;:::o;29074:366::-;29216:3;29237:67;29301:2;29296:3;29237:67;:::i;:::-;29230:74;;29313:93;29402:3;29313:93;:::i;:::-;29431:2;29426:3;29422:12;29415:19;;29074:366;;;:::o;29446:419::-;29612:4;29650:2;29639:9;29635:18;29627:26;;29699:9;29693:4;29689:20;29685:1;29674:9;29670:17;29663:47;29727:131;29853:4;29727:131;:::i;:::-;29719:139;;29446:419;;;:::o;29871:233::-;29910:3;29933:24;29951:5;29933:24;:::i;:::-;29924:33;;29979:66;29972:5;29969:77;29966:103;;30049:18;;:::i;:::-;29966:103;30096:1;30089:5;30085:13;30078:20;;29871:233;;;:::o;30110:::-;30250:34;30246:1;30238:6;30234:14;30227:58;30319:16;30314:2;30306:6;30302:15;30295:41;30110:233;:::o;30349:366::-;30491:3;30512:67;30576:2;30571:3;30512:67;:::i;:::-;30505:74;;30588:93;30677:3;30588:93;:::i;:::-;30706:2;30701:3;30697:12;30690:19;;30349:366;;;:::o;30721:419::-;30887:4;30925:2;30914:9;30910:18;30902:26;;30974:9;30968:4;30964:20;30960:1;30949:9;30945:17;30938:47;31002:131;31128:4;31002:131;:::i;:::-;30994:139;;30721:419;;;:::o;31146:222::-;31286:34;31282:1;31274:6;31270:14;31263:58;31355:5;31350:2;31342:6;31338:15;31331:30;31146:222;:::o;31374:366::-;31516:3;31537:67;31601:2;31596:3;31537:67;:::i;:::-;31530:74;;31613:93;31702:3;31613:93;:::i;:::-;31731:2;31726:3;31722:12;31715:19;;31374:366;;;:::o;31746:419::-;31912:4;31950:2;31939:9;31935:18;31927:26;;31999:9;31993:4;31989:20;31985:1;31974:9;31970:17;31963:47;32027:131;32153:4;32027:131;:::i;:::-;32019:139;;31746:419;;;:::o;32171:97::-;32230:6;32258:3;32248:13;;32171:97;;;;:::o;32274:141::-;32323:4;32346:3;32338:11;;32369:3;32366:1;32359:14;32403:4;32400:1;32390:18;32382:26;;32274:141;;;:::o;32421:93::-;32458:6;32505:2;32500;32493:5;32489:14;32485:23;32475:33;;32421:93;;;:::o;32520:107::-;32564:8;32614:5;32608:4;32604:16;32583:37;;32520:107;;;;:::o;32633:393::-;32702:6;32752:1;32740:10;32736:18;32775:97;32805:66;32794:9;32775:97;:::i;:::-;32893:39;32923:8;32912:9;32893:39;:::i;:::-;32881:51;;32965:4;32961:9;32954:5;32950:21;32941:30;;33014:4;33004:8;33000:19;32993:5;32990:30;32980:40;;32709:317;;32633:393;;;;;:::o;33032:142::-;33082:9;33115:53;33133:34;33142:24;33160:5;33142:24;:::i;:::-;33133:34;:::i;:::-;33115:53;:::i;:::-;33102:66;;33032:142;;;:::o;33180:75::-;33223:3;33244:5;33237:12;;33180:75;;;:::o;33261:269::-;33371:39;33402:7;33371:39;:::i;:::-;33432:91;33481:41;33505:16;33481:41;:::i;:::-;33473:6;33466:4;33460:11;33432:91;:::i;:::-;33426:4;33419:105;33337:193;33261:269;;;:::o;33536:73::-;33581:3;33536:73;:::o;33615:189::-;33692:32;;:::i;:::-;33733:65;33791:6;33783;33777:4;33733:65;:::i;:::-;33668:136;33615:189;;:::o;33810:186::-;33870:120;33887:3;33880:5;33877:14;33870:120;;;33941:39;33978:1;33971:5;33941:39;:::i;:::-;33914:1;33907:5;33903:13;33894:22;;33870:120;;;33810:186;;:::o;34002:543::-;34103:2;34098:3;34095:11;34092:446;;;34137:38;34169:5;34137:38;:::i;:::-;34221:29;34239:10;34221:29;:::i;:::-;34211:8;34207:44;34404:2;34392:10;34389:18;34386:49;;;34425:8;34410:23;;34386:49;34448:80;34504:22;34522:3;34504:22;:::i;:::-;34494:8;34490:37;34477:11;34448:80;:::i;:::-;34107:431;;34092:446;34002:543;;;:::o;34551:117::-;34605:8;34655:5;34649:4;34645:16;34624:37;;34551:117;;;;:::o;34674:169::-;34718:6;34751:51;34799:1;34795:6;34787:5;34784:1;34780:13;34751:51;:::i;:::-;34747:56;34832:4;34826;34822:15;34812:25;;34725:118;34674:169;;;;:::o;34848:295::-;34924:4;35070:29;35095:3;35089:4;35070:29;:::i;:::-;35062:37;;35132:3;35129:1;35125:11;35119:4;35116:21;35108:29;;34848:295;;;;:::o;35148:1403::-;35272:44;35312:3;35307;35272:44;:::i;:::-;35381:18;35373:6;35370:30;35367:56;;;35403:18;;:::i;:::-;35367:56;35447:38;35479:4;35473:11;35447:38;:::i;:::-;35532:67;35592:6;35584;35578:4;35532:67;:::i;:::-;35626:1;35655:2;35647:6;35644:14;35672:1;35667:632;;;;36343:1;36360:6;36357:84;;;36416:9;36411:3;36407:19;36394:33;36385:42;;36357:84;36467:67;36527:6;36520:5;36467:67;:::i;:::-;36461:4;36454:81;36316:229;35637:908;;35667:632;35719:4;35715:9;35707:6;35703:22;35753:37;35785:4;35753:37;:::i;:::-;35812:1;35826:215;35840:7;35837:1;35834:14;35826:215;;;35926:9;35921:3;35917:19;35904:33;35896:6;35889:49;35977:1;35969:6;35965:14;35955:24;;36024:2;36013:9;36009:18;35996:31;;35863:4;35860:1;35856:12;35851:17;;35826:215;;;36069:6;36060:7;36057:19;36054:186;;;36134:9;36129:3;36125:19;36112:33;36177:48;36219:4;36211:6;36207:17;36196:9;36177:48;:::i;:::-;36169:6;36162:64;36077:163;36054:186;36286:1;36282;36274:6;36270:14;36266:22;36260:4;36253:36;35674:625;;;35637:908;;35247:1304;;;35148:1403;;;:::o;36557:230::-;36697:34;36693:1;36685:6;36681:14;36674:58;36766:13;36761:2;36753:6;36749:15;36742:38;36557:230;:::o;36793:366::-;36935:3;36956:67;37020:2;37015:3;36956:67;:::i;:::-;36949:74;;37032:93;37121:3;37032:93;:::i;:::-;37150:2;37145:3;37141:12;37134:19;;36793:366;;;:::o;37165:419::-;37331:4;37369:2;37358:9;37354:18;37346:26;;37418:9;37412:4;37408:20;37404:1;37393:9;37389:17;37382:47;37446:131;37572:4;37446:131;:::i;:::-;37438:139;;37165:419;;;:::o;37590:94::-;37623:8;37671:5;37667:2;37663:14;37642:35;;37590:94;;;:::o;37690:::-;37729:7;37758:20;37772:5;37758:20;:::i;:::-;37747:31;;37690:94;;;:::o;37790:100::-;37829:7;37858:26;37878:5;37858:26;:::i;:::-;37847:37;;37790:100;;;:::o;37896:157::-;38001:45;38021:24;38039:5;38021:24;:::i;:::-;38001:45;:::i;:::-;37996:3;37989:58;37896:157;;:::o;38059:256::-;38171:3;38186:75;38257:3;38248:6;38186:75;:::i;:::-;38286:2;38281:3;38277:12;38270:19;;38306:3;38299:10;;38059:256;;;;:::o;38321:164::-;38461:16;38457:1;38449:6;38445:14;38438:40;38321:164;:::o;38491:366::-;38633:3;38654:67;38718:2;38713:3;38654:67;:::i;:::-;38647:74;;38730:93;38819:3;38730:93;:::i;:::-;38848:2;38843:3;38839:12;38832:19;;38491:366;;;:::o;38863:419::-;39029:4;39067:2;39056:9;39052:18;39044:26;;39116:9;39110:4;39106:20;39102:1;39091:9;39087:17;39080:47;39144:131;39270:4;39144:131;:::i;:::-;39136:139;;38863:419;;;:::o;39288:234::-;39428:34;39424:1;39416:6;39412:14;39405:58;39497:17;39492:2;39484:6;39480:15;39473:42;39288:234;:::o;39528:366::-;39670:3;39691:67;39755:2;39750:3;39691:67;:::i;:::-;39684:74;;39767:93;39856:3;39767:93;:::i;:::-;39885:2;39880:3;39876:12;39869:19;;39528:366;;;:::o;39900:419::-;40066:4;40104:2;40093:9;40089:18;40081:26;;40153:9;40147:4;40143:20;40139:1;40128:9;40124:17;40117:47;40181:131;40307:4;40181:131;:::i;:::-;40173:139;;39900:419;;;:::o;40325:148::-;40427:11;40464:3;40449:18;;40325:148;;;;:::o;40479:390::-;40585:3;40613:39;40646:5;40613:39;:::i;:::-;40668:89;40750:6;40745:3;40668:89;:::i;:::-;40661:96;;40766:65;40824:6;40819:3;40812:4;40805:5;40801:16;40766:65;:::i;:::-;40856:6;40851:3;40847:16;40840:23;;40589:280;40479:390;;;;:::o;40875:155::-;41015:7;41011:1;41003:6;40999:14;40992:31;40875:155;:::o;41036:400::-;41196:3;41217:84;41299:1;41294:3;41217:84;:::i;:::-;41210:91;;41310:93;41399:3;41310:93;:::i;:::-;41428:1;41423:3;41419:11;41412:18;;41036:400;;;:::o;41442:701::-;41723:3;41745:95;41836:3;41827:6;41745:95;:::i;:::-;41738:102;;41857:95;41948:3;41939:6;41857:95;:::i;:::-;41850:102;;41969:148;42113:3;41969:148;:::i;:::-;41962:155;;42134:3;42127:10;;41442:701;;;;;:::o;42149:225::-;42289:34;42285:1;42277:6;42273:14;42266:58;42358:8;42353:2;42345:6;42341:15;42334:33;42149:225;:::o;42380:366::-;42522:3;42543:67;42607:2;42602:3;42543:67;:::i;:::-;42536:74;;42619:93;42708:3;42619:93;:::i;:::-;42737:2;42732:3;42728:12;42721:19;;42380:366;;;:::o;42752:419::-;42918:4;42956:2;42945:9;42941:18;42933:26;;43005:9;42999:4;42995:20;42991:1;42980:9;42976:17;42969:47;43033:131;43159:4;43033:131;:::i;:::-;43025:139;;42752:419;;;:::o;43177:180::-;43225:77;43222:1;43215:88;43322:4;43319:1;43312:15;43346:4;43343:1;43336:15;43363:176;43503:28;43499:1;43491:6;43487:14;43480:52;43363:176;:::o;43545:366::-;43687:3;43708:67;43772:2;43767:3;43708:67;:::i;:::-;43701:74;;43784:93;43873:3;43784:93;:::i;:::-;43902:2;43897:3;43893:12;43886:19;;43545:366;;;:::o;43917:419::-;44083:4;44121:2;44110:9;44106:18;44098:26;;44170:9;44164:4;44160:20;44156:1;44145:9;44141:17;44134:47;44198:131;44324:4;44198:131;:::i;:::-;44190:139;;43917:419;;;:::o;44342:231::-;44482:34;44478:1;44470:6;44466:14;44459:58;44551:14;44546:2;44538:6;44534:15;44527:39;44342:231;:::o;44579:366::-;44721:3;44742:67;44806:2;44801:3;44742:67;:::i;:::-;44735:74;;44818:93;44907:3;44818:93;:::i;:::-;44936:2;44931:3;44927:12;44920:19;;44579:366;;;:::o;44951:419::-;45117:4;45155:2;45144:9;45140:18;45132:26;;45204:9;45198:4;45194:20;45190:1;45179:9;45175:17;45168:47;45232:131;45358:4;45232:131;:::i;:::-;45224:139;;44951:419;;;:::o;45376:182::-;45516:34;45512:1;45504:6;45500:14;45493:58;45376:182;:::o;45564:366::-;45706:3;45727:67;45791:2;45786:3;45727:67;:::i;:::-;45720:74;;45803:93;45892:3;45803:93;:::i;:::-;45921:2;45916:3;45912:12;45905:19;;45564:366;;;:::o;45936:419::-;46102:4;46140:2;46129:9;46125:18;46117:26;;46189:9;46183:4;46179:20;46175:1;46164:9;46160:17;46153:47;46217:131;46343:4;46217:131;:::i;:::-;46209:139;;45936:419;;;:::o;46361:229::-;46501:34;46497:1;46489:6;46485:14;46478:58;46570:12;46565:2;46557:6;46553:15;46546:37;46361:229;:::o;46596:366::-;46738:3;46759:67;46823:2;46818:3;46759:67;:::i;:::-;46752:74;;46835:93;46924:3;46835:93;:::i;:::-;46953:2;46948:3;46944:12;46937:19;;46596:366;;;:::o;46968:419::-;47134:4;47172:2;47161:9;47157:18;47149:26;;47221:9;47215:4;47211:20;47207:1;47196:9;47192:17;47185:47;47249:131;47375:4;47249:131;:::i;:::-;47241:139;;46968:419;;;:::o;47393:194::-;47433:4;47453:20;47471:1;47453:20;:::i;:::-;47448:25;;47487:20;47505:1;47487:20;:::i;:::-;47482:25;;47531:1;47528;47524:9;47516:17;;47555:1;47549:4;47546:11;47543:37;;;47560:18;;:::i;:::-;47543:37;47393:194;;;;:::o;47593:171::-;47632:3;47655:24;47673:5;47655:24;:::i;:::-;47646:33;;47701:4;47694:5;47691:15;47688:41;;47709:18;;:::i;:::-;47688:41;47756:1;47749:5;47745:13;47738:20;;47593:171;;;:::o;47770:234::-;47910:34;47906:1;47898:6;47894:14;47887:58;47979:17;47974:2;47966:6;47962:15;47955:42;47770:234;:::o;48010:366::-;48152:3;48173:67;48237:2;48232:3;48173:67;:::i;:::-;48166:74;;48249:93;48338:3;48249:93;:::i;:::-;48367:2;48362:3;48358:12;48351:19;;48010:366;;;:::o;48382:419::-;48548:4;48586:2;48575:9;48571:18;48563:26;;48635:9;48629:4;48625:20;48621:1;48610:9;48606:17;48599:47;48663:131;48789:4;48663:131;:::i;:::-;48655:139;;48382:419;;;:::o;48807:238::-;48947:34;48943:1;48935:6;48931:14;48924:58;49016:21;49011:2;49003:6;48999:15;48992:46;48807:238;:::o;49051:366::-;49193:3;49214:67;49278:2;49273:3;49214:67;:::i;:::-;49207:74;;49290:93;49379:3;49290:93;:::i;:::-;49408:2;49403:3;49399:12;49392:19;;49051:366;;;:::o;49423:419::-;49589:4;49627:2;49616:9;49612:18;49604:26;;49676:9;49670:4;49666:20;49662:1;49651:9;49647:17;49640:47;49704:131;49830:4;49704:131;:::i;:::-;49696:139;;49423:419;;;:::o;49848:180::-;49896:77;49893:1;49886:88;49993:4;49990:1;49983:15;50017:4;50014:1;50007:15;50034:185;50074:1;50091:20;50109:1;50091:20;:::i;:::-;50086:25;;50125:20;50143:1;50125:20;:::i;:::-;50120:25;;50164:1;50154:35;;50169:18;;:::i;:::-;50154:35;50211:1;50208;50204:9;50199:14;;50034:185;;;;:::o;50225:176::-;50257:1;50274:20;50292:1;50274:20;:::i;:::-;50269:25;;50308:20;50326:1;50308:20;:::i;:::-;50303:25;;50347:1;50337:35;;50352:18;;:::i;:::-;50337:35;50393:1;50390;50386:9;50381:14;;50225:176;;;;:::o;50407:236::-;50547:34;50543:1;50535:6;50531:14;50524:58;50616:19;50611:2;50603:6;50599:15;50592:44;50407:236;:::o;50649:366::-;50791:3;50812:67;50876:2;50871:3;50812:67;:::i;:::-;50805:74;;50888:93;50977:3;50888:93;:::i;:::-;51006:2;51001:3;50997:12;50990:19;;50649:366;;;:::o;51021:419::-;51187:4;51225:2;51214:9;51210:18;51202:26;;51274:9;51268:4;51264:20;51260:1;51249:9;51245:17;51238:47;51302:131;51428:4;51302:131;:::i;:::-;51294:139;;51021:419;;;:::o;51446:220::-;51586:34;51582:1;51574:6;51570:14;51563:58;51655:3;51650:2;51642:6;51638:15;51631:28;51446:220;:::o;51672:366::-;51814:3;51835:67;51899:2;51894:3;51835:67;:::i;:::-;51828:74;;51911:93;52000:3;51911:93;:::i;:::-;52029:2;52024:3;52020:12;52013:19;;51672:366;;;:::o;52044:419::-;52210:4;52248:2;52237:9;52233:18;52225:26;;52297:9;52291:4;52287:20;52283:1;52272:9;52268:17;52261:47;52325:131;52451:4;52325:131;:::i;:::-;52317:139;;52044:419;;;:::o;52469:179::-;52609:31;52605:1;52597:6;52593:14;52586:55;52469:179;:::o;52654:366::-;52796:3;52817:67;52881:2;52876:3;52817:67;:::i;:::-;52810:74;;52893:93;52982:3;52893:93;:::i;:::-;53011:2;53006:3;53002:12;52995:19;;52654:366;;;:::o;53026:419::-;53192:4;53230:2;53219:9;53215:18;53207:26;;53279:9;53273:4;53269:20;53265:1;53254:9;53250:17;53243:47;53307:131;53433:4;53307:131;:::i;:::-;53299:139;;53026:419;;;:::o;53451:221::-;53591:34;53587:1;53579:6;53575:14;53568:58;53660:4;53655:2;53647:6;53643:15;53636:29;53451:221;:::o;53678:366::-;53820:3;53841:67;53905:2;53900:3;53841:67;:::i;:::-;53834:74;;53917:93;54006:3;53917:93;:::i;:::-;54035:2;54030:3;54026:12;54019:19;;53678:366;;;:::o;54050:419::-;54216:4;54254:2;54243:9;54239:18;54231:26;;54303:9;54297:4;54293:20;54289:1;54278:9;54274:17;54267:47;54331:131;54457:4;54331:131;:::i;:::-;54323:139;;54050:419;;;:::o;54475:118::-;54512:7;54552:34;54545:5;54541:46;54530:57;;54475:118;;;:::o;54599:224::-;54639:3;54658:20;54676:1;54658:20;:::i;:::-;54653:25;;54692:20;54710:1;54692:20;:::i;:::-;54687:25;;54735:1;54732;54728:9;54721:16;;54758:34;54753:3;54750:43;54747:69;;;54796:18;;:::i;:::-;54747:69;54599:224;;;;:::o;54829:237::-;54969:34;54965:1;54957:6;54953:14;54946:58;55038:20;55033:2;55025:6;55021:15;55014:45;54829:237;:::o;55072:366::-;55214:3;55235:67;55299:2;55294:3;55235:67;:::i;:::-;55228:74;;55311:93;55400:3;55311:93;:::i;:::-;55429:2;55424:3;55420:12;55413:19;;55072:366;;;:::o;55444:419::-;55610:4;55648:2;55637:9;55633:18;55625:26;;55697:9;55691:4;55687:20;55683:1;55672:9;55668:17;55661:47;55725:131;55851:4;55725:131;:::i;:::-;55717:139;;55444:419;;;:::o;55869:225::-;56009:34;56005:1;55997:6;55993:14;55986:58;56078:8;56073:2;56065:6;56061:15;56054:33;55869:225;:::o;56100:366::-;56242:3;56263:67;56327:2;56322:3;56263:67;:::i;:::-;56256:74;;56339:93;56428:3;56339:93;:::i;:::-;56457:2;56452:3;56448:12;56441:19;;56100:366;;;:::o;56472:419::-;56638:4;56676:2;56665:9;56661:18;56653:26;;56725:9;56719:4;56715:20;56711:1;56700:9;56696:17;56689:47;56753:131;56879:4;56753:131;:::i;:::-;56745:139;;56472:419;;;:::o;56897:224::-;57037:34;57033:1;57025:6;57021:14;57014:58;57106:7;57101:2;57093:6;57089:15;57082:32;56897:224;:::o;57127:366::-;57269:3;57290:67;57354:2;57349:3;57290:67;:::i;:::-;57283:74;;57366:93;57455:3;57366:93;:::i;:::-;57484:2;57479:3;57475:12;57468:19;;57127:366;;;:::o;57499:419::-;57665:4;57703:2;57692:9;57688:18;57680:26;;57752:9;57746:4;57742:20;57738:1;57727:9;57723:17;57716:47;57780:131;57906:4;57780:131;:::i;:::-;57772:139;;57499:419;;;:::o;57924:227::-;57964:4;57984:20;58002:1;57984:20;:::i;:::-;57979:25;;58018:20;58036:1;58018:20;:::i;:::-;58013:25;;58062:1;58059;58055:9;58047:17;;58086:34;58080:4;58077:44;58074:70;;;58124:18;;:::i;:::-;58074:70;57924:227;;;;:::o;58157:98::-;58208:6;58242:5;58236:12;58226:22;;58157:98;;;:::o;58261:168::-;58344:11;58378:6;58373:3;58366:19;58418:4;58413:3;58409:14;58394:29;;58261:168;;;;:::o;58435:373::-;58521:3;58549:38;58581:5;58549:38;:::i;:::-;58603:70;58666:6;58661:3;58603:70;:::i;:::-;58596:77;;58682:65;58740:6;58735:3;58728:4;58721:5;58717:16;58682:65;:::i;:::-;58772:29;58794:6;58772:29;:::i;:::-;58767:3;58763:39;58756:46;;58525:283;58435:373;;;;:::o;58814:640::-;59009:4;59047:3;59036:9;59032:19;59024:27;;59061:71;59129:1;59118:9;59114:17;59105:6;59061:71;:::i;:::-;59142:72;59210:2;59199:9;59195:18;59186:6;59142:72;:::i;:::-;59224;59292:2;59281:9;59277:18;59268:6;59224:72;:::i;:::-;59343:9;59337:4;59333:20;59328:2;59317:9;59313:18;59306:48;59371:76;59442:4;59433:6;59371:76;:::i;:::-;59363:84;;58814:640;;;;;;;:::o;59460:141::-;59516:5;59547:6;59541:13;59532:22;;59563:32;59589:5;59563:32;:::i;:::-;59460:141;;;;:::o;59607:349::-;59676:6;59725:2;59713:9;59704:7;59700:23;59696:32;59693:119;;;59731:79;;:::i;:::-;59693:119;59851:1;59876:63;59931:7;59922:6;59911:9;59907:22;59876:63;:::i;:::-;59866:73;;59822:127;59607:349;;;;:::o
Swarm Source
ipfs://2be967b33ad8115ec2180af5276d53bb4eb6b67983dc0bf5caa244bdebf3e587
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.