Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
NFT
Overview
Max Total Supply
5,269 KIT
Holders
1,162
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 KITLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
KitPics
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-10-09 */ // File: @openzeppelin/contracts/utils/Counters.sol pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/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) { 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 = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } // Check if the computed hash (root) is equal to the provided root return computedHash == root; } } // File: @openzeppelin/contracts/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 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 pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol 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 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 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 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 pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: 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 virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol pragma solidity ^0.8.0; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: contracts/KitPics.sol pragma solidity ^0.8.0; contract KitPics is Ownable, ERC721Enumerable, ERC721Burnable { using Counters for Counters.Counter; event Mint(address indexed owner, uint256 indexed tokenId); Counters.Counter public _tokenIdTracker; bytes32 immutable public root; uint256 public maxTokens = 5555; uint256 public constant MINT_FEE = 6 * 10**16; uint256 public constant MAX_MINT_COUNT = 25; string private _baseTokenURI = "https://kitpics.art/kits/"; bool public mintEnabled = false; // open minting in general bool public whitelistMintEnabled = false; // open minting just for whitelist bool public whitelistRemoved = false; // to be used if a while after mint there are still unclaimed whitelist slots constructor(bytes32 merkleroot, uint256 whitelistSize, uint256 _maxTokens) ERC721("KitPics", "KIT") { root = merkleroot; _tokenIdTracker._value = whitelistSize + 9; // first N are reserved for whitelist, 9 airdrops maxTokens = _maxTokens; // 5555, just input easier for testing // airdrop mints _safeMint(0x2488B49Db678a9598A232bF56a90433993F522c5, 0); // canti _safeMint(0xc32c9d183CF89f4746F000797542f46F6aa8Cd1d, 1); // grug _safeMint(0xc80824E1A48cFAc44851048B2De463784b0a42Bd, 2); // panckaes _safeMint(0x8794d984e0AB8A967347290D931baEFba450075a, 3); // big d _safeMint(0x6240CD386f5b47C793F321327c3dc6C7856b25A0, 4); // smylbot _safeMint(0x24c306eaF8631F783d83CF837967b31c100B8358, 5); // hux _safeMint(0x92e9b91AA2171694d740E7066F787739CA1Af9De, 6); // ti _safeMint(0x12918F13ce746dA4Cf486B907a93CfFAdbbF9A96, 7); // ippo _safeMint(0x85B6594d35a12e534e8346a1A9087BCb26b622Ed, 8); // pete } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setBaseURI(string memory baseURI) public onlyOwner { _baseTokenURI = baseURI; } function mint(uint256 _count) public payable { uint256 nextId = _tokenIdTracker.current(); require(_count <= MAX_MINT_COUNT, "Cannot mint more than max per transaction"); require(nextId + _count <= maxTokens, "Supply limit reached"); require(msg.value >= MINT_FEE * _count, "Price not met"); require(mintEnabled, "Mint must be enabled"); for (uint256 i = 0; i < _count; i++) { _mintSingle(); } } function _mintSingle() private { uint256 nextId = _tokenIdTracker.current(); _safeMint(msg.sender, nextId); emit Mint(msg.sender, nextId); _tokenIdTracker.increment(); } function whitelistMint(address account, uint256 tokenId, bytes32[] calldata proof) public payable { require(whitelistMintEnabled, "Whitelist mint must be enabled"); if (!whitelistRemoved) { require(_verify(_leaf(account, tokenId), proof), "Invalid merkle proof"); } require(msg.value >= MINT_FEE, "Price not met"); _safeMint(account, tokenId); emit Mint(account, tokenId); } function _leaf(address account, uint256 tokenId) internal pure returns (bytes32) { return keccak256(abi.encodePacked(tokenId, account)); } function _verify(bytes32 leaf, bytes32[] memory proof) internal view returns (bool) { return MerkleProof.verify(proof, root, leaf); } function withdraw() public onlyOwner { (bool success, ) = owner().call{value: address(this).balance}(""); require(success, "Transfer failed."); } function toggleMint() public onlyOwner { mintEnabled = !mintEnabled; } function toggleWhitelistMint() public onlyOwner { whitelistMintEnabled = !whitelistMintEnabled; } function toggleWhitelistRemoved() public onlyOwner { whitelistRemoved = !whitelistRemoved; } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"bytes32","name":"merkleroot","type":"bytes32"},{"internalType":"uint256","name":"whitelistSize","type":"uint256"},{"internalType":"uint256","name":"_maxTokens","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":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_MINT_COUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokenIdTracker","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","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":[],"name":"toggleMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWhitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWhitelistRemoved","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistRemoved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6115b3600c5560e0604052601960a08190527f68747470733a2f2f6b6974706963732e6172742f6b6974732f0000000000000060c09081526200004691600d919062000943565b50600e805462ffffff191690553480156200006057600080fd5b50604051620031f8380380620031f88339810160408190526200008391620009e9565b604051806040016040528060078152602001664b69745069637360c81b8152506040518060400160405280600381526020016212d25560ea1b815250620000d9620000d36200025360201b60201c565b62000257565b8151620000ee90600190602085019062000943565b5080516200010490600290602084019062000943565b50505060808390526200011982600962000ac6565b600b55600c81905562000142732488b49db678a9598a232bf56a90433993f522c56000620002a7565b6200016373c32c9d183cf89f4746f000797542f46f6aa8cd1d6001620002a7565b6200018473c80824e1a48cfac44851048b2de463784b0a42bd6002620002a7565b620001a5738794d984e0ab8a967347290d931baefba450075a6003620002a7565b620001c6736240cd386f5b47c793f321327c3dc6c7856b25a06004620002a7565b620001e77324c306eaf8631f783d83cf837967b31c100b83586005620002a7565b620002087392e9b91aa2171694d740e7066f787739ca1af9de6006620002a7565b620002297312918f13ce746da4cf486b907a93cffadbbf9a966007620002a7565b6200024a7385b6594d35a12e534e8346a1a9087bcb26b622ed6008620002a7565b50505062000b7a565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620002c9828260405180602001604052806000815250620002cd60201b60201c565b5050565b620002d9838362000349565b620002e860008484846200049f565b620003445760405162461bcd60e51b81526020600482015260326024820152600080516020620031d883398151915260448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084015b60405180910390fd5b505050565b6001600160a01b038216620003a15760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016200033b565b6000818152600360205260409020546001600160a01b031615620004085760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016200033b565b620004166000838362000608565b6001600160a01b03821660009081526004602052604081208054600192906200044190849062000ac6565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000620004c0846001600160a01b03166200062060201b620013101760201c565b15620005fc57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290620004fa90339089908890889060040162000a4b565b602060405180830381600087803b1580156200051557600080fd5b505af192505050801562000548575060408051601f3d908101601f19168201909252620005459181019062000a18565b60015b620005e1573d80801562000579576040519150601f19603f3d011682016040523d82523d6000602084013e6200057e565b606091505b508051620005d95760405162461bcd60e51b81526020600482015260326024820152600080516020620031d883398151915260448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016200033b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905062000600565b5060015b949350505050565b620003448383836200062660201b620013161760201c565b3b151590565b6200063e8383836200034460201b6200089c1760201c565b6001600160a01b0383166200069c576200069681600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b620006c2565b816001600160a01b0316836001600160a01b031614620006c257620006c2838262000702565b6001600160a01b038216620006dc576200034481620007af565b826001600160a01b0316826001600160a01b031614620003445762000344828262000869565b600060016200071c84620008ba60201b62000e161760201c565b62000728919062000ae1565b6000838152600860205260409020549091508082146200077c576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b600954600090620007c39060019062000ae1565b6000838152600a602052604081205460098054939450909284908110620007ee57620007ee62000b64565b90600052602060002001549050806009838154811062000812576200081262000b64565b6000918252602080832090910192909255828152600a909152604080822084905585825281205560098054806200084d576200084d62000b4e565b6001900381819060005260206000200160009055905550505050565b60006200088183620008ba60201b62000e161760201c565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b60006001600160a01b038216620009275760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016200033b565b506001600160a01b031660009081526004602052604090205490565b828054620009519062000afb565b90600052602060002090601f016020900481019282620009755760008555620009c0565b82601f106200099057805160ff1916838001178555620009c0565b82800160010185558215620009c0579182015b82811115620009c0578251825591602001919060010190620009a3565b50620009ce929150620009d2565b5090565b5b80821115620009ce5760008155600101620009d3565b600080600060608486031215620009ff57600080fd5b8351925060208401519150604084015190509250925092565b60006020828403121562000a2b57600080fd5b81516001600160e01b03198116811462000a4457600080fd5b9392505050565b600060018060a01b038087168352602081871681850152856040850152608060608501528451915081608085015260005b8281101562000a9a5785810182015185820160a00152810162000a7c565b8281111562000aad57600060a084870101525b5050601f01601f19169190910160a00195945050505050565b6000821982111562000adc5762000adc62000b38565b500190565b60008282101562000af65762000af662000b38565b500390565b600181811c9082168062000b1057607f821691505b6020821081141562000b3257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60805161263b62000b9d6000396000818161060c0152611800015261263b6000f3fe6080604052600436106102045760003560e01c806370a0823111610118578063c87b56dd116100a0578063d7bf81a31161006f578063d7bf81a314610580578063e83157421461059b578063e985e9c5146105b1578063ebf0c717146105fa578063f2fde38b1461062e57600080fd5b8063c87b56dd1461051c578063cdf653061461053c578063d123973014610551578063d3dd5fe01461056b57600080fd5b806395d89b41116100e757806395d89b411461049d57806398bcede9146104b2578063a0712d68146104c9578063a22cb465146104dc578063b88d4fde146104fc57600080fd5b806370a082311461042a578063715018a61461044a5780638da5cb5b1461045f57806395d00fca1461047d57600080fd5b80633ccfd60b1161019b5780634f6ccce71161016a5780634f6ccce71461039657806355f804b3146103b65780636352211e146103d65780636caede3d146103f65780636f63b60a1461041557600080fd5b80633ccfd60b1461032e57806342842e0e1461034357806342966c68146103635780634b11faaf1461038357600080fd5b806318160ddd116101d757806318160ddd146102ba57806322aea20f146102d957806323b872dd146102ee5780632f745c591461030e57600080fd5b806301ffc9a71461020957806306fdde031461023e578063081812fc14610260578063095ea7b314610298575b600080fd5b34801561021557600080fd5b5061022961022436600461226a565b61064e565b60405190151581526020015b60405180910390f35b34801561024a57600080fd5b5061025361065f565b604051610235919061239e565b34801561026c57600080fd5b5061028061027b3660046122ed565b6106f1565b6040516001600160a01b039091168152602001610235565b3480156102a457600080fd5b506102b86102b33660046121b6565b61078b565b005b3480156102c657600080fd5b506009545b604051908152602001610235565b3480156102e557600080fd5b506102b86108a1565b3480156102fa57600080fd5b506102b86103093660046120c2565b6108ea565b34801561031a57600080fd5b506102cb6103293660046121b6565b61091c565b34801561033a57600080fd5b506102b86109b2565b34801561034f57600080fd5b506102b861035e3660046120c2565b610a75565b34801561036f57600080fd5b506102b861037e3660046122ed565b610a90565b6102b86103913660046121e0565b610b07565b3480156103a257600080fd5b506102cb6103b13660046122ed565b610c84565b3480156103c257600080fd5b506102b86103d13660046122a4565b610d17565b3480156103e257600080fd5b506102806103f13660046122ed565b610d58565b34801561040257600080fd5b50600e5461022990610100900460ff1681565b34801561042157600080fd5b506102b8610dcf565b34801561043657600080fd5b506102cb610445366004612074565b610e16565b34801561045657600080fd5b506102b8610e9d565b34801561046b57600080fd5b506000546001600160a01b0316610280565b34801561048957600080fd5b50600e546102299062010000900460ff1681565b3480156104a957600080fd5b50610253610ed3565b3480156104be57600080fd5b50600b546102cb9081565b6102b86104d73660046122ed565b610ee2565b3480156104e857600080fd5b506102b86104f736600461217a565b611062565b34801561050857600080fd5b506102b86105173660046120fe565b611127565b34801561052857600080fd5b506102536105373660046122ed565b61115f565b34801561054857600080fd5b506102cb601981565b34801561055d57600080fd5b50600e546102299060ff1681565b34801561057757600080fd5b506102b861123a565b34801561058c57600080fd5b506102cb66d529ae9e86000081565b3480156105a757600080fd5b506102cb600c5481565b3480156105bd57600080fd5b506102296105cc36600461208f565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561060657600080fd5b506102cb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561063a57600080fd5b506102b8610649366004612074565b611278565b6000610659826113ce565b92915050565b60606001805461066e90612517565b80601f016020809104026020016040519081016040528092919081815260200182805461069a90612517565b80156106e75780601f106106bc576101008083540402835291602001916106e7565b820191906000526020600020905b8154815290600101906020018083116106ca57829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b031661076f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600061079682610d58565b9050806001600160a01b0316836001600160a01b031614156108045760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610766565b336001600160a01b0382161480610820575061082081336105cc565b6108925760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610766565b61089c83836113f3565b505050565b6000546001600160a01b031633146108cb5760405162461bcd60e51b815260040161076690612403565b600e805462ff0000198116620100009182900460ff1615909102179055565b6108f5335b82611461565b6109115760405162461bcd60e51b815260040161076690612438565b61089c838383611558565b600061092783610e16565b82106109895760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610766565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b6000546001600160a01b031633146109dc5760405162461bcd60e51b815260040161076690612403565b600080546040516001600160a01b039091169047908381818185875af1925050503d8060008114610a29576040519150601f19603f3d011682016040523d82523d6000602084013e610a2e565b606091505b5050905080610a725760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610766565b50565b61089c83838360405180602001604052806000815250611127565b610a99336108ef565b610afe5760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401610766565b610a7281611703565b600e54610100900460ff16610b5e5760405162461bcd60e51b815260206004820152601e60248201527f57686974656c697374206d696e74206d75737420626520656e61626c656400006044820152606401610766565b600e5462010000900460ff16610bf757610bb4610b7b85856117aa565b8383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506117f892505050565b610bf75760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b21036b2b935b63290383937b7b360611b6044820152606401610766565b66d529ae9e860000341015610c3e5760405162461bcd60e51b815260206004820152600d60248201526c141c9a58d9481b9bdd081b595d609a1b6044820152606401610766565b610c488484611825565b60405183906001600160a01b038616907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688590600090a350505050565b6000610c8f60095490565b8210610cf25760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610766565b60098281548110610d0557610d056125c3565b90600052602060002001549050919050565b6000546001600160a01b03163314610d415760405162461bcd60e51b815260040161076690612403565b8051610d5490600d906020840190611f49565b5050565b6000818152600360205260408120546001600160a01b0316806106595760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610766565b6000546001600160a01b03163314610df95760405162461bcd60e51b815260040161076690612403565b600e805461ff001981166101009182900460ff1615909102179055565b60006001600160a01b038216610e815760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610766565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b03163314610ec75760405162461bcd60e51b815260040161076690612403565b610ed1600061183f565b565b60606002805461066e90612517565b6000610eed600b5490565b90506019821115610f525760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f74206d696e74206d6f7265207468616e206d61782070657220747260448201526830b739b0b1ba34b7b760b91b6064820152608401610766565b600c54610f5f8383612489565b1115610fa45760405162461bcd60e51b815260206004820152601460248201527314dd5c1c1b1e481b1a5b5a5d081c995858da195960621b6044820152606401610766565b610fb58266d529ae9e8600006124b5565b341015610ff45760405162461bcd60e51b815260206004820152600d60248201526c141c9a58d9481b9bdd081b595d609a1b6044820152606401610766565b600e5460ff1661103d5760405162461bcd60e51b8152602060048201526014602482015273135a5b9d081b5d5cdd08189948195b98589b195960621b6044820152606401610766565b60005b8281101561089c5761105061188f565b8061105a81612552565b915050611040565b6001600160a01b0382163314156110bb5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610766565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6111313383611461565b61114d5760405162461bcd60e51b815260040161076690612438565b611159848484846118e1565b50505050565b6000818152600360205260409020546060906001600160a01b03166111de5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610766565b60006111e8611914565b905060008151116112085760405180602001604052806000815250611233565b8061121284611923565b604051602001611223929190612332565b6040516020818303038152906040525b9392505050565b6000546001600160a01b031633146112645760405162461bcd60e51b815260040161076690612403565b600e805460ff19811660ff90911615179055565b6000546001600160a01b031633146112a25760405162461bcd60e51b815260040161076690612403565b6001600160a01b0381166113075760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610766565b610a728161183f565b3b151590565b6001600160a01b0383166113715761136c81600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b611394565b816001600160a01b0316836001600160a01b031614611394576113948382611a21565b6001600160a01b0382166113ab5761089c81611abe565b826001600160a01b0316826001600160a01b03161461089c5761089c8282611b6d565b60006001600160e01b0319821663780e9d6360e01b1480610659575061065982611bb1565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061142882610d58565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b03166114da5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610766565b60006114e583610d58565b9050806001600160a01b0316846001600160a01b031614806115205750836001600160a01b0316611515846106f1565b6001600160a01b0316145b8061155057506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661156b82610d58565b6001600160a01b0316146115d35760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610766565b6001600160a01b0382166116355760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610766565b611640838383611c01565b61164b6000826113f3565b6001600160a01b03831660009081526004602052604081208054600192906116749084906124d4565b90915550506001600160a01b03821660009081526004602052604081208054600192906116a2908490612489565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061170e82610d58565b905061171c81600084611c01565b6117276000836113f3565b6001600160a01b03811660009081526004602052604081208054600192906117509084906124d4565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600081836040516020016117da92919091825260601b6bffffffffffffffffffffffff1916602082015260340190565b60405160208183030381529060405280519060200120905092915050565b6000611233827f000000000000000000000000000000000000000000000000000000000000000085611c0c565b610d54828260405180602001604052806000815250611cbb565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600061189a600b5490565b90506118a63382611825565b604051819033907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688590600090a3610a72600b80546001019055565b6118ec848484611558565b6118f884848484611cee565b6111595760405162461bcd60e51b8152600401610766906123b1565b6060600d805461066e90612517565b6060816119475750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611971578061195b81612552565b915061196a9050600a836124a1565b915061194b565b60008167ffffffffffffffff81111561198c5761198c6125d9565b6040519080825280601f01601f1916602001820160405280156119b6576020820181803683370190505b5090505b8415611550576119cb6001836124d4565b91506119d8600a8661256d565b6119e3906030612489565b60f81b8183815181106119f8576119f86125c3565b60200101906001600160f81b031916908160001a905350611a1a600a866124a1565b94506119ba565b60006001611a2e84610e16565b611a3891906124d4565b600083815260086020526040902054909150808214611a8b576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b600954600090611ad0906001906124d4565b6000838152600a602052604081205460098054939450909284908110611af857611af86125c3565b906000526020600020015490508060098381548110611b1957611b196125c3565b6000918252602080832090910192909255828152600a90915260408082208490558582528120556009805480611b5157611b516125ad565b6001900381819060005260206000200160009055905550505050565b6000611b7883610e16565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b60006001600160e01b031982166380ac58cd60e01b1480611be257506001600160e01b03198216635b5e139f60e01b145b8061065957506301ffc9a760e01b6001600160e01b0319831614610659565b61089c838383611316565b600081815b8551811015611cb0576000868281518110611c2e57611c2e6125c3565b60200260200101519050808311611c70576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250611c9d565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080611ca881612552565b915050611c11565b509092149392505050565b611cc58383611dfb565b611cd26000848484611cee565b61089c5760405162461bcd60e51b8152600401610766906123b1565b60006001600160a01b0384163b15611df057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611d32903390899088908890600401612361565b602060405180830381600087803b158015611d4c57600080fd5b505af1925050508015611d7c575060408051601f3d908101601f19168201909252611d7991810190612287565b60015b611dd6573d808015611daa576040519150601f19603f3d011682016040523d82523d6000602084013e611daf565b606091505b508051611dce5760405162461bcd60e51b8152600401610766906123b1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611550565b506001949350505050565b6001600160a01b038216611e515760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610766565b6000818152600360205260409020546001600160a01b031615611eb65760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610766565b611ec260008383611c01565b6001600160a01b0382166000908152600460205260408120805460019290611eeb908490612489565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611f5590612517565b90600052602060002090601f016020900481019282611f775760008555611fbd565b82601f10611f9057805160ff1916838001178555611fbd565b82800160010185558215611fbd579182015b82811115611fbd578251825591602001919060010190611fa2565b50611fc9929150611fcd565b5090565b5b80821115611fc95760008155600101611fce565b600067ffffffffffffffff80841115611ffd57611ffd6125d9565b604051601f8501601f19908116603f01168101908282118183101715612025576120256125d9565b8160405280935085815286868601111561203e57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461206f57600080fd5b919050565b60006020828403121561208657600080fd5b61123382612058565b600080604083850312156120a257600080fd5b6120ab83612058565b91506120b960208401612058565b90509250929050565b6000806000606084860312156120d757600080fd5b6120e084612058565b92506120ee60208501612058565b9150604084013590509250925092565b6000806000806080858703121561211457600080fd5b61211d85612058565b935061212b60208601612058565b925060408501359150606085013567ffffffffffffffff81111561214e57600080fd5b8501601f8101871361215f57600080fd5b61216e87823560208401611fe2565b91505092959194509250565b6000806040838503121561218d57600080fd5b61219683612058565b9150602083013580151581146121ab57600080fd5b809150509250929050565b600080604083850312156121c957600080fd5b6121d283612058565b946020939093013593505050565b600080600080606085870312156121f657600080fd5b6121ff85612058565b935060208501359250604085013567ffffffffffffffff8082111561222357600080fd5b818701915087601f83011261223757600080fd5b81358181111561224657600080fd5b8860208260051b850101111561225b57600080fd5b95989497505060200194505050565b60006020828403121561227c57600080fd5b8135611233816125ef565b60006020828403121561229957600080fd5b8151611233816125ef565b6000602082840312156122b657600080fd5b813567ffffffffffffffff8111156122cd57600080fd5b8201601f810184136122de57600080fd5b61155084823560208401611fe2565b6000602082840312156122ff57600080fd5b5035919050565b6000815180845261231e8160208601602086016124eb565b601f01601f19169290920160200192915050565b600083516123448184602088016124eb565b8351908301906123588183602088016124eb565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061239490830184612306565b9695505050505050565b6020815260006112336020830184612306565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561249c5761249c612581565b500190565b6000826124b0576124b0612597565b500490565b60008160001904831182151516156124cf576124cf612581565b500290565b6000828210156124e6576124e6612581565b500390565b60005b838110156125065781810151838201526020016124ee565b838111156111595750506000910152565b600181811c9082168061252b57607f821691505b6020821081141561254c57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561256657612566612581565b5060010190565b60008261257c5761257c612597565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610a7257600080fdfea2646970667358221220e03932bffeb1ab7f734fdef5c078b1c2ccbc54762c704b693061089c00b8f66d64736f6c634300080700334552433732313a207472616e7366657220746f206e6f6e2045524337323152657e16e941334f9f727e3aec9982ba3feffa7a217dbd22071bfe1bfba099be780100000000000000000000000000000000000000000000000000000000000001d600000000000000000000000000000000000000000000000000000000000015b3
Deployed Bytecode
0x6080604052600436106102045760003560e01c806370a0823111610118578063c87b56dd116100a0578063d7bf81a31161006f578063d7bf81a314610580578063e83157421461059b578063e985e9c5146105b1578063ebf0c717146105fa578063f2fde38b1461062e57600080fd5b8063c87b56dd1461051c578063cdf653061461053c578063d123973014610551578063d3dd5fe01461056b57600080fd5b806395d89b41116100e757806395d89b411461049d57806398bcede9146104b2578063a0712d68146104c9578063a22cb465146104dc578063b88d4fde146104fc57600080fd5b806370a082311461042a578063715018a61461044a5780638da5cb5b1461045f57806395d00fca1461047d57600080fd5b80633ccfd60b1161019b5780634f6ccce71161016a5780634f6ccce71461039657806355f804b3146103b65780636352211e146103d65780636caede3d146103f65780636f63b60a1461041557600080fd5b80633ccfd60b1461032e57806342842e0e1461034357806342966c68146103635780634b11faaf1461038357600080fd5b806318160ddd116101d757806318160ddd146102ba57806322aea20f146102d957806323b872dd146102ee5780632f745c591461030e57600080fd5b806301ffc9a71461020957806306fdde031461023e578063081812fc14610260578063095ea7b314610298575b600080fd5b34801561021557600080fd5b5061022961022436600461226a565b61064e565b60405190151581526020015b60405180910390f35b34801561024a57600080fd5b5061025361065f565b604051610235919061239e565b34801561026c57600080fd5b5061028061027b3660046122ed565b6106f1565b6040516001600160a01b039091168152602001610235565b3480156102a457600080fd5b506102b86102b33660046121b6565b61078b565b005b3480156102c657600080fd5b506009545b604051908152602001610235565b3480156102e557600080fd5b506102b86108a1565b3480156102fa57600080fd5b506102b86103093660046120c2565b6108ea565b34801561031a57600080fd5b506102cb6103293660046121b6565b61091c565b34801561033a57600080fd5b506102b86109b2565b34801561034f57600080fd5b506102b861035e3660046120c2565b610a75565b34801561036f57600080fd5b506102b861037e3660046122ed565b610a90565b6102b86103913660046121e0565b610b07565b3480156103a257600080fd5b506102cb6103b13660046122ed565b610c84565b3480156103c257600080fd5b506102b86103d13660046122a4565b610d17565b3480156103e257600080fd5b506102806103f13660046122ed565b610d58565b34801561040257600080fd5b50600e5461022990610100900460ff1681565b34801561042157600080fd5b506102b8610dcf565b34801561043657600080fd5b506102cb610445366004612074565b610e16565b34801561045657600080fd5b506102b8610e9d565b34801561046b57600080fd5b506000546001600160a01b0316610280565b34801561048957600080fd5b50600e546102299062010000900460ff1681565b3480156104a957600080fd5b50610253610ed3565b3480156104be57600080fd5b50600b546102cb9081565b6102b86104d73660046122ed565b610ee2565b3480156104e857600080fd5b506102b86104f736600461217a565b611062565b34801561050857600080fd5b506102b86105173660046120fe565b611127565b34801561052857600080fd5b506102536105373660046122ed565b61115f565b34801561054857600080fd5b506102cb601981565b34801561055d57600080fd5b50600e546102299060ff1681565b34801561057757600080fd5b506102b861123a565b34801561058c57600080fd5b506102cb66d529ae9e86000081565b3480156105a757600080fd5b506102cb600c5481565b3480156105bd57600080fd5b506102296105cc36600461208f565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561060657600080fd5b506102cb7f7e16e941334f9f727e3aec9982ba3feffa7a217dbd22071bfe1bfba099be780181565b34801561063a57600080fd5b506102b8610649366004612074565b611278565b6000610659826113ce565b92915050565b60606001805461066e90612517565b80601f016020809104026020016040519081016040528092919081815260200182805461069a90612517565b80156106e75780601f106106bc576101008083540402835291602001916106e7565b820191906000526020600020905b8154815290600101906020018083116106ca57829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b031661076f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600061079682610d58565b9050806001600160a01b0316836001600160a01b031614156108045760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610766565b336001600160a01b0382161480610820575061082081336105cc565b6108925760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610766565b61089c83836113f3565b505050565b6000546001600160a01b031633146108cb5760405162461bcd60e51b815260040161076690612403565b600e805462ff0000198116620100009182900460ff1615909102179055565b6108f5335b82611461565b6109115760405162461bcd60e51b815260040161076690612438565b61089c838383611558565b600061092783610e16565b82106109895760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610766565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b6000546001600160a01b031633146109dc5760405162461bcd60e51b815260040161076690612403565b600080546040516001600160a01b039091169047908381818185875af1925050503d8060008114610a29576040519150601f19603f3d011682016040523d82523d6000602084013e610a2e565b606091505b5050905080610a725760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610766565b50565b61089c83838360405180602001604052806000815250611127565b610a99336108ef565b610afe5760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401610766565b610a7281611703565b600e54610100900460ff16610b5e5760405162461bcd60e51b815260206004820152601e60248201527f57686974656c697374206d696e74206d75737420626520656e61626c656400006044820152606401610766565b600e5462010000900460ff16610bf757610bb4610b7b85856117aa565b8383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506117f892505050565b610bf75760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b21036b2b935b63290383937b7b360611b6044820152606401610766565b66d529ae9e860000341015610c3e5760405162461bcd60e51b815260206004820152600d60248201526c141c9a58d9481b9bdd081b595d609a1b6044820152606401610766565b610c488484611825565b60405183906001600160a01b038616907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688590600090a350505050565b6000610c8f60095490565b8210610cf25760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610766565b60098281548110610d0557610d056125c3565b90600052602060002001549050919050565b6000546001600160a01b03163314610d415760405162461bcd60e51b815260040161076690612403565b8051610d5490600d906020840190611f49565b5050565b6000818152600360205260408120546001600160a01b0316806106595760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610766565b6000546001600160a01b03163314610df95760405162461bcd60e51b815260040161076690612403565b600e805461ff001981166101009182900460ff1615909102179055565b60006001600160a01b038216610e815760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610766565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b03163314610ec75760405162461bcd60e51b815260040161076690612403565b610ed1600061183f565b565b60606002805461066e90612517565b6000610eed600b5490565b90506019821115610f525760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f74206d696e74206d6f7265207468616e206d61782070657220747260448201526830b739b0b1ba34b7b760b91b6064820152608401610766565b600c54610f5f8383612489565b1115610fa45760405162461bcd60e51b815260206004820152601460248201527314dd5c1c1b1e481b1a5b5a5d081c995858da195960621b6044820152606401610766565b610fb58266d529ae9e8600006124b5565b341015610ff45760405162461bcd60e51b815260206004820152600d60248201526c141c9a58d9481b9bdd081b595d609a1b6044820152606401610766565b600e5460ff1661103d5760405162461bcd60e51b8152602060048201526014602482015273135a5b9d081b5d5cdd08189948195b98589b195960621b6044820152606401610766565b60005b8281101561089c5761105061188f565b8061105a81612552565b915050611040565b6001600160a01b0382163314156110bb5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610766565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6111313383611461565b61114d5760405162461bcd60e51b815260040161076690612438565b611159848484846118e1565b50505050565b6000818152600360205260409020546060906001600160a01b03166111de5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610766565b60006111e8611914565b905060008151116112085760405180602001604052806000815250611233565b8061121284611923565b604051602001611223929190612332565b6040516020818303038152906040525b9392505050565b6000546001600160a01b031633146112645760405162461bcd60e51b815260040161076690612403565b600e805460ff19811660ff90911615179055565b6000546001600160a01b031633146112a25760405162461bcd60e51b815260040161076690612403565b6001600160a01b0381166113075760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610766565b610a728161183f565b3b151590565b6001600160a01b0383166113715761136c81600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b611394565b816001600160a01b0316836001600160a01b031614611394576113948382611a21565b6001600160a01b0382166113ab5761089c81611abe565b826001600160a01b0316826001600160a01b03161461089c5761089c8282611b6d565b60006001600160e01b0319821663780e9d6360e01b1480610659575061065982611bb1565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061142882610d58565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b03166114da5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610766565b60006114e583610d58565b9050806001600160a01b0316846001600160a01b031614806115205750836001600160a01b0316611515846106f1565b6001600160a01b0316145b8061155057506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661156b82610d58565b6001600160a01b0316146115d35760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610766565b6001600160a01b0382166116355760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610766565b611640838383611c01565b61164b6000826113f3565b6001600160a01b03831660009081526004602052604081208054600192906116749084906124d4565b90915550506001600160a01b03821660009081526004602052604081208054600192906116a2908490612489565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061170e82610d58565b905061171c81600084611c01565b6117276000836113f3565b6001600160a01b03811660009081526004602052604081208054600192906117509084906124d4565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600081836040516020016117da92919091825260601b6bffffffffffffffffffffffff1916602082015260340190565b60405160208183030381529060405280519060200120905092915050565b6000611233827f7e16e941334f9f727e3aec9982ba3feffa7a217dbd22071bfe1bfba099be780185611c0c565b610d54828260405180602001604052806000815250611cbb565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600061189a600b5490565b90506118a63382611825565b604051819033907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688590600090a3610a72600b80546001019055565b6118ec848484611558565b6118f884848484611cee565b6111595760405162461bcd60e51b8152600401610766906123b1565b6060600d805461066e90612517565b6060816119475750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611971578061195b81612552565b915061196a9050600a836124a1565b915061194b565b60008167ffffffffffffffff81111561198c5761198c6125d9565b6040519080825280601f01601f1916602001820160405280156119b6576020820181803683370190505b5090505b8415611550576119cb6001836124d4565b91506119d8600a8661256d565b6119e3906030612489565b60f81b8183815181106119f8576119f86125c3565b60200101906001600160f81b031916908160001a905350611a1a600a866124a1565b94506119ba565b60006001611a2e84610e16565b611a3891906124d4565b600083815260086020526040902054909150808214611a8b576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b600954600090611ad0906001906124d4565b6000838152600a602052604081205460098054939450909284908110611af857611af86125c3565b906000526020600020015490508060098381548110611b1957611b196125c3565b6000918252602080832090910192909255828152600a90915260408082208490558582528120556009805480611b5157611b516125ad565b6001900381819060005260206000200160009055905550505050565b6000611b7883610e16565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b60006001600160e01b031982166380ac58cd60e01b1480611be257506001600160e01b03198216635b5e139f60e01b145b8061065957506301ffc9a760e01b6001600160e01b0319831614610659565b61089c838383611316565b600081815b8551811015611cb0576000868281518110611c2e57611c2e6125c3565b60200260200101519050808311611c70576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250611c9d565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080611ca881612552565b915050611c11565b509092149392505050565b611cc58383611dfb565b611cd26000848484611cee565b61089c5760405162461bcd60e51b8152600401610766906123b1565b60006001600160a01b0384163b15611df057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611d32903390899088908890600401612361565b602060405180830381600087803b158015611d4c57600080fd5b505af1925050508015611d7c575060408051601f3d908101601f19168201909252611d7991810190612287565b60015b611dd6573d808015611daa576040519150601f19603f3d011682016040523d82523d6000602084013e611daf565b606091505b508051611dce5760405162461bcd60e51b8152600401610766906123b1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611550565b506001949350505050565b6001600160a01b038216611e515760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610766565b6000818152600360205260409020546001600160a01b031615611eb65760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610766565b611ec260008383611c01565b6001600160a01b0382166000908152600460205260408120805460019290611eeb908490612489565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611f5590612517565b90600052602060002090601f016020900481019282611f775760008555611fbd565b82601f10611f9057805160ff1916838001178555611fbd565b82800160010185558215611fbd579182015b82811115611fbd578251825591602001919060010190611fa2565b50611fc9929150611fcd565b5090565b5b80821115611fc95760008155600101611fce565b600067ffffffffffffffff80841115611ffd57611ffd6125d9565b604051601f8501601f19908116603f01168101908282118183101715612025576120256125d9565b8160405280935085815286868601111561203e57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461206f57600080fd5b919050565b60006020828403121561208657600080fd5b61123382612058565b600080604083850312156120a257600080fd5b6120ab83612058565b91506120b960208401612058565b90509250929050565b6000806000606084860312156120d757600080fd5b6120e084612058565b92506120ee60208501612058565b9150604084013590509250925092565b6000806000806080858703121561211457600080fd5b61211d85612058565b935061212b60208601612058565b925060408501359150606085013567ffffffffffffffff81111561214e57600080fd5b8501601f8101871361215f57600080fd5b61216e87823560208401611fe2565b91505092959194509250565b6000806040838503121561218d57600080fd5b61219683612058565b9150602083013580151581146121ab57600080fd5b809150509250929050565b600080604083850312156121c957600080fd5b6121d283612058565b946020939093013593505050565b600080600080606085870312156121f657600080fd5b6121ff85612058565b935060208501359250604085013567ffffffffffffffff8082111561222357600080fd5b818701915087601f83011261223757600080fd5b81358181111561224657600080fd5b8860208260051b850101111561225b57600080fd5b95989497505060200194505050565b60006020828403121561227c57600080fd5b8135611233816125ef565b60006020828403121561229957600080fd5b8151611233816125ef565b6000602082840312156122b657600080fd5b813567ffffffffffffffff8111156122cd57600080fd5b8201601f810184136122de57600080fd5b61155084823560208401611fe2565b6000602082840312156122ff57600080fd5b5035919050565b6000815180845261231e8160208601602086016124eb565b601f01601f19169290920160200192915050565b600083516123448184602088016124eb565b8351908301906123588183602088016124eb565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061239490830184612306565b9695505050505050565b6020815260006112336020830184612306565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561249c5761249c612581565b500190565b6000826124b0576124b0612597565b500490565b60008160001904831182151516156124cf576124cf612581565b500290565b6000828210156124e6576124e6612581565b500390565b60005b838110156125065781810151838201526020016124ee565b838111156111595750506000910152565b600181811c9082168061252b57607f821691505b6020821081141561254c57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561256657612566612581565b5060010190565b60008261257c5761257c612597565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610a7257600080fdfea2646970667358221220e03932bffeb1ab7f734fdef5c078b1c2ccbc54762c704b693061089c00b8f66d64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
7e16e941334f9f727e3aec9982ba3feffa7a217dbd22071bfe1bfba099be780100000000000000000000000000000000000000000000000000000000000001d600000000000000000000000000000000000000000000000000000000000015b3
-----Decoded View---------------
Arg [0] : merkleroot (bytes32): 0x7e16e941334f9f727e3aec9982ba3feffa7a217dbd22071bfe1bfba099be7801
Arg [1] : whitelistSize (uint256): 470
Arg [2] : _maxTokens (uint256): 5555
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 7e16e941334f9f727e3aec9982ba3feffa7a217dbd22071bfe1bfba099be7801
Arg [1] : 00000000000000000000000000000000000000000000000000000000000001d6
Arg [2] : 00000000000000000000000000000000000000000000000000000000000015b3
Deployed Bytecode Sourcemap
46983:4356:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51157:179;;;;;;;;;;-1:-1:-1;51157:179:0;;;;;:::i;:::-;;:::i;:::-;;;7169:14:1;;7162:22;7144:41;;7132:2;7117:18;51157:179:0;;;;;;;;27943:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29502:221::-;;;;;;;;;;-1:-1:-1;29502:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6467:32:1;;;6449:51;;6437:2;6422:18;29502:221:0;6303:203:1;29025:411:0;;;;;;;;;;-1:-1:-1;29025:411:0;;;;;:::i;:::-;;:::i;:::-;;41400:113;;;;;;;;;;-1:-1:-1;41488:10:0;:17;41400:113;;;7342:25:1;;;7330:2;7315:18;41400:113:0;7196:177:1;50846:106:0;;;;;;;;;;;;;:::i;30392:339::-;;;;;;;;;;-1:-1:-1;30392:339:0;;;;;:::i;:::-;;:::i;41068:256::-;;;;;;;;;;-1:-1:-1;41068:256:0;;;;;:::i;:::-;;:::i;50459:168::-;;;;;;;;;;;;;:::i;30802:185::-;;;;;;;;;;-1:-1:-1;30802:185:0;;;;;:::i;:::-;;:::i;39578:245::-;;;;;;;;;;-1:-1:-1;39578:245:0;;;;;:::i;:::-;;:::i;49690:446::-;;;;;;:::i;:::-;;:::i;41590:233::-;;;;;;;;;;-1:-1:-1;41590:233:0;;;;;:::i;:::-;;:::i;48876:102::-;;;;;;;;;;-1:-1:-1;48876:102:0;;;;;:::i;:::-;;:::i;27637:239::-;;;;;;;;;;-1:-1:-1;27637:239:0;;;;;:::i;:::-;;:::i;47521:40::-;;;;;;;;;;-1:-1:-1;47521:40:0;;;;;;;;;;;50727:111;;;;;;;;;;;;;:::i;27367:208::-;;;;;;;;;;-1:-1:-1;27367:208:0;;;;;:::i;:::-;;:::i;7642:94::-;;;;;;;;;;;;;:::i;6991:87::-;;;;;;;;;;-1:-1:-1;7037:7:0;7064:6;-1:-1:-1;;;;;7064:6:0;6991:87;;47603:36;;;;;;;;;;-1:-1:-1;47603:36:0;;;;;;;;;;;28112:104;;;;;;;;;;;;;:::i;47163:39::-;;;;;;;;;;-1:-1:-1;47163:39:0;;;;;;48986:478;;;;;;:::i;:::-;;:::i;29795:295::-;;;;;;;;;;-1:-1:-1;29795:295:0;;;;;:::i;:::-;;:::i;31058:328::-;;;;;;;;;;-1:-1:-1;31058:328:0;;;;;:::i;:::-;;:::i;28287:334::-;;;;;;;;;;-1:-1:-1;28287:334:0;;;;;:::i;:::-;;:::i;47339:43::-;;;;;;;;;;;;47380:2;47339:43;;47456:31;;;;;;;;;;-1:-1:-1;47456:31:0;;;;;;;;50635:84;;;;;;;;;;;;;:::i;47287:45::-;;;;;;;;;;;;47322:10;47287:45;;47249:31;;;;;;;;;;;;;;;;30161:164;;;;;;;;;;-1:-1:-1;30161:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;30282:25:0;;;30258:4;30282:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;30161:164;47211:29;;;;;;;;;;;;;;;7891:192;;;;;;;;;;-1:-1:-1;7891:192:0;;;;;:::i;:::-;;:::i;51157:179::-;51268:4;51292:36;51316:11;51292:23;:36::i;:::-;51285:43;51157:179;-1:-1:-1;;51157:179:0:o;27943:100::-;27997:13;28030:5;28023:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27943:100;:::o;29502:221::-;29578:7;32985:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32985:16:0;29598:73;;;;-1:-1:-1;;;29598:73:0;;12588:2:1;29598:73:0;;;12570:21:1;12627:2;12607:18;;;12600:30;12666:34;12646:18;;;12639:62;-1:-1:-1;;;12717:18:1;;;12710:42;12769:19;;29598:73:0;;;;;;;;;-1:-1:-1;29691:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;29691:24:0;;29502:221::o;29025:411::-;29106:13;29122:23;29137:7;29122:14;:23::i;:::-;29106:39;;29170:5;-1:-1:-1;;;;;29164:11:0;:2;-1:-1:-1;;;;;29164:11:0;;;29156:57;;;;-1:-1:-1;;;29156:57:0;;15238:2:1;29156:57:0;;;15220:21:1;15277:2;15257:18;;;15250:30;15316:34;15296:18;;;15289:62;-1:-1:-1;;;15367:18:1;;;15360:31;15408:19;;29156:57:0;15036:397:1;29156:57:0;5859:10;-1:-1:-1;;;;;29248:21:0;;;;:62;;-1:-1:-1;29273:37:0;29290:5;5859:10;30161:164;:::i;29273:37::-;29226:168;;;;-1:-1:-1;;;29226:168:0;;10981:2:1;29226:168:0;;;10963:21:1;11020:2;11000:18;;;10993:30;11059:34;11039:18;;;11032:62;11130:26;11110:18;;;11103:54;11174:19;;29226:168:0;10779:420:1;29226:168:0;29407:21;29416:2;29420:7;29407:8;:21::i;:::-;29095:341;29025:411;;:::o;50846:106::-;7037:7;7064:6;-1:-1:-1;;;;;7064:6:0;5859:10;7211:23;7203:68;;;;-1:-1:-1;;;7203:68:0;;;;;;;:::i;:::-;50928:16:::1;::::0;;-1:-1:-1;;50908:36:0;::::1;50928:16:::0;;;;::::1;;;50927:17;50908:36:::0;;::::1;;::::0;;50846:106::o;30392:339::-;30587:41;5859:10;30606:12;30620:7;30587:18;:41::i;:::-;30579:103;;;;-1:-1:-1;;;30579:103:0;;;;;;;:::i;:::-;30695:28;30705:4;30711:2;30715:7;30695:9;:28::i;41068:256::-;41165:7;41201:23;41218:5;41201:16;:23::i;:::-;41193:5;:31;41185:87;;;;-1:-1:-1;;;41185:87:0;;7804:2:1;41185:87:0;;;7786:21:1;7843:2;7823:18;;;7816:30;7882:34;7862:18;;;7855:62;-1:-1:-1;;;7933:18:1;;;7926:41;7984:19;;41185:87:0;7602:407:1;41185:87:0;-1:-1:-1;;;;;;41290:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;41068:256::o;50459:168::-;7037:7;7064:6;-1:-1:-1;;;;;7064:6:0;5859:10;7211:23;7203:68;;;;-1:-1:-1;;;7203:68:0;;;;;;;:::i;:::-;50508:12:::1;7064:6:::0;;50526:46:::1;::::0;-1:-1:-1;;;;;7064:6:0;;;;50546:21:::1;::::0;50508:12;50526:46;50508:12;50526:46;50546:21;7064:6;50526:46:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50507:65;;;50591:7;50583:36;;;::::0;-1:-1:-1;;;50583:36:0;;15640:2:1;50583:36:0::1;::::0;::::1;15622:21:1::0;15679:2;15659:18;;;15652:30;-1:-1:-1;;;15698:18:1;;;15691:46;15754:18;;50583:36:0::1;15438:340:1::0;50583:36:0::1;50496:131;50459:168::o:0;30802:185::-;30940:39;30957:4;30963:2;30967:7;30940:39;;;;;;;;;;;;:16;:39::i;39578:245::-;39696:41;5859:10;39715:12;5779:98;39696:41;39688:102;;;;-1:-1:-1;;;39688:102:0;;17165:2:1;39688:102:0;;;17147:21:1;17204:2;17184:18;;;17177:30;17243:34;17223:18;;;17216:62;-1:-1:-1;;;17294:18:1;;;17287:46;17350:19;;39688:102:0;16963:412:1;39688:102:0;39801:14;39807:7;39801:5;:14::i;49690:446::-;49807:20;;;;;;;49799:63;;;;-1:-1:-1;;;49799:63:0;;14879:2:1;49799:63:0;;;14861:21:1;14918:2;14898:18;;;14891:30;14957:32;14937:18;;;14930:60;15007:18;;49799:63:0;14677:354:1;49799:63:0;49878:16;;;;;;;49873:122;;49919:39;49927:23;49933:7;49942;49927:5;:23::i;:::-;49952:5;;49919:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49919:7:0;;-1:-1:-1;;;49919:39:0:i;:::-;49911:72;;;;-1:-1:-1;;;49911:72:0;;13704:2:1;49911:72:0;;;13686:21:1;13743:2;13723:18;;;13716:30;-1:-1:-1;;;13762:18:1;;;13755:50;13822:18;;49911:72:0;13502:344:1;49911:72:0;47322:10;50013:9;:21;;50005:47;;;;-1:-1:-1;;;50005:47:0;;13362:2:1;50005:47:0;;;13344:21:1;13401:2;13381:18;;;13374:30;-1:-1:-1;;;13420:18:1;;;13413:43;13473:18;;50005:47:0;13160:337:1;50005:47:0;50063:27;50073:7;50082;50063:9;:27::i;:::-;50106:22;;50120:7;;-1:-1:-1;;;;;50106:22:0;;;;;;;;49690:446;;;;:::o;41590:233::-;41665:7;41701:30;41488:10;:17;;41400:113;41701:30;41693:5;:38;41685:95;;;;-1:-1:-1;;;41685:95:0;;16752:2:1;41685:95:0;;;16734:21:1;16791:2;16771:18;;;16764:30;16830:34;16810:18;;;16803:62;-1:-1:-1;;;16881:18:1;;;16874:42;16933:19;;41685:95:0;16550:408:1;41685:95:0;41798:10;41809:5;41798:17;;;;;;;;:::i;:::-;;;;;;;;;41791:24;;41590:233;;;:::o;48876:102::-;7037:7;7064:6;-1:-1:-1;;;;;7064:6:0;5859:10;7211:23;7203:68;;;;-1:-1:-1;;;7203:68:0;;;;;;;:::i;:::-;48947:23;;::::1;::::0;:13:::1;::::0;:23:::1;::::0;::::1;::::0;::::1;:::i;:::-;;48876:102:::0;:::o;27637:239::-;27709:7;27745:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27745:16:0;27780:19;27772:73;;;;-1:-1:-1;;;27772:73:0;;11817:2:1;27772:73:0;;;11799:21:1;11856:2;11836:18;;;11829:30;11895:34;11875:18;;;11868:62;-1:-1:-1;;;11946:18:1;;;11939:39;11995:19;;27772:73:0;11615:405:1;50727:111:0;7037:7;7064:6;-1:-1:-1;;;;;7064:6:0;5859:10;7211:23;7203:68;;;;-1:-1:-1;;;7203:68:0;;;;;;;:::i;:::-;50810:20:::1;::::0;;-1:-1:-1;;50786:44:0;::::1;50810:20;::::0;;;::::1;;;50809:21;50786:44:::0;;::::1;;::::0;;50727:111::o;27367:208::-;27439:7;-1:-1:-1;;;;;27467:19:0;;27459:74;;;;-1:-1:-1;;;27459:74:0;;11406:2:1;27459:74:0;;;11388:21:1;11445:2;11425:18;;;11418:30;11484:34;11464:18;;;11457:62;-1:-1:-1;;;11535:18:1;;;11528:40;11585:19;;27459:74:0;11204:406:1;27459:74:0;-1:-1:-1;;;;;;27551:16:0;;;;;:9;:16;;;;;;;27367:208::o;7642:94::-;7037:7;7064:6;-1:-1:-1;;;;;7064:6:0;5859:10;7211:23;7203:68;;;;-1:-1:-1;;;7203:68:0;;;;;;;:::i;:::-;7707:21:::1;7725:1;7707:9;:21::i;:::-;7642:94::o:0;28112:104::-;28168:13;28201:7;28194:14;;;;;:::i;48986:478::-;49042:14;49059:25;:15;909:14;;817:114;49059:25;49042:42;;47380:2;49103:6;:24;;49095:78;;;;-1:-1:-1;;;49095:78:0;;9042:2:1;49095:78:0;;;9024:21:1;9081:2;9061:18;;;9054:30;9120:34;9100:18;;;9093:62;-1:-1:-1;;;9171:18:1;;;9164:39;9220:19;;49095:78:0;8840:405:1;49095:78:0;49211:9;;49192:15;49201:6;49192;:15;:::i;:::-;:28;;49184:61;;;;-1:-1:-1;;;49184:61:0;;17582:2:1;49184:61:0;;;17564:21:1;17621:2;17601:18;;;17594:30;-1:-1:-1;;;17640:18:1;;;17633:50;17700:18;;49184:61:0;17380:344:1;49184:61:0;49277:17;49288:6;47322:10;49277:17;:::i;:::-;49264:9;:30;;49256:56;;;;-1:-1:-1;;;49256:56:0;;13362:2:1;49256:56:0;;;13344:21:1;13401:2;13381:18;;;13374:30;-1:-1:-1;;;13420:18:1;;;13413:43;13473:18;;49256:56:0;13160:337:1;49256:56:0;49331:11;;;;49323:44;;;;-1:-1:-1;;;49323:44:0;;16403:2:1;49323:44:0;;;16385:21:1;16442:2;16422:18;;;16415:30;-1:-1:-1;;;16461:18:1;;;16454:50;16521:18;;49323:44:0;16201:344:1;49323:44:0;49385:9;49380:77;49404:6;49400:1;:10;49380:77;;;49432:13;:11;:13::i;:::-;49412:3;;;;:::i;:::-;;;;49380:77;;29795:295;-1:-1:-1;;;;;29898:24:0;;5859:10;29898:24;;29890:62;;;;-1:-1:-1;;;29890:62:0;;10214:2:1;29890:62:0;;;10196:21:1;10253:2;10233:18;;;10226:30;10292:27;10272:18;;;10265:55;10337:18;;29890:62:0;10012:349:1;29890:62:0;5859:10;29965:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;29965:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;29965:53:0;;;;;;;;;;30034:48;;7144:41:1;;;29965:42:0;;5859:10;30034:48;;7117:18:1;30034:48:0;;;;;;;29795:295;;:::o;31058:328::-;31233:41;5859:10;31266:7;31233:18;:41::i;:::-;31225:103;;;;-1:-1:-1;;;31225:103:0;;;;;;;:::i;:::-;31339:39;31353:4;31359:2;31363:7;31372:5;31339:13;:39::i;:::-;31058:328;;;;:::o;28287:334::-;32961:4;32985:16;;;:7;:16;;;;;;28360:13;;-1:-1:-1;;;;;32985:16:0;28386:76;;;;-1:-1:-1;;;28386:76:0;;14463:2:1;28386:76:0;;;14445:21:1;14502:2;14482:18;;;14475:30;14541:34;14521:18;;;14514:62;-1:-1:-1;;;14592:18:1;;;14585:45;14647:19;;28386:76:0;14261:411:1;28386:76:0;28475:21;28499:10;:8;:10::i;:::-;28475:34;;28551:1;28533:7;28527:21;:25;:86;;;;;;;;;;;;;;;;;28579:7;28588:18;:7;:16;:18::i;:::-;28562:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28527:86;28520:93;28287:334;-1:-1:-1;;;28287:334:0:o;50635:84::-;7037:7;7064:6;-1:-1:-1;;;;;7064:6:0;5859:10;7211:23;7203:68;;;;-1:-1:-1;;;7203:68:0;;;;;;;:::i;:::-;50700:11:::1;::::0;;-1:-1:-1;;50685:26:0;::::1;50700:11;::::0;;::::1;50699:12;50685:26;::::0;;50635:84::o;7891:192::-;7037:7;7064:6;-1:-1:-1;;;;;7064:6:0;5859:10;7211:23;7203:68;;;;-1:-1:-1;;;7203:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7980:22:0;::::1;7972:73;;;::::0;-1:-1:-1;;;7972:73:0;;8635:2:1;7972:73:0::1;::::0;::::1;8617:21:1::0;8674:2;8654:18;;;8647:30;8713:34;8693:18;;;8686:62;-1:-1:-1;;;8764:18:1;;;8757:36;8810:19;;7972:73:0::1;8433:402:1::0;7972:73:0::1;8056:19;8066:8;8056:9;:19::i;9037:387::-:0;9360:20;9408:8;;;9037:387::o;42436:589::-;-1:-1:-1;;;;;42642:18:0;;42638:187;;42677:40;42709:7;43852:10;:17;;43825:24;;;;:15;:24;;;;;:44;;;43880:24;;;;;;;;;;;;43748:164;42677:40;42638:187;;;42747:2;-1:-1:-1;;;;;42739:10:0;:4;-1:-1:-1;;;;;42739:10:0;;42735:90;;42766:47;42799:4;42805:7;42766:32;:47::i;:::-;-1:-1:-1;;;;;42839:16:0;;42835:183;;42872:45;42909:7;42872:36;:45::i;42835:183::-;42945:4;-1:-1:-1;;;;;42939:10:0;:2;-1:-1:-1;;;;;42939:10:0;;42935:83;;42966:40;42994:2;42998:7;42966:27;:40::i;40760:224::-;40862:4;-1:-1:-1;;;;;;40886:50:0;;-1:-1:-1;;;40886:50:0;;:90;;;40940:36;40964:11;40940:23;:36::i;36878:174::-;36953:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;36953:29:0;-1:-1:-1;;;;;36953:29:0;;;;;;;;:24;;37007:23;36953:24;37007:14;:23::i;:::-;-1:-1:-1;;;;;36998:46:0;;;;;;;;;;;36878:174;;:::o;33190:348::-;33283:4;32985:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32985:16:0;33300:73;;;;-1:-1:-1;;;33300:73:0;;10568:2:1;33300:73:0;;;10550:21:1;10607:2;10587:18;;;10580:30;10646:34;10626:18;;;10619:62;-1:-1:-1;;;10697:18:1;;;10690:42;10749:19;;33300:73:0;10366:408:1;33300:73:0;33384:13;33400:23;33415:7;33400:14;:23::i;:::-;33384:39;;33453:5;-1:-1:-1;;;;;33442:16:0;:7;-1:-1:-1;;;;;33442:16:0;;:51;;;;33486:7;-1:-1:-1;;;;;33462:31:0;:20;33474:7;33462:11;:20::i;:::-;-1:-1:-1;;;;;33462:31:0;;33442:51;:87;;;-1:-1:-1;;;;;;30282:25:0;;;30258:4;30282:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;33497:32;33434:96;33190:348;-1:-1:-1;;;;33190:348:0:o;36182:578::-;36341:4;-1:-1:-1;;;;;36314:31:0;:23;36329:7;36314:14;:23::i;:::-;-1:-1:-1;;;;;36314:31:0;;36306:85;;;;-1:-1:-1;;;36306:85:0;;14053:2:1;36306:85:0;;;14035:21:1;14092:2;14072:18;;;14065:30;14131:34;14111:18;;;14104:62;-1:-1:-1;;;14182:18:1;;;14175:39;14231:19;;36306:85:0;13851:405:1;36306:85:0;-1:-1:-1;;;;;36410:16:0;;36402:65;;;;-1:-1:-1;;;36402:65:0;;9809:2:1;36402:65:0;;;9791:21:1;9848:2;9828:18;;;9821:30;9887:34;9867:18;;;9860:62;-1:-1:-1;;;9938:18:1;;;9931:34;9982:19;;36402:65:0;9607:400:1;36402:65:0;36480:39;36501:4;36507:2;36511:7;36480:20;:39::i;:::-;36584:29;36601:1;36605:7;36584:8;:29::i;:::-;-1:-1:-1;;;;;36626:15:0;;;;;;:9;:15;;;;;:20;;36645:1;;36626:15;:20;;36645:1;;36626:20;:::i;:::-;;;;-1:-1:-1;;;;;;;36657:13:0;;;;;;:9;:13;;;;;:18;;36674:1;;36657:13;:18;;36674:1;;36657:18;:::i;:::-;;;;-1:-1:-1;;36686:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;36686:21:0;-1:-1:-1;;;;;36686:21:0;;;;;;;;;36725:27;;36686:16;;36725:27;;;;;;;36182:578;;;:::o;35485:360::-;35545:13;35561:23;35576:7;35561:14;:23::i;:::-;35545:39;;35597:48;35618:5;35633:1;35637:7;35597:20;:48::i;:::-;35686:29;35703:1;35707:7;35686:8;:29::i;:::-;-1:-1:-1;;;;;35728:16:0;;;;;;:9;:16;;;;;:21;;35748:1;;35728:16;:21;;35748:1;;35728:21;:::i;:::-;;;;-1:-1:-1;;35767:16:0;;;;:7;:16;;;;;;35760:23;;-1:-1:-1;;;;;;35760:23:0;;;35801:36;35775:7;;35767:16;-1:-1:-1;;;;;35801:36:0;;;;;35767:16;;35801:36;35534:311;35485:360;:::o;50144:152::-;50216:7;50270;50279;50253:34;;;;;;;;6161:19:1;;;6218:2;6214:15;-1:-1:-1;;6210:53:1;6205:2;6196:12;;6189:75;6289:2;6280:12;;6004:294;50253:34:0;;;;;;;;;;;;;50243:45;;;;;;50236:52;;50144:152;;;;:::o;50304:147::-;50382:4;50406:37;50425:5;50432:4;50438;50406:18;:37::i;33880:110::-;33956:26;33966:2;33970:7;33956:26;;;;;;;;;;;;:9;:26::i;8091:173::-;8147:16;8166:6;;-1:-1:-1;;;;;8183:17:0;;;-1:-1:-1;;;;;;8183:17:0;;;;;;8216:40;;8166:6;;;;;;;8216:40;;8147:16;8216:40;8136:128;8091:173;:::o;49472:210::-;49514:14;49531:25;:15;909:14;;817:114;49531:25;49514:42;;49567:29;49577:10;49589:6;49567:9;:29::i;:::-;49612:24;;49629:6;;49617:10;;49612:24;;;;;49647:27;:15;1028:19;;1046:1;1028:19;;;939:127;32268:315;32425:28;32435:4;32441:2;32445:7;32425:9;:28::i;:::-;32472:48;32495:4;32501:2;32505:7;32514:5;32472:22;:48::i;:::-;32464:111;;;;-1:-1:-1;;;32464:111:0;;;;;;;:::i;48754:114::-;48814:13;48847;48840:20;;;;;:::i;3395:723::-;3451:13;3672:10;3668:53;;-1:-1:-1;;3699:10:0;;;;;;;;;;;;-1:-1:-1;;;3699:10:0;;;;;3395:723::o;3668:53::-;3746:5;3731:12;3787:78;3794:9;;3787:78;;3820:8;;;;:::i;:::-;;-1:-1:-1;3843:10:0;;-1:-1:-1;3851:2:0;3843:10;;:::i;:::-;;;3787:78;;;3875:19;3907:6;3897:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3897:17:0;;3875:39;;3925:154;3932:10;;3925:154;;3959:11;3969:1;3959:11;;:::i;:::-;;-1:-1:-1;4028:10:0;4036:2;4028:5;:10;:::i;:::-;4015:24;;:2;:24;:::i;:::-;4002:39;;3985:6;3992;3985:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;3985:56:0;;;;;;;;-1:-1:-1;4056:11:0;4065:2;4056:11;;:::i;:::-;;;3925:154;;44539:988;44805:22;44855:1;44830:22;44847:4;44830:16;:22::i;:::-;:26;;;;:::i;:::-;44867:18;44888:26;;;:17;:26;;;;;;44805:51;;-1:-1:-1;45021:28:0;;;45017:328;;-1:-1:-1;;;;;45088:18:0;;45066:19;45088:18;;;:12;:18;;;;;;;;:34;;;;;;;;;45139:30;;;;;;:44;;;45256:30;;:17;:30;;;;;:43;;;45017:328;-1:-1:-1;45441:26:0;;;;:17;:26;;;;;;;;45434:33;;;-1:-1:-1;;;;;45485:18:0;;;;;:12;:18;;;;;:34;;;;;;;45478:41;44539:988::o;45822:1079::-;46100:10;:17;46075:22;;46100:21;;46120:1;;46100:21;:::i;:::-;46132:18;46153:24;;;:15;:24;;;;;;46526:10;:26;;46075:46;;-1:-1:-1;46153:24:0;;46075:46;;46526:26;;;;;;:::i;:::-;;;;;;;;;46504:48;;46590:11;46565:10;46576;46565:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;46670:28;;;:15;:28;;;;;;;:41;;;46842:24;;;;;46835:31;46877:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;45893:1008;;;45822:1079;:::o;43326:221::-;43411:14;43428:20;43445:2;43428:16;:20::i;:::-;-1:-1:-1;;;;;43459:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;43504:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;43326:221:0:o;26998:305::-;27100:4;-1:-1:-1;;;;;;27137:40:0;;-1:-1:-1;;;27137:40:0;;:105;;-1:-1:-1;;;;;;;27194:48:0;;-1:-1:-1;;;27194:48:0;27137:105;:158;;;-1:-1:-1;;;;;;;;;;19086:40:0;;;27259:36;18977:157;50960:189;51096:45;51123:4;51129:2;51133:7;51096:26;:45::i;2247:830::-;2372:4;2412;2372;2429:525;2453:5;:12;2449:1;:16;2429:525;;;2487:20;2510:5;2516:1;2510:8;;;;;;;;:::i;:::-;;;;;;;2487:31;;2555:12;2539;:28;2535:408;;2692:44;;;;;;5224:19:1;;;5259:12;;;5252:28;;;5296:12;;2692:44:0;;;;;;;;;;;;2682:55;;;;;;2667:70;;2535:408;;;2882:44;;;;;;5224:19:1;;;5259:12;;;5252:28;;;5296:12;;2882:44:0;;;;;;;;;;;;2872:55;;;;;;2857:70;;2535:408;-1:-1:-1;2467:3:0;;;;:::i;:::-;;;;2429:525;;;-1:-1:-1;3049:20:0;;;;2247:830;-1:-1:-1;;;2247:830:0:o;34217:321::-;34347:18;34353:2;34357:7;34347:5;:18::i;:::-;34398:54;34429:1;34433:2;34437:7;34446:5;34398:22;:54::i;:::-;34376:154;;;;-1:-1:-1;;;34376:154:0;;;;;;;:::i;37617:799::-;37772:4;-1:-1:-1;;;;;37793:13:0;;9360:20;9408:8;37789:620;;37829:72;;-1:-1:-1;;;37829:72:0;;-1:-1:-1;;;;;37829:36:0;;;;;:72;;5859:10;;37880:4;;37886:7;;37895:5;;37829:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37829:72:0;;;;;;;;-1:-1:-1;;37829:72:0;;;;;;;;;;;;:::i;:::-;;;37825:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38071:13:0;;38067:272;;38114:60;;-1:-1:-1;;;38114:60:0;;;;;;;:::i;38067:272::-;38289:6;38283:13;38274:6;38270:2;38266:15;38259:38;37825:529;-1:-1:-1;;;;;;37952:51:0;-1:-1:-1;;;37952:51:0;;-1:-1:-1;37945:58:0;;37789:620;-1:-1:-1;38393:4:0;37617:799;;;;;;:::o;34874:382::-;-1:-1:-1;;;;;34954:16:0;;34946:61;;;;-1:-1:-1;;;34946:61:0;;12227:2:1;34946:61:0;;;12209:21:1;;;12246:18;;;12239:30;12305:34;12285:18;;;12278:62;12357:18;;34946:61:0;12025:356:1;34946:61:0;32961:4;32985:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32985:16:0;:30;35018:58;;;;-1:-1:-1;;;35018:58:0;;9452:2:1;35018:58:0;;;9434:21:1;9491:2;9471:18;;;9464:30;9530;9510:18;;;9503:58;9578:18;;35018:58:0;9250:352:1;35018:58:0;35089:45;35118:1;35122:2;35126:7;35089:20;:45::i;:::-;-1:-1:-1;;;;;35147:13:0;;;;;;:9;:13;;;;;:18;;35164:1;;35147:13;:18;;35164:1;;35147:18;:::i;:::-;;;;-1:-1:-1;;35176:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;35176:21:0;-1:-1:-1;;;;;35176:21:0;;;;;;;;35215:33;;35176:16;;;35215:33;;35176:16;;35215:33;34874:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:186::-;887:6;940:2;928:9;919:7;915:23;911:32;908:52;;;956:1;953;946:12;908:52;979:29;998:9;979:29;:::i;1019:260::-;1087:6;1095;1148:2;1136:9;1127:7;1123:23;1119:32;1116:52;;;1164:1;1161;1154:12;1116:52;1187:29;1206:9;1187:29;:::i;:::-;1177:39;;1235:38;1269:2;1258:9;1254:18;1235:38;:::i;:::-;1225:48;;1019:260;;;;;:::o;1284:328::-;1361:6;1369;1377;1430:2;1418:9;1409:7;1405:23;1401:32;1398:52;;;1446:1;1443;1436:12;1398:52;1469:29;1488:9;1469:29;:::i;:::-;1459:39;;1517:38;1551:2;1540:9;1536:18;1517:38;:::i;:::-;1507:48;;1602:2;1591:9;1587:18;1574:32;1564:42;;1284:328;;;;;:::o;1617:666::-;1712:6;1720;1728;1736;1789:3;1777:9;1768:7;1764:23;1760:33;1757:53;;;1806:1;1803;1796:12;1757:53;1829:29;1848:9;1829:29;:::i;:::-;1819:39;;1877:38;1911:2;1900:9;1896:18;1877:38;:::i;:::-;1867:48;;1962:2;1951:9;1947:18;1934:32;1924:42;;2017:2;2006:9;2002:18;1989:32;2044:18;2036:6;2033:30;2030:50;;;2076:1;2073;2066:12;2030:50;2099:22;;2152:4;2144:13;;2140:27;-1:-1:-1;2130:55:1;;2181:1;2178;2171:12;2130:55;2204:73;2269:7;2264:2;2251:16;2246:2;2242;2238:11;2204:73;:::i;:::-;2194:83;;;1617:666;;;;;;;:::o;2288:347::-;2353:6;2361;2414:2;2402:9;2393:7;2389:23;2385:32;2382:52;;;2430:1;2427;2420:12;2382:52;2453:29;2472:9;2453:29;:::i;:::-;2443:39;;2532:2;2521:9;2517:18;2504:32;2579:5;2572:13;2565:21;2558:5;2555:32;2545:60;;2601:1;2598;2591:12;2545:60;2624:5;2614:15;;;2288:347;;;;;:::o;2640:254::-;2708:6;2716;2769:2;2757:9;2748:7;2744:23;2740:32;2737:52;;;2785:1;2782;2775:12;2737:52;2808:29;2827:9;2808:29;:::i;:::-;2798:39;2884:2;2869:18;;;;2856:32;;-1:-1:-1;;;2640:254:1:o;2899:757::-;3003:6;3011;3019;3027;3080:2;3068:9;3059:7;3055:23;3051:32;3048:52;;;3096:1;3093;3086:12;3048:52;3119:29;3138:9;3119:29;:::i;:::-;3109:39;;3195:2;3184:9;3180:18;3167:32;3157:42;;3250:2;3239:9;3235:18;3222:32;3273:18;3314:2;3306:6;3303:14;3300:34;;;3330:1;3327;3320:12;3300:34;3368:6;3357:9;3353:22;3343:32;;3413:7;3406:4;3402:2;3398:13;3394:27;3384:55;;3435:1;3432;3425:12;3384:55;3475:2;3462:16;3501:2;3493:6;3490:14;3487:34;;;3517:1;3514;3507:12;3487:34;3570:7;3565:2;3555:6;3552:1;3548:14;3544:2;3540:23;3536:32;3533:45;3530:65;;;3591:1;3588;3581:12;3530:65;2899:757;;;;-1:-1:-1;;3622:2:1;3614:11;;-1:-1:-1;;;2899:757:1:o;3661:245::-;3719:6;3772:2;3760:9;3751:7;3747:23;3743:32;3740:52;;;3788:1;3785;3778:12;3740:52;3827:9;3814:23;3846:30;3870:5;3846:30;:::i;3911:249::-;3980:6;4033:2;4021:9;4012:7;4008:23;4004:32;4001:52;;;4049:1;4046;4039:12;4001:52;4081:9;4075:16;4100:30;4124:5;4100:30;:::i;4165:450::-;4234:6;4287:2;4275:9;4266:7;4262:23;4258:32;4255:52;;;4303:1;4300;4293:12;4255:52;4343:9;4330:23;4376:18;4368:6;4365:30;4362:50;;;4408:1;4405;4398:12;4362:50;4431:22;;4484:4;4476:13;;4472:27;-1:-1:-1;4462:55:1;;4513:1;4510;4503:12;4462:55;4536:73;4601:7;4596:2;4583:16;4578:2;4574;4570:11;4536:73;:::i;4620:180::-;4679:6;4732:2;4720:9;4711:7;4707:23;4703:32;4700:52;;;4748:1;4745;4738:12;4700:52;-1:-1:-1;4771:23:1;;4620:180;-1:-1:-1;4620:180:1:o;4805:257::-;4846:3;4884:5;4878:12;4911:6;4906:3;4899:19;4927:63;4983:6;4976:4;4971:3;4967:14;4960:4;4953:5;4949:16;4927:63;:::i;:::-;5044:2;5023:15;-1:-1:-1;;5019:29:1;5010:39;;;;5051:4;5006:50;;4805:257;-1:-1:-1;;4805:257:1:o;5319:470::-;5498:3;5536:6;5530:13;5552:53;5598:6;5593:3;5586:4;5578:6;5574:17;5552:53;:::i;:::-;5668:13;;5627:16;;;;5690:57;5668:13;5627:16;5724:4;5712:17;;5690:57;:::i;:::-;5763:20;;5319:470;-1:-1:-1;;;;5319:470:1:o;6511:488::-;-1:-1:-1;;;;;6780:15:1;;;6762:34;;6832:15;;6827:2;6812:18;;6805:43;6879:2;6864:18;;6857:34;;;6927:3;6922:2;6907:18;;6900:31;;;6705:4;;6948:45;;6973:19;;6965:6;6948:45;:::i;:::-;6940:53;6511:488;-1:-1:-1;;;;;;6511:488:1:o;7378:219::-;7527:2;7516:9;7509:21;7490:4;7547:44;7587:2;7576:9;7572:18;7564:6;7547:44;:::i;8014:414::-;8216:2;8198:21;;;8255:2;8235:18;;;8228:30;8294:34;8289:2;8274:18;;8267:62;-1:-1:-1;;;8360:2:1;8345:18;;8338:48;8418:3;8403:19;;8014:414::o;12799:356::-;13001:2;12983:21;;;13020:18;;;13013:30;13079:34;13074:2;13059:18;;13052:62;13146:2;13131:18;;12799:356::o;15783:413::-;15985:2;15967:21;;;16024:2;16004:18;;;15997:30;16063:34;16058:2;16043:18;;16036:62;-1:-1:-1;;;16129:2:1;16114:18;;16107:47;16186:3;16171:19;;15783:413::o;17911:128::-;17951:3;17982:1;17978:6;17975:1;17972:13;17969:39;;;17988:18;;:::i;:::-;-1:-1:-1;18024:9:1;;17911:128::o;18044:120::-;18084:1;18110;18100:35;;18115:18;;:::i;:::-;-1:-1:-1;18149:9:1;;18044:120::o;18169:168::-;18209:7;18275:1;18271;18267:6;18263:14;18260:1;18257:21;18252:1;18245:9;18238:17;18234:45;18231:71;;;18282:18;;:::i;:::-;-1:-1:-1;18322:9:1;;18169:168::o;18342:125::-;18382:4;18410:1;18407;18404:8;18401:34;;;18415:18;;:::i;:::-;-1:-1:-1;18452:9:1;;18342:125::o;18472:258::-;18544:1;18554:113;18568:6;18565:1;18562:13;18554:113;;;18644:11;;;18638:18;18625:11;;;18618:39;18590:2;18583:10;18554:113;;;18685:6;18682:1;18679:13;18676:48;;;-1:-1:-1;;18720:1:1;18702:16;;18695:27;18472:258::o;18735:380::-;18814:1;18810:12;;;;18857;;;18878:61;;18932:4;18924:6;18920:17;18910:27;;18878:61;18985:2;18977:6;18974:14;18954:18;18951:38;18948:161;;;19031:10;19026:3;19022:20;19019:1;19012:31;19066:4;19063:1;19056:15;19094:4;19091:1;19084:15;18948:161;;18735:380;;;:::o;19120:135::-;19159:3;-1:-1:-1;;19180:17:1;;19177:43;;;19200:18;;:::i;:::-;-1:-1:-1;19247:1:1;19236:13;;19120:135::o;19260:112::-;19292:1;19318;19308:35;;19323:18;;:::i;:::-;-1:-1:-1;19357:9:1;;19260:112::o;19377:127::-;19438:10;19433:3;19429:20;19426:1;19419:31;19469:4;19466:1;19459:15;19493:4;19490:1;19483:15;19509:127;19570:10;19565:3;19561:20;19558:1;19551:31;19601:4;19598:1;19591:15;19625:4;19622:1;19615:15;19641:127;19702:10;19697:3;19693:20;19690:1;19683:31;19733:4;19730:1;19723:15;19757:4;19754:1;19747:15;19773:127;19834:10;19829:3;19825:20;19822:1;19815:31;19865:4;19862:1;19855:15;19889:4;19886:1;19879:15;19905:127;19966:10;19961:3;19957:20;19954:1;19947:31;19997:4;19994:1;19987:15;20021:4;20018:1;20011:15;20037:131;-1:-1:-1;;;;;;20111:32:1;;20101:43;;20091:71;;20158:1;20155;20148:12
Swarm Source
ipfs://e03932bffeb1ab7f734fdef5c078b1c2ccbc54762c704b693061089c00b8f66d
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.