ERC-721
NFT
Overview
Max Total Supply
7,898 OXYA
Holders
1,478
Market
Volume (24H)
0.0548 ETH
Min Price (24H)
$60.70 @ 0.017900 ETH
Max Price (24H)
$64.43 @ 0.019000 ETH
Other Info
Token Contract
Balance
0 OXYALoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
OxyaOriginProject
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-01-06 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.4; // File @openzeppelin/contracts/utils/introspection/[email protected] /** * @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/token/ERC721/[email protected] /** * @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 whiteed 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 whiteed 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/[email protected] /** * @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/token/ERC721/extensions/[email protected] /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/utils/[email protected] /** * @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/utils/[email protected] /** * @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/utils/[email protected] /** * @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/introspection/[email protected] /** * @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/[email protected] /** * @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 whiteed 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/[email protected] /** * @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/[email protected] /** * @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 whites 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 @openzeppelin/contracts/utils/math/[email protected] // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File @openzeppelin/contracts/access/[email protected] /** * @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); } } contract OxyaOriginProject is ERC721("OxyaOriginProject", "OXYA"), ERC721Enumerable, Ownable { using SafeMath for uint256; using Strings for uint256; /* * Currently Assuming there will be one baseURI. * If it fails to upload all NFTs data under one baseURI, * we will divide baseURI and tokenURI function will be changed accordingly. */ string private baseURI; string private blindURI; uint256 public constant BUY_LIMIT_PER_TX = 2; uint256 public constant MAX_NFT_PUBLIC = 7848; uint256 private constant MAX_NFT = 7898; uint256 public NFTPrice = 300000000000000000; // 0.3 ETH bool public reveal; bool public isActive; bool public isPresaleActive; bool private giveawayMintActive = false; bytes32 public root; uint256 public constant WHITELIST_MAX_MINT = 2; mapping(address => uint256) private whiteListClaimed; mapping(address => bool) private giveawayMintClaimed; uint256 public giveawayCount; /* * Function to reveal all NFTs */ function revealNow() external onlyOwner { reveal = true; } /* * Function setIsActive to activate/desactivate the smart contract */ function setIsActive( bool _isActive ) external onlyOwner { isActive = _isActive; } /* * Function setPresaleActive to activate/desactivate the presale */ function setPresaleActive( bool _isActive ) external onlyOwner { isPresaleActive = _isActive; } /* * Function setGiveAwayActive to activate/desactivate the presale */ function setGiveAwayActive( bool _isActive ) external onlyOwner { giveawayMintActive = _isActive; } /* * Function to set Base and Blind URI */ function setURIs( string memory _blindURI, string memory _URI ) external onlyOwner { blindURI = _blindURI; baseURI = _URI; } /* * Function to withdraw collected amount during minting by the owner */ /* * Function to withdraw collected amount during minting by the owner */ function withdraw( ) public onlyOwner { address[5] memory addresses = [ 0x49Bb38D0787e62aDd4702e6B4325971Be5A29D0e, 0xC657031487a6eA048E28ca23b61963676553c966, 0x8b4f27cf1CBC9BF0C961495f9b0E485a95188c18, 0x251c0e8F312BeB3cEc41A44cae62c4d254A0aD95, 0x5d50b637532A97d1177c5507ED82aAE9a57F7BC3 ]; uint32[5] memory shares = [ uint32(2000), uint32(2000), uint32(2000), uint32(2000), uint32(2000) ]; uint256 balance = address(this).balance; for (uint32 i = 0; i < addresses.length; i++) { uint256 amount = i == addresses.length - 1 ? address(this).balance : balance * shares[i] / 10000; payable(addresses[i]).transfer(amount); } } /* * Function to mint new NFTs during the public sale * It is payable. Amount is calculated as per (NFTPrice.mul(_numOfTokens)) */ function mintNFT( uint256 _numOfTokens ) public payable { require(isActive, 'Contract is not active'); require(!isPresaleActive, 'Presale is still active'); require(_numOfTokens <= BUY_LIMIT_PER_TX, "Cannot mint above limit"); require(totalSupply().add(_numOfTokens).sub(giveawayCount) <= MAX_NFT_PUBLIC, "Purchase would exceed max public supply of NFTs"); require(NFTPrice.mul(_numOfTokens) == msg.value, "Ether value sent is not correct"); for(uint i = 0; i < _numOfTokens; i++) { _safeMint(msg.sender, totalSupply().sub(giveawayCount)); } } /* * Function to mint new NFTs during the presale * It is payable. Amount is calculated as per (NFTPrice.mul(_numOfTokens)) */ function mintNFTDuringPresale( uint256 _numOfTokens, bytes32[] memory _proof ) public payable { require(isActive, 'Sale is not active'); require(isPresaleActive, 'Whitelist is not active'); require(verify(_proof, bytes32(uint256(uint160(msg.sender)))), "Not whitelisted"); if (!giveawayMintActive){ require(totalSupply() < MAX_NFT_PUBLIC, 'All public tokens have been minted'); require(_numOfTokens <= WHITELIST_MAX_MINT, 'Cannot purchase this many tokens'); require(totalSupply().add(_numOfTokens).sub(giveawayCount) <= MAX_NFT_PUBLIC, 'Purchase would exceed max public supply of NFTs'); require(whiteListClaimed[msg.sender].add(_numOfTokens) <= WHITELIST_MAX_MINT, 'Purchase exceeds max whiteed'); require(NFTPrice.mul(_numOfTokens) == msg.value, "Ether value sent is not correct"); for (uint256 i = 0; i < _numOfTokens; i++) { whiteListClaimed[msg.sender] += 1; _safeMint(msg.sender, totalSupply().sub(giveawayCount)); } } else{ require(totalSupply() < MAX_NFT, 'All tokens have been minted'); require(_numOfTokens == 1, 'Cannot purchase this many tokens'); require(!giveawayMintClaimed[msg.sender], 'Already claimed giveaway'); giveawayMintClaimed[msg.sender] = true; _safeMint(msg.sender, totalSupply()); } } /* * Function to mint NFTs for giveaway and partnerships */ function mintByOwner( address _to, uint256 _tokenId ) public onlyOwner { require(_tokenId < MAX_NFT, "Tokens number to mint cannot exceed number of MAX tokens"); _safeMint(_to, _tokenId); } /* * Function to mint all NFTs for giveaway and partnerships */ function mintMultipleByOwner( address[] memory _to, uint256[] memory _tokenId ) public onlyOwner { require(_to.length == _tokenId.length, "Should have same length"); for(uint256 i = 0; i < _to.length; i++){ require(_tokenId[i] >= MAX_NFT_PUBLIC, "Tokens number to mint must exceed number of public tokens"); require(_tokenId[i] < MAX_NFT, "Tokens number to mint cannot exceed number of MAX tokens"); _safeMint(_to[i], _tokenId[i]); giveawayCount = giveawayCount.add(1); } } /* * Function to get token URI of given token ID * URI will be blank untill totalSupply reaches MAX_NFT_PUBLIC */ function tokenURI( uint256 _tokenId ) public view virtual override returns (string memory) { require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token"); if (!reveal) { return string(abi.encodePacked(blindURI)); } else { return string(abi.encodePacked(baseURI, _tokenId.toString())); } } function supportsInterface( bytes4 _interfaceId ) public view override (ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(_interfaceId); } // Standard functions to be overridden function _beforeTokenTransfer( address _from, address _to, uint256 _tokenId ) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(_from, _to, _tokenId); } function setRoot(uint256 _root) onlyOwner() public { root = bytes32(_root); } function verify(bytes32[] memory proof, bytes32 leaf) public view 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 = sha256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = sha256(abi.encodePacked(proofElement, computedHash)); } } // Check if the computed hash (root) is equal to the provided root return computedHash == root; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BUY_LIMIT_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NFT_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFTPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_MAX_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"giveawayCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"isPresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"mintByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[]","name":"_tokenId","type":"uint256[]"}],"name":"mintMultipleByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numOfTokens","type":"uint256"}],"name":"mintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numOfTokens","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"mintNFTDuringPresale","outputs":[],"stateMutability":"payable","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":"reveal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revealNow","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":"bool","name":"_isActive","type":"bool"}],"name":"setGiveAwayActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setPresaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_root","type":"uint256"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_blindURI","type":"string"},{"internalType":"string","name":"_URI","type":"string"}],"name":"setURIs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes32","name":"leaf","type":"bytes32"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052670429d069189e0000600d55600e805463ff000000191690553480156200002a57600080fd5b50604080518082018252601181527013de1e5853dc9a59da5b941c9bda9958dd607a1b6020808301918252835180850190945260048452634f58594160e01b90840152815191929162000080916000916200010f565b508051620000969060019060208401906200010f565b505050620000b3620000ad620000b960201b60201c565b620000bd565b620001f2565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200011d90620001b5565b90600052602060002090601f0160209004810192826200014157600085556200018c565b82601f106200015c57805160ff19168380011785556200018c565b828001600101855582156200018c579182015b828111156200018c5782518255916020019190600101906200016f565b506200019a9291506200019e565b5090565b5b808211156200019a57600081556001016200019f565b600181811c90821680620001ca57607f821691505b60208210811415620001ec57634e487b7160e01b600052602260045260246000fd5b50919050565b612fd580620002026000396000f3fe60806040526004361061023b5760003560e01c80638f76696c1161012e578063c151a5f8116100ab578063e985e9c51161006f578063e985e9c514610642578063e9be0f3f1461068b578063ebf0c717146106a1578063f2f5a7e5146106b7578063f2fde38b146106d757600080fd5b8063c151a5f8146105cc578063c87b56dd146105ec578063d1d80f301461060c578063e748e07c14610597578063e82541741461062257600080fd5b8063a22cb465116100f2578063a22cb46514610547578063a38bffda14610567578063a475b5dd1461057d578063aeb1676814610597578063b88d4fde146105ac57600080fd5b80638f76696c146104cc57806392642744146104df57806395d89b41146104f2578063972a2a62146105075780639a5b2f001461052757600080fd5b80633ccfd60b116101bc57806360d938dc1161018057806360d938dc146104395780636352211e1461045957806370a0823114610479578063715018a6146104995780638da5cb5b146104ae57600080fd5b80633ccfd60b146103af5780633f8121a2146103c457806342842e0e146103e45780634f6ccce7146104045780635f0f45b21461042457600080fd5b806322f3e2d41161020357806322f3e2d41461031057806323b872dd1461032f5780632750fc781461034f5780632f745c591461036f5780633542aee21461038f57600080fd5b806301ffc9a71461024057806306fdde0314610275578063081812fc14610297578063095ea7b3146102cf57806318160ddd146102f1575b600080fd5b34801561024c57600080fd5b5061026061025b366004612a0f565b6106f7565b60405190151581526020015b60405180910390f35b34801561028157600080fd5b5061028a610708565b60405161026c9190612c3f565b3480156102a357600080fd5b506102b76102b2366004612a9e565b61079a565b6040516001600160a01b03909116815260200161026c565b3480156102db57600080fd5b506102ef6102ea3660046128b0565b610834565b005b3480156102fd57600080fd5b506008545b60405190815260200161026c565b34801561031c57600080fd5b50600e5461026090610100900460ff1681565b34801561033b57600080fd5b506102ef61034a3660046127d3565b61094a565b34801561035b57600080fd5b506102ef61036a3660046129dd565b61097b565b34801561037b57600080fd5b5061030261038a3660046128b0565b6109bf565b34801561039b57600080fd5b506102ef6103aa3660046128b0565b610a55565b3480156103bb57600080fd5b506102ef610aae565b3480156103d057600080fd5b506102ef6103df3660046129dd565b610c8f565b3480156103f057600080fd5b506102ef6103ff3660046127d3565b610cd5565b34801561041057600080fd5b5061030261041f366004612a9e565b610cf0565b34801561043057600080fd5b506102ef610d91565b34801561044557600080fd5b50600e546102609062010000900460ff1681565b34801561046557600080fd5b506102b7610474366004612a9e565b610dca565b34801561048557600080fd5b50610302610494366004612787565b610e41565b3480156104a557600080fd5b506102ef610ec8565b3480156104ba57600080fd5b50600a546001600160a01b03166102b7565b6102ef6104da366004612ab6565b610efe565b6102ef6104ed366004612a9e565b611343565b3480156104fe57600080fd5b5061028a6114fd565b34801561051357600080fd5b5061026061052236600461299a565b61150c565b34801561053357600080fd5b506102ef6105423660046129dd565b611658565b34801561055357600080fd5b506102ef610562366004612887565b6116a0565b34801561057357600080fd5b50610302600d5481565b34801561058957600080fd5b50600e546102609060ff1681565b3480156105a357600080fd5b50610302600281565b3480156105b857600080fd5b506102ef6105c736600461280e565b611765565b3480156105d857600080fd5b506102ef6105e73660046128d9565b611797565b3480156105f857600080fd5b5061028a610607366004612a9e565b611980565b34801561061857600080fd5b50610302611ea881565b34801561062e57600080fd5b506102ef61063d366004612a47565b611a52565b34801561064e57600080fd5b5061026061065d3660046127a1565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561069757600080fd5b5061030260125481565b3480156106ad57600080fd5b50610302600f5481565b3480156106c357600080fd5b506102ef6106d2366004612a9e565b611aa3565b3480156106e357600080fd5b506102ef6106f2366004612787565b611ad2565b600061070282611b6d565b92915050565b60606000805461071790612eb9565b80601f016020809104026020016040519081016040528092919081815260200182805461074390612eb9565b80156107905780601f1061076557610100808354040283529160200191610790565b820191906000526020600020905b81548152906001019060200180831161077357829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108185760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061083f82610dca565b9050806001600160a01b0316836001600160a01b031614156108ad5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161080f565b336001600160a01b03821614806108c957506108c9813361065d565b61093b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161080f565b6109458383611b92565b505050565b6109543382611c00565b6109705760405162461bcd60e51b815260040161080f90612d85565b610945838383611cf7565b600a546001600160a01b031633146109a55760405162461bcd60e51b815260040161080f90612d01565b600e80549115156101000261ff0019909216919091179055565b60006109ca83610e41565b8210610a2c5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161080f565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610a7f5760405162461bcd60e51b815260040161080f90612d01565b611eda8110610aa05760405162461bcd60e51b815260040161080f90612ca4565b610aaa8282611ea2565b5050565b600a546001600160a01b03163314610ad85760405162461bcd60e51b815260040161080f90612d01565b6040805160a080820183527349bb38d0787e62add4702e6b4325971be5a29d0e825273c657031487a6ea048e28ca23b61963676553c966602080840191909152738b4f27cf1cbc9bf0c961495f9b0e485a95188c188385015273251c0e8f312beb3cec41a44cae62c4d254a0ad95606080850191909152735d50b637532a97d1177c5507ed82aae9a57f7bc3608080860191909152855193840186526107d0808552928401839052948301829052820181905292810192909252904760005b60058163ffffffff161015610c89576000610bb460016005612e76565b8263ffffffff1614610c0d57612710848363ffffffff1660058110610be957634e487b7160e01b600052603260045260246000fd5b6020020151610bfe9063ffffffff1685612e57565b610c089190612e43565b610c0f565b475b9050848263ffffffff1660058110610c3757634e487b7160e01b600052603260045260246000fd5b60200201516001600160a01b03166108fc829081150290604051600060405180830381858888f19350505050158015610c74573d6000803e3d6000fd5b50508080610c8190612f0f565b915050610b97565b50505050565b600a546001600160a01b03163314610cb95760405162461bcd60e51b815260040161080f90612d01565b600e8054911515620100000262ff000019909216919091179055565b61094583838360405180602001604052806000815250611765565b6000610cfb60085490565b8210610d5e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161080f565b60088281548110610d7f57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600a546001600160a01b03163314610dbb5760405162461bcd60e51b815260040161080f90612d01565b600e805460ff19166001179055565b6000818152600260205260408120546001600160a01b0316806107025760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161080f565b60006001600160a01b038216610eac5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161080f565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610ef25760405162461bcd60e51b815260040161080f90612d01565b610efc6000611ebc565b565b600e54610100900460ff16610f4a5760405162461bcd60e51b815260206004820152601260248201527153616c65206973206e6f742061637469766560701b604482015260640161080f565b600e5462010000900460ff16610fa25760405162461bcd60e51b815260206004820152601760248201527f57686974656c697374206973206e6f7420616374697665000000000000000000604482015260640161080f565b610fac813361150c565b610fea5760405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b604482015260640161080f565b600e546301000000900460ff1661121357611ea861100760085490565b1061105f5760405162461bcd60e51b815260206004820152602260248201527f416c6c207075626c696320746f6b656e732068617665206265656e206d696e74604482015261195960f21b606482015260840161080f565b60028211156110b05760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e73604482015260640161080f565b611ea86110d26012546110cc856110c660085490565b90611f0e565b90611f21565b11156110f05760405162461bcd60e51b815260040161080f90612d36565b3360009081526010602052604090205460029061110d9084611f0e565b111561115b5760405162461bcd60e51b815260206004820152601c60248201527f50757263686173652065786365656473206d6178207768697465656400000000604482015260640161080f565b600d54349061116a9084611f2d565b146111b75760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604482015260640161080f565b60005b82811015610945573360009081526010602052604081208054600192906111e2908490612e2b565b92505081905550611201336111fc6012546110cc60085490565b611ea2565b8061120b81612ef4565b9150506111ba565b611eda61121f60085490565b1061126c5760405162461bcd60e51b815260206004820152601b60248201527f416c6c20746f6b656e732068617665206265656e206d696e7465640000000000604482015260640161080f565b816001146112bc5760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e73604482015260640161080f565b3360009081526011602052604090205460ff161561131c5760405162461bcd60e51b815260206004820152601860248201527f416c726561647920636c61696d65642067697665617761790000000000000000604482015260640161080f565b336000818152601160205260409020805460ff19166001179055610aaa906111fc60085490565b600e54610100900460ff166113935760405162461bcd60e51b8152602060048201526016602482015275436f6e7472616374206973206e6f742061637469766560501b604482015260640161080f565b600e5462010000900460ff16156113ec5760405162461bcd60e51b815260206004820152601760248201527f50726573616c65206973207374696c6c20616374697665000000000000000000604482015260640161080f565b600281111561143d5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74206d696e742061626f7665206c696d6974000000000000000000604482015260640161080f565b611ea86114536012546110cc846110c660085490565b11156114715760405162461bcd60e51b815260040161080f90612d36565b600d5434906114809083611f2d565b146114cd5760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604482015260640161080f565b60005b81811015610aaa576114eb336111fc6012546110cc60085490565b806114f581612ef4565b9150506114d0565b60606001805461071790612eb9565b600081815b845181101561164c57600085828151811061153c57634e487b7160e01b600052603260045260246000fd5b602002602001015190508083116115c557604080516020810185905290810182905260029060600160408051601f198184030181529082905261157e91612bb5565b602060405180830381855afa15801561159b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906115be91906129f7565b9250611639565b604080516020810183905290810184905260029060600160408051601f19818403018152908290526115f691612bb5565b602060405180830381855afa158015611613573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061163691906129f7565b92505b508061164481612ef4565b915050611511565b50600f54149392505050565b600a546001600160a01b031633146116825760405162461bcd60e51b815260040161080f90612d01565b600e805491151563010000000263ff00000019909216919091179055565b6001600160a01b0382163314156116f95760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161080f565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61176f3383611c00565b61178b5760405162461bcd60e51b815260040161080f90612d85565b610c8984848484611f39565b600a546001600160a01b031633146117c15760405162461bcd60e51b815260040161080f90612d01565b80518251146118125760405162461bcd60e51b815260206004820152601760248201527f53686f756c6420686176652073616d65206c656e677468000000000000000000604482015260640161080f565b60005b825181101561094557611ea882828151811061184157634e487b7160e01b600052603260045260246000fd5b602002602001015110156118bd5760405162461bcd60e51b815260206004820152603960248201527f546f6b656e73206e756d62657220746f206d696e74206d75737420657863656560448201527f64206e756d626572206f66207075626c696320746f6b656e7300000000000000606482015260840161080f565b611eda8282815181106118e057634e487b7160e01b600052603260045260246000fd5b6020026020010151106119055760405162461bcd60e51b815260040161080f90612ca4565b61195d83828151811061192857634e487b7160e01b600052603260045260246000fd5b602002602001015183838151811061195057634e487b7160e01b600052603260045260246000fd5b6020026020010151611ea2565b60125461196b906001611f0e565b6012558061197881612ef4565b915050611815565b6000818152600260205260409020546060906001600160a01b03166119ff5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161080f565b600e5460ff16611a3157600c604051602001611a1b9190612bd1565b6040516020818303038152906040529050919050565b600b611a3c83611f6c565b604051602001611a1b929190612bdd565b919050565b600a546001600160a01b03163314611a7c5760405162461bcd60e51b815260040161080f90612d01565b8151611a8f90600c9060208501906125e1565b50805161094590600b9060208401906125e1565b600a546001600160a01b03163314611acd5760405162461bcd60e51b815260040161080f90612d01565b600f55565b600a546001600160a01b03163314611afc5760405162461bcd60e51b815260040161080f90612d01565b6001600160a01b038116611b615760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161080f565b611b6a81611ebc565b50565b60006001600160e01b0319821663780e9d6360e01b1480610702575061070282612086565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611bc782610dca565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611c795760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161080f565b6000611c8483610dca565b9050806001600160a01b0316846001600160a01b03161480611cbf5750836001600160a01b0316611cb48461079a565b6001600160a01b0316145b80611cef57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611d0a82610dca565b6001600160a01b031614611d725760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161080f565b6001600160a01b038216611dd45760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161080f565b611ddf8383836120d6565b611dea600082611b92565b6001600160a01b0383166000908152600360205260408120805460019290611e13908490612e76565b90915550506001600160a01b0382166000908152600360205260408120805460019290611e41908490612e2b565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610aaa8282604051806020016040528060008152506120e1565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000611f1a8284612e2b565b9392505050565b6000611f1a8284612e76565b6000611f1a8284612e57565b611f44848484611cf7565b611f5084848484612114565b610c895760405162461bcd60e51b815260040161080f90612c52565b606081611f905750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611fba5780611fa481612ef4565b9150611fb39050600a83612e43565b9150611f94565b60008167ffffffffffffffff811115611fe357634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561200d576020820181803683370190505b5090505b8415611cef57612022600183612e76565b915061202f600a86612f33565b61203a906030612e2b565b60f81b81838151811061205d57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061207f600a86612e43565b9450612011565b60006001600160e01b031982166380ac58cd60e01b14806120b757506001600160e01b03198216635b5e139f60e01b145b8061070257506301ffc9a760e01b6001600160e01b0319831614610702565b610945838383612221565b6120eb83836122d9565b6120f86000848484612114565b6109455760405162461bcd60e51b815260040161080f90612c52565b60006001600160a01b0384163b1561221657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612158903390899088908890600401612c02565b602060405180830381600087803b15801561217257600080fd5b505af19250505080156121a2575060408051601f3d908101601f1916820190925261219f91810190612a2b565b60015b6121fc573d8080156121d0576040519150601f19603f3d011682016040523d82523d6000602084013e6121d5565b606091505b5080516121f45760405162461bcd60e51b815260040161080f90612c52565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611cef565b506001949350505050565b6001600160a01b03831661227c5761227781600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61229f565b816001600160a01b0316836001600160a01b03161461229f5761229f8382612427565b6001600160a01b0382166122b657610945816124c4565b826001600160a01b0316826001600160a01b03161461094557610945828261259d565b6001600160a01b03821661232f5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161080f565b6000818152600260205260409020546001600160a01b0316156123945760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161080f565b6123a0600083836120d6565b6001600160a01b03821660009081526003602052604081208054600192906123c9908490612e2b565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000600161243484610e41565b61243e9190612e76565b600083815260076020526040902054909150808214612491576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906124d690600190612e76565b6000838152600960205260408120546008805493945090928490811061250c57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061253b57634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061258157634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006125a883610e41565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b8280546125ed90612eb9565b90600052602060002090601f01602090048101928261260f5760008555612655565b82601f1061262857805160ff1916838001178555612655565b82800160010185558215612655579182015b8281111561265557825182559160200191906001019061263a565b50612661929150612665565b5090565b5b808211156126615760008155600101612666565b600067ffffffffffffffff83111561269457612694612f73565b6126a7601f8401601f1916602001612dd6565b90508281528383830111156126bb57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114611a4d57600080fd5b600082601f8301126126f9578081fd5b8135602061270e61270983612e07565b612dd6565b80838252828201915082860187848660051b890101111561272d578586fd5b855b8581101561274b5781358452928401929084019060010161272f565b5090979650505050505050565b80358015158114611a4d57600080fd5b600082601f830112612778578081fd5b611f1a8383356020850161267a565b600060208284031215612798578081fd5b611f1a826126d2565b600080604083850312156127b3578081fd5b6127bc836126d2565b91506127ca602084016126d2565b90509250929050565b6000806000606084860312156127e7578081fd5b6127f0846126d2565b92506127fe602085016126d2565b9150604084013590509250925092565b60008060008060808587031215612823578081fd5b61282c856126d2565b935061283a602086016126d2565b925060408501359150606085013567ffffffffffffffff81111561285c578182fd5b8501601f8101871361286c578182fd5b61287b8782356020840161267a565b91505092959194509250565b60008060408385031215612899578182fd5b6128a2836126d2565b91506127ca60208401612758565b600080604083850312156128c2578182fd5b6128cb836126d2565b946020939093013593505050565b600080604083850312156128eb578182fd5b823567ffffffffffffffff80821115612902578384fd5b818501915085601f830112612915578384fd5b8135602061292561270983612e07565b8083825282820191508286018a848660051b8901011115612944578889fd5b8896505b8487101561296d57612959816126d2565b835260019690960195918301918301612948565b5096505086013592505080821115612983578283fd5b50612990858286016126e9565b9150509250929050565b600080604083850312156129ac578182fd5b823567ffffffffffffffff8111156129c2578283fd5b6129ce858286016126e9565b95602094909401359450505050565b6000602082840312156129ee578081fd5b611f1a82612758565b600060208284031215612a08578081fd5b5051919050565b600060208284031215612a20578081fd5b8135611f1a81612f89565b600060208284031215612a3c578081fd5b8151611f1a81612f89565b60008060408385031215612a59578182fd5b823567ffffffffffffffff80821115612a70578384fd5b612a7c86838701612768565b93506020850135915080821115612a91578283fd5b5061299085828601612768565b600060208284031215612aaf578081fd5b5035919050565b60008060408385031215612ac8578182fd5b82359150602083013567ffffffffffffffff811115612ae5578182fd5b612990858286016126e9565b60008151808452612b09816020860160208601612e8d565b601f01601f19169290920160200192915050565b8054600090600181811c9080831680612b3757607f831692505b6020808410821415612b5757634e487b7160e01b86526022600452602486fd5b818015612b6b5760018114612b7c57612ba9565b60ff19861689528489019650612ba9565b60008881526020902060005b86811015612ba15781548b820152908501908301612b88565b505084890196505b50505050505092915050565b60008251612bc7818460208701612e8d565b9190910192915050565b6000611f1a8284612b1d565b6000612be98285612b1d565b8351612bf9818360208801612e8d565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612c3590830184612af1565b9695505050505050565b602081526000611f1a6020830184612af1565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526038908201527f546f6b656e73206e756d62657220746f206d696e742063616e6e6f742065786360408201527f656564206e756d626572206f66204d415820746f6b656e730000000000000000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602f908201527f507572636861736520776f756c6420657863656564206d6178207075626c696360408201526e20737570706c79206f66204e46547360881b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715612dff57612dff612f73565b604052919050565b600067ffffffffffffffff821115612e2157612e21612f73565b5060051b60200190565b60008219821115612e3e57612e3e612f47565b500190565b600082612e5257612e52612f5d565b500490565b6000816000190483118215151615612e7157612e71612f47565b500290565b600082821015612e8857612e88612f47565b500390565b60005b83811015612ea8578181015183820152602001612e90565b83811115610c895750506000910152565b600181811c90821680612ecd57607f821691505b60208210811415612eee57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612f0857612f08612f47565b5060010190565b600063ffffffff80831681811415612f2957612f29612f47565b6001019392505050565b600082612f4257612f42612f5d565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611b6a57600080fdfea2646970667358221220b60e80f11a71d2178b5d8621883f863cbac211e979b49f8df69b74479d0281fa64736f6c63430008040033
Deployed Bytecode
0x60806040526004361061023b5760003560e01c80638f76696c1161012e578063c151a5f8116100ab578063e985e9c51161006f578063e985e9c514610642578063e9be0f3f1461068b578063ebf0c717146106a1578063f2f5a7e5146106b7578063f2fde38b146106d757600080fd5b8063c151a5f8146105cc578063c87b56dd146105ec578063d1d80f301461060c578063e748e07c14610597578063e82541741461062257600080fd5b8063a22cb465116100f2578063a22cb46514610547578063a38bffda14610567578063a475b5dd1461057d578063aeb1676814610597578063b88d4fde146105ac57600080fd5b80638f76696c146104cc57806392642744146104df57806395d89b41146104f2578063972a2a62146105075780639a5b2f001461052757600080fd5b80633ccfd60b116101bc57806360d938dc1161018057806360d938dc146104395780636352211e1461045957806370a0823114610479578063715018a6146104995780638da5cb5b146104ae57600080fd5b80633ccfd60b146103af5780633f8121a2146103c457806342842e0e146103e45780634f6ccce7146104045780635f0f45b21461042457600080fd5b806322f3e2d41161020357806322f3e2d41461031057806323b872dd1461032f5780632750fc781461034f5780632f745c591461036f5780633542aee21461038f57600080fd5b806301ffc9a71461024057806306fdde0314610275578063081812fc14610297578063095ea7b3146102cf57806318160ddd146102f1575b600080fd5b34801561024c57600080fd5b5061026061025b366004612a0f565b6106f7565b60405190151581526020015b60405180910390f35b34801561028157600080fd5b5061028a610708565b60405161026c9190612c3f565b3480156102a357600080fd5b506102b76102b2366004612a9e565b61079a565b6040516001600160a01b03909116815260200161026c565b3480156102db57600080fd5b506102ef6102ea3660046128b0565b610834565b005b3480156102fd57600080fd5b506008545b60405190815260200161026c565b34801561031c57600080fd5b50600e5461026090610100900460ff1681565b34801561033b57600080fd5b506102ef61034a3660046127d3565b61094a565b34801561035b57600080fd5b506102ef61036a3660046129dd565b61097b565b34801561037b57600080fd5b5061030261038a3660046128b0565b6109bf565b34801561039b57600080fd5b506102ef6103aa3660046128b0565b610a55565b3480156103bb57600080fd5b506102ef610aae565b3480156103d057600080fd5b506102ef6103df3660046129dd565b610c8f565b3480156103f057600080fd5b506102ef6103ff3660046127d3565b610cd5565b34801561041057600080fd5b5061030261041f366004612a9e565b610cf0565b34801561043057600080fd5b506102ef610d91565b34801561044557600080fd5b50600e546102609062010000900460ff1681565b34801561046557600080fd5b506102b7610474366004612a9e565b610dca565b34801561048557600080fd5b50610302610494366004612787565b610e41565b3480156104a557600080fd5b506102ef610ec8565b3480156104ba57600080fd5b50600a546001600160a01b03166102b7565b6102ef6104da366004612ab6565b610efe565b6102ef6104ed366004612a9e565b611343565b3480156104fe57600080fd5b5061028a6114fd565b34801561051357600080fd5b5061026061052236600461299a565b61150c565b34801561053357600080fd5b506102ef6105423660046129dd565b611658565b34801561055357600080fd5b506102ef610562366004612887565b6116a0565b34801561057357600080fd5b50610302600d5481565b34801561058957600080fd5b50600e546102609060ff1681565b3480156105a357600080fd5b50610302600281565b3480156105b857600080fd5b506102ef6105c736600461280e565b611765565b3480156105d857600080fd5b506102ef6105e73660046128d9565b611797565b3480156105f857600080fd5b5061028a610607366004612a9e565b611980565b34801561061857600080fd5b50610302611ea881565b34801561062e57600080fd5b506102ef61063d366004612a47565b611a52565b34801561064e57600080fd5b5061026061065d3660046127a1565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561069757600080fd5b5061030260125481565b3480156106ad57600080fd5b50610302600f5481565b3480156106c357600080fd5b506102ef6106d2366004612a9e565b611aa3565b3480156106e357600080fd5b506102ef6106f2366004612787565b611ad2565b600061070282611b6d565b92915050565b60606000805461071790612eb9565b80601f016020809104026020016040519081016040528092919081815260200182805461074390612eb9565b80156107905780601f1061076557610100808354040283529160200191610790565b820191906000526020600020905b81548152906001019060200180831161077357829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108185760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061083f82610dca565b9050806001600160a01b0316836001600160a01b031614156108ad5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161080f565b336001600160a01b03821614806108c957506108c9813361065d565b61093b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161080f565b6109458383611b92565b505050565b6109543382611c00565b6109705760405162461bcd60e51b815260040161080f90612d85565b610945838383611cf7565b600a546001600160a01b031633146109a55760405162461bcd60e51b815260040161080f90612d01565b600e80549115156101000261ff0019909216919091179055565b60006109ca83610e41565b8210610a2c5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161080f565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610a7f5760405162461bcd60e51b815260040161080f90612d01565b611eda8110610aa05760405162461bcd60e51b815260040161080f90612ca4565b610aaa8282611ea2565b5050565b600a546001600160a01b03163314610ad85760405162461bcd60e51b815260040161080f90612d01565b6040805160a080820183527349bb38d0787e62add4702e6b4325971be5a29d0e825273c657031487a6ea048e28ca23b61963676553c966602080840191909152738b4f27cf1cbc9bf0c961495f9b0e485a95188c188385015273251c0e8f312beb3cec41a44cae62c4d254a0ad95606080850191909152735d50b637532a97d1177c5507ed82aae9a57f7bc3608080860191909152855193840186526107d0808552928401839052948301829052820181905292810192909252904760005b60058163ffffffff161015610c89576000610bb460016005612e76565b8263ffffffff1614610c0d57612710848363ffffffff1660058110610be957634e487b7160e01b600052603260045260246000fd5b6020020151610bfe9063ffffffff1685612e57565b610c089190612e43565b610c0f565b475b9050848263ffffffff1660058110610c3757634e487b7160e01b600052603260045260246000fd5b60200201516001600160a01b03166108fc829081150290604051600060405180830381858888f19350505050158015610c74573d6000803e3d6000fd5b50508080610c8190612f0f565b915050610b97565b50505050565b600a546001600160a01b03163314610cb95760405162461bcd60e51b815260040161080f90612d01565b600e8054911515620100000262ff000019909216919091179055565b61094583838360405180602001604052806000815250611765565b6000610cfb60085490565b8210610d5e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161080f565b60088281548110610d7f57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600a546001600160a01b03163314610dbb5760405162461bcd60e51b815260040161080f90612d01565b600e805460ff19166001179055565b6000818152600260205260408120546001600160a01b0316806107025760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161080f565b60006001600160a01b038216610eac5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161080f565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610ef25760405162461bcd60e51b815260040161080f90612d01565b610efc6000611ebc565b565b600e54610100900460ff16610f4a5760405162461bcd60e51b815260206004820152601260248201527153616c65206973206e6f742061637469766560701b604482015260640161080f565b600e5462010000900460ff16610fa25760405162461bcd60e51b815260206004820152601760248201527f57686974656c697374206973206e6f7420616374697665000000000000000000604482015260640161080f565b610fac813361150c565b610fea5760405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b604482015260640161080f565b600e546301000000900460ff1661121357611ea861100760085490565b1061105f5760405162461bcd60e51b815260206004820152602260248201527f416c6c207075626c696320746f6b656e732068617665206265656e206d696e74604482015261195960f21b606482015260840161080f565b60028211156110b05760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e73604482015260640161080f565b611ea86110d26012546110cc856110c660085490565b90611f0e565b90611f21565b11156110f05760405162461bcd60e51b815260040161080f90612d36565b3360009081526010602052604090205460029061110d9084611f0e565b111561115b5760405162461bcd60e51b815260206004820152601c60248201527f50757263686173652065786365656473206d6178207768697465656400000000604482015260640161080f565b600d54349061116a9084611f2d565b146111b75760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604482015260640161080f565b60005b82811015610945573360009081526010602052604081208054600192906111e2908490612e2b565b92505081905550611201336111fc6012546110cc60085490565b611ea2565b8061120b81612ef4565b9150506111ba565b611eda61121f60085490565b1061126c5760405162461bcd60e51b815260206004820152601b60248201527f416c6c20746f6b656e732068617665206265656e206d696e7465640000000000604482015260640161080f565b816001146112bc5760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e73604482015260640161080f565b3360009081526011602052604090205460ff161561131c5760405162461bcd60e51b815260206004820152601860248201527f416c726561647920636c61696d65642067697665617761790000000000000000604482015260640161080f565b336000818152601160205260409020805460ff19166001179055610aaa906111fc60085490565b600e54610100900460ff166113935760405162461bcd60e51b8152602060048201526016602482015275436f6e7472616374206973206e6f742061637469766560501b604482015260640161080f565b600e5462010000900460ff16156113ec5760405162461bcd60e51b815260206004820152601760248201527f50726573616c65206973207374696c6c20616374697665000000000000000000604482015260640161080f565b600281111561143d5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74206d696e742061626f7665206c696d6974000000000000000000604482015260640161080f565b611ea86114536012546110cc846110c660085490565b11156114715760405162461bcd60e51b815260040161080f90612d36565b600d5434906114809083611f2d565b146114cd5760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604482015260640161080f565b60005b81811015610aaa576114eb336111fc6012546110cc60085490565b806114f581612ef4565b9150506114d0565b60606001805461071790612eb9565b600081815b845181101561164c57600085828151811061153c57634e487b7160e01b600052603260045260246000fd5b602002602001015190508083116115c557604080516020810185905290810182905260029060600160408051601f198184030181529082905261157e91612bb5565b602060405180830381855afa15801561159b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906115be91906129f7565b9250611639565b604080516020810183905290810184905260029060600160408051601f19818403018152908290526115f691612bb5565b602060405180830381855afa158015611613573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061163691906129f7565b92505b508061164481612ef4565b915050611511565b50600f54149392505050565b600a546001600160a01b031633146116825760405162461bcd60e51b815260040161080f90612d01565b600e805491151563010000000263ff00000019909216919091179055565b6001600160a01b0382163314156116f95760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161080f565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61176f3383611c00565b61178b5760405162461bcd60e51b815260040161080f90612d85565b610c8984848484611f39565b600a546001600160a01b031633146117c15760405162461bcd60e51b815260040161080f90612d01565b80518251146118125760405162461bcd60e51b815260206004820152601760248201527f53686f756c6420686176652073616d65206c656e677468000000000000000000604482015260640161080f565b60005b825181101561094557611ea882828151811061184157634e487b7160e01b600052603260045260246000fd5b602002602001015110156118bd5760405162461bcd60e51b815260206004820152603960248201527f546f6b656e73206e756d62657220746f206d696e74206d75737420657863656560448201527f64206e756d626572206f66207075626c696320746f6b656e7300000000000000606482015260840161080f565b611eda8282815181106118e057634e487b7160e01b600052603260045260246000fd5b6020026020010151106119055760405162461bcd60e51b815260040161080f90612ca4565b61195d83828151811061192857634e487b7160e01b600052603260045260246000fd5b602002602001015183838151811061195057634e487b7160e01b600052603260045260246000fd5b6020026020010151611ea2565b60125461196b906001611f0e565b6012558061197881612ef4565b915050611815565b6000818152600260205260409020546060906001600160a01b03166119ff5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161080f565b600e5460ff16611a3157600c604051602001611a1b9190612bd1565b6040516020818303038152906040529050919050565b600b611a3c83611f6c565b604051602001611a1b929190612bdd565b919050565b600a546001600160a01b03163314611a7c5760405162461bcd60e51b815260040161080f90612d01565b8151611a8f90600c9060208501906125e1565b50805161094590600b9060208401906125e1565b600a546001600160a01b03163314611acd5760405162461bcd60e51b815260040161080f90612d01565b600f55565b600a546001600160a01b03163314611afc5760405162461bcd60e51b815260040161080f90612d01565b6001600160a01b038116611b615760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161080f565b611b6a81611ebc565b50565b60006001600160e01b0319821663780e9d6360e01b1480610702575061070282612086565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611bc782610dca565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611c795760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161080f565b6000611c8483610dca565b9050806001600160a01b0316846001600160a01b03161480611cbf5750836001600160a01b0316611cb48461079a565b6001600160a01b0316145b80611cef57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611d0a82610dca565b6001600160a01b031614611d725760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161080f565b6001600160a01b038216611dd45760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161080f565b611ddf8383836120d6565b611dea600082611b92565b6001600160a01b0383166000908152600360205260408120805460019290611e13908490612e76565b90915550506001600160a01b0382166000908152600360205260408120805460019290611e41908490612e2b565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610aaa8282604051806020016040528060008152506120e1565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000611f1a8284612e2b565b9392505050565b6000611f1a8284612e76565b6000611f1a8284612e57565b611f44848484611cf7565b611f5084848484612114565b610c895760405162461bcd60e51b815260040161080f90612c52565b606081611f905750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611fba5780611fa481612ef4565b9150611fb39050600a83612e43565b9150611f94565b60008167ffffffffffffffff811115611fe357634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561200d576020820181803683370190505b5090505b8415611cef57612022600183612e76565b915061202f600a86612f33565b61203a906030612e2b565b60f81b81838151811061205d57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061207f600a86612e43565b9450612011565b60006001600160e01b031982166380ac58cd60e01b14806120b757506001600160e01b03198216635b5e139f60e01b145b8061070257506301ffc9a760e01b6001600160e01b0319831614610702565b610945838383612221565b6120eb83836122d9565b6120f86000848484612114565b6109455760405162461bcd60e51b815260040161080f90612c52565b60006001600160a01b0384163b1561221657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612158903390899088908890600401612c02565b602060405180830381600087803b15801561217257600080fd5b505af19250505080156121a2575060408051601f3d908101601f1916820190925261219f91810190612a2b565b60015b6121fc573d8080156121d0576040519150601f19603f3d011682016040523d82523d6000602084013e6121d5565b606091505b5080516121f45760405162461bcd60e51b815260040161080f90612c52565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611cef565b506001949350505050565b6001600160a01b03831661227c5761227781600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61229f565b816001600160a01b0316836001600160a01b03161461229f5761229f8382612427565b6001600160a01b0382166122b657610945816124c4565b826001600160a01b0316826001600160a01b03161461094557610945828261259d565b6001600160a01b03821661232f5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161080f565b6000818152600260205260409020546001600160a01b0316156123945760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161080f565b6123a0600083836120d6565b6001600160a01b03821660009081526003602052604081208054600192906123c9908490612e2b565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000600161243484610e41565b61243e9190612e76565b600083815260076020526040902054909150808214612491576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906124d690600190612e76565b6000838152600960205260408120546008805493945090928490811061250c57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061253b57634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061258157634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006125a883610e41565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b8280546125ed90612eb9565b90600052602060002090601f01602090048101928261260f5760008555612655565b82601f1061262857805160ff1916838001178555612655565b82800160010185558215612655579182015b8281111561265557825182559160200191906001019061263a565b50612661929150612665565b5090565b5b808211156126615760008155600101612666565b600067ffffffffffffffff83111561269457612694612f73565b6126a7601f8401601f1916602001612dd6565b90508281528383830111156126bb57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114611a4d57600080fd5b600082601f8301126126f9578081fd5b8135602061270e61270983612e07565b612dd6565b80838252828201915082860187848660051b890101111561272d578586fd5b855b8581101561274b5781358452928401929084019060010161272f565b5090979650505050505050565b80358015158114611a4d57600080fd5b600082601f830112612778578081fd5b611f1a8383356020850161267a565b600060208284031215612798578081fd5b611f1a826126d2565b600080604083850312156127b3578081fd5b6127bc836126d2565b91506127ca602084016126d2565b90509250929050565b6000806000606084860312156127e7578081fd5b6127f0846126d2565b92506127fe602085016126d2565b9150604084013590509250925092565b60008060008060808587031215612823578081fd5b61282c856126d2565b935061283a602086016126d2565b925060408501359150606085013567ffffffffffffffff81111561285c578182fd5b8501601f8101871361286c578182fd5b61287b8782356020840161267a565b91505092959194509250565b60008060408385031215612899578182fd5b6128a2836126d2565b91506127ca60208401612758565b600080604083850312156128c2578182fd5b6128cb836126d2565b946020939093013593505050565b600080604083850312156128eb578182fd5b823567ffffffffffffffff80821115612902578384fd5b818501915085601f830112612915578384fd5b8135602061292561270983612e07565b8083825282820191508286018a848660051b8901011115612944578889fd5b8896505b8487101561296d57612959816126d2565b835260019690960195918301918301612948565b5096505086013592505080821115612983578283fd5b50612990858286016126e9565b9150509250929050565b600080604083850312156129ac578182fd5b823567ffffffffffffffff8111156129c2578283fd5b6129ce858286016126e9565b95602094909401359450505050565b6000602082840312156129ee578081fd5b611f1a82612758565b600060208284031215612a08578081fd5b5051919050565b600060208284031215612a20578081fd5b8135611f1a81612f89565b600060208284031215612a3c578081fd5b8151611f1a81612f89565b60008060408385031215612a59578182fd5b823567ffffffffffffffff80821115612a70578384fd5b612a7c86838701612768565b93506020850135915080821115612a91578283fd5b5061299085828601612768565b600060208284031215612aaf578081fd5b5035919050565b60008060408385031215612ac8578182fd5b82359150602083013567ffffffffffffffff811115612ae5578182fd5b612990858286016126e9565b60008151808452612b09816020860160208601612e8d565b601f01601f19169290920160200192915050565b8054600090600181811c9080831680612b3757607f831692505b6020808410821415612b5757634e487b7160e01b86526022600452602486fd5b818015612b6b5760018114612b7c57612ba9565b60ff19861689528489019650612ba9565b60008881526020902060005b86811015612ba15781548b820152908501908301612b88565b505084890196505b50505050505092915050565b60008251612bc7818460208701612e8d565b9190910192915050565b6000611f1a8284612b1d565b6000612be98285612b1d565b8351612bf9818360208801612e8d565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612c3590830184612af1565b9695505050505050565b602081526000611f1a6020830184612af1565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526038908201527f546f6b656e73206e756d62657220746f206d696e742063616e6e6f742065786360408201527f656564206e756d626572206f66204d415820746f6b656e730000000000000000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602f908201527f507572636861736520776f756c6420657863656564206d6178207075626c696360408201526e20737570706c79206f66204e46547360881b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715612dff57612dff612f73565b604052919050565b600067ffffffffffffffff821115612e2157612e21612f73565b5060051b60200190565b60008219821115612e3e57612e3e612f47565b500190565b600082612e5257612e52612f5d565b500490565b6000816000190483118215151615612e7157612e71612f47565b500290565b600082821015612e8857612e88612f47565b500390565b60005b83811015612ea8578181015183820152602001612e90565b83811115610c895750506000910152565b600181811c90821680612ecd57607f821691505b60208210811415612eee57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612f0857612f08612f47565b5060010190565b600063ffffffff80831681811415612f2957612f29612f47565b6001019392505050565b600082612f4257612f42612f5d565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611b6a57600080fdfea2646970667358221220b60e80f11a71d2178b5d8621883f863cbac211e979b49f8df69b74479d0281fa64736f6c63430008040033
Deployed Bytecode Sourcemap
49810:8881:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57258:235;;;;;;;;;;-1:-1:-1;57258:235:0;;;;;:::i;:::-;;:::i;:::-;;;11472:14:1;;11465:22;11447:41;;11435:2;11420:18;57258:235:0;;;;;;;;21422:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;22981:221::-;;;;;;;;;;-1:-1:-1;22981:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;10770:32:1;;;10752:51;;10740:2;10725:18;22981:221:0;10707:102:1;22504:411:0;;;;;;;;;;-1:-1:-1;22504:411:0;;;;;:::i;:::-;;:::i;:::-;;35111:113;;;;;;;;;;-1:-1:-1;35199:10:0;:17;35111:113;;;11645:25:1;;;11633:2;11618:18;35111:113:0;11600:76:1;50486:20:0;;;;;;;;;;-1:-1:-1;50486:20:0;;;;;;;;;;;23871:339;;;;;;;;;;-1:-1:-1;23871:339:0;;;;;:::i;:::-;;:::i;51097:137::-;;;;;;;;;;-1:-1:-1;51097:137:0;;;;;:::i;:::-;;:::i;34779:256::-;;;;;;;;;;-1:-1:-1;34779:256:0;;;;;:::i;:::-;;:::i;55705:260::-;;;;;;;;;;-1:-1:-1;55705:260:0;;;;;:::i;:::-;;:::i;52198:885::-;;;;;;;;;;;;;:::i;51334:149::-;;;;;;;;;;-1:-1:-1;51334:149:0;;;;;:::i;:::-;;:::i;24281:185::-;;;;;;;;;;-1:-1:-1;24281:185:0;;;;;:::i;:::-;;:::i;35301:233::-;;;;;;;;;;-1:-1:-1;35301:233:0;;;;;:::i;:::-;;:::i;50883:98::-;;;;;;;;;;;;;:::i;50513:27::-;;;;;;;;;;-1:-1:-1;50513:27:0;;;;;;;;;;;21116:239;;;;;;;;;;-1:-1:-1;21116:239:0;;;;;:::i;:::-;;:::i;20846:208::-;;;;;;;;;;-1:-1:-1;20846:208:0;;;;;:::i;:::-;;:::i;49179:94::-;;;;;;;;;;;;;:::i;48528:87::-;;;;;;;;;;-1:-1:-1;48601:6:0;;-1:-1:-1;;;;;48601:6:0;48528:87;;54090:1527;;;;;;:::i;:::-;;:::i;53248:680::-;;;;;;:::i;:::-;;:::i;21591:104::-;;;;;;;;;;;;;:::i;57902:786::-;;;;;;;;;;-1:-1:-1;57902:786:0;;;;;:::i;:::-;;:::i;51580:153::-;;;;;;;;;;-1:-1:-1;51580:153:0;;;;;:::i;:::-;;:::i;23274:295::-;;;;;;;;;;-1:-1:-1;23274:295:0;;;;;:::i;:::-;;:::i;50398:44::-;;;;;;;;;;;;;;;;50461:18;;;;;;;;;;-1:-1:-1;50461:18:0;;;;;;;;50619:46;;;;;;;;;;;;50664:1;50619:46;;24537:328;;;;;;;;;;-1:-1:-1;24537:328:0;;;;;:::i;:::-;;:::i;56057:604::-;;;;;;;;;;-1:-1:-1;56057:604:0;;;;;:::i;:::-;;:::i;56805:441::-;;;;;;;;;;-1:-1:-1;56805:441:0;;;;;:::i;:::-;;:::i;50300:45::-;;;;;;;;;;;;50341:4;50300:45;;51805:197;;;;;;;;;;-1:-1:-1;51805:197:0;;;;;:::i;:::-;;:::i;23640:164::-;;;;;;;;;;-1:-1:-1;23640:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;23761:25:0;;;23737:4;23761:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23640:164;50790:28;;;;;;;;;;;;;;;;50593:19;;;;;;;;;;;;;;;;57803:91;;;;;;;;;;-1:-1:-1;57803:91:0;;;;;:::i;:::-;;:::i;49428:192::-;;;;;;;;;;-1:-1:-1;49428:192:0;;;;;:::i;:::-;;:::i;57258:235::-;57418:4;57448:37;57472:12;57448:23;:37::i;:::-;57441:44;57258:235;-1:-1:-1;;57258:235:0:o;21422:100::-;21476:13;21509:5;21502:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21422:100;:::o;22981:221::-;23057:7;26464:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26464:16:0;23077:73;;;;-1:-1:-1;;;23077:73:0;;19369:2:1;23077:73:0;;;19351:21:1;19408:2;19388:18;;;19381:30;19447:34;19427:18;;;19420:62;-1:-1:-1;;;19498:18:1;;;19491:42;19550:19;;23077:73:0;;;;;;;;;-1:-1:-1;23170:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23170:24:0;;22981:221::o;22504:411::-;22585:13;22601:23;22616:7;22601:14;:23::i;:::-;22585:39;;22649:5;-1:-1:-1;;;;;22643:11:0;:2;-1:-1:-1;;;;;22643:11:0;;;22635:57;;;;-1:-1:-1;;;22635:57:0;;20969:2:1;22635:57:0;;;20951:21:1;21008:2;20988:18;;;20981:30;21047:34;21027:18;;;21020:62;-1:-1:-1;;;21098:18:1;;;21091:31;21139:19;;22635:57:0;20941:223:1;22635:57:0;16064:10;-1:-1:-1;;;;;22727:21:0;;;;:62;;-1:-1:-1;22752:37:0;22769:5;16064:10;23640:164;:::i;22752:37::-;22705:168;;;;-1:-1:-1;;;22705:168:0;;16642:2:1;22705:168:0;;;16624:21:1;16681:2;16661:18;;;16654:30;16720:34;16700:18;;;16693:62;16791:26;16771:18;;;16764:54;16835:19;;22705:168:0;16614:246:1;22705:168:0;22886:21;22895:2;22899:7;22886:8;:21::i;:::-;22504:411;;;:::o;23871:339::-;24066:41;16064:10;24099:7;24066:18;:41::i;:::-;24058:103;;;;-1:-1:-1;;;24058:103:0;;;;;;;:::i;:::-;24174:28;24184:4;24190:2;24194:7;24174:9;:28::i;51097:137::-;48601:6;;-1:-1:-1;;;;;48601:6:0;16064:10;48748:23;48740:68;;;;-1:-1:-1;;;48740:68:0;;;;;;;:::i;:::-;51206:8:::1;:20:::0;;;::::1;;;;-1:-1:-1::0;;51206:20:0;;::::1;::::0;;;::::1;::::0;;51097:137::o;34779:256::-;34876:7;34912:23;34929:5;34912:16;:23::i;:::-;34904:5;:31;34896:87;;;;-1:-1:-1;;;34896:87:0;;12459:2:1;34896:87:0;;;12441:21:1;12498:2;12478:18;;;12471:30;12537:34;12517:18;;;12510:62;-1:-1:-1;;;12588:18:1;;;12581:41;12639:19;;34896:87:0;12431:233:1;34896:87:0;-1:-1:-1;;;;;;35001:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;34779:256::o;55705:260::-;48601:6;;-1:-1:-1;;;;;48601:6:0;16064:10;48748:23;48740:68;;;;-1:-1:-1;;;48740:68:0;;;;;;;:::i;:::-;50387:4:::1;55843:8;:18;55835:87;;;;-1:-1:-1::0;;;55835:87:0::1;;;;;;;:::i;:::-;55933:24;55943:3;55948:8;55933:9;:24::i;:::-;55705:260:::0;;:::o;52198:885::-;48601:6;;-1:-1:-1;;;;;48601:6:0;16064:10;48748:23;48740:68;;;;-1:-1:-1;;;48740:68:0;;;;;;;:::i;:::-;52278:326:::1;::::0;;::::1;::::0;;::::1;::::0;;52323:42:::1;52278:326:::0;;52380:42:::1;52278:326;::::0;;::::1;::::0;;;;52437:42:::1;52278:326:::0;;;;52494:42:::1;52278:326:::0;;;;;;;;52551:42:::1;52278:326:::0;;;;;;;;52617:172;;;;::::1;::::0;;52665:4:::1;52617:172:::0;;;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;52278:326;52820:21:::1;52278:27;52854:222;52877:16;52873:1;:20;;;52854:222;;;52915:14;52937:20;52956:1;52937:16;:20;:::i;:::-;52932:1;:25;;;:79;;53006:5;52994:6;53001:1;52994:9;;;;;;;-1:-1:-1::0;;;52994:9:0::1;;;;;;;;;;;;::::0;52984:19:::1;::::0;::::1;;:7:::0;:19:::1;:::i;:::-;:27;;;;:::i;:::-;52932:79;;;52960:21;52932:79;52915:96;;53034:9;53044:1;53034:12;;;;;;;-1:-1:-1::0;;;53034:12:0::1;;;;;;;;;;;;;-1:-1:-1::0;;;;;53026:30:0::1;:38;53057:6;53026:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;52854:222;52895:3;;;;;:::i;:::-;;;;52854:222;;;;48819:1;;;52198:885::o:0;51334:149::-;48601:6;;-1:-1:-1;;;;;48601:6:0;16064:10;48748:23;48740:68;;;;-1:-1:-1;;;48740:68:0;;;;;;;:::i;:::-;51448:15:::1;:27:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;51448:27:0;;::::1;::::0;;;::::1;::::0;;51334:149::o;24281:185::-;24419:39;24436:4;24442:2;24446:7;24419:39;;;;;;;;;;;;:16;:39::i;35301:233::-;35376:7;35412:30;35199:10;:17;;35111:113;35412:30;35404:5;:38;35396:95;;;;-1:-1:-1;;;35396:95:0;;22205:2:1;35396:95:0;;;22187:21:1;22244:2;22224:18;;;22217:30;22283:34;22263:18;;;22256:62;-1:-1:-1;;;22334:18:1;;;22327:42;22386:19;;35396:95:0;22177:234:1;35396:95:0;35509:10;35520:5;35509:17;;;;;;-1:-1:-1;;;35509:17:0;;;;;;;;;;;;;;;;;35502:24;;35301:233;;;:::o;50883:98::-;48601:6;;-1:-1:-1;;;;;48601:6:0;16064:10;48748:23;48740:68;;;;-1:-1:-1;;;48740:68:0;;;;;;;:::i;:::-;50960:6:::1;:13:::0;;-1:-1:-1;;50960:13:0::1;50969:4;50960:13;::::0;;50883:98::o;21116:239::-;21188:7;21224:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21224:16:0;21259:19;21251:73;;;;-1:-1:-1;;;21251:73:0;;18247:2:1;21251:73:0;;;18229:21:1;18286:2;18266:18;;;18259:30;18325:34;18305:18;;;18298:62;-1:-1:-1;;;18376:18:1;;;18369:39;18425:19;;21251:73:0;18219:231:1;20846:208:0;20918:7;-1:-1:-1;;;;;20946:19:0;;20938:74;;;;-1:-1:-1;;;20938:74:0;;17411:2:1;20938:74:0;;;17393:21:1;17450:2;17430:18;;;17423:30;17489:34;17469:18;;;17462:62;-1:-1:-1;;;17540:18:1;;;17533:40;17590:19;;20938:74:0;17383:232:1;20938:74:0;-1:-1:-1;;;;;;21030:16:0;;;;;:9;:16;;;;;;;20846:208::o;49179:94::-;48601:6;;-1:-1:-1;;;;;48601:6:0;16064:10;48748:23;48740:68;;;;-1:-1:-1;;;48740:68:0;;;;;;;:::i;:::-;49244:21:::1;49262:1;49244:9;:21::i;:::-;49179:94::o:0;54090:1527::-;54251:8;;;;;;;54243:39;;;;-1:-1:-1;;;54243:39:0;;15522:2:1;54243:39:0;;;15504:21:1;15561:2;15541:18;;;15534:30;-1:-1:-1;;;15580:18:1;;;15573:48;15638:18;;54243:39:0;15494:168:1;54243:39:0;54301:15;;;;;;;54293:51;;;;-1:-1:-1;;;54293:51:0;;12107:2:1;54293:51:0;;;12089:21:1;12146:2;12126:18;;;12119:30;12185:25;12165:18;;;12158:53;12228:18;;54293:51:0;12079:173:1;54293:51:0;54363:53;54370:6;54402:10;54363:6;:53::i;:::-;54355:81;;;;-1:-1:-1;;;54355:81:0;;17067:2:1;54355:81:0;;;17049:21:1;17106:2;17086:18;;;17079:30;-1:-1:-1;;;17125:18:1;;;17118:45;17180:18;;54355:81:0;17039:165:1;54355:81:0;54452:18;;;;;;;54447:1163;;50341:4;54494:13;35199:10;:17;;35111:113;54494:13;:30;54486:77;;;;-1:-1:-1;;;54486:77:0;;23322:2:1;54486:77:0;;;23304:21:1;23361:2;23341:18;;;23334:30;23400:34;23380:18;;;23373:62;-1:-1:-1;;;23451:18:1;;;23444:32;23493:19;;54486:77:0;23294:224:1;54486:77:0;50664:1;54586:12;:34;;54578:79;;;;-1:-1:-1;;;54578:79:0;;24860:2:1;54578:79:0;;;24842:21:1;;;24879:18;;;24872:30;24938:34;24918:18;;;24911:62;24990:18;;54578:79:0;24832:182:1;54578:79:0;50341:4;54680:50;54716:13;;54680:31;54698:12;54680:13;35199:10;:17;;35111:113;54680:13;:17;;:31::i;:::-;:35;;:50::i;:::-;:68;;54672:128;;;;-1:-1:-1;;;54672:128:0;;;;;;;:::i;:::-;54840:10;54823:28;;;;:16;:28;;;;;;50664:1;;54823:46;;54856:12;54823:32;:46::i;:::-;:68;;54815:109;;;;-1:-1:-1;;;54815:109:0;;13290:2:1;54815:109:0;;;13272:21:1;13329:2;13309:18;;;13302:30;13368;13348:18;;;13341:58;13416:18;;54815:109:0;13262:178:1;54815:109:0;54947:8;;54977:9;;54947:26;;54960:12;54947;:26::i;:::-;:39;54939:83;;;;-1:-1:-1;;;54939:83:0;;15869:2:1;54939:83:0;;;15851:21:1;15908:2;15888:18;;;15881:30;15947:33;15927:18;;;15920:61;15998:18;;54939:83:0;15841:181:1;54939:83:0;55042:9;55037:193;55061:12;55057:1;:16;55037:193;;;55120:10;55103:28;;;;:16;:28;;;;;:33;;55135:1;;55103:28;:33;;55135:1;;55103:33;:::i;:::-;;;;;;;;55159:55;55169:10;55181:32;55199:13;;55181;35199:10;:17;;35111:113;55181:32;55159:9;:55::i;:::-;55075:3;;;;:::i;:::-;;;;55037:193;;54447:1163;50387:4;55278:13;35199:10;:17;;35111:113;55278:13;:23;55270:63;;;;-1:-1:-1;;;55270:63:0;;24151:2:1;55270:63:0;;;24133:21:1;24190:2;24170:18;;;24163:30;24229:29;24209:18;;;24202:57;24276:18;;55270:63:0;24123:177:1;55270:63:0;55356:12;55372:1;55356:17;55348:62;;;;-1:-1:-1;;;55348:62:0;;24860:2:1;55348:62:0;;;24842:21:1;;;24879:18;;;24872:30;24938:34;24918:18;;;24911:62;24990:18;;55348:62:0;24832:182:1;55348:62:0;55454:10;55434:31;;;;:19;:31;;;;;;;;55433:32;55425:69;;;;-1:-1:-1;;;55425:69:0;;24507:2:1;55425:69:0;;;24489:21:1;24546:2;24526:18;;;24519:30;24585:26;24565:18;;;24558:54;24629:18;;55425:69:0;24479:174:1;55425:69:0;55529:10;55509:31;;;;:19;:31;;;;;:38;;-1:-1:-1;;55509:38:0;55543:4;55509:38;;;55562:36;;55584:13;35199:10;:17;;35111:113;53248:680;53369:8;;;;;;;53361:43;;;;-1:-1:-1;;;53361:43:0;;19018:2:1;53361:43:0;;;19000:21:1;19057:2;19037:18;;;19030:30;-1:-1:-1;;;19076:18:1;;;19069:52;19138:18;;53361:43:0;18990:172:1;53361:43:0;53424:15;;;;;;;53423:16;53415:52;;;;-1:-1:-1;;;53415:52:0;;22970:2:1;53415:52:0;;;22952:21:1;23009:2;22989:18;;;22982:30;23048:25;23028:18;;;23021:53;23091:18;;53415:52:0;22942:173:1;53415:52:0;50292:1;53486:12;:32;;53478:68;;;;-1:-1:-1;;;53478:68:0;;14411:2:1;53478:68:0;;;14393:21:1;14450:2;14430:18;;;14423:30;14489:25;14469:18;;;14462:53;14532:18;;53478:68:0;14383:173:1;53478:68:0;50341:4;53565:50;53601:13;;53565:31;53583:12;53565:13;35199:10;:17;;35111:113;53565:50;:68;;53557:128;;;;-1:-1:-1;;;53557:128:0;;;;;;;:::i;:::-;53704:8;;53734:9;;53704:26;;53717:12;53704;:26::i;:::-;:39;53696:83;;;;-1:-1:-1;;;53696:83:0;;15869:2:1;53696:83:0;;;15851:21:1;15908:2;15888:18;;;15881:30;15947:33;15927:18;;;15920:61;15998:18;;53696:83:0;15841:181:1;53696:83:0;53804:6;53800:121;53820:12;53816:1;:16;53800:121;;;53854:55;53864:10;53876:32;53894:13;;53876;35199:10;:17;;35111:113;53854:55;53834:3;;;;:::i;:::-;;;;53800:121;;21591:104;21647:13;21680:7;21673:14;;;;;:::i;57902:786::-;57977:4;58017;57977;58034:531;58058:5;:12;58054:1;:16;58034:531;;;58092:20;58115:5;58121:1;58115:8;;;;;;-1:-1:-1;;;58115:8:0;;;;;;;;;;;;;;;58092:31;;58172:12;58156;:28;58152:402;;58306:44;;;;;;9649:19:1;;;9684:12;;;9677:28;;;58299:52:0;;9721:12:1;;58306:44:0;;;-1:-1:-1;;58306:44:0;;;;;;;;;;58299:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58284:67;;58152:402;;;58493:44;;;;;;9649:19:1;;;9684:12;;;9677:28;;;58486:52:0;;9721:12:1;;58493:44:0;;;-1:-1:-1;;58493:44:0;;;;;;;;;;58486:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58471:67;;58152:402;-1:-1:-1;58072:3:0;;;;:::i;:::-;;;;58034:531;;;-1:-1:-1;58676:4:0;;58660:20;;57902:786;-1:-1:-1;;;57902:786:0:o;51580:153::-;48601:6;;-1:-1:-1;;;;;48601:6:0;16064:10;48748:23;48740:68;;;;-1:-1:-1;;;48740:68:0;;;;;;;:::i;:::-;51695:18:::1;:30:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;51695:30:0;;::::1;::::0;;;::::1;::::0;;51580:153::o;23274:295::-;-1:-1:-1;;;;;23377:24:0;;16064:10;23377:24;;23369:62;;;;-1:-1:-1;;;23369:62:0;;15168:2:1;23369:62:0;;;15150:21:1;15207:2;15187:18;;;15180:30;15246:27;15226:18;;;15219:55;15291:18;;23369:62:0;15140:175:1;23369:62:0;16064:10;23444:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;23444:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;23444:53:0;;;;;;;;;;23513:48;;11447:41:1;;;23444:42:0;;16064:10;23513:48;;11420:18:1;23513:48:0;;;;;;;23274:295;;:::o;24537:328::-;24712:41;16064:10;24745:7;24712:18;:41::i;:::-;24704:103;;;;-1:-1:-1;;;24704:103:0;;;;;;;:::i;:::-;24818:39;24832:4;24838:2;24842:7;24851:5;24818:13;:39::i;56057:604::-;48601:6;;-1:-1:-1;;;;;48601:6:0;16064:10;48748:23;48740:68;;;;-1:-1:-1;;;48740:68:0;;;;;;;:::i;:::-;56234:8:::1;:15;56220:3;:10;:29;56212:65;;;::::0;-1:-1:-1;;;56212:65:0;;22618:2:1;56212:65:0::1;::::0;::::1;22600:21:1::0;22657:2;22637:18;;;22630:30;22696:25;22676:18;;;22669:53;22739:18;;56212:65:0::1;22590:173:1::0;56212:65:0::1;56292:9;56288:366;56311:3;:10;56307:1;:14;56288:366;;;50341:4;56350:8;56359:1;56350:11;;;;;;-1:-1:-1::0;;;56350:11:0::1;;;;;;;;;;;;;;;:29;;56342:99;;;::::0;-1:-1:-1;;;56342:99:0;;23725:2:1;56342:99:0::1;::::0;::::1;23707:21:1::0;23764:2;23744:18;;;23737:30;23803:34;23783:18;;;23776:62;23874:27;23854:18;;;23847:55;23919:19;;56342:99:0::1;23697:247:1::0;56342:99:0::1;50387:4;56464:8;56473:1;56464:11;;;;;;-1:-1:-1::0;;;56464:11:0::1;;;;;;;;;;;;;;;:21;56456:90;;;;-1:-1:-1::0;;;56456:90:0::1;;;;;;;:::i;:::-;56561:30;56571:3;56575:1;56571:6;;;;;;-1:-1:-1::0;;;56571:6:0::1;;;;;;;;;;;;;;;56579:8;56588:1;56579:11;;;;;;-1:-1:-1::0;;;56579:11:0::1;;;;;;;;;;;;;;;56561:9;:30::i;:::-;56622:13;::::0;:20:::1;::::0;56640:1:::1;56622:17;:20::i;:::-;56606:13;:36:::0;56323:3;::::1;::::0;::::1;:::i;:::-;;;;56288:366;;56805:441:::0;26440:4;26464:16;;;:7;:16;;;;;;56944:13;;-1:-1:-1;;;;;26464:16:0;56976:77;;;;-1:-1:-1;;;56976:77:0;;20553:2:1;56976:77:0;;;20535:21:1;20592:2;20572:18;;;20565:30;20631:34;20611:18;;;20604:62;-1:-1:-1;;;20682:18:1;;;20675:45;20737:19;;56976:77:0;20525:237:1;56976:77:0;57069:6;;;;57064:175;;57123:8;57106:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;57092:41;;56805:441;;;:::o;57064:175::-;57197:7;57206:19;:8;:17;:19::i;:::-;57180:46;;;;;;;;;:::i;57064:175::-;56805:441;;;:::o;51805:197::-;48601:6;;-1:-1:-1;;;;;48601:6:0;16064:10;48748:23;48740:68;;;;-1:-1:-1;;;48740:68:0;;;;;;;:::i;:::-;51949:20;;::::1;::::0;:8:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;51980:14:0;;::::1;::::0;:7:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;57803:91::-:0;48601:6;;-1:-1:-1;;;;;48601:6:0;16064:10;48748:23;48740:68;;;;-1:-1:-1;;;48740:68:0;;;;;;;:::i;:::-;57865:4:::1;:21:::0;57803:91::o;49428:192::-;48601:6;;-1:-1:-1;;;;;48601:6:0;16064:10;48748:23;48740:68;;;;-1:-1:-1;;;48740:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49517:22:0;::::1;49509:73;;;::::0;-1:-1:-1;;;49509:73:0;;13647:2:1;49509:73:0::1;::::0;::::1;13629:21:1::0;13686:2;13666:18;;;13659:30;13725:34;13705:18;;;13698:62;-1:-1:-1;;;13776:18:1;;;13769:36;13822:19;;49509:73:0::1;13619:228:1::0;49509:73:0::1;49593:19;49603:8;49593:9;:19::i;:::-;49428:192:::0;:::o;34471:224::-;34573:4;-1:-1:-1;;;;;;34597:50:0;;-1:-1:-1;;;34597:50:0;;:90;;;34651:36;34675:11;34651:23;:36::i;30357:174::-;30432:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30432:29:0;-1:-1:-1;;;;;30432:29:0;;;;;;;;:24;;30486:23;30432:24;30486:14;:23::i;:::-;-1:-1:-1;;;;;30477:46:0;;;;;;;;;;;30357:174;;:::o;26669:348::-;26762:4;26464:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26464:16:0;26779:73;;;;-1:-1:-1;;;26779:73:0;;16229:2:1;26779:73:0;;;16211:21:1;16268:2;16248:18;;;16241:30;16307:34;16287:18;;;16280:62;-1:-1:-1;;;16358:18:1;;;16351:42;16410:19;;26779:73:0;16201:234:1;26779:73:0;26863:13;26879:23;26894:7;26879:14;:23::i;:::-;26863:39;;26932:5;-1:-1:-1;;;;;26921:16:0;:7;-1:-1:-1;;;;;26921:16:0;;:51;;;;26965:7;-1:-1:-1;;;;;26941:31:0;:20;26953:7;26941:11;:20::i;:::-;-1:-1:-1;;;;;26941:31:0;;26921:51;:87;;;-1:-1:-1;;;;;;23761:25:0;;;23737:4;23761:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;26976:32;26913:96;26669:348;-1:-1:-1;;;;26669:348:0:o;29661:578::-;29820:4;-1:-1:-1;;;;;29793:31:0;:23;29808:7;29793:14;:23::i;:::-;-1:-1:-1;;;;;29793:31:0;;29785:85;;;;-1:-1:-1;;;29785:85:0;;20143:2:1;29785:85:0;;;20125:21:1;20182:2;20162:18;;;20155:30;20221:34;20201:18;;;20194:62;-1:-1:-1;;;20272:18:1;;;20265:39;20321:19;;29785:85:0;20115:231:1;29785:85:0;-1:-1:-1;;;;;29889:16:0;;29881:65;;;;-1:-1:-1;;;29881:65:0;;14763:2:1;29881:65:0;;;14745:21:1;14802:2;14782:18;;;14775:30;14841:34;14821:18;;;14814:62;-1:-1:-1;;;14892:18:1;;;14885:34;14936:19;;29881:65:0;14735:226:1;29881:65:0;29959:39;29980:4;29986:2;29990:7;29959:20;:39::i;:::-;30063:29;30080:1;30084:7;30063:8;:29::i;:::-;-1:-1:-1;;;;;30105:15:0;;;;;;:9;:15;;;;;:20;;30124:1;;30105:15;:20;;30124:1;;30105:20;:::i;:::-;;;;-1:-1:-1;;;;;;;30136:13:0;;;;;;:9;:13;;;;;:18;;30153:1;;30136:13;:18;;30153:1;;30136:18;:::i;:::-;;;;-1:-1:-1;;30165:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30165:21:0;-1:-1:-1;;;;;30165:21:0;;;;;;;;;30204:27;;30165:16;;30204:27;;;;;;;29661:578;;;:::o;27359:110::-;27435:26;27445:2;27449:7;27435:26;;;;;;;;;;;;:9;:26::i;49628:173::-;49703:6;;;-1:-1:-1;;;;;49720:17:0;;;-1:-1:-1;;;;;;49720:17:0;;;;;;;49753:40;;49703:6;;;49720:17;49703:6;;49753:40;;49684:16;;49753:40;49628:173;;:::o;43390:98::-;43448:7;43475:5;43479:1;43475;:5;:::i;:::-;43468:12;43390:98;-1:-1:-1;;;43390:98:0:o;43771:::-;43829:7;43856:5;43860:1;43856;:5;:::i;44128:98::-;44186:7;44213:5;44217:1;44213;:5;:::i;25747:315::-;25904:28;25914:4;25920:2;25924:7;25904:9;:28::i;:::-;25951:48;25974:4;25980:2;25984:7;25993:5;25951:22;:48::i;:::-;25943:111;;;;-1:-1:-1;;;25943:111:0;;;;;;;:::i;16486:723::-;16542:13;16763:10;16759:53;;-1:-1:-1;;16790:10:0;;;;;;;;;;;;-1:-1:-1;;;16790:10:0;;;;;16486:723::o;16759:53::-;16837:5;16822:12;16878:78;16885:9;;16878:78;;16911:8;;;;:::i;:::-;;-1:-1:-1;16934:10:0;;-1:-1:-1;16942:2:0;16934:10;;:::i;:::-;;;16878:78;;;16966:19;16998:6;16988:17;;;;;;-1:-1:-1;;;16988:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16988:17:0;;16966:39;;17016:154;17023:10;;17016:154;;17050:11;17060:1;17050:11;;:::i;:::-;;-1:-1:-1;17119:10:0;17127:2;17119:5;:10;:::i;:::-;17106:24;;:2;:24;:::i;:::-;17093:39;;17076:6;17083;17076:14;;;;;;-1:-1:-1;;;17076:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;17076:56:0;;;;;;;;-1:-1:-1;17147:11:0;17156:2;17147:11;;:::i;:::-;;;17016:154;;20477:305;20579:4;-1:-1:-1;;;;;;20616:40:0;;-1:-1:-1;;;20616:40:0;;:105;;-1:-1:-1;;;;;;;20673:48:0;;-1:-1:-1;;;20673:48:0;20616:105;:158;;;-1:-1:-1;;;;;;;;;;19127:40:0;;;20738:36;19018:157;57546:249;57739:48;57766:5;57773:3;57778:8;57739:26;:48::i;27696:321::-;27826:18;27832:2;27836:7;27826:5;:18::i;:::-;27877:54;27908:1;27912:2;27916:7;27925:5;27877:22;:54::i;:::-;27855:154;;;;-1:-1:-1;;;27855:154:0;;;;;;;:::i;31096:799::-;31251:4;-1:-1:-1;;;;;31272:13:0;;8374:20;8422:8;31268:620;;31308:72;;-1:-1:-1;;;31308:72:0;;-1:-1:-1;;;;;31308:36:0;;;;;:72;;16064:10;;31359:4;;31365:7;;31374:5;;31308:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31308:72:0;;;;;;;;-1:-1:-1;;31308:72:0;;;;;;;;;;;;:::i;:::-;;;31304:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31550:13:0;;31546:272;;31593:60;;-1:-1:-1;;;31593:60:0;;;;;;;:::i;31546:272::-;31768:6;31762:13;31753:6;31749:2;31745:15;31738:38;31304:529;-1:-1:-1;;;;;;31431:51:0;-1:-1:-1;;;31431:51:0;;-1:-1:-1;31424:58:0;;31268:620;-1:-1:-1;31872:4:0;31096:799;;;;;;:::o;36147:589::-;-1:-1:-1;;;;;36353:18:0;;36349:187;;36388:40;36420:7;37563:10;:17;;37536:24;;;;:15;:24;;;;;:44;;;37591:24;;;;;;;;;;;;37459:164;36388:40;36349:187;;;36458:2;-1:-1:-1;;;;;36450:10:0;:4;-1:-1:-1;;;;;36450:10:0;;36446:90;;36477:47;36510:4;36516:7;36477:32;:47::i;:::-;-1:-1:-1;;;;;36550:16:0;;36546:183;;36583:45;36620:7;36583:36;:45::i;36546:183::-;36656:4;-1:-1:-1;;;;;36650:10:0;:2;-1:-1:-1;;;;;36650:10:0;;36646:83;;36677:40;36705:2;36709:7;36677:27;:40::i;28353:382::-;-1:-1:-1;;;;;28433:16:0;;28425:61;;;;-1:-1:-1;;;28425:61:0;;18657:2:1;28425:61:0;;;18639:21:1;;;18676:18;;;18669:30;18735:34;18715:18;;;18708:62;18787:18;;28425:61:0;18629:182:1;28425:61:0;26440:4;26464:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26464:16:0;:30;28497:58;;;;-1:-1:-1;;;28497:58:0;;14054:2:1;28497:58:0;;;14036:21:1;14093:2;14073:18;;;14066:30;14132;14112:18;;;14105:58;14180:18;;28497:58:0;14026:178:1;28497:58:0;28568:45;28597:1;28601:2;28605:7;28568:20;:45::i;:::-;-1:-1:-1;;;;;28626:13:0;;;;;;:9;:13;;;;;:18;;28643:1;;28626:13;:18;;28643:1;;28626:18;:::i;:::-;;;;-1:-1:-1;;28655:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28655:21:0;-1:-1:-1;;;;;28655:21:0;;;;;;;;28694:33;;28655:16;;;28694:33;;28655:16;;28694:33;28353:382;;:::o;38250:988::-;38516:22;38566:1;38541:22;38558:4;38541:16;:22::i;:::-;:26;;;;:::i;:::-;38578:18;38599:26;;;:17;:26;;;;;;38516:51;;-1:-1:-1;38732:28:0;;;38728:328;;-1:-1:-1;;;;;38799:18:0;;38777:19;38799:18;;;:12;:18;;;;;;;;:34;;;;;;;;;38850:30;;;;;;:44;;;38967:30;;:17;:30;;;;;:43;;;38728:328;-1:-1:-1;39152:26:0;;;;:17;:26;;;;;;;;39145:33;;;-1:-1:-1;;;;;39196:18:0;;;;;:12;:18;;;;;:34;;;;;;;39189:41;38250:988::o;39533:1079::-;39811:10;:17;39786:22;;39811:21;;39831:1;;39811:21;:::i;:::-;39843:18;39864:24;;;:15;:24;;;;;;40237:10;:26;;39786:46;;-1:-1:-1;39864:24:0;;39786:46;;40237:26;;;;-1:-1:-1;;;40237:26:0;;;;;;;;;;;;;;;;;40215:48;;40301:11;40276:10;40287;40276:22;;;;;;-1:-1:-1;;;40276:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;40381:28;;;:15;:28;;;;;;;:41;;;40553:24;;;;;40546:31;40588:10;:16;;;;;-1:-1:-1;;;40588:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;39533:1079;;;;:::o;37037:221::-;37122:14;37139:20;37156:2;37139:16;:20::i;:::-;-1:-1:-1;;;;;37170:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;37215:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;37037:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:2;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:2;;;309:1;306;299:12;268:2;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;88:332;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:2;;588:1;585;578:12;603:693;657:5;710:3;703:4;695:6;691:17;687:27;677:2;;732:5;725;718:20;677:2;772:6;759:20;798:4;822:60;838:43;878:2;838:43;:::i;:::-;822:60;:::i;:::-;904:3;928:2;923:3;916:15;956:2;951:3;947:12;940:19;;991:2;983:6;979:15;1043:3;1038:2;1032;1029:1;1025:10;1017:6;1013:23;1009:32;1006:41;1003:2;;;1064:5;1057;1050:20;1003:2;1090:5;1104:163;1118:2;1115:1;1112:9;1104:163;;;1175:17;;1163:30;;1213:12;;;;1245;;;;1136:1;1129:9;1104:163;;;-1:-1:-1;1285:5:1;;667:629;-1:-1:-1;;;;;;;667:629:1:o;1999:160::-;2064:20;;2120:13;;2113:21;2103:32;;2093:2;;2149:1;2146;2139:12;2164:229;2207:5;2260:3;2253:4;2245:6;2241:17;2237:27;2227:2;;2282:5;2275;2268:20;2227:2;2308:79;2383:3;2374:6;2361:20;2354:4;2346:6;2342:17;2308:79;:::i;2398:196::-;2457:6;2510:2;2498:9;2489:7;2485:23;2481:32;2478:2;;;2531:6;2523;2516:22;2478:2;2559:29;2578:9;2559:29;:::i;2599:270::-;2667:6;2675;2728:2;2716:9;2707:7;2703:23;2699:32;2696:2;;;2749:6;2741;2734:22;2696:2;2777:29;2796:9;2777:29;:::i;:::-;2767:39;;2825:38;2859:2;2848:9;2844:18;2825:38;:::i;:::-;2815:48;;2686:183;;;;;:::o;2874:338::-;2951:6;2959;2967;3020:2;3008:9;2999:7;2995:23;2991:32;2988:2;;;3041:6;3033;3026:22;2988:2;3069:29;3088:9;3069:29;:::i;:::-;3059:39;;3117:38;3151:2;3140:9;3136:18;3117:38;:::i;:::-;3107:48;;3202:2;3191:9;3187:18;3174:32;3164:42;;2978:234;;;;;:::o;3217:696::-;3312:6;3320;3328;3336;3389:3;3377:9;3368:7;3364:23;3360:33;3357:2;;;3411:6;3403;3396:22;3357:2;3439:29;3458:9;3439:29;:::i;:::-;3429:39;;3487:38;3521:2;3510:9;3506:18;3487:38;:::i;:::-;3477:48;;3572:2;3561:9;3557:18;3544:32;3534:42;;3627:2;3616:9;3612:18;3599:32;3654:18;3646:6;3643:30;3640:2;;;3691:6;3683;3676:22;3640:2;3719:22;;3772:4;3764:13;;3760:27;-1:-1:-1;3750:2:1;;3806:6;3798;3791:22;3750:2;3834:73;3899:7;3894:2;3881:16;3876:2;3872;3868:11;3834:73;:::i;:::-;3824:83;;;3347:566;;;;;;;:::o;3918:264::-;3983:6;3991;4044:2;4032:9;4023:7;4019:23;4015:32;4012:2;;;4065:6;4057;4050:22;4012:2;4093:29;4112:9;4093:29;:::i;:::-;4083:39;;4141:35;4172:2;4161:9;4157:18;4141:35;:::i;4187:264::-;4255:6;4263;4316:2;4304:9;4295:7;4291:23;4287:32;4284:2;;;4337:6;4329;4322:22;4284:2;4365:29;4384:9;4365:29;:::i;:::-;4355:39;4441:2;4426:18;;;;4413:32;;-1:-1:-1;;;4274:177:1:o;4456:1212::-;4574:6;4582;4635:2;4623:9;4614:7;4610:23;4606:32;4603:2;;;4656:6;4648;4641:22;4603:2;4701:9;4688:23;4730:18;4771:2;4763:6;4760:14;4757:2;;;4792:6;4784;4777:22;4757:2;4835:6;4824:9;4820:22;4810:32;;4880:7;4873:4;4869:2;4865:13;4861:27;4851:2;;4907:6;4899;4892:22;4851:2;4948;4935:16;4970:4;4994:60;5010:43;5050:2;5010:43;:::i;4994:60::-;5076:3;5100:2;5095:3;5088:15;5128:2;5123:3;5119:12;5112:19;;5159:2;5155;5151:11;5207:7;5202:2;5196;5193:1;5189:10;5185:2;5181:19;5177:28;5174:41;5171:2;;;5233:6;5225;5218:22;5171:2;5260:6;5251:15;;5275:169;5289:2;5286:1;5283:9;5275:169;;;5346:23;5365:3;5346:23;:::i;:::-;5334:36;;5307:1;5300:9;;;;;5390:12;;;;5422;;5275:169;;;-1:-1:-1;5463:5:1;-1:-1:-1;;5506:18:1;;5493:32;;-1:-1:-1;;5537:16:1;;;5534:2;;;5571:6;5563;5556:22;5534:2;;5599:63;5654:7;5643:8;5632:9;5628:24;5599:63;:::i;:::-;5589:73;;;4593:1075;;;;;:::o;5673:436::-;5766:6;5774;5827:2;5815:9;5806:7;5802:23;5798:32;5795:2;;;5848:6;5840;5833:22;5795:2;5893:9;5880:23;5926:18;5918:6;5915:30;5912:2;;;5963:6;5955;5948:22;5912:2;5991:61;6044:7;6035:6;6024:9;6020:22;5991:61;:::i;:::-;5981:71;6099:2;6084:18;;;;6071:32;;-1:-1:-1;;;;5785:324:1:o;6114:190::-;6170:6;6223:2;6211:9;6202:7;6198:23;6194:32;6191:2;;;6244:6;6236;6229:22;6191:2;6272:26;6288:9;6272:26;:::i;6309:194::-;6379:6;6432:2;6420:9;6411:7;6407:23;6403:32;6400:2;;;6453:6;6445;6438:22;6400:2;-1:-1:-1;6481:16:1;;6390:113;-1:-1:-1;6390:113:1:o;6508:255::-;6566:6;6619:2;6607:9;6598:7;6594:23;6590:32;6587:2;;;6640:6;6632;6625:22;6587:2;6684:9;6671:23;6703:30;6727:5;6703:30;:::i;6768:259::-;6837:6;6890:2;6878:9;6869:7;6865:23;6861:32;6858:2;;;6911:6;6903;6896:22;6858:2;6948:9;6942:16;6967:30;6991:5;6967:30;:::i;7032:573::-;7120:6;7128;7181:2;7169:9;7160:7;7156:23;7152:32;7149:2;;;7202:6;7194;7187:22;7149:2;7247:9;7234:23;7276:18;7317:2;7309:6;7306:14;7303:2;;;7338:6;7330;7323:22;7303:2;7366:50;7408:7;7399:6;7388:9;7384:22;7366:50;:::i;:::-;7356:60;;7469:2;7458:9;7454:18;7441:32;7425:48;;7498:2;7488:8;7485:16;7482:2;;;7519:6;7511;7504:22;7482:2;;7547:52;7591:7;7580:8;7569:9;7565:24;7547:52;:::i;7610:190::-;7669:6;7722:2;7710:9;7701:7;7697:23;7693:32;7690:2;;;7743:6;7735;7728:22;7690:2;-1:-1:-1;7771:23:1;;7680:120;-1:-1:-1;7680:120:1:o;7805:436::-;7898:6;7906;7959:2;7947:9;7938:7;7934:23;7930:32;7927:2;;;7980:6;7972;7965:22;7927:2;8021:9;8008:23;7998:33;;8082:2;8071:9;8067:18;8054:32;8109:18;8101:6;8098:30;8095:2;;;8146:6;8138;8131:22;8095:2;8174:61;8227:7;8218:6;8207:9;8203:22;8174:61;:::i;8246:257::-;8287:3;8325:5;8319:12;8352:6;8347:3;8340:19;8368:63;8424:6;8417:4;8412:3;8408:14;8401:4;8394:5;8390:16;8368:63;:::i;:::-;8485:2;8464:15;-1:-1:-1;;8460:29:1;8451:39;;;;8492:4;8447:50;;8295:208;-1:-1:-1;;8295:208:1:o;8508:979::-;8593:12;;8558:3;;8650:1;8670:18;;;;8723;;;;8750:2;;8804:4;8796:6;8792:17;8782:27;;8750:2;8830;8878;8870:6;8867:14;8847:18;8844:38;8841:2;;;-1:-1:-1;;;8905:33:1;;8961:4;8958:1;8951:15;8991:4;8912:3;8979:17;8841:2;9022:18;9049:104;;;;9167:1;9162:319;;;;9015:466;;9049:104;-1:-1:-1;;9082:24:1;;9070:37;;9127:16;;;;-1:-1:-1;9049:104:1;;9162:319;25716:4;25735:17;;;25785:4;25769:21;;9256:1;9270:165;9284:6;9281:1;9278:13;9270:165;;;9362:14;;9349:11;;;9342:35;9405:16;;;;9299:10;;9270:165;;;9274:3;;9464:6;9459:3;9455:16;9448:23;;9015:466;;;;;;;8566:921;;;;:::o;9744:274::-;9873:3;9911:6;9905:13;9927:53;9973:6;9968:3;9961:4;9953:6;9949:17;9927:53;:::i;:::-;9996:16;;;;;9881:137;-1:-1:-1;;9881:137:1:o;10023:197::-;10151:3;10176:38;10210:3;10202:6;10176:38;:::i;10225:376::-;10401:3;10429:38;10463:3;10455:6;10429:38;:::i;:::-;10496:6;10490:13;10512:52;10557:6;10553:2;10546:4;10538:6;10534:17;10512:52;:::i;:::-;10580:15;;10409:192;-1:-1:-1;;;;10409:192:1:o;10814:488::-;-1:-1:-1;;;;;11083:15:1;;;11065:34;;11135:15;;11130:2;11115:18;;11108:43;11182:2;11167:18;;11160:34;;;11230:3;11225:2;11210:18;;11203:31;;;11008:4;;11251:45;;11276:19;;11268:6;11251:45;:::i;:::-;11243:53;11017:285;-1:-1:-1;;;;;;11017:285:1:o;11681:219::-;11830:2;11819:9;11812:21;11793:4;11850:44;11890:2;11879:9;11875:18;11867:6;11850:44;:::i;12669:414::-;12871:2;12853:21;;;12910:2;12890:18;;;12883:30;12949:34;12944:2;12929:18;;12922:62;-1:-1:-1;;;13015:2:1;13000:18;;12993:48;13073:3;13058:19;;12843:240::o;17620:420::-;17822:2;17804:21;;;17861:2;17841:18;;;17834:30;17900:34;17895:2;17880:18;;17873:62;17971:26;17966:2;17951:18;;17944:54;18030:3;18015:19;;17794:246::o;19580:356::-;19782:2;19764:21;;;19801:18;;;19794:30;19860:34;19855:2;19840:18;;19833:62;19927:2;19912:18;;19754:182::o;21169:411::-;21371:2;21353:21;;;21410:2;21390:18;;;21383:30;21449:34;21444:2;21429:18;;21422:62;-1:-1:-1;;;21515:2:1;21500:18;;21493:45;21570:3;21555:19;;21343:237::o;21585:413::-;21787:2;21769:21;;;21826:2;21806:18;;;21799:30;21865:34;21860:2;21845:18;;21838:62;-1:-1:-1;;;21931:2:1;21916:18;;21909:47;21988:3;21973:19;;21759:239::o;25201:275::-;25272:2;25266:9;25337:2;25318:13;;-1:-1:-1;;25314:27:1;25302:40;;25372:18;25357:34;;25393:22;;;25354:62;25351:2;;;25419:18;;:::i;:::-;25455:2;25448:22;25246:230;;-1:-1:-1;25246:230:1:o;25481:183::-;25541:4;25574:18;25566:6;25563:30;25560:2;;;25596:18;;:::i;:::-;-1:-1:-1;25641:1:1;25637:14;25653:4;25633:25;;25550:114::o;25801:128::-;25841:3;25872:1;25868:6;25865:1;25862:13;25859:2;;;25878:18;;:::i;:::-;-1:-1:-1;25914:9:1;;25849:80::o;25934:120::-;25974:1;26000;25990:2;;26005:18;;:::i;:::-;-1:-1:-1;26039:9:1;;25980:74::o;26059:168::-;26099:7;26165:1;26161;26157:6;26153:14;26150:1;26147:21;26142:1;26135:9;26128:17;26124:45;26121:2;;;26172:18;;:::i;:::-;-1:-1:-1;26212:9:1;;26111:116::o;26232:125::-;26272:4;26300:1;26297;26294:8;26291:2;;;26305:18;;:::i;:::-;-1:-1:-1;26342:9:1;;26281:76::o;26362:258::-;26434:1;26444:113;26458:6;26455:1;26452:13;26444:113;;;26534:11;;;26528:18;26515:11;;;26508:39;26480:2;26473:10;26444:113;;;26575:6;26572:1;26569:13;26566:2;;;-1:-1:-1;;26610:1:1;26592:16;;26585:27;26415:205::o;26625:380::-;26704:1;26700:12;;;;26747;;;26768:2;;26822:4;26814:6;26810:17;26800:27;;26768:2;26875;26867:6;26864:14;26844:18;26841:38;26838:2;;;26921:10;26916:3;26912:20;26909:1;26902:31;26956:4;26953:1;26946:15;26984:4;26981:1;26974:15;26838:2;;26680:325;;;:::o;27010:135::-;27049:3;-1:-1:-1;;27070:17:1;;27067:2;;;27090:18;;:::i;:::-;-1:-1:-1;27137:1:1;27126:13;;27057:88::o;27150:201::-;27188:3;27216:10;27261:2;27254:5;27250:14;27288:2;27279:7;27276:15;27273:2;;;27294:18;;:::i;:::-;27343:1;27330:15;;27196:155;-1:-1:-1;;;27196:155:1:o;27356:112::-;27388:1;27414;27404:2;;27419:18;;:::i;:::-;-1:-1:-1;27453:9:1;;27394:74::o;27473:127::-;27534:10;27529:3;27525:20;27522:1;27515:31;27565:4;27562:1;27555:15;27589:4;27586:1;27579:15;27605:127;27666:10;27661:3;27657:20;27654:1;27647:31;27697:4;27694:1;27687:15;27721:4;27718:1;27711:15;27737:127;27798:10;27793:3;27789:20;27786:1;27779:31;27829:4;27826:1;27819:15;27853:4;27850:1;27843:15;27869:131;-1:-1:-1;;;;;;27943:32:1;;27933:43;;27923:2;;27990:1;27987;27980:12
Swarm Source
ipfs://b60e80f11a71d2178b5d8621883f863cbac211e979b49f8df69b74479d0281fa
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.