Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
1,263 Kawakami
Holders
90
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 KawakamiLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Kawakami
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-20 */ // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/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: contracts/nft.sol pragma solidity ^0.8.7; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128. * * Does not support burning tokens to address(0). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 private currentIndex = 0; uint256 internal immutable collectionSize; uint256 internal immutable maxBatchSize; // 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 to check staking status mapping(uint256 => uint256) private stakingData; /** * @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())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, "ERC721A: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721A: approve caller is not owner nor approved for all" ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require( _exists(tokenId), "ERC721A: approved query for nonexistent token" ); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), "ERC721A: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } event stakingEnabled(address _owner, uint256[] _tokenID); event unstaked(address _owner, uint256[] _tokenID); event claimed(address _owner, uint256[] _tokenID); // Start staking function enableMultiStaking(uint256[] calldata tokenIds) external returns (bool) { uint256 tokenId = 0; for (uint256 i = 0; i < tokenIds.length; i++) { tokenId = tokenIds[i]; require(msg.sender == ownerOf(tokenId), "Not the owner of nft"); require(stakingData[tokenId] == 0, "Staking Already Enabled"); stakingData[tokenId] = block.timestamp; } emit stakingEnabled(ownershipOf(tokenId).addr, tokenIds); return true; } //Function to claim and optional unstake multiple nfts function multiUpdateStaking(uint256[] calldata tokenIds, bool unStake) external returns (uint256[] memory stakedTime) { uint256[] memory stakedTimes = new uint256[](tokenIds.length); for (uint256 i = 0; i < tokenIds.length; i++) { uint256 tokenId = tokenIds[i]; bool isApprovedOrOwner = (_msgSender() == ownershipOf(tokenId).addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(ownershipOf(tokenId).addr, _msgSender())); require(isApprovedOrOwner, "Sender is not owner or approved"); uint256 stakingStartTime = stakingData[tokenId]; require(stakingStartTime > 0, "NFT not staked"); // Make Sure call is only for staked NFTs stakedTimes[i] = block.timestamp - stakingStartTime; // Storing Time NFT was staked for if (unStake) { stakingData[tokenId] = 0; } else { stakingData[tokenId] = block.timestamp; // Setting Current time as staking start time } } if (unStake) { emit unstaked(_msgSender(), tokenIds); } else { emit claimed(_msgSender(), tokenIds); } return stakedTimes; } // Unstake the NFT // function disableStaking(uint256 tokenId) external returns(bool){ // bool isApprovedOrOwner = (_msgSender() == ownershipOf(tokenId).addr || // getApproved(tokenId) == _msgSender() || // isApprovedForAll(ownershipOf(tokenId).addr, _msgSender())); // uint256 stakingStartTime = stakingData[tokenId]; // require(stakingStartTime != 0, "NFT not staked"); // // require(stakingStartTime < block.timestamp, "Staking not started"); // require(isApprovedOrOwner, "Sender is not owner or approved"); // // uint256 stakedTime = block.timestamp - stakingStartTime; // stakingData[tokenId] = 0; // emit unstaked(ownershipOf(tokenId).addr,tokenId); // return true; // } function getStakingTime(uint256 tokenId) external view returns (uint256) { uint256 stakingStartTime = stakingData[tokenId]; return stakingStartTime; } /** * @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 + uint64(quantity), addressData.numberMinted + uint64(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); } function resetMintCountForWhiteList(address _addr) internal { _addressData[_addr].numberMinted = 0; } /** * @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 { require( stakingData[tokenId] == 0, "Staking enabled, Disable staking to transfer" ); 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 {} } pragma solidity ^0.8.0; //Pubic Mint: price, max supply //Private Mint: max amount for team //Whitelist Mint: merkle tree contract Kawakami is Ownable, ERC721A, ReentrancyGuard { uint256 public immutable maxPerAddressDuringMint; uint256 public immutable amountForDevs; uint256 public immutable whitelistMaxPerAddress; //Root for merkel tree whitelisting bytes32 private root; struct SaleConfig { uint32 publicSaleStartTime; uint64 whitelistPrice; uint64 publicPrice; } SaleConfig private saleConfig; mapping(address => uint256) private whitelistMintCount; constructor( uint256 maxBatchSize_, uint256 collectionSize_, uint256 amountForDevs_, uint256 whitelistSize_ ) ERC721A("Kawakami", "Kawakami", maxBatchSize_, collectionSize_) { maxPerAddressDuringMint = maxBatchSize_; amountForDevs = amountForDevs_; whitelistMaxPerAddress = whitelistSize_; } //test public mint function publicMint(uint256 quantity) external payable { uint256 publicPrice = uint256(saleConfig.publicPrice); uint256 publicSaleStartTime = uint256(saleConfig.publicSaleStartTime); require( totalSupply() + quantity <= collectionSize, "reached max supply" ); //Can't mint more than collectionSize require( isPublicSaleOn(publicPrice, publicSaleStartTime), "Public sale has not begun yet" ); require( numberMinted(msg.sender) + quantity <= maxPerAddressDuringMint, "can not mint this many" ); require(msg.value == publicPrice * quantity, "Check Ether amount sent"); _safeMint(msg.sender, quantity); } //whitelistMint function whitelistMint(bytes32[] calldata _proof, uint256 quantity) external payable { uint256 price = uint256(saleConfig.whitelistPrice); require(price != 0, "Whitelist sale has not begun yet"); require( block.timestamp < saleConfig.publicSaleStartTime, "Public Mint started, Whitelisted Mint Closed" ); require(msg.value == (price * quantity), "Incorrect eth amount"); bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); require(MerkleProof.verify(_proof, root, leaf), "Incorrect proof"); require( whitelistMintCount[msg.sender] + quantity <= whitelistMaxPerAddress, "Whitelist Limit Exceeded" ); whitelistMintCount[msg.sender] = whitelistMintCount[msg.sender] + quantity; _safeMint(msg.sender, quantity); resetMintCountForWhiteList(msg.sender); } function checkValidity(bytes32[] calldata _merkleProof) public view returns (bool) { bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); require( MerkleProof.verify(_merkleProof, root, leaf), "Incorrect proof" ); return true; // Or you can mint tokens here } function setRoot(bytes32 _root) external onlyOwner { root = _root; } function refundIfOver(uint256 price) private { require(msg.value >= price, "Need to send more ETH."); if (msg.value > price) { payable(msg.sender).transfer(msg.value - price); } } function isPublicSaleOn(uint256 publicPriceWei, uint256 publicSaleStartTime) public view returns (bool) { return publicPriceWei != 0 && block.timestamp >= publicSaleStartTime; } function getWhiteistMintCount(address _address) public view returns(uint256){ return whitelistMintCount[_address]; } function getSaleConfig() public view returns(SaleConfig memory){ return saleConfig; } function setPublicMintInfo( uint64 whitelistPriceWei, uint64 publicPriceWei, uint32 publicSaleStartTime ) external onlyOwner { saleConfig = SaleConfig( publicSaleStartTime, whitelistPriceWei, publicPriceWei ); } // For marketing etc. function devMint(uint256 quantity) external onlyOwner { require( totalSupply() + quantity <= amountForDevs, "too many already minted before dev mint" ); require( quantity % maxBatchSize == 0, "can only mint a multiple of the maxBatchSize" ); uint256 numChunks = quantity / maxBatchSize; for (uint256 i = 0; i < numChunks; i++) { _safeMint(msg.sender, maxBatchSize); } } // // metadata URI string private _baseTokenURI; function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setBaseURI(string calldata baseURI) external onlyOwner { _baseTokenURI = baseURI; } function withdrawMoney() external onlyOwner nonReentrant { (bool success, ) = msg.sender.call{value: address(this).balance}(""); require(success, "Transfer failed."); } function setOwnersExplicit(uint256 quantity) external onlyOwner nonReentrant { _setOwnersExplicit(quantity); } function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } function getOwnershipData(uint256 tokenId) external view returns (TokenOwnership memory) { return ownershipOf(tokenId); } function renounceOwnership() public virtual override onlyOwner { require(false, "Can't renounceOwnership"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"maxBatchSize_","type":"uint256"},{"internalType":"uint256","name":"collectionSize_","type":"uint256"},{"internalType":"uint256","name":"amountForDevs_","type":"uint256"},{"internalType":"uint256","name":"whitelistSize_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_owner","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"_tokenID","type":"uint256[]"}],"name":"claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_owner","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"_tokenID","type":"uint256[]"}],"name":"stakingEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_owner","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"_tokenID","type":"uint256[]"}],"name":"unstaked","type":"event"},{"inputs":[],"name":"amountForDevs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"checkValidity","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"enableMultiStaking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":[],"name":"getSaleConfig","outputs":[{"components":[{"internalType":"uint32","name":"publicSaleStartTime","type":"uint32"},{"internalType":"uint64","name":"whitelistPrice","type":"uint64"},{"internalType":"uint64","name":"publicPrice","type":"uint64"}],"internalType":"struct Kawakami.SaleConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getStakingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getWhiteistMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"publicPriceWei","type":"uint256"},{"internalType":"uint256","name":"publicSaleStartTime","type":"uint256"}],"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":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"bool","name":"unStake","type":"bool"}],"name":"multiUpdateStaking","outputs":[{"internalType":"uint256[]","name":"stakedTime","type":"uint256[]"}],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setOwnersExplicit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"whitelistPriceWei","type":"uint64"},{"internalType":"uint64","name":"publicPriceWei","type":"uint64"},{"internalType":"uint32","name":"publicSaleStartTime","type":"uint32"}],"name":"setPublicMintInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setRoot","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":"whitelistMaxPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
610120604052600060015560006009553480156200001c57600080fd5b5060405162003905380380620039058339810160408190526200003f91620002b6565b604051806040016040528060088152602001674b6177616b616d6960c01b815250604051806040016040528060088152602001674b6177616b616d6960c01b81525085856200009d62000097620001bc60201b60201c565b620001c0565b600081116200010a5760405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060448201526d6e6f6e7a65726f20737570706c7960901b60648201526084015b60405180910390fd5b600082116200016c5760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b606482015260840162000101565b83516200018190600290602087019062000210565b5082516200019790600390602086019062000210565b5060a09190915260805250506001600a5560c09390935260e05250610100526200032a565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200021e90620002ed565b90600052602060002090601f0160209004810192826200024257600085556200028d565b82601f106200025d57805160ff19168380011785556200028d565b828001600101855582156200028d579182015b828111156200028d57825182559160200191906001019062000270565b506200029b9291506200029f565b5090565b5b808211156200029b5760008155600101620002a0565b60008060008060808587031215620002cd57600080fd5b505082516020840151604085015160609095015191969095509092509050565b600181811c908216806200030257607f821691505b602082108114156200032457634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e05161010051613550620003b5600039600081816104a20152610d0501526000818161085001526111d601526000818161052b0152610f5601526000818161126c015281816112fa01528181611332015281816125150152818161253f0152612a74015260008181610e880152818161231b015261234d01526135506000f3fe60806040526004361061023b5760003560e01c80637f84f1d61161012e578063b88d4fde116100ab578063dbcad76f1161006f578063dbcad76f14610795578063dc33e681146107b5578063e985e9c5146107d5578063f2fde38b1461081e578063fbe1aa511461083e57600080fd5b8063b88d4fde14610678578063c87b56dd14610698578063cea943ee146106b8578063d7224ba01461075f578063dab5f3401461077557600080fd5b806395d89b41116100f257806395d89b41146105d8578063a22cb465146105ed578063ac4460021461060d578063ae970bb614610622578063b323b4961461064257600080fd5b80637f84f1d6146104f95780638bc35c2f146105195780638da5cb5b1461054d5780639231ab2a1461056b578063954d90d0146105b857600080fd5b80632f745c59116101bc57806355f804b31161018057806355f804b3146104505780636352211e14610470578063709ed9421461049057806370a08231146104c4578063715018a6146104e457600080fd5b80632f745c59146103a3578063375a069a146103c35780634210e9be146103e357806342842e0e146104105780634f6ccce71461043057600080fd5b806323b872dd1161020357806323b872dd1461031057806328f39231146103305780632904e6d91461035d5780632d20fb60146103705780632db115441461039057600080fd5b806301ffc9a71461024057806306fdde0314610275578063081812fc14610297578063095ea7b3146102cf57806318160ddd146102f1575b600080fd5b34801561024c57600080fd5b5061026061025b366004613072565b610872565b60405190151581526020015b60405180910390f35b34801561028157600080fd5b5061028a6108df565b60405161026c91906132b8565b3480156102a357600080fd5b506102b76102b2366004613059565b610971565b6040516001600160a01b03909116815260200161026c565b3480156102db57600080fd5b506102ef6102ea366004612f50565b610a01565b005b3480156102fd57600080fd5b506001545b60405190815260200161026c565b34801561031c57600080fd5b506102ef61032b366004612e0f565b610b19565b34801561033c57600080fd5b5061030261034b366004613059565b60009081526008602052604090205490565b6102ef61036b366004612fbb565b610b24565b34801561037c57600080fd5b506102ef61038b366004613059565b610dd9565b6102ef61039e366004613059565b610e6c565b3480156103af57600080fd5b506103026103be366004612f50565b611032565b3480156103cf57600080fd5b506102ef6103de366004613059565b6111aa565b3480156103ef57600080fd5b506104036103fe366004613006565b611368565b60405161026c9190613274565b34801561041c57600080fd5b506102ef61042b366004612e0f565b6115bd565b34801561043c57600080fd5b5061030261044b366004613059565b6115d8565b34801561045c57600080fd5b506102ef61046b3660046130ac565b611641565b34801561047c57600080fd5b506102b761048b366004613059565b611677565b34801561049c57600080fd5b506103027f000000000000000000000000000000000000000000000000000000000000000081565b3480156104d057600080fd5b506103026104df366004612dc1565b611689565b3480156104f057600080fd5b506102ef61171a565b34801561050557600080fd5b50610260610514366004612f7a565b61178c565b34801561052557600080fd5b506103027f000000000000000000000000000000000000000000000000000000000000000081565b34801561055957600080fd5b506000546001600160a01b03166102b7565b34801561057757600080fd5b5061058b610586366004613059565b6118e2565b6040805182516001600160a01b031681526020928301516001600160401b0316928101929092520161026c565b3480156105c457600080fd5b506102606105d3366004612f7a565b6118ff565b3480156105e457600080fd5b5061028a6119be565b3480156105f957600080fd5b506102ef610608366004612f26565b6119cd565b34801561061957600080fd5b506102ef611a92565b34801561062e57600080fd5b506102ef61063d36600461313f565b611b9f565b34801561064e57600080fd5b5061030261065d366004612dc1565b6001600160a01b03166000908152600d602052604090205490565b34801561068457600080fd5b506102ef610693366004612e4b565b611c33565b3480156106a457600080fd5b5061028a6106b3366004613059565b611c6c565b3480156106c457600080fd5b5061072660408051606081018252600080825260208201819052918101919091525060408051606081018252600c5463ffffffff811682526001600160401b03640100000000820481166020840152600160601b909104169181019190915290565b60408051825163ffffffff1681526020808401516001600160401b0390811691830191909152928201519092169082015260600161026c565b34801561076b57600080fd5b5061030260095481565b34801561078157600080fd5b506102ef610790366004613059565b611d39565b3480156107a157600080fd5b506102606107b036600461311d565b611d68565b3480156107c157600080fd5b506103026107d0366004612dc1565b611d7d565b3480156107e157600080fd5b506102606107f0366004612ddc565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561082a57600080fd5b506102ef610839366004612dc1565b611d88565b34801561084a57600080fd5b506103027f000000000000000000000000000000000000000000000000000000000000000081565b60006001600160e01b031982166380ac58cd60e01b14806108a357506001600160e01b03198216635b5e139f60e01b145b806108be57506001600160e01b0319821663780e9d6360e01b145b806108d957506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600280546108ee90613442565b80601f016020809104026020016040519081016040528092919081815260200182805461091a90613442565b80156109675780601f1061093c57610100808354040283529160200191610967565b820191906000526020600020905b81548152906001019060200180831161094a57829003601f168201915b5050505050905090565b600061097e826001541190565b6109e55760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610a0c82611677565b9050806001600160a01b0316836001600160a01b03161415610a7b5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b60648201526084016109dc565b336001600160a01b0382161480610a975750610a9781336107f0565b610b095760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c0000000000000060648201526084016109dc565b610b14838383611e23565b505050565b610b14838383611e7f565b600c5464010000000090046001600160401b031680610b855760405162461bcd60e51b815260206004820181905260248201527f57686974656c6973742073616c6520686173206e6f7420626567756e2079657460448201526064016109dc565b600c5463ffffffff164210610bf15760405162461bcd60e51b815260206004820152602c60248201527f5075626c6963204d696e7420737461727465642c2057686974656c697374656460448201526b08135a5b9d0810db1bdcd95960a21b60648201526084016109dc565b610bfb82826133a1565b3414610c405760405162461bcd60e51b8152602060048201526014602482015273125b98dbdc9c9958dd08195d1a08185b5bdd5b9d60621b60448201526064016109dc565b6040516001600160601b03193360601b166020820152600090603401604051602081830303815290604052805190602001209050610cb585858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600b549150849050612276565b610cf35760405162461bcd60e51b815260206004820152600f60248201526e24b731b7b93932b1ba10383937b7b360891b60448201526064016109dc565b336000908152600d60205260409020547f000000000000000000000000000000000000000000000000000000000000000090610d30908590613375565b1115610d7e5760405162461bcd60e51b815260206004820152601860248201527f57686974656c697374204c696d6974204578636565646564000000000000000060448201526064016109dc565b336000908152600d6020526040902054610d99908490613375565b336000818152600d6020526040902091909155610db6908461228c565b33600090815260056020526040902080546001600160801b031690555050505050565b6000546001600160a01b03163314610e035760405162461bcd60e51b81526004016109dc906132cb565b6002600a541415610e565760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109dc565b6002600a55610e64816122aa565b506001600a55565b600c546001600160401b03600160601b8204169063ffffffff167f000000000000000000000000000000000000000000000000000000000000000083610eb160015490565b610ebb9190613375565b1115610efe5760405162461bcd60e51b815260206004820152601260248201527172656163686564206d617820737570706c7960701b60448201526064016109dc565b610f088282611d68565b610f545760405162461bcd60e51b815260206004820152601d60248201527f5075626c69632073616c6520686173206e6f7420626567756e2079657400000060448201526064016109dc565b7f000000000000000000000000000000000000000000000000000000000000000083610f7f33611d7d565b610f899190613375565b1115610fd05760405162461bcd60e51b815260206004820152601660248201527563616e206e6f74206d696e742074686973206d616e7960501b60448201526064016109dc565b610fda83836133a1565b34146110285760405162461bcd60e51b815260206004820152601760248201527f436865636b20457468657220616d6f756e742073656e7400000000000000000060448201526064016109dc565b610b14338461228c565b600061103d83611689565b82106110965760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016109dc565b60006110a160015490565b905060008060005b8381101561114a576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b031691830191909152156110fb57805192505b876001600160a01b0316836001600160a01b031614156111375786841415611129575093506108d992505050565b836111338161347d565b9450505b50806111428161347d565b9150506110a9565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b60648201526084016109dc565b6000546001600160a01b031633146111d45760405162461bcd60e51b81526004016109dc906132cb565b7f0000000000000000000000000000000000000000000000000000000000000000816111ff60015490565b6112099190613375565b11156112675760405162461bcd60e51b815260206004820152602760248201527f746f6f206d616e7920616c7265616479206d696e746564206265666f72652064604482015266195d881b5a5b9d60ca1b60648201526084016109dc565b6112917f000000000000000000000000000000000000000000000000000000000000000082613498565b156112f35760405162461bcd60e51b815260206004820152602c60248201527f63616e206f6e6c79206d696e742061206d756c7469706c65206f66207468652060448201526b6d6178426174636853697a6560a01b60648201526084016109dc565b600061131f7f00000000000000000000000000000000000000000000000000000000000000008361338d565b905060005b81811015610b1457611356337f000000000000000000000000000000000000000000000000000000000000000061228c565b806113608161347d565b915050611324565b60606000836001600160401b03811115611384576113846134ee565b6040519080825280602002602001820160405280156113ad578160200160208202803683370190505b50905060005b848110156115325760008686838181106113cf576113cf6134d8565b90506020020135905060006113e382612493565b516001600160a01b0316336001600160a01b0316148061141357503361140883610971565b6001600160a01b0316145b8061142c575061142c61142583612493565b51336107f0565b90508061147b5760405162461bcd60e51b815260206004820152601f60248201527f53656e646572206973206e6f74206f776e6572206f7220617070726f7665640060448201526064016109dc565b600082815260086020526040902054806114c85760405162461bcd60e51b815260206004820152600e60248201526d139195081b9bdd081cdd185ad95960921b60448201526064016109dc565b6114d281426133e8565b8585815181106114e4576114e46134d8565b602002602001018181525050861561150a5760008381526008602052604081205561151c565b60008381526008602052604090204290555b505050808061152a9061347d565b9150506113b3565b508215611579577f70b7ad2469256a533880bbe41f3a84f136ff6f0137174fc95dc996df7c4756c333868660405161156c93929190613227565b60405180910390a16115b5565b7fcd37c631adb690c8025e7364692089a6ac69e4fdfcfe9e43fb5e82cc6dee99c73386866040516115ac93929190613227565b60405180910390a15b949350505050565b610b1483838360405180602001604052806000815250611c33565b60006115e360015490565b821061163d5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b60648201526084016109dc565b5090565b6000546001600160a01b0316331461166b5760405162461bcd60e51b81526004016109dc906132cb565b610b14600e8383612ca3565b600061168282612493565b5192915050565b60006001600160a01b0382166116f55760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016109dc565b506001600160a01b03166000908152600560205260409020546001600160801b031690565b6000546001600160a01b031633146117445760405162461bcd60e51b81526004016109dc906132cb565b60405162461bcd60e51b815260206004820152601760248201527f43616e27742072656e6f756e63654f776e65727368697000000000000000000060448201526064016109dc565b600080805b83811015611893578484828181106117ab576117ab6134d8565b9050602002013591506117bd82611677565b6001600160a01b0316336001600160a01b0316146118145760405162461bcd60e51b8152602060048201526014602482015273139bdd081d1a19481bdddb995c881bd9881b999d60621b60448201526064016109dc565b600082815260086020526040902054156118705760405162461bcd60e51b815260206004820152601760248201527f5374616b696e6720416c726561647920456e61626c656400000000000000000060448201526064016109dc565b60008281526008602052604090204290558061188b8161347d565b915050611791565b507f53ba3c0cf49afeb3f054c66fb2a8eb5b8c4fc8b9cb5f4cecbe048e1284a369026118be82612493565b516040516118d0919087908790613227565b60405180910390a15060019392505050565b60408051808201909152600080825260208201526108d982612493565b6040516001600160601b03193360601b166020820152600090819060340160405160208183030381529060405280519060200120905061197684848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600b549150849050612276565b6119b45760405162461bcd60e51b815260206004820152600f60248201526e24b731b7b93932b1ba10383937b7b360891b60448201526064016109dc565b5060019392505050565b6060600380546108ee90613442565b6001600160a01b038216331415611a265760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c657200000000000060448201526064016109dc565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b03163314611abc5760405162461bcd60e51b81526004016109dc906132cb565b6002600a541415611b0f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109dc565b6002600a55604051600090339047908381818185875af1925050503d8060008114611b56576040519150601f19603f3d011682016040523d82523d6000602084013e611b5b565b606091505b5050905080610e645760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b60448201526064016109dc565b6000546001600160a01b03163314611bc95760405162461bcd60e51b81526004016109dc906132cb565b6040805160608101825263ffffffff929092168083526001600160401b0394851660208401819052939094169101819052600c80546001600160601b0319169093176401000000009092029190911767ffffffffffffffff60601b1916600160601b909102179055565b611c3e848484611e7f565b611c4a8484848461263c565b611c665760405162461bcd60e51b81526004016109dc90613300565b50505050565b6060611c79826001541190565b611cdd5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109dc565b6000611ce7612749565b90506000815111611d075760405180602001604052806000815250611d32565b80611d1184612758565b604051602001611d229291906131bb565b6040516020818303038152906040525b9392505050565b6000546001600160a01b03163314611d635760405162461bcd60e51b81526004016109dc906132cb565b600b55565b60008215801590611d32575050421015919050565b60006108d982612855565b6000546001600160a01b03163314611db25760405162461bcd60e51b81526004016109dc906132cb565b6001600160a01b038116611e175760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109dc565b611e20816128f3565b50565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60008181526008602052604090205415611ef05760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e6720656e61626c65642c2044697361626c65207374616b696e6760448201526b103a37903a3930b739b332b960a11b60648201526084016109dc565b6000611efb82612493565b80519091506000906001600160a01b0316336001600160a01b03161480611f32575033611f2784610971565b6001600160a01b0316145b80611f4457508151611f4490336107f0565b905080611fae5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016109dc565b846001600160a01b031682600001516001600160a01b0316146120225760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b60648201526084016109dc565b6001600160a01b0384166120865760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016109dc565b6120966000848460000151611e23565b6001600160a01b03851660009081526005602052604081208054600192906120c89084906001600160801b03166133c0565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b0386166000908152600560205260408120805460019450909261211491859116613353565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526004909152948520935184549151909216600160a01b026001600160e01b0319909116919092161717905561219b846001613375565b6000818152600460205260409020549091506001600160a01b031661222c576121c5816001541190565b1561222c5760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600490935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6000826122838584612943565b14949350505050565b6122a68282604051806020016040528060008152506129b7565b5050565b600954816122fa5760405162461bcd60e51b815260206004820152601860248201527f7175616e74697479206d757374206265206e6f6e7a65726f000000000000000060448201526064016109dc565b600060016123088484613375565b61231291906133e8565b905061233f60017f00000000000000000000000000000000000000000000000000000000000000006133e8565b8111156123745761237160017f00000000000000000000000000000000000000000000000000000000000000006133e8565b90505b61237f816001541190565b6123da5760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360448201526506c65616e75760d41b60648201526084016109dc565b815b81811161247f576000818152600460205260409020546001600160a01b031661246d57600061240a82612493565b60408051808201825282516001600160a01b0390811682526020938401516001600160401b039081168584019081526000888152600490965293909420915182549351909416600160a01b026001600160e01b0319909316931692909217179055505b806124778161347d565b9150506123dc565b5061248b816001613375565b600955505050565b60408051808201909152600080825260208201526124b2826001541190565b6125115760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b60648201526084016109dc565b60007f00000000000000000000000000000000000000000000000000000000000000008310612572576125647f0000000000000000000000000000000000000000000000000000000000000000846133e8565b61256f906001613375565b90505b825b8181106125db576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b031691830191909152156125c857949350505050565b50806125d38161342b565b915050612574565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b60648201526084016109dc565b60006001600160a01b0384163b1561273e57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906126809033908990889088906004016131ea565b602060405180830381600087803b15801561269a57600080fd5b505af19250505080156126ca575060408051601f3d908101601f191682019092526126c79181019061308f565b60015b612724573d8080156126f8576040519150601f19603f3d011682016040523d82523d6000602084013e6126fd565b606091505b50805161271c5760405162461bcd60e51b81526004016109dc90613300565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506115b5565b506001949350505050565b6060600e80546108ee90613442565b60608161277c5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156127a657806127908161347d565b915061279f9050600a8361338d565b9150612780565b6000816001600160401b038111156127c0576127c06134ee565b6040519080825280601f01601f1916602001820160405280156127ea576020820181803683370190505b5090505b84156115b5576127ff6001836133e8565b915061280c600a86613498565b612817906030613375565b60f81b81838151811061282c5761282c6134d8565b60200101906001600160f81b031916908160001a90535061284e600a8661338d565b94506127ee565b60006001600160a01b0382166128c75760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b60648201526084016109dc565b506001600160a01b0316600090815260056020526040902054600160801b90046001600160801b031690565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600081815b84518110156129af576000858281518110612965576129656134d8565b6020026020010151905080831161298b576000838152602082905260409020925061299c565b600081815260208490526040902092505b50806129a78161347d565b915050612948565b509392505050565b6001546001600160a01b038416612a1a5760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016109dc565b612a25816001541190565b15612a725760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e74656400000060448201526064016109dc565b7f0000000000000000000000000000000000000000000000000000000000000000831115612aed5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b60648201526084016109dc565b6001600160a01b0384166000908152600560209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612b52906001600160401b03881690613353565b6001600160801b03168152602001856001600160401b03168360200151612b799190613353565b6001600160801b039081169091526001600160a01b0380881660008181526005602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526004909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b85811015612c985760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612c5c600088848861263c565b612c785760405162461bcd60e51b81526004016109dc90613300565b81612c828161347d565b9250508080612c909061347d565b915050612c0f565b50600181905561226e565b828054612caf90613442565b90600052602060002090601f016020900481019282612cd15760008555612d17565b82601f10612cea5782800160ff19823516178555612d17565b82800160010185558215612d17579182015b82811115612d17578235825591602001919060010190612cfc565b5061163d9291505b8082111561163d5760008155600101612d1f565b80356001600160a01b0381168114612d4a57600080fd5b919050565b60008083601f840112612d6157600080fd5b5081356001600160401b03811115612d7857600080fd5b6020830191508360208260051b8501011115612d9357600080fd5b9250929050565b80358015158114612d4a57600080fd5b80356001600160401b0381168114612d4a57600080fd5b600060208284031215612dd357600080fd5b611d3282612d33565b60008060408385031215612def57600080fd5b612df883612d33565b9150612e0660208401612d33565b90509250929050565b600080600060608486031215612e2457600080fd5b612e2d84612d33565b9250612e3b60208501612d33565b9150604084013590509250925092565b60008060008060808587031215612e6157600080fd5b612e6a85612d33565b9350612e7860208601612d33565b92506040850135915060608501356001600160401b0380821115612e9b57600080fd5b818701915087601f830112612eaf57600080fd5b813581811115612ec157612ec16134ee565b604051601f8201601f19908116603f01168101908382118183101715612ee957612ee96134ee565b816040528281528a6020848701011115612f0257600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215612f3957600080fd5b612f4283612d33565b9150612e0660208401612d9a565b60008060408385031215612f6357600080fd5b612f6c83612d33565b946020939093013593505050565b60008060208385031215612f8d57600080fd5b82356001600160401b03811115612fa357600080fd5b612faf85828601612d4f565b90969095509350505050565b600080600060408486031215612fd057600080fd5b83356001600160401b03811115612fe657600080fd5b612ff286828701612d4f565b909790965060209590950135949350505050565b60008060006040848603121561301b57600080fd5b83356001600160401b0381111561303157600080fd5b61303d86828701612d4f565b9094509250613050905060208501612d9a565b90509250925092565b60006020828403121561306b57600080fd5b5035919050565b60006020828403121561308457600080fd5b8135611d3281613504565b6000602082840312156130a157600080fd5b8151611d3281613504565b600080602083850312156130bf57600080fd5b82356001600160401b03808211156130d657600080fd5b818501915085601f8301126130ea57600080fd5b8135818111156130f957600080fd5b86602082850101111561310b57600080fd5b60209290920196919550909350505050565b6000806040838503121561313057600080fd5b50508035926020909101359150565b60008060006060848603121561315457600080fd5b61315d84612daa565b925061316b60208501612daa565b9150604084013563ffffffff8116811461318457600080fd5b809150509250925092565b600081518084526131a78160208601602086016133ff565b601f01601f19169290920160200192915050565b600083516131cd8184602088016133ff565b8351908301906131e18183602088016133ff565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061321d9083018461318f565b9695505050505050565b6001600160a01b0384168152604060208201819052810182905260006001600160fb1b0383111561325757600080fd5b8260051b8085606085013760009201606001918252509392505050565b6020808252825182820181905260009190848201906040850190845b818110156132ac57835183529284019291840191600101613290565b50909695505050505050565b602081526000611d32602083018461318f565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60006001600160801b038083168185168083038211156131e1576131e16134ac565b60008219821115613388576133886134ac565b500190565b60008261339c5761339c6134c2565b500490565b60008160001904831182151516156133bb576133bb6134ac565b500290565b60006001600160801b03838116908316818110156133e0576133e06134ac565b039392505050565b6000828210156133fa576133fa6134ac565b500390565b60005b8381101561341a578181015183820152602001613402565b83811115611c665750506000910152565b60008161343a5761343a6134ac565b506000190190565b600181811c9082168061345657607f821691505b6020821081141561347757634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613491576134916134ac565b5060010190565b6000826134a7576134a76134c2565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611e2057600080fdfea2646970667358221220d6ff19a10c9bb21a29c49966cfefa2c29e553824c7c51797dfbb0e4e0102ff4b64736f6c634300080700330000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000115e00000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000002
Deployed Bytecode
0x60806040526004361061023b5760003560e01c80637f84f1d61161012e578063b88d4fde116100ab578063dbcad76f1161006f578063dbcad76f14610795578063dc33e681146107b5578063e985e9c5146107d5578063f2fde38b1461081e578063fbe1aa511461083e57600080fd5b8063b88d4fde14610678578063c87b56dd14610698578063cea943ee146106b8578063d7224ba01461075f578063dab5f3401461077557600080fd5b806395d89b41116100f257806395d89b41146105d8578063a22cb465146105ed578063ac4460021461060d578063ae970bb614610622578063b323b4961461064257600080fd5b80637f84f1d6146104f95780638bc35c2f146105195780638da5cb5b1461054d5780639231ab2a1461056b578063954d90d0146105b857600080fd5b80632f745c59116101bc57806355f804b31161018057806355f804b3146104505780636352211e14610470578063709ed9421461049057806370a08231146104c4578063715018a6146104e457600080fd5b80632f745c59146103a3578063375a069a146103c35780634210e9be146103e357806342842e0e146104105780634f6ccce71461043057600080fd5b806323b872dd1161020357806323b872dd1461031057806328f39231146103305780632904e6d91461035d5780632d20fb60146103705780632db115441461039057600080fd5b806301ffc9a71461024057806306fdde0314610275578063081812fc14610297578063095ea7b3146102cf57806318160ddd146102f1575b600080fd5b34801561024c57600080fd5b5061026061025b366004613072565b610872565b60405190151581526020015b60405180910390f35b34801561028157600080fd5b5061028a6108df565b60405161026c91906132b8565b3480156102a357600080fd5b506102b76102b2366004613059565b610971565b6040516001600160a01b03909116815260200161026c565b3480156102db57600080fd5b506102ef6102ea366004612f50565b610a01565b005b3480156102fd57600080fd5b506001545b60405190815260200161026c565b34801561031c57600080fd5b506102ef61032b366004612e0f565b610b19565b34801561033c57600080fd5b5061030261034b366004613059565b60009081526008602052604090205490565b6102ef61036b366004612fbb565b610b24565b34801561037c57600080fd5b506102ef61038b366004613059565b610dd9565b6102ef61039e366004613059565b610e6c565b3480156103af57600080fd5b506103026103be366004612f50565b611032565b3480156103cf57600080fd5b506102ef6103de366004613059565b6111aa565b3480156103ef57600080fd5b506104036103fe366004613006565b611368565b60405161026c9190613274565b34801561041c57600080fd5b506102ef61042b366004612e0f565b6115bd565b34801561043c57600080fd5b5061030261044b366004613059565b6115d8565b34801561045c57600080fd5b506102ef61046b3660046130ac565b611641565b34801561047c57600080fd5b506102b761048b366004613059565b611677565b34801561049c57600080fd5b506103027f000000000000000000000000000000000000000000000000000000000000000281565b3480156104d057600080fd5b506103026104df366004612dc1565b611689565b3480156104f057600080fd5b506102ef61171a565b34801561050557600080fd5b50610260610514366004612f7a565b61178c565b34801561052557600080fd5b506103027f000000000000000000000000000000000000000000000000000000000000000581565b34801561055957600080fd5b506000546001600160a01b03166102b7565b34801561057757600080fd5b5061058b610586366004613059565b6118e2565b6040805182516001600160a01b031681526020928301516001600160401b0316928101929092520161026c565b3480156105c457600080fd5b506102606105d3366004612f7a565b6118ff565b3480156105e457600080fd5b5061028a6119be565b3480156105f957600080fd5b506102ef610608366004612f26565b6119cd565b34801561061957600080fd5b506102ef611a92565b34801561062e57600080fd5b506102ef61063d36600461313f565b611b9f565b34801561064e57600080fd5b5061030261065d366004612dc1565b6001600160a01b03166000908152600d602052604090205490565b34801561068457600080fd5b506102ef610693366004612e4b565b611c33565b3480156106a457600080fd5b5061028a6106b3366004613059565b611c6c565b3480156106c457600080fd5b5061072660408051606081018252600080825260208201819052918101919091525060408051606081018252600c5463ffffffff811682526001600160401b03640100000000820481166020840152600160601b909104169181019190915290565b60408051825163ffffffff1681526020808401516001600160401b0390811691830191909152928201519092169082015260600161026c565b34801561076b57600080fd5b5061030260095481565b34801561078157600080fd5b506102ef610790366004613059565b611d39565b3480156107a157600080fd5b506102606107b036600461311d565b611d68565b3480156107c157600080fd5b506103026107d0366004612dc1565b611d7d565b3480156107e157600080fd5b506102606107f0366004612ddc565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561082a57600080fd5b506102ef610839366004612dc1565b611d88565b34801561084a57600080fd5b506103027f000000000000000000000000000000000000000000000000000000000000002881565b60006001600160e01b031982166380ac58cd60e01b14806108a357506001600160e01b03198216635b5e139f60e01b145b806108be57506001600160e01b0319821663780e9d6360e01b145b806108d957506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600280546108ee90613442565b80601f016020809104026020016040519081016040528092919081815260200182805461091a90613442565b80156109675780601f1061093c57610100808354040283529160200191610967565b820191906000526020600020905b81548152906001019060200180831161094a57829003601f168201915b5050505050905090565b600061097e826001541190565b6109e55760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610a0c82611677565b9050806001600160a01b0316836001600160a01b03161415610a7b5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b60648201526084016109dc565b336001600160a01b0382161480610a975750610a9781336107f0565b610b095760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c0000000000000060648201526084016109dc565b610b14838383611e23565b505050565b610b14838383611e7f565b600c5464010000000090046001600160401b031680610b855760405162461bcd60e51b815260206004820181905260248201527f57686974656c6973742073616c6520686173206e6f7420626567756e2079657460448201526064016109dc565b600c5463ffffffff164210610bf15760405162461bcd60e51b815260206004820152602c60248201527f5075626c6963204d696e7420737461727465642c2057686974656c697374656460448201526b08135a5b9d0810db1bdcd95960a21b60648201526084016109dc565b610bfb82826133a1565b3414610c405760405162461bcd60e51b8152602060048201526014602482015273125b98dbdc9c9958dd08195d1a08185b5bdd5b9d60621b60448201526064016109dc565b6040516001600160601b03193360601b166020820152600090603401604051602081830303815290604052805190602001209050610cb585858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600b549150849050612276565b610cf35760405162461bcd60e51b815260206004820152600f60248201526e24b731b7b93932b1ba10383937b7b360891b60448201526064016109dc565b336000908152600d60205260409020547f000000000000000000000000000000000000000000000000000000000000000290610d30908590613375565b1115610d7e5760405162461bcd60e51b815260206004820152601860248201527f57686974656c697374204c696d6974204578636565646564000000000000000060448201526064016109dc565b336000908152600d6020526040902054610d99908490613375565b336000818152600d6020526040902091909155610db6908461228c565b33600090815260056020526040902080546001600160801b031690555050505050565b6000546001600160a01b03163314610e035760405162461bcd60e51b81526004016109dc906132cb565b6002600a541415610e565760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109dc565b6002600a55610e64816122aa565b506001600a55565b600c546001600160401b03600160601b8204169063ffffffff167f000000000000000000000000000000000000000000000000000000000000115e83610eb160015490565b610ebb9190613375565b1115610efe5760405162461bcd60e51b815260206004820152601260248201527172656163686564206d617820737570706c7960701b60448201526064016109dc565b610f088282611d68565b610f545760405162461bcd60e51b815260206004820152601d60248201527f5075626c69632073616c6520686173206e6f7420626567756e2079657400000060448201526064016109dc565b7f000000000000000000000000000000000000000000000000000000000000000583610f7f33611d7d565b610f899190613375565b1115610fd05760405162461bcd60e51b815260206004820152601660248201527563616e206e6f74206d696e742074686973206d616e7960501b60448201526064016109dc565b610fda83836133a1565b34146110285760405162461bcd60e51b815260206004820152601760248201527f436865636b20457468657220616d6f756e742073656e7400000000000000000060448201526064016109dc565b610b14338461228c565b600061103d83611689565b82106110965760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016109dc565b60006110a160015490565b905060008060005b8381101561114a576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b031691830191909152156110fb57805192505b876001600160a01b0316836001600160a01b031614156111375786841415611129575093506108d992505050565b836111338161347d565b9450505b50806111428161347d565b9150506110a9565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b60648201526084016109dc565b6000546001600160a01b031633146111d45760405162461bcd60e51b81526004016109dc906132cb565b7f0000000000000000000000000000000000000000000000000000000000000028816111ff60015490565b6112099190613375565b11156112675760405162461bcd60e51b815260206004820152602760248201527f746f6f206d616e7920616c7265616479206d696e746564206265666f72652064604482015266195d881b5a5b9d60ca1b60648201526084016109dc565b6112917f000000000000000000000000000000000000000000000000000000000000000582613498565b156112f35760405162461bcd60e51b815260206004820152602c60248201527f63616e206f6e6c79206d696e742061206d756c7469706c65206f66207468652060448201526b6d6178426174636853697a6560a01b60648201526084016109dc565b600061131f7f00000000000000000000000000000000000000000000000000000000000000058361338d565b905060005b81811015610b1457611356337f000000000000000000000000000000000000000000000000000000000000000561228c565b806113608161347d565b915050611324565b60606000836001600160401b03811115611384576113846134ee565b6040519080825280602002602001820160405280156113ad578160200160208202803683370190505b50905060005b848110156115325760008686838181106113cf576113cf6134d8565b90506020020135905060006113e382612493565b516001600160a01b0316336001600160a01b0316148061141357503361140883610971565b6001600160a01b0316145b8061142c575061142c61142583612493565b51336107f0565b90508061147b5760405162461bcd60e51b815260206004820152601f60248201527f53656e646572206973206e6f74206f776e6572206f7220617070726f7665640060448201526064016109dc565b600082815260086020526040902054806114c85760405162461bcd60e51b815260206004820152600e60248201526d139195081b9bdd081cdd185ad95960921b60448201526064016109dc565b6114d281426133e8565b8585815181106114e4576114e46134d8565b602002602001018181525050861561150a5760008381526008602052604081205561151c565b60008381526008602052604090204290555b505050808061152a9061347d565b9150506113b3565b508215611579577f70b7ad2469256a533880bbe41f3a84f136ff6f0137174fc95dc996df7c4756c333868660405161156c93929190613227565b60405180910390a16115b5565b7fcd37c631adb690c8025e7364692089a6ac69e4fdfcfe9e43fb5e82cc6dee99c73386866040516115ac93929190613227565b60405180910390a15b949350505050565b610b1483838360405180602001604052806000815250611c33565b60006115e360015490565b821061163d5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b60648201526084016109dc565b5090565b6000546001600160a01b0316331461166b5760405162461bcd60e51b81526004016109dc906132cb565b610b14600e8383612ca3565b600061168282612493565b5192915050565b60006001600160a01b0382166116f55760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016109dc565b506001600160a01b03166000908152600560205260409020546001600160801b031690565b6000546001600160a01b031633146117445760405162461bcd60e51b81526004016109dc906132cb565b60405162461bcd60e51b815260206004820152601760248201527f43616e27742072656e6f756e63654f776e65727368697000000000000000000060448201526064016109dc565b600080805b83811015611893578484828181106117ab576117ab6134d8565b9050602002013591506117bd82611677565b6001600160a01b0316336001600160a01b0316146118145760405162461bcd60e51b8152602060048201526014602482015273139bdd081d1a19481bdddb995c881bd9881b999d60621b60448201526064016109dc565b600082815260086020526040902054156118705760405162461bcd60e51b815260206004820152601760248201527f5374616b696e6720416c726561647920456e61626c656400000000000000000060448201526064016109dc565b60008281526008602052604090204290558061188b8161347d565b915050611791565b507f53ba3c0cf49afeb3f054c66fb2a8eb5b8c4fc8b9cb5f4cecbe048e1284a369026118be82612493565b516040516118d0919087908790613227565b60405180910390a15060019392505050565b60408051808201909152600080825260208201526108d982612493565b6040516001600160601b03193360601b166020820152600090819060340160405160208183030381529060405280519060200120905061197684848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600b549150849050612276565b6119b45760405162461bcd60e51b815260206004820152600f60248201526e24b731b7b93932b1ba10383937b7b360891b60448201526064016109dc565b5060019392505050565b6060600380546108ee90613442565b6001600160a01b038216331415611a265760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c657200000000000060448201526064016109dc565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b03163314611abc5760405162461bcd60e51b81526004016109dc906132cb565b6002600a541415611b0f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109dc565b6002600a55604051600090339047908381818185875af1925050503d8060008114611b56576040519150601f19603f3d011682016040523d82523d6000602084013e611b5b565b606091505b5050905080610e645760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b60448201526064016109dc565b6000546001600160a01b03163314611bc95760405162461bcd60e51b81526004016109dc906132cb565b6040805160608101825263ffffffff929092168083526001600160401b0394851660208401819052939094169101819052600c80546001600160601b0319169093176401000000009092029190911767ffffffffffffffff60601b1916600160601b909102179055565b611c3e848484611e7f565b611c4a8484848461263c565b611c665760405162461bcd60e51b81526004016109dc90613300565b50505050565b6060611c79826001541190565b611cdd5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109dc565b6000611ce7612749565b90506000815111611d075760405180602001604052806000815250611d32565b80611d1184612758565b604051602001611d229291906131bb565b6040516020818303038152906040525b9392505050565b6000546001600160a01b03163314611d635760405162461bcd60e51b81526004016109dc906132cb565b600b55565b60008215801590611d32575050421015919050565b60006108d982612855565b6000546001600160a01b03163314611db25760405162461bcd60e51b81526004016109dc906132cb565b6001600160a01b038116611e175760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109dc565b611e20816128f3565b50565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60008181526008602052604090205415611ef05760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e6720656e61626c65642c2044697361626c65207374616b696e6760448201526b103a37903a3930b739b332b960a11b60648201526084016109dc565b6000611efb82612493565b80519091506000906001600160a01b0316336001600160a01b03161480611f32575033611f2784610971565b6001600160a01b0316145b80611f4457508151611f4490336107f0565b905080611fae5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016109dc565b846001600160a01b031682600001516001600160a01b0316146120225760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b60648201526084016109dc565b6001600160a01b0384166120865760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016109dc565b6120966000848460000151611e23565b6001600160a01b03851660009081526005602052604081208054600192906120c89084906001600160801b03166133c0565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b0386166000908152600560205260408120805460019450909261211491859116613353565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526004909152948520935184549151909216600160a01b026001600160e01b0319909116919092161717905561219b846001613375565b6000818152600460205260409020549091506001600160a01b031661222c576121c5816001541190565b1561222c5760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600490935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6000826122838584612943565b14949350505050565b6122a68282604051806020016040528060008152506129b7565b5050565b600954816122fa5760405162461bcd60e51b815260206004820152601860248201527f7175616e74697479206d757374206265206e6f6e7a65726f000000000000000060448201526064016109dc565b600060016123088484613375565b61231291906133e8565b905061233f60017f000000000000000000000000000000000000000000000000000000000000115e6133e8565b8111156123745761237160017f000000000000000000000000000000000000000000000000000000000000115e6133e8565b90505b61237f816001541190565b6123da5760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360448201526506c65616e75760d41b60648201526084016109dc565b815b81811161247f576000818152600460205260409020546001600160a01b031661246d57600061240a82612493565b60408051808201825282516001600160a01b0390811682526020938401516001600160401b039081168584019081526000888152600490965293909420915182549351909416600160a01b026001600160e01b0319909316931692909217179055505b806124778161347d565b9150506123dc565b5061248b816001613375565b600955505050565b60408051808201909152600080825260208201526124b2826001541190565b6125115760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b60648201526084016109dc565b60007f00000000000000000000000000000000000000000000000000000000000000058310612572576125647f0000000000000000000000000000000000000000000000000000000000000005846133e8565b61256f906001613375565b90505b825b8181106125db576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b031691830191909152156125c857949350505050565b50806125d38161342b565b915050612574565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b60648201526084016109dc565b60006001600160a01b0384163b1561273e57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906126809033908990889088906004016131ea565b602060405180830381600087803b15801561269a57600080fd5b505af19250505080156126ca575060408051601f3d908101601f191682019092526126c79181019061308f565b60015b612724573d8080156126f8576040519150601f19603f3d011682016040523d82523d6000602084013e6126fd565b606091505b50805161271c5760405162461bcd60e51b81526004016109dc90613300565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506115b5565b506001949350505050565b6060600e80546108ee90613442565b60608161277c5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156127a657806127908161347d565b915061279f9050600a8361338d565b9150612780565b6000816001600160401b038111156127c0576127c06134ee565b6040519080825280601f01601f1916602001820160405280156127ea576020820181803683370190505b5090505b84156115b5576127ff6001836133e8565b915061280c600a86613498565b612817906030613375565b60f81b81838151811061282c5761282c6134d8565b60200101906001600160f81b031916908160001a90535061284e600a8661338d565b94506127ee565b60006001600160a01b0382166128c75760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b60648201526084016109dc565b506001600160a01b0316600090815260056020526040902054600160801b90046001600160801b031690565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600081815b84518110156129af576000858281518110612965576129656134d8565b6020026020010151905080831161298b576000838152602082905260409020925061299c565b600081815260208490526040902092505b50806129a78161347d565b915050612948565b509392505050565b6001546001600160a01b038416612a1a5760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016109dc565b612a25816001541190565b15612a725760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e74656400000060448201526064016109dc565b7f0000000000000000000000000000000000000000000000000000000000000005831115612aed5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b60648201526084016109dc565b6001600160a01b0384166000908152600560209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612b52906001600160401b03881690613353565b6001600160801b03168152602001856001600160401b03168360200151612b799190613353565b6001600160801b039081169091526001600160a01b0380881660008181526005602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526004909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b85811015612c985760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612c5c600088848861263c565b612c785760405162461bcd60e51b81526004016109dc90613300565b81612c828161347d565b9250508080612c909061347d565b915050612c0f565b50600181905561226e565b828054612caf90613442565b90600052602060002090601f016020900481019282612cd15760008555612d17565b82601f10612cea5782800160ff19823516178555612d17565b82800160010185558215612d17579182015b82811115612d17578235825591602001919060010190612cfc565b5061163d9291505b8082111561163d5760008155600101612d1f565b80356001600160a01b0381168114612d4a57600080fd5b919050565b60008083601f840112612d6157600080fd5b5081356001600160401b03811115612d7857600080fd5b6020830191508360208260051b8501011115612d9357600080fd5b9250929050565b80358015158114612d4a57600080fd5b80356001600160401b0381168114612d4a57600080fd5b600060208284031215612dd357600080fd5b611d3282612d33565b60008060408385031215612def57600080fd5b612df883612d33565b9150612e0660208401612d33565b90509250929050565b600080600060608486031215612e2457600080fd5b612e2d84612d33565b9250612e3b60208501612d33565b9150604084013590509250925092565b60008060008060808587031215612e6157600080fd5b612e6a85612d33565b9350612e7860208601612d33565b92506040850135915060608501356001600160401b0380821115612e9b57600080fd5b818701915087601f830112612eaf57600080fd5b813581811115612ec157612ec16134ee565b604051601f8201601f19908116603f01168101908382118183101715612ee957612ee96134ee565b816040528281528a6020848701011115612f0257600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215612f3957600080fd5b612f4283612d33565b9150612e0660208401612d9a565b60008060408385031215612f6357600080fd5b612f6c83612d33565b946020939093013593505050565b60008060208385031215612f8d57600080fd5b82356001600160401b03811115612fa357600080fd5b612faf85828601612d4f565b90969095509350505050565b600080600060408486031215612fd057600080fd5b83356001600160401b03811115612fe657600080fd5b612ff286828701612d4f565b909790965060209590950135949350505050565b60008060006040848603121561301b57600080fd5b83356001600160401b0381111561303157600080fd5b61303d86828701612d4f565b9094509250613050905060208501612d9a565b90509250925092565b60006020828403121561306b57600080fd5b5035919050565b60006020828403121561308457600080fd5b8135611d3281613504565b6000602082840312156130a157600080fd5b8151611d3281613504565b600080602083850312156130bf57600080fd5b82356001600160401b03808211156130d657600080fd5b818501915085601f8301126130ea57600080fd5b8135818111156130f957600080fd5b86602082850101111561310b57600080fd5b60209290920196919550909350505050565b6000806040838503121561313057600080fd5b50508035926020909101359150565b60008060006060848603121561315457600080fd5b61315d84612daa565b925061316b60208501612daa565b9150604084013563ffffffff8116811461318457600080fd5b809150509250925092565b600081518084526131a78160208601602086016133ff565b601f01601f19169290920160200192915050565b600083516131cd8184602088016133ff565b8351908301906131e18183602088016133ff565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061321d9083018461318f565b9695505050505050565b6001600160a01b0384168152604060208201819052810182905260006001600160fb1b0383111561325757600080fd5b8260051b8085606085013760009201606001918252509392505050565b6020808252825182820181905260009190848201906040850190845b818110156132ac57835183529284019291840191600101613290565b50909695505050505050565b602081526000611d32602083018461318f565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60006001600160801b038083168185168083038211156131e1576131e16134ac565b60008219821115613388576133886134ac565b500190565b60008261339c5761339c6134c2565b500490565b60008160001904831182151516156133bb576133bb6134ac565b500290565b60006001600160801b03838116908316818110156133e0576133e06134ac565b039392505050565b6000828210156133fa576133fa6134ac565b500390565b60005b8381101561341a578181015183820152602001613402565b83811115611c665750506000910152565b60008161343a5761343a6134ac565b506000190190565b600181811c9082168061345657607f821691505b6020821081141561347757634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613491576134916134ac565b5060010190565b6000826134a7576134a76134c2565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611e2057600080fdfea2646970667358221220d6ff19a10c9bb21a29c49966cfefa2c29e553824c7c51797dfbb0e4e0102ff4b64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000115e00000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000002
-----Decoded View---------------
Arg [0] : maxBatchSize_ (uint256): 5
Arg [1] : collectionSize_ (uint256): 4446
Arg [2] : amountForDevs_ (uint256): 40
Arg [3] : whitelistSize_ (uint256): 2
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [1] : 000000000000000000000000000000000000000000000000000000000000115e
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000028
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000002
Deployed Bytecode Sourcemap
50556:5798:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33139:422;;;;;;;;;;-1:-1:-1;33139:422:0;;;;;:::i;:::-;;:::i;:::-;;;10680:14:1;;10673:22;10655:41;;10643:2;10628:18;33139:422:0;;;;;;;;35100:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;36795:292::-;;;;;;;;;;-1:-1:-1;36795:292:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8753:32:1;;;8735:51;;8723:2;8708:18;36795:292:0;8589:203:1;36316:413:0;;;;;;;;;;-1:-1:-1;36316:413:0;;;;;:::i;:::-;;:::i;:::-;;31495:100;;;;;;;;;;-1:-1:-1;31575:12:0;;31495:100;;;28085:25:1;;;28073:2;28058:18;31495:100:0;27939:177:1;37822:162:0;;;;;;;;;;-1:-1:-1;37822:162:0;;;;;:::i;:::-;;:::i;42074:173::-;;;;;;;;;;-1:-1:-1;42074:173:0;;;;;:::i;:::-;42138:7;42185:20;;;:11;:20;;;;;;;42074:173;52277:969;;;;;;:::i;:::-;;:::i;55768:156::-;;;;;;;;;;-1:-1:-1;55768:156:0;;;;;:::i;:::-;;:::i;51473:775::-;;;;;;:::i;:::-;;:::i;32203:864::-;;;;;;;;;;-1:-1:-1;32203:864:0;;;;;:::i;:::-;;:::i;54762:502::-;;;;;;;;;;-1:-1:-1;54762:502:0;;;;;:::i;:::-;;:::i;39954:1308::-;;;;;;;;;;-1:-1:-1;39954:1308:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;38055:177::-;;;;;;;;;;-1:-1:-1;38055:177:0;;;;;:::i;:::-;;:::i;31672:228::-;;;;;;;;;;-1:-1:-1;31672:228:0;;;;;:::i;:::-;;:::i;55455:106::-;;;;;;;;;;-1:-1:-1;55455:106:0;;;;;:::i;:::-;;:::i;34909:124::-;;;;;;;;;;-1:-1:-1;34909:124:0;;;;;:::i;:::-;;:::i;50718:47::-;;;;;;;;;;;;;;;33625:258;;;;;;;;;;-1:-1:-1;33625:258:0;;;;;:::i;:::-;;:::i;56228:123::-;;;;;;;;;;;;;:::i;39344:542::-;;;;;;;;;;-1:-1:-1;39344:542:0;;;;;:::i;:::-;;:::i;50618:48::-;;;;;;;;;;;;;;;9227:87;;;;;;;;;;-1:-1:-1;9273:7:0;9300:6;-1:-1:-1;;;;;9300:6:0;9227:87;;56053:167;;;;;;;;;;-1:-1:-1;56053:167:0;;;;;:::i;:::-;;:::i;:::-;;;;27804:13:1;;-1:-1:-1;;;;;27800:39:1;27782:58;;27900:4;27888:17;;;27882:24;-1:-1:-1;;;;;27878:49:1;27856:20;;;27849:79;;;;27755:18;56053:167:0;27574:360:1;53254:361:0;;;;;;;;;;-1:-1:-1;53254:361:0;;;;;:::i;:::-;;:::i;35269:104::-;;;;;;;;;;;;;:::i;37159:311::-;;;;;;;;;;-1:-1:-1;37159:311:0;;;;;:::i;:::-;;:::i;55569:191::-;;;;;;;;;;;;;:::i;54422:305::-;;;;;;;;;;-1:-1:-1;54422:305:0;;;;;:::i;:::-;;:::i;54176:130::-;;;;;;;;;;-1:-1:-1;54176:130:0;;;;;:::i;:::-;-1:-1:-1;;;;;54270:28:0;54244:7;54270:28;;;:18;:28;;;;;;;54176:130;38303:355;;;;;;;;;;-1:-1:-1;38303:355:0;;;;;:::i;:::-;;:::i;35444:468::-;;;;;;;;;;-1:-1:-1;35444:468:0;;;;;:::i;:::-;;:::i;54315:99::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;54389:17:0;;;;;;;;54396:10;54389:17;;;;;;-1:-1:-1;;;;;54389:17:0;;;;;;;;;-1:-1:-1;;;54389:17:0;;;;;;;;;;;;54315:99;;;;;27314:13:1;;27329:10;27310:30;27292:49;;27388:4;27376:17;;;27370:24;-1:-1:-1;;;;;27469:21:1;;;27447:20;;;27440:51;;;;27539:17;;;27533:24;27529:33;;;27507:20;;;27500:63;27280:2;27265:18;54315:99:0;27090:479:1;46546:43:0;;;;;;;;;;;;;;;;53623:82;;;;;;;;;;-1:-1:-1;53623:82:0;;;;;:::i;:::-;;:::i;53945:223::-;;;;;;;;;;-1:-1:-1;53945:223:0;;;;;:::i;:::-;;:::i;55932:113::-;;;;;;;;;;-1:-1:-1;55932:113:0;;;;;:::i;:::-;;:::i;37541:214::-;;;;;;;;;;-1:-1:-1;37541:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;37712:25:0;;;37683:4;37712:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;37541:214;10136:201;;;;;;;;;;-1:-1:-1;10136:201:0;;;;;:::i;:::-;;:::i;50673:38::-;;;;;;;;;;;;;;;33139:422;33286:4;-1:-1:-1;;;;;;33328:40:0;;-1:-1:-1;;;33328:40:0;;:105;;-1:-1:-1;;;;;;;33385:48:0;;-1:-1:-1;;;33385:48:0;33328:105;:172;;;-1:-1:-1;;;;;;;33450:50:0;;-1:-1:-1;;;33450:50:0;33328:172;:225;;;-1:-1:-1;;;;;;;;;;22120:40:0;;;33517:36;33308:245;33139:422;-1:-1:-1;;33139:422:0:o;35100:100::-;35154:13;35187:5;35180:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35100:100;:::o;36795:292::-;36899:7;36946:16;36954:7;39004:12;;-1:-1:-1;38994:22:0;38913:111;36946:16;36924:111;;;;-1:-1:-1;;;36924:111:0;;26475:2:1;36924:111:0;;;26457:21:1;26514:2;26494:18;;;26487:30;26553:34;26533:18;;;26526:62;-1:-1:-1;;;26604:18:1;;;26597:43;26657:19;;36924:111:0;;;;;;;;;-1:-1:-1;37055:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;37055:24:0;;36795:292::o;36316:413::-;36389:13;36405:24;36421:7;36405:15;:24::i;:::-;36389:40;;36454:5;-1:-1:-1;;;;;36448:11:0;:2;-1:-1:-1;;;;;36448:11:0;;;36440:58;;;;-1:-1:-1;;;36440:58:0;;21777:2:1;36440:58:0;;;21759:21:1;21816:2;21796:18;;;21789:30;21855:34;21835:18;;;21828:62;-1:-1:-1;;;21906:18:1;;;21899:32;21948:19;;36440:58:0;21575:398:1;36440:58:0;8031:10;-1:-1:-1;;;;;36533:21:0;;;;:62;;-1:-1:-1;36558:37:0;36575:5;8031:10;37541:214;:::i;36558:37::-;36511:169;;;;-1:-1:-1;;;36511:169:0;;17576:2:1;36511:169:0;;;17558:21:1;17615:2;17595:18;;;17588:30;17654:34;17634:18;;;17627:62;17725:27;17705:18;;;17698:55;17770:19;;36511:169:0;17374:421:1;36511:169:0;36693:28;36702:2;36706:7;36715:5;36693:8;:28::i;:::-;36378:351;36316:413;;:::o;37822:162::-;37948:28;37958:4;37964:2;37968:7;37948:9;:28::i;52277:969::-;52420:10;:25;;;;-1:-1:-1;;;;;52420:25:0;;52457:55;;;;-1:-1:-1;;;52457:55:0;;21416:2:1;52457:55:0;;;21398:21:1;;;21435:18;;;21428:30;21494:34;21474:18;;;21467:62;21546:18;;52457:55:0;21214:356:1;52457:55:0;52563:10;:30;;;52545:15;:48;52523:142;;;;-1:-1:-1;;;52523:142:0;;14925:2:1;52523:142:0;;;14907:21:1;14964:2;14944:18;;;14937:30;15003:34;14983:18;;;14976:62;-1:-1:-1;;;15054:18:1;;;15047:42;15106:19;;52523:142:0;14723:408:1;52523:142:0;52698:16;52706:8;52698:5;:16;:::i;:::-;52684:9;:31;52676:64;;;;-1:-1:-1;;;52676:64:0;;14172:2:1;52676:64:0;;;14154:21:1;14211:2;14191:18;;;14184:30;-1:-1:-1;;;14230:18:1;;;14223:50;14290:18;;52676:64:0;13970:344:1;52676:64:0;52776:28;;-1:-1:-1;;;;;;52793:10:0;7819:2:1;7815:15;7811:53;52776:28:0;;;7799:66:1;52751:12:0;;7881::1;;52776:28:0;;;;;;;;;;;;52766:39;;;;;;52751:54;;52824:38;52843:6;;52824:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52851:4:0;;;-1:-1:-1;52857:4:0;;-1:-1:-1;52824:18:0;:38::i;:::-;52816:66;;;;-1:-1:-1;;;52816:66:0;;21072:2:1;52816:66:0;;;21054:21:1;21111:2;21091:18;;;21084:30;-1:-1:-1;;;21130:18:1;;;21123:45;21185:18;;52816:66:0;20870:339:1;52816:66:0;52934:10;52915:30;;;;:18;:30;;;;;;52960:22;;52915:41;;52948:8;;52915:41;:::i;:::-;:67;;52893:141;;;;-1:-1:-1;;;52893:141:0;;16162:2:1;52893:141:0;;;16144:21:1;16201:2;16181:18;;;16174:30;16240:26;16220:18;;;16213:54;16284:18;;52893:141:0;15960:348:1;52893:141:0;53112:10;53093:30;;;;:18;:30;;;;;;:54;;53139:8;;53093:54;:::i;:::-;53066:10;53047:30;;;;:18;:30;;;;;:100;;;;53158:31;;53180:8;53158:9;:31::i;:::-;53227:10;44122:1;44087:19;;;:12;:19;;;;;:36;;-1:-1:-1;;;;;44087:36:0;;;52385:861;;52277:969;;;:::o;55768:156::-;9273:7;9300:6;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;4201:1:::1;4799:7;;:19;;4791:63;;;::::0;-1:-1:-1;;;4791:63:0;;25699:2:1;4791:63:0::1;::::0;::::1;25681:21:1::0;25738:2;25718:18;;;25711:30;25777:33;25757:18;;;25750:61;25828:18;;4791:63:0::1;25497:355:1::0;4791:63:0::1;4201:1;4932:7;:18:::0;55888:28:::2;55907:8:::0;55888:18:::2;:28::i;:::-;-1:-1:-1::0;4157:1:0::1;5111:7;:22:::0;55768:156::o;51473:775::-;51569:10;:22;-1:-1:-1;;;;;;;;51569:22:0;;;;51641:30;;51733:14;51721:8;51705:13;31575:12;;;31495:100;51705:13;:24;;;;:::i;:::-;:42;;51683:110;;;;-1:-1:-1;;;51683:110:0;;18767:2:1;51683:110:0;;;18749:21:1;18806:2;18786:18;;;18779:30;-1:-1:-1;;;18825:18:1;;;18818:48;18883:18;;51683:110:0;18565:342:1;51683:110:0;51864:48;51879:11;51892:19;51864:14;:48::i;:::-;51842:127;;;;-1:-1:-1;;;51842:127:0;;11888:2:1;51842:127:0;;;11870:21:1;11927:2;11907:18;;;11900:30;11966:31;11946:18;;;11939:59;12015:18;;51842:127:0;11686:353:1;51842:127:0;52041:23;52029:8;52002:24;52015:10;52002:12;:24::i;:::-;:35;;;;:::i;:::-;:62;;51980:134;;;;-1:-1:-1;;;51980:134:0;;23705:2:1;51980:134:0;;;23687:21:1;23744:2;23724:18;;;23717:30;-1:-1:-1;;;23763:18:1;;;23756:52;23825:18;;51980:134:0;23503:346:1;51980:134:0;52146:22;52160:8;52146:11;:22;:::i;:::-;52133:9;:35;52125:71;;;;-1:-1:-1;;;52125:71:0;;11536:2:1;52125:71:0;;;11518:21:1;11575:2;11555:18;;;11548:30;11614:25;11594:18;;;11587:53;11657:18;;52125:71:0;11334:347:1;52125:71:0;52209:31;52219:10;52231:8;52209:9;:31::i;32203:864::-;32328:7;32369:16;32379:5;32369:9;:16::i;:::-;32361:5;:24;32353:71;;;;-1:-1:-1;;;32353:71:0;;11133:2:1;32353:71:0;;;11115:21:1;11172:2;11152:18;;;11145:30;11211:34;11191:18;;;11184:62;-1:-1:-1;;;11262:18:1;;;11255:32;11304:19;;32353:71:0;10931:398:1;32353:71:0;32435:22;32460:13;31575:12;;;31495:100;32460:13;32435:38;;32484:19;32518:25;32572:9;32567:426;32591:14;32587:1;:18;32567:426;;;32627:31;32661:14;;;:11;:14;;;;;;;;;32627:48;;;;;;;;;-1:-1:-1;;;;;32627:48:0;;;;;-1:-1:-1;;;32627:48:0;;;-1:-1:-1;;;;;32627:48:0;;;;;;;;32694:28;32690:103;;32763:14;;;-1:-1:-1;32690:103:0;32832:5;-1:-1:-1;;;;;32811:26:0;:17;-1:-1:-1;;;;;32811:26:0;;32807:175;;;32877:5;32862:11;:20;32858:77;;;-1:-1:-1;32914:1:0;-1:-1:-1;32907:8:0;;-1:-1:-1;;;32907:8:0;32858:77;32953:13;;;;:::i;:::-;;;;32807:175;-1:-1:-1;32607:3:0;;;;:::i;:::-;;;;32567:426;;;-1:-1:-1;33003:56:0;;-1:-1:-1;;;33003:56:0;;24877:2:1;33003:56:0;;;24859:21:1;24916:2;24896:18;;;24889:30;24955:34;24935:18;;;24928:62;-1:-1:-1;;;25006:18:1;;;24999:44;25060:19;;33003:56:0;24675:410:1;54762:502:0;9273:7;9300:6;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;54877:13:::1;54865:8;54849:13;31575:12:::0;;;31495:100;54849:13:::1;:24;;;;:::i;:::-;:41;;54827:130;;;::::0;-1:-1:-1;;;54827:130:0;;24469:2:1;54827:130:0::1;::::0;::::1;24451:21:1::0;24508:2;24488:18;;;24481:30;24547:34;24527:18;;;24520:62;-1:-1:-1;;;24598:18:1;;;24591:37;24645:19;;54827:130:0::1;24267:403:1::0;54827:130:0::1;54990:23;55001:12;54990:8:::0;:23:::1;:::i;:::-;:28:::0;54968:122:::1;;;::::0;-1:-1:-1;;;54968:122:0;;13759:2:1;54968:122:0::1;::::0;::::1;13741:21:1::0;13798:2;13778:18;;;13771:30;13837:34;13817:18;;;13810:62;-1:-1:-1;;;13888:18:1;;;13881:42;13940:19;;54968:122:0::1;13557:408:1::0;54968:122:0::1;55101:17;55121:23;55132:12;55121:8:::0;:23:::1;:::i;:::-;55101:43;;55160:9;55155:102;55179:9;55175:1;:13;55155:102;;;55210:35;55220:10;55232:12;55210:9;:35::i;:::-;55190:3:::0;::::1;::::0;::::1;:::i;:::-;;;;55155:102;;39954:1308:::0;40061:27;40106:28;40151:8;-1:-1:-1;;;;;40137:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40137:30:0;;40106:61;;40183:9;40178:892;40198:19;;;40178:892;;;40239:15;40257:8;;40266:1;40257:11;;;;;;;:::i;:::-;;;;;;;40239:29;;40283:22;40342:20;40354:7;40342:11;:20::i;:::-;:25;-1:-1:-1;;;;;40309:58:0;8031:10;-1:-1:-1;;;;;40309:58:0;;:115;;;-1:-1:-1;8031:10:0;40388:20;40400:7;40388:11;:20::i;:::-;-1:-1:-1;;;;;40388:36:0;;40309:115;:193;;;;40445:57;40462:20;40474:7;40462:11;:20::i;:::-;:25;8031:10;37541:214;:::i;40445:57::-;40283:220;;40526:17;40518:61;;;;-1:-1:-1;;;40518:61:0;;16864:2:1;40518:61:0;;;16846:21:1;16903:2;16883:18;;;16876:30;16942:33;16922:18;;;16915:61;16993:18;;40518:61:0;16662:355:1;40518:61:0;40594:24;40621:20;;;:11;:20;;;;;;40664;40656:47;;;;-1:-1:-1;;;40656:47:0;;12653:2:1;40656:47:0;;;12635:21:1;12692:2;12672:18;;;12665:30;-1:-1:-1;;;12711:18:1;;;12704:44;12765:18;;40656:47:0;12451:338:1;40656:47:0;40777:34;40795:16;40777:15;:34;:::i;:::-;40760:11;40772:1;40760:14;;;;;;;;:::i;:::-;;;;;;:51;;;;;40866:7;40862:197;;;40917:1;40894:20;;;:11;:20;;;;;:24;40862:197;;;40959:20;;;;:11;:20;;;;;40982:15;40959:38;;40862:197;40224:846;;;40219:3;;;;;:::i;:::-;;;;40178:892;;;;41084:7;41080:146;;;41113:32;8031:10;41136:8;;41113:32;;;;;;;;:::i;:::-;;;;;;;;41080:146;;;41183:31;8031:10;41205:8;;41183:31;;;;;;;;:::i;:::-;;;;;;;;41080:146;41243:11;39954:1308;-1:-1:-1;;;;39954:1308:0:o;38055:177::-;38185:39;38202:4;38208:2;38212:7;38185:39;;;;;;;;;;;;:16;:39::i;31672:228::-;31775:7;31816:13;31575:12;;;31495:100;31816:13;31808:5;:21;31800:69;;;;-1:-1:-1;;;31800:69:0;;14521:2:1;31800:69:0;;;14503:21:1;14560:2;14540:18;;;14533:30;14599:34;14579:18;;;14572:62;-1:-1:-1;;;14650:18:1;;;14643:33;14693:19;;31800:69:0;14319:399:1;31800:69:0;-1:-1:-1;31887:5:0;31672:228::o;55455:106::-;9273:7;9300:6;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;55530:23:::1;:13;55546:7:::0;;55530:23:::1;:::i;34909:124::-:0;34973:7;35000:20;35012:7;35000:11;:20::i;:::-;:25;;34909:124;-1:-1:-1;;34909:124:0:o;33625:258::-;33689:7;-1:-1:-1;;;;;33731:19:0;;33709:112;;;;-1:-1:-1;;;33709:112:0;;18355:2:1;33709:112:0;;;18337:21:1;18394:2;18374:18;;;18367:30;18433:34;18413:18;;;18406:62;-1:-1:-1;;;18484:18:1;;;18477:41;18535:19;;33709:112:0;18153:407:1;33709:112:0;-1:-1:-1;;;;;;33847:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;33847:27:0;;33625:258::o;56228:123::-;9273:7;9300:6;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;56302:41:::1;::::0;-1:-1:-1;;;56302:41:0;;13407:2:1;56302:41:0::1;::::0;::::1;13389:21:1::0;13446:2;13426:18;;;13419:30;13485:25;13465:18;;;13458:53;13528:18;;56302:41:0::1;13205:347:1::0;39344:542:0;39437:4;;;39489:301;39509:19;;;39489:301;;;39560:8;;39569:1;39560:11;;;;;;;:::i;:::-;;;;;;;39550:21;;39608:16;39616:7;39608;:16::i;:::-;-1:-1:-1;;;;;39594:30:0;:10;-1:-1:-1;;;;;39594:30:0;;39586:63;;;;-1:-1:-1;;;39586:63:0;;16515:2:1;39586:63:0;;;16497:21:1;16554:2;16534:18;;;16527:30;-1:-1:-1;;;16573:18:1;;;16566:50;16633:18;;39586:63:0;16313:344:1;39586:63:0;39672:20;;;;:11;:20;;;;;;:25;39664:61;;;;-1:-1:-1;;;39664:61:0;;17224:2:1;39664:61:0;;;17206:21:1;17263:2;17243:18;;;17236:30;17302:25;17282:18;;;17275:53;17345:18;;39664:61:0;17022:347:1;39664:61:0;39740:20;;;;:11;:20;;;;;39763:15;39740:38;;39530:3;;;;:::i;:::-;;;;39489:301;;;;39805:51;39820:20;39832:7;39820:11;:20::i;:::-;:25;39805:51;;;;39820:25;39847:8;;;;39805:51;:::i;:::-;;;;;;;;-1:-1:-1;39874:4:0;;39344:542;-1:-1:-1;;;39344:542:0:o;56053:167::-;-1:-1:-1;;;;;;;;;;;;;;;;;56192:20:0;56204:7;56192:11;:20::i;53254:361::-;53405:28;;-1:-1:-1;;;;;;53422:10:0;7819:2:1;7815:15;7811:53;53405:28:0;;;7799:66:1;53358:4:0;;;;7881:12:1;;53405:28:0;;;;;;;;;;;;53395:39;;;;;;53380:54;;53467:44;53486:12;;53467:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53500:4:0;;;-1:-1:-1;53506:4:0;;-1:-1:-1;53467:18:0;:44::i;:::-;53445:109;;;;-1:-1:-1;;;53445:109:0;;21072:2:1;53445:109:0;;;21054:21:1;21111:2;21091:18;;;21084:30;-1:-1:-1;;;21130:18:1;;;21123:45;21185:18;;53445:109:0;20870:339:1;53445:109:0;-1:-1:-1;53572:4:0;;53254:361;-1:-1:-1;;;53254:361:0:o;35269:104::-;35325:13;35358:7;35351:14;;;;;:::i;37159:311::-;-1:-1:-1;;;;;37277:24:0;;8031:10;37277:24;;37269:63;;;;-1:-1:-1;;;37269:63:0;;20298:2:1;37269:63:0;;;20280:21:1;20337:2;20317:18;;;20310:30;20376:28;20356:18;;;20349:56;20422:18;;37269:63:0;20096:350:1;37269:63:0;8031:10;37345:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;37345:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;37345:53:0;;;;;;;;;;37414:48;;10655:41:1;;;37345:42:0;;8031:10;37414:48;;10628:18:1;37414:48:0;;;;;;;37159:311;;:::o;55569:191::-;9273:7;9300:6;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;4201:1:::1;4799:7;;:19;;4791:63;;;::::0;-1:-1:-1;;;4791:63:0;;25699:2:1;4791:63:0::1;::::0;::::1;25681:21:1::0;25738:2;25718:18;;;25711:30;25777:33;25757:18;;;25750:61;25828:18;;4791:63:0::1;25497:355:1::0;4791:63:0::1;4201:1;4932:7;:18:::0;55656:49:::2;::::0;55638:12:::2;::::0;55656:10:::2;::::0;55679:21:::2;::::0;55638:12;55656:49;55638:12;55656:49;55679:21;55656:10;:49:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55637:68;;;55724:7;55716:36;;;::::0;-1:-1:-1;;;55716:36:0;;22180:2:1;55716:36:0::2;::::0;::::2;22162:21:1::0;22219:2;22199:18;;;22192:30;-1:-1:-1;;;22238:18:1;;;22231:46;22294:18;;55716:36:0::2;21978:340:1::0;54422:305:0;9273:7;9300:6;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;54603:116:::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;;;;54603:116:0;;::::1;;::::0;::::1;::::0;;;;;;::::1;::::0;;;;;54590:10:::1;:129:::0;;-1:-1:-1;;;;;;54590:129:0;;;;;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;54590:129:0::1;-1:-1:-1::0;;;54590:129:0;;::::1;;::::0;;54422:305::o;38303:355::-;38462:28;38472:4;38478:2;38482:7;38462:9;:28::i;:::-;38523:48;38546:4;38552:2;38556:7;38565:5;38523:22;:48::i;:::-;38501:149;;;;-1:-1:-1;;;38501:149:0;;;;;;;:::i;:::-;38303:355;;;;:::o;35444:468::-;35562:13;35615:16;35623:7;39004:12;;-1:-1:-1;38994:22:0;38913:111;35615:16;35593:113;;;;-1:-1:-1;;;35593:113:0;;19882:2:1;35593:113:0;;;19864:21:1;19921:2;19901:18;;;19894:30;19960:34;19940:18;;;19933:62;-1:-1:-1;;;20011:18:1;;;20004:45;20066:19;;35593:113:0;19680:411:1;35593:113:0;35719:21;35743:10;:8;:10::i;:::-;35719:34;;35808:1;35790:7;35784:21;:25;:120;;;;;;;;;;;;;;;;;35853:7;35862:18;:7;:16;:18::i;:::-;35836:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35784:120;35764:140;35444:468;-1:-1:-1;;;35444:468:0:o;53623:82::-;9273:7;9300:6;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;53685:4:::1;:12:::0;53623:82::o;53945:223::-;54070:4;54099:19;;;;;:61;;-1:-1:-1;;54122:15:0;:38;;;54092:68;-1:-1:-1;53945:223:0:o;55932:113::-;55990:7;56017:20;56031:5;56017:13;:20::i;10136:201::-;9273:7;9300:6;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10225:22:0;::::1;10217:73;;;::::0;-1:-1:-1;;;10217:73:0;;12246:2:1;10217:73:0::1;::::0;::::1;12228:21:1::0;12285:2;12265:18;;;12258:30;12324:34;12304:18;;;12297:62;-1:-1:-1;;;12375:18:1;;;12368:36;12421:19;;10217:73:0::1;12044:402:1::0;10217:73:0::1;10301:28;10320:8;10301:18;:28::i;:::-;10136:201:::0;:::o;46342:196::-;46457:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;46457:29:0;-1:-1:-1;;;;;46457:29:0;;;;;;;;;46502:28;;46457:24;;46502:28;;;;;;;46342:196;;;:::o;44385:1839::-;44522:20;;;;:11;:20;;;;;;:25;44500:119;;;;-1:-1:-1;;;44500:119:0;;24056:2:1;44500:119:0;;;24038:21:1;24095:2;24075:18;;;24068:30;24134:34;24114:18;;;24107:62;-1:-1:-1;;;24185:18:1;;;24178:42;24237:19;;44500:119:0;23854:408:1;44500:119:0;44630:35;44668:20;44680:7;44668:11;:20::i;:::-;44743:18;;44630:58;;-1:-1:-1;44701:22:0;;-1:-1:-1;;;;;44727:34:0;8031:10;-1:-1:-1;;;;;44727:34:0;;:87;;;-1:-1:-1;8031:10:0;44778:20;44790:7;44778:11;:20::i;:::-;-1:-1:-1;;;;;44778:36:0;;44727:87;:154;;;-1:-1:-1;44848:18:0;;44831:50;;8031:10;37541:214;:::i;44831:50::-;44701:181;;44917:17;44895:117;;;;-1:-1:-1;;;44895:117:0;;20653:2:1;44895:117:0;;;20635:21:1;20692:2;20672:18;;;20665:30;20731:34;20711:18;;;20704:62;-1:-1:-1;;;20782:18:1;;;20775:48;20840:19;;44895:117:0;20451:414:1;44895:117:0;45069:4;-1:-1:-1;;;;;45047:26:0;:13;:18;;;-1:-1:-1;;;;;45047:26:0;;45025:114;;;;-1:-1:-1;;;45025:114:0;;19114:2:1;45025:114:0;;;19096:21:1;19153:2;19133:18;;;19126:30;19192:34;19172:18;;;19165:62;-1:-1:-1;;;19243:18:1;;;19236:36;19289:19;;45025:114:0;18912:402:1;45025:114:0;-1:-1:-1;;;;;45158:16:0;;45150:66;;;;-1:-1:-1;;;45150:66:0;;15338:2:1;45150:66:0;;;15320:21:1;15377:2;15357:18;;;15350:30;15416:34;15396:18;;;15389:62;-1:-1:-1;;;15467:18:1;;;15460:35;15512:19;;45150:66:0;15136:401:1;45150:66:0;45337:49;45354:1;45358:7;45367:13;:18;;;45337:8;:49::i;:::-;-1:-1:-1;;;;;45399:18:0;;;;;;:12;:18;;;;;:31;;45429:1;;45399:18;:31;;45429:1;;-1:-1:-1;;;;;45399:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;45399:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;45441:16:0;;-1:-1:-1;45441:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;45441:16:0;;:29;;-1:-1:-1;;45441:29:0;;:::i;:::-;;;-1:-1:-1;;;;;45441:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45504:43:0;;;;;;;;-1:-1:-1;;;;;45504:43:0;;;;;-1:-1:-1;;;;;45530:15:0;45504:43;;;;;;;;;-1:-1:-1;45481:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;45481:66:0;-1:-1:-1;;;;;;45481:66:0;;;;;;;;;;;45809:11;45493:7;-1:-1:-1;45809:11:0;:::i;:::-;45876:1;45835:24;;;:11;:24;;;;;:29;45787:33;;-1:-1:-1;;;;;;45835:29:0;45831:288;;45899:20;45907:11;39004:12;;-1:-1:-1;38994:22:0;38913:111;45899:20;45895:213;;;45967:125;;;;;;;;46004:18;;-1:-1:-1;;;;;45967:125:0;;;;;;46045:28;;;;-1:-1:-1;;;;;45967:125:0;;;;;;;;;-1:-1:-1;45940:24:0;;;:11;:24;;;;;;;:152;;;;;;;;;-1:-1:-1;;;45940:152:0;-1:-1:-1;;;;;;45940:152:0;;;;;;;;;;;;45895:213;46155:7;46151:2;-1:-1:-1;;;;;46136:27:0;46145:4;-1:-1:-1;;;;;46136:27:0;;;;;;;;;;;46174:42;44489:1735;;;44385:1839;;;:::o;923:190::-;1048:4;1101;1072:25;1085:5;1092:4;1072:12;:25::i;:::-;:33;;923:190;-1:-1:-1;;;;923:190:0:o;39032:104::-;39101:27;39111:2;39115:8;39101:27;;;;;;;;;;;;:9;:27::i;:::-;39032:104;;:::o;46702:950::-;46796:24;;46839:12;46831:49;;;;-1:-1:-1;;;46831:49:0;;18002:2:1;46831:49:0;;;17984:21:1;18041:2;18021:18;;;18014:30;18080:26;18060:18;;;18053:54;18124:18;;46831:49:0;17800:348:1;46831:49:0;46891:16;46941:1;46910:28;46930:8;46910:17;:28;:::i;:::-;:32;;;;:::i;:::-;46891:51;-1:-1:-1;46968:18:0;46985:1;46968:14;:18;:::i;:::-;46957:8;:29;46953:91;;;47014:18;47031:1;47014:14;:18;:::i;:::-;47003:29;;46953:91;47167:17;47175:8;39004:12;;-1:-1:-1;38994:22:0;38913:111;47167:17;47159:68;;;;-1:-1:-1;;;47159:68:0;;25292:2:1;47159:68:0;;;25274:21:1;25331:2;25311:18;;;25304:30;25370:34;25350:18;;;25343:62;-1:-1:-1;;;25421:18:1;;;25414:36;25467:19;;47159:68:0;25090:402:1;47159:68:0;47255:17;47238:357;47279:8;47274:1;:13;47238:357;;47344:1;47313:14;;;:11;:14;;;;;:19;-1:-1:-1;;;;;47313:19:0;47309:275;;47367:31;47401:14;47413:1;47401:11;:14::i;:::-;47451:117;;;;;;;;47488:14;;-1:-1:-1;;;;;47451:117:0;;;;;;47525:24;;;;-1:-1:-1;;;;;47451:117:0;;;;;;;;;-1:-1:-1;47434:14:0;;;:11;:14;;;;;;;:134;;;;;;;;;-1:-1:-1;;;47434:134:0;-1:-1:-1;;;;;;47434:134:0;;;;;;;;;;;;-1:-1:-1;47309:275:0;47289:3;;;;:::i;:::-;;;;47238:357;;;-1:-1:-1;47632:12:0;:8;47643:1;47632:12;:::i;:::-;47605:24;:39;-1:-1:-1;;;46702:950:0:o;34165:682::-;-1:-1:-1;;;;;;;;;;;;;;;;;34300:16:0;34308:7;39004:12;;-1:-1:-1;38994:22:0;38913:111;34300:16;34292:71;;;;-1:-1:-1;;;34292:71:0;;12996:2:1;34292:71:0;;;12978:21:1;13035:2;13015:18;;;13008:30;13074:34;13054:18;;;13047:62;-1:-1:-1;;;13125:18:1;;;13118:40;13175:19;;34292:71:0;12794:406:1;34292:71:0;34376:26;34428:12;34417:7;:23;34413:103;;34478:22;34488:12;34478:7;:22;:::i;:::-;:26;;34503:1;34478:26;:::i;:::-;34457:47;;34413:103;34548:7;34528:242;34565:18;34557:4;:26;34528:242;;34608:31;34642:17;;;:11;:17;;;;;;;;;34608:51;;;;;;;;;-1:-1:-1;;;;;34608:51:0;;;;;-1:-1:-1;;;34608:51:0;;;-1:-1:-1;;;;;34608:51:0;;;;;;;;34678:28;34674:85;;34734:9;34165:682;-1:-1:-1;;;;34165:682:0:o;34674:85::-;-1:-1:-1;34585:6:0;;;;:::i;:::-;;;;34528:242;;;-1:-1:-1;34782:57:0;;-1:-1:-1;;;34782:57:0;;26059:2:1;34782:57:0;;;26041:21:1;26098:2;26078:18;;;26071:30;26137:34;26117:18;;;26110:62;-1:-1:-1;;;26188:18:1;;;26181:45;26243:19;;34782:57:0;25857:411:1;48217:985:0;48372:4;-1:-1:-1;;;;;48393:13:0;;12223:19;:23;48389:806;;48446:175;;-1:-1:-1;;;48446:175:0;;-1:-1:-1;;;;;48446:36:0;;;;;:175;;8031:10;;48540:4;;48567:7;;48597:5;;48446:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48446:175:0;;;;;;;;-1:-1:-1;;48446:175:0;;;;;;;;;;;;:::i;:::-;;;48425:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48808:13:0;;48804:321;;48851:109;;-1:-1:-1;;;48851:109:0;;;;;;;:::i;48804:321::-;49075:6;49069:13;49060:6;49056:2;49052:15;49045:38;48425:715;-1:-1:-1;;;;;;48685:55:0;-1:-1:-1;;;48685:55:0;;-1:-1:-1;48678:62:0;;48389:806;-1:-1:-1;49179:4:0;48217:985;;;;;;:::o;55333:114::-;55393:13;55426;55419:20;;;;;:::i;5513:723::-;5569:13;5790:10;5786:53;;-1:-1:-1;;5817:10:0;;;;;;;;;;;;-1:-1:-1;;;5817:10:0;;;;;5513:723::o;5786:53::-;5864:5;5849:12;5905:78;5912:9;;5905:78;;5938:8;;;;:::i;:::-;;-1:-1:-1;5961:10:0;;-1:-1:-1;5969:2:0;5961:10;;:::i;:::-;;;5905:78;;;5993:19;6025:6;-1:-1:-1;;;;;6015:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6015:17:0;;5993:39;;6043:154;6050:10;;6043:154;;6077:11;6087:1;6077:11;;:::i;:::-;;-1:-1:-1;6146:10:0;6154:2;6146:5;:10;:::i;:::-;6133:24;;:2;:24;:::i;:::-;6120:39;;6103:6;6110;6103:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;6103:56:0;;;;;;;;-1:-1:-1;6174:11:0;6183:2;6174:11;;:::i;:::-;;;6043:154;;33891:266;33952:7;-1:-1:-1;;;;;33994:19:0;;33972:118;;;;-1:-1:-1;;;33972:118:0;;15744:2:1;33972:118:0;;;15726:21:1;15783:2;15763:18;;;15756:30;15822:34;15802:18;;;15795:62;-1:-1:-1;;;15873:18:1;;;15866:47;15930:19;;33972:118:0;15542:413:1;33972:118:0;-1:-1:-1;;;;;;34116:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;34116:32:0;;-1:-1:-1;;;;;34116:32:0;;33891:266::o;10497:191::-;10571:16;10590:6;;-1:-1:-1;;;;;10607:17:0;;;-1:-1:-1;;;;;;10607:17:0;;;;;;10640:40;;10590:6;;;;;;;10640:40;;10571:16;10640:40;10560:128;10497:191;:::o;1475:675::-;1558:7;1601:4;1558:7;1616:497;1640:5;:12;1636:1;:16;1616:497;;;1674:20;1697:5;1703:1;1697:8;;;;;;;;:::i;:::-;;;;;;;1674:31;;1740:12;1724;:28;1720:382;;2226:13;2276:15;;;2312:4;2305:15;;;2359:4;2343:21;;1852:57;;1720:382;;;2226:13;2276:15;;;2312:4;2305:15;;;2359:4;2343:21;;2029:57;;1720:382;-1:-1:-1;1654:3:0;;;;:::i;:::-;;;;1616:497;;;-1:-1:-1;2130:12:0;1475:675;-1:-1:-1;;;1475:675:0:o;42610:1398::-;42756:12;;-1:-1:-1;;;;;42787:16:0;;42779:62;;;;-1:-1:-1;;;42779:62:0;;23303:2:1;42779:62:0;;;23285:21:1;23342:2;23322:18;;;23315:30;23381:34;23361:18;;;23354:62;-1:-1:-1;;;23432:18:1;;;23425:31;23473:19;;42779:62:0;23101:397:1;42779:62:0;42986:21;42994:12;39004;;-1:-1:-1;38994:22:0;38913:111;42986:21;42985:22;42977:64;;;;-1:-1:-1;;;42977:64:0;;22945:2:1;42977:64:0;;;22927:21:1;22984:2;22964:18;;;22957:30;23023:31;23003:18;;;22996:59;23072:18;;42977:64:0;22743:353:1;42977:64:0;43072:12;43060:8;:24;;43052:71;;;;-1:-1:-1;;;43052:71:0;;26889:2:1;43052:71:0;;;26871:21:1;26928:2;26908:18;;;26901:30;26967:34;26947:18;;;26940:62;-1:-1:-1;;;27018:18:1;;;27011:32;27060:19;;43052:71:0;26687:398:1;43052:71:0;-1:-1:-1;;;;;43243:16:0;;43210:30;43243:16;;;:12;:16;;;;;;;;;43210:49;;;;;;;;;-1:-1:-1;;;;;43210:49:0;;;;;-1:-1:-1;;;43210:49:0;;;;;;;;;;;43289:133;;;;;;;;43315:19;;43210:49;;43289:133;;;43315:38;;-1:-1:-1;;;;;43315:38:0;;;;:::i;:::-;-1:-1:-1;;;;;43289:133:0;;;;;43402:8;-1:-1:-1;;;;;43368:43:0;:11;:24;;;:43;;;;:::i;:::-;-1:-1:-1;;;;;43289:133:0;;;;;;-1:-1:-1;;;;;43270:16:0;;;;;;;:12;:16;;;;;;;;:152;;;;;;;;-1:-1:-1;;;43270:152:0;;;;;;;;;;;;43461:43;;;;;;;;;;-1:-1:-1;;;;;43487:15:0;43461:43;;;;;;;;43433:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;43433:71:0;-1:-1:-1;;;;;;43433:71:0;;;;;;;;;;;;;;;;;;43445:12;;43565:325;43589:8;43585:1;:12;43565:325;;;43624:38;;43649:12;;-1:-1:-1;;;;;43624:38:0;;;43641:1;;43624:38;;43641:1;;43624:38;43703:59;43734:1;43738:2;43742:12;43756:5;43703:22;:59::i;:::-;43677:172;;;;-1:-1:-1;;;43677:172:0;;;;;;;:::i;:::-;43864:14;;;;:::i;:::-;;;;43599:3;;;;;:::i;:::-;;;;43565:325;;;-1:-1:-1;43902:12:0;:27;;;43940:60;38303:355;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:367::-;255:8;265:6;319:3;312:4;304:6;300:17;296:27;286:55;;337:1;334;327:12;286:55;-1:-1:-1;360:20:1;;-1:-1:-1;;;;;392:30:1;;389:50;;;435:1;432;425:12;389:50;472:4;464:6;460:17;448:29;;532:3;525:4;515:6;512:1;508:14;500:6;496:27;492:38;489:47;486:67;;;549:1;546;539:12;486:67;192:367;;;;;:::o;564:160::-;629:20;;685:13;;678:21;668:32;;658:60;;714:1;711;704:12;729:171;796:20;;-1:-1:-1;;;;;845:30:1;;835:41;;825:69;;890:1;887;880:12;905:186;964:6;1017:2;1005:9;996:7;992:23;988:32;985:52;;;1033:1;1030;1023:12;985:52;1056:29;1075:9;1056:29;:::i;1096:260::-;1164:6;1172;1225:2;1213:9;1204:7;1200:23;1196:32;1193:52;;;1241:1;1238;1231:12;1193:52;1264:29;1283:9;1264:29;:::i;:::-;1254:39;;1312:38;1346:2;1335:9;1331:18;1312:38;:::i;:::-;1302:48;;1096:260;;;;;:::o;1361:328::-;1438:6;1446;1454;1507:2;1495:9;1486:7;1482:23;1478:32;1475:52;;;1523:1;1520;1513:12;1475:52;1546:29;1565:9;1546:29;:::i;:::-;1536:39;;1594:38;1628:2;1617:9;1613:18;1594:38;:::i;:::-;1584:48;;1679:2;1668:9;1664:18;1651:32;1641:42;;1361:328;;;;;:::o;1694:1138::-;1789:6;1797;1805;1813;1866:3;1854:9;1845:7;1841:23;1837:33;1834:53;;;1883:1;1880;1873:12;1834:53;1906:29;1925:9;1906:29;:::i;:::-;1896:39;;1954:38;1988:2;1977:9;1973:18;1954:38;:::i;:::-;1944:48;;2039:2;2028:9;2024:18;2011:32;2001:42;;2094:2;2083:9;2079:18;2066:32;-1:-1:-1;;;;;2158:2:1;2150:6;2147:14;2144:34;;;2174:1;2171;2164:12;2144:34;2212:6;2201:9;2197:22;2187:32;;2257:7;2250:4;2246:2;2242:13;2238:27;2228:55;;2279:1;2276;2269:12;2228:55;2315:2;2302:16;2337:2;2333;2330:10;2327:36;;;2343:18;;:::i;:::-;2418:2;2412:9;2386:2;2472:13;;-1:-1:-1;;2468:22:1;;;2492:2;2464:31;2460:40;2448:53;;;2516:18;;;2536:22;;;2513:46;2510:72;;;2562:18;;:::i;:::-;2602:10;2598:2;2591:22;2637:2;2629:6;2622:18;2677:7;2672:2;2667;2663;2659:11;2655:20;2652:33;2649:53;;;2698:1;2695;2688:12;2649:53;2754:2;2749;2745;2741:11;2736:2;2728:6;2724:15;2711:46;2799:1;2794:2;2789;2781:6;2777:15;2773:24;2766:35;2820:6;2810:16;;;;;;;1694:1138;;;;;;;:::o;2837:254::-;2902:6;2910;2963:2;2951:9;2942:7;2938:23;2934:32;2931:52;;;2979:1;2976;2969:12;2931:52;3002:29;3021:9;3002:29;:::i;:::-;2992:39;;3050:35;3081:2;3070:9;3066:18;3050:35;:::i;3096:254::-;3164:6;3172;3225:2;3213:9;3204:7;3200:23;3196:32;3193:52;;;3241:1;3238;3231:12;3193:52;3264:29;3283:9;3264:29;:::i;:::-;3254:39;3340:2;3325:18;;;;3312:32;;-1:-1:-1;;;3096:254:1:o;3355:437::-;3441:6;3449;3502:2;3490:9;3481:7;3477:23;3473:32;3470:52;;;3518:1;3515;3508:12;3470:52;3558:9;3545:23;-1:-1:-1;;;;;3583:6:1;3580:30;3577:50;;;3623:1;3620;3613:12;3577:50;3662:70;3724:7;3715:6;3704:9;3700:22;3662:70;:::i;:::-;3751:8;;3636:96;;-1:-1:-1;3355:437:1;-1:-1:-1;;;;3355:437:1:o;3797:505::-;3892:6;3900;3908;3961:2;3949:9;3940:7;3936:23;3932:32;3929:52;;;3977:1;3974;3967:12;3929:52;4017:9;4004:23;-1:-1:-1;;;;;4042:6:1;4039:30;4036:50;;;4082:1;4079;4072:12;4036:50;4121:70;4183:7;4174:6;4163:9;4159:22;4121:70;:::i;:::-;4210:8;;4095:96;;-1:-1:-1;4292:2:1;4277:18;;;;4264:32;;3797:505;-1:-1:-1;;;;3797:505:1:o;4749:::-;4841:6;4849;4857;4910:2;4898:9;4889:7;4885:23;4881:32;4878:52;;;4926:1;4923;4916:12;4878:52;4966:9;4953:23;-1:-1:-1;;;;;4991:6:1;4988:30;4985:50;;;5031:1;5028;5021:12;4985:50;5070:70;5132:7;5123:6;5112:9;5108:22;5070:70;:::i;:::-;5159:8;;-1:-1:-1;5044:96:1;-1:-1:-1;5213:35:1;;-1:-1:-1;5244:2:1;5229:18;;5213:35;:::i;:::-;5203:45;;4749:505;;;;;:::o;5259:180::-;5318:6;5371:2;5359:9;5350:7;5346:23;5342:32;5339:52;;;5387:1;5384;5377:12;5339:52;-1:-1:-1;5410:23:1;;5259:180;-1:-1:-1;5259:180:1:o;5444:245::-;5502:6;5555:2;5543:9;5534:7;5530:23;5526:32;5523:52;;;5571:1;5568;5561:12;5523:52;5610:9;5597:23;5629:30;5653:5;5629:30;:::i;5694:249::-;5763:6;5816:2;5804:9;5795:7;5791:23;5787:32;5784:52;;;5832:1;5829;5822:12;5784:52;5864:9;5858:16;5883:30;5907:5;5883:30;:::i;5948:592::-;6019:6;6027;6080:2;6068:9;6059:7;6055:23;6051:32;6048:52;;;6096:1;6093;6086:12;6048:52;6136:9;6123:23;-1:-1:-1;;;;;6206:2:1;6198:6;6195:14;6192:34;;;6222:1;6219;6212:12;6192:34;6260:6;6249:9;6245:22;6235:32;;6305:7;6298:4;6294:2;6290:13;6286:27;6276:55;;6327:1;6324;6317:12;6276:55;6367:2;6354:16;6393:2;6385:6;6382:14;6379:34;;;6409:1;6406;6399:12;6379:34;6454:7;6449:2;6440:6;6436:2;6432:15;6428:24;6425:37;6422:57;;;6475:1;6472;6465:12;6422:57;6506:2;6498:11;;;;;6528:6;;-1:-1:-1;5948:592:1;;-1:-1:-1;;;;5948:592:1:o;6730:248::-;6798:6;6806;6859:2;6847:9;6838:7;6834:23;6830:32;6827:52;;;6875:1;6872;6865:12;6827:52;-1:-1:-1;;6898:23:1;;;6968:2;6953:18;;;6940:32;;-1:-1:-1;6730:248:1:o;6983:420::-;7057:6;7065;7073;7126:2;7114:9;7105:7;7101:23;7097:32;7094:52;;;7142:1;7139;7132:12;7094:52;7165:28;7183:9;7165:28;:::i;:::-;7155:38;;7212:37;7245:2;7234:9;7230:18;7212:37;:::i;:::-;7202:47;;7299:2;7288:9;7284:18;7271:32;7343:10;7336:5;7332:22;7325:5;7322:33;7312:61;;7369:1;7366;7359:12;7312:61;7392:5;7382:15;;;6983:420;;;;;:::o;7408:257::-;7449:3;7487:5;7481:12;7514:6;7509:3;7502:19;7530:63;7586:6;7579:4;7574:3;7570:14;7563:4;7556:5;7552:16;7530:63;:::i;:::-;7647:2;7626:15;-1:-1:-1;;7622:29:1;7613:39;;;;7654:4;7609:50;;7408:257;-1:-1:-1;;7408:257:1:o;7904:470::-;8083:3;8121:6;8115:13;8137:53;8183:6;8178:3;8171:4;8163:6;8159:17;8137:53;:::i;:::-;8253:13;;8212:16;;;;8275:57;8253:13;8212:16;8309:4;8297:17;;8275:57;:::i;:::-;8348:20;;7904:470;-1:-1:-1;;;;7904:470:1:o;8797:488::-;-1:-1:-1;;;;;9066:15:1;;;9048:34;;9118:15;;9113:2;9098:18;;9091:43;9165:2;9150:18;;9143:34;;;9213:3;9208:2;9193:18;;9186:31;;;8991:4;;9234:45;;9259:19;;9251:6;9234:45;:::i;:::-;9226:53;8797:488;-1:-1:-1;;;;;;8797:488:1:o;9290:583::-;-1:-1:-1;;;;;9507:32:1;;9489:51;;9576:2;9571;9556:18;;9549:30;;;9595:18;;9588:34;;;-1:-1:-1;;;;;;9634:31:1;;9631:51;;;9678:1;9675;9668:12;9631:51;9712:6;9709:1;9705:14;9769:6;9761;9756:2;9745:9;9741:18;9728:48;9846:1;9799:22;;9823:2;9795:31;9835:13;;;-1:-1:-1;9795:31:1;9290:583;-1:-1:-1;;;9290:583:1:o;9878:632::-;10049:2;10101:21;;;10171:13;;10074:18;;;10193:22;;;10020:4;;10049:2;10272:15;;;;10246:2;10231:18;;;10020:4;10315:169;10329:6;10326:1;10323:13;10315:169;;;10390:13;;10378:26;;10459:15;;;;10424:12;;;;10351:1;10344:9;10315:169;;;-1:-1:-1;10501:3:1;;9878:632;-1:-1:-1;;;;;;9878:632:1:o;10707:219::-;10856:2;10845:9;10838:21;10819:4;10876:44;10916:2;10905:9;10901:18;10893:6;10876:44;:::i;19319:356::-;19521:2;19503:21;;;19540:18;;;19533:30;19599:34;19594:2;19579:18;;19572:62;19666:2;19651:18;;19319:356::o;22323:415::-;22525:2;22507:21;;;22564:2;22544:18;;;22537:30;22603:34;22598:2;22583:18;;22576:62;-1:-1:-1;;;22669:2:1;22654:18;;22647:49;22728:3;22713:19;;22323:415::o;28121:253::-;28161:3;-1:-1:-1;;;;;28250:2:1;28247:1;28243:10;28280:2;28277:1;28273:10;28311:3;28307:2;28303:12;28298:3;28295:21;28292:47;;;28319:18;;:::i;28379:128::-;28419:3;28450:1;28446:6;28443:1;28440:13;28437:39;;;28456:18;;:::i;:::-;-1:-1:-1;28492:9:1;;28379:128::o;28512:120::-;28552:1;28578;28568:35;;28583:18;;:::i;:::-;-1:-1:-1;28617:9:1;;28512:120::o;28637:168::-;28677:7;28743:1;28739;28735:6;28731:14;28728:1;28725:21;28720:1;28713:9;28706:17;28702:45;28699:71;;;28750:18;;:::i;:::-;-1:-1:-1;28790:9:1;;28637:168::o;28810:246::-;28850:4;-1:-1:-1;;;;;28963:10:1;;;;28933;;28985:12;;;28982:38;;;29000:18;;:::i;:::-;29037:13;;28810:246;-1:-1:-1;;;28810:246:1:o;29061:125::-;29101:4;29129:1;29126;29123:8;29120:34;;;29134:18;;:::i;:::-;-1:-1:-1;29171:9:1;;29061:125::o;29191:258::-;29263:1;29273:113;29287:6;29284:1;29281:13;29273:113;;;29363:11;;;29357:18;29344:11;;;29337:39;29309:2;29302:10;29273:113;;;29404:6;29401:1;29398:13;29395:48;;;-1:-1:-1;;29439:1:1;29421:16;;29414:27;29191:258::o;29454:136::-;29493:3;29521:5;29511:39;;29530:18;;:::i;:::-;-1:-1:-1;;;29566:18:1;;29454:136::o;29595:380::-;29674:1;29670:12;;;;29717;;;29738:61;;29792:4;29784:6;29780:17;29770:27;;29738:61;29845:2;29837:6;29834:14;29814:18;29811:38;29808:161;;;29891:10;29886:3;29882:20;29879:1;29872:31;29926:4;29923:1;29916:15;29954:4;29951:1;29944:15;29808:161;;29595:380;;;:::o;29980:135::-;30019:3;-1:-1:-1;;30040:17:1;;30037:43;;;30060:18;;:::i;:::-;-1:-1:-1;30107:1:1;30096:13;;29980:135::o;30120:112::-;30152:1;30178;30168:35;;30183:18;;:::i;:::-;-1:-1:-1;30217:9:1;;30120:112::o;30237:127::-;30298:10;30293:3;30289:20;30286:1;30279:31;30329:4;30326:1;30319:15;30353:4;30350:1;30343:15;30369:127;30430:10;30425:3;30421:20;30418:1;30411:31;30461:4;30458:1;30451:15;30485:4;30482:1;30475:15;30501:127;30562:10;30557:3;30553:20;30550:1;30543:31;30593:4;30590:1;30583:15;30617:4;30614:1;30607:15;30633:127;30694:10;30689:3;30685:20;30682:1;30675:31;30725:4;30722:1;30715:15;30749:4;30746:1;30739:15;30765:131;-1:-1:-1;;;;;;30839:32:1;;30829:43;;30819:71;;30886:1;30883;30876:12
Swarm Source
ipfs://d6ff19a10c9bb21a29c49966cfefa2c29e553824c7c51797dfbb0e4e0102ff4b
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.