Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
NFT
Overview
Max Total Supply
8,715 HVN
Holders
2,778
Market
Volume (24H)
0.0346 ETH
Min Price (24H)
$48.80 @ 0.017288 ETH
Max Price (24H)
$48.80 @ 0.017288 ETH
Other Info
Token Contract
Balance
2 HVNLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
HeavenComputer
Compiler Version
v0.8.3+commit.8d00100c
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-08-17 */ // Sources flattened with hardhat v2.6.0 https://hardhat.org // File @openzeppelin/contracts/utils/introspection/[email protected] // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File @openzeppelin/contracts/token/ERC721/[email protected] pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private 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] pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/token/ERC721/[email protected] pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).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] pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File contracts/HeavenComputer.sol // contracts/HeavenComputer.sol pragma solidity >=0.7.0 <0.9.0; contract HeavenComputer is ERC721Enumerable { event Mint( address indexed _to, uint256 indexed _tokenId, uint256 indexed _collectionId, uint256 _invocations, uint256 _value ); struct Collection { string name; uint256 tokenPriceInWei; uint256 invocations; uint256 maxInvocations; string script; uint256 hash; bool paused; bool locked; } address public admin; uint256 public nextCollectionId; uint256 constant ONE_MILLION = 1000000; mapping(uint256 => string) private collectionIdToBaseURI; mapping(uint256 => Collection) collections; mapping(uint256 => uint256) public tokenIdToCollectionId; mapping(uint256 => uint256[]) public collectionIdToTokenIds; mapping(uint256 => bytes32[]) public tokenIdToHashes; mapping(bytes32 => uint256) internal hashToTokenId; constructor(string memory _tokenName, string memory _tokenSymbol) ERC721(_tokenName, _tokenSymbol) { admin = msg.sender; } modifier onlyValidTokenId(uint256 _tokenId) { require(_exists(_tokenId), "Token ID does not exist"); _; } modifier onlyUnlocked(uint256 _collectionId) { require(!collections[_collectionId].locked, "Only unlocked collections"); _; } modifier onlyAdmin() { require(msg.sender == admin, "Only admin"); _; } function purchase(uint256 _collectionId) public payable returns (uint256 _tokenId) { return purchaseTo(msg.sender, _collectionId); } function purchaseTo(address _to, uint256 _collectionId) public payable returns (uint256 _tokenId) { require(msg.value >= collections[_collectionId].tokenPriceInWei, "Must send at least current price for token"); require(collections[_collectionId].invocations+1 <= collections[_collectionId].maxInvocations, "Must not exceed maximum invocations"); require(!collections[_collectionId].paused || msg.sender == admin, "Purchases must not be paused"); uint256 tokenId = _mintToken(_to, _collectionId); _splitFunds(_collectionId); return tokenId; } function _mintToken(address _to, uint256 _collectionId) internal returns (uint256 _tokenId) { uint256 tokenIdToBe = (_collectionId * ONE_MILLION) + collections[_collectionId].invocations; collections[_collectionId].invocations = collections[_collectionId].invocations+1; bytes32 newHash = keccak256(abi.encodePacked(collections[_collectionId].invocations, block.number, msg.sender)); tokenIdToHashes[tokenIdToBe].push(newHash); hashToTokenId[newHash] = tokenIdToBe; _mint(_to, tokenIdToBe); tokenIdToCollectionId[tokenIdToBe] = _collectionId; collectionIdToTokenIds[_collectionId].push(tokenIdToBe); emit Mint(_to, tokenIdToBe, _collectionId, collections[_collectionId].invocations, collections[_collectionId].tokenPriceInWei); return tokenIdToBe; } function _splitFunds(uint256 _collectionId) internal { if (msg.value > 0) { uint256 tokenPriceInWei = collections[_collectionId].tokenPriceInWei; uint256 refund = msg.value - tokenPriceInWei; if (refund > 0) { payable(msg.sender).transfer(refund); } payable(admin).transfer(tokenPriceInWei); } } function lockCollection(uint256 _collectionId) public onlyAdmin onlyUnlocked(_collectionId) { collections[_collectionId].locked = true; } function pauseCollection(uint256 _collectionId) public onlyAdmin { collections[_collectionId].paused = !collections[_collectionId].paused; } function addCollection(string memory _name, uint256 _tokenPriceInWei, uint256 _maxInvocations) public onlyAdmin { uint256 collectionId = nextCollectionId; collections[collectionId].name = _name; collections[collectionId].tokenPriceInWei = _tokenPriceInWei; collections[collectionId].maxInvocations = _maxInvocations; collections[collectionId].paused=true; nextCollectionId = nextCollectionId+1; } function addCollectionScript(uint256 _collectionId, string memory _script) onlyUnlocked(_collectionId) onlyAdmin public { collections[_collectionId].script = _script; } function addBaseURI(string memory _newBaseURI, uint256 _collectionId) onlyUnlocked(_collectionId) onlyAdmin public { collectionIdToBaseURI[_collectionId] = _newBaseURI; } function viewCollectionDetails(uint256 _collectionId) public view returns (string memory name, uint256 tokenPriceInWei, uint256 invocations, uint256 maxInvocations, bool paused, bool locked) { name = collections[_collectionId].name; tokenPriceInWei = collections[_collectionId].tokenPriceInWei; maxInvocations = collections[_collectionId].maxInvocations; invocations = collections[_collectionId].invocations; paused = collections[_collectionId].paused; locked = collections[_collectionId].locked; } function viewCollectionScript(uint256 _collectionId) public view returns (string memory){ return collections[_collectionId].script; } function viewAllCollectionTokens(uint _collectionId) public view returns (uint256[] memory){ return collectionIdToTokenIds[_collectionId]; } function contractURI() public pure returns (string memory) { return string("ipfs://QmeMAyCb5VVigXkb9MFhpPLXkbRGUV2ECYoc39J4WBq7JA"); } function tokenURI(uint256 _tokenId) public view onlyValidTokenId(_tokenId) override returns (string memory) { return string(abi.encodePacked(collectionIdToBaseURI[tokenIdToCollectionId[_tokenId]], "/token/", Strings.toString(_tokenId))); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_collectionId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_invocations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"},{"internalType":"uint256","name":"_collectionId","type":"uint256"}],"name":"addBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"uint256","name":"_tokenPriceInWei","type":"uint256"},{"internalType":"uint256","name":"_maxInvocations","type":"uint256"}],"name":"addCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionId","type":"uint256"},{"internalType":"string","name":"_script","type":"string"}],"name":"addCollectionScript","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"collectionIdToTokenIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionId","type":"uint256"}],"name":"lockCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextCollectionId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionId","type":"uint256"}],"name":"pauseCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionId","type":"uint256"}],"name":"purchase","outputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_collectionId","type":"uint256"}],"name":"purchaseTo","outputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"stateMutability":"payable","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":"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":"uint256","name":"","type":"uint256"}],"name":"tokenIdToCollectionId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdToHashes","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"uint256","name":"_collectionId","type":"uint256"}],"name":"viewAllCollectionTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionId","type":"uint256"}],"name":"viewCollectionDetails","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"tokenPriceInWei","type":"uint256"},{"internalType":"uint256","name":"invocations","type":"uint256"},{"internalType":"uint256","name":"maxInvocations","type":"uint256"},{"internalType":"bool","name":"paused","type":"bool"},{"internalType":"bool","name":"locked","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionId","type":"uint256"}],"name":"viewCollectionScript","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162002a0c38038062002a0c8339810160408190526200003491620001da565b8151829082906200004d90600090602085019062000081565b5080516200006390600190602084019062000081565b5050600a80546001600160a01b031916331790555062000294915050565b8280546200008f9062000241565b90600052602060002090601f016020900481019282620000b35760008555620000fe565b82601f10620000ce57805160ff1916838001178555620000fe565b82800160010185558215620000fe579182015b82811115620000fe578251825591602001919060010190620000e1565b506200010c92915062000110565b5090565b5b808211156200010c576000815560010162000111565b600082601f83011262000138578081fd5b81516001600160401b03808211156200015557620001556200027e565b604051601f8301601f19908116603f011681019082821181831017156200018057620001806200027e565b816040528381526020925086838588010111156200019c578485fd5b8491505b83821015620001bf5785820183015181830184015290820190620001a0565b83821115620001d057848385830101525b9695505050505050565b60008060408385031215620001ed578182fd5b82516001600160401b038082111562000204578384fd5b620002128683870162000127565b9350602085015191508082111562000228578283fd5b50620002378582860162000127565b9150509250929050565b600181811c908216806200025657607f821691505b602082108114156200027857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61276880620002a46000396000f3fe6080604052600436106101e35760003560e01c80637e7e8bd611610102578063de93a82511610095578063efef39a111610064578063efef39a1146105b7578063f851a440146105ca578063fc23d74f146105ea578063fdb886071461060a576101e3565b8063de93a82514610511578063e77d6f7c14610543578063e8a3d48514610559578063e985e9c51461056e576101e3565b806395d89b41116100d157806395d89b411461049c578063a22cb465146104b1578063b88d4fde146104d1578063c87b56dd146104f1576101e3565b80637e7e8bd6146104295780637f4258e714610449578063891407c014610469578063942448901461047c576101e3565b806342842e0e1161017a5780636352211e116101495780636352211e1461039c57806370a08231146103bc578063734edac9146103dc57806375c10ffa146103fc576101e3565b806342842e0e1461031c578063468e50e91461033c5780634d1907931461035c5780634f6ccce71461037c576101e3565b8063095ea7b3116101b6578063095ea7b3146102a557806318160ddd146102c757806323b872dd146102dc5780632f745c59146102fc576101e3565b806301ffc9a7146101e857806306fdde031461021d578063078a811d1461023f578063081812fc1461026d575b600080fd5b3480156101f457600080fd5b50610208610203366004612198565b610637565b60405190151581526020015b60405180910390f35b34801561022957600080fd5b50610232610664565b6040516102149190612462565b34801561024b57600080fd5b5061025f61025a3660046122bc565b6106f6565b604051908152602001610214565b34801561027957600080fd5b5061028d61028836600461225f565b610727565b6040516001600160a01b039091168152602001610214565b3480156102b157600080fd5b506102c56102c036600461216f565b6107c1565b005b3480156102d357600080fd5b5060085461025f565b3480156102e857600080fd5b506102c56102f7366004612081565b6108d7565b34801561030857600080fd5b5061025f61031736600461216f565b610908565b34801561032857600080fd5b506102c5610337366004612081565b61099e565b34801561034857600080fd5b506102c5610357366004612213565b6109b9565b34801561036857600080fd5b506102c5610377366004612277565b610a47565b34801561038857600080fd5b5061025f61039736600461225f565b610ad5565b3480156103a857600080fd5b5061028d6103b736600461225f565b610b76565b3480156103c857600080fd5b5061025f6103d7366004612035565b610bed565b3480156103e857600080fd5b506102c56103f736600461225f565b610c74565b34801561040857600080fd5b5061025f61041736600461225f565b600e6020526000908152604090205481565b34801561043557600080fd5b5061023261044436600461225f565b610cc1565b34801561045557600080fd5b506102c561046436600461225f565b610d66565b61025f61047736600461216f565b610dea565b34801561048857600080fd5b5061025f6104973660046122bc565b610f71565b3480156104a857600080fd5b50610232610f8d565b3480156104bd57600080fd5b506102c56104cc366004612135565b610f9c565b3480156104dd57600080fd5b506102c56104ec3660046120bc565b61106e565b3480156104fd57600080fd5b5061023261050c36600461225f565b6110a0565b34801561051d57600080fd5b5061053161052c36600461225f565b61115d565b60405161021496959493929190612475565b34801561054f57600080fd5b5061025f600b5481565b34801561056557600080fd5b5061023261124a565b34801561057a57600080fd5b5061020861058936600461204f565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61025f6105c536600461225f565b61126a565b3480156105d657600080fd5b50600a5461028d906001600160a01b031681565b3480156105f657600080fd5b506102c56106053660046121d0565b611276565b34801561061657600080fd5b5061062a61062536600461225f565b6112f8565b604051610214919061241e565b60006001600160e01b0319821663780e9d6360e01b148061065c575061065c82611359565b90505b919050565b60606000805461067390612641565b80601f016020809104026020016040519081016040528092919081815260200182805461069f90612641565b80156106ec5780601f106106c1576101008083540402835291602001916106ec565b820191906000526020600020905b8154815290600101906020018083116106cf57829003601f168201915b5050505050905090565b6010602052816000526040600020818154811061071257600080fd5b90600052602060002001600091509150505481565b6000818152600260205260408120546001600160a01b03166107a55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006107cc82610b76565b9050806001600160a01b0316836001600160a01b0316141561083a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161079c565b336001600160a01b038216148061085657506108568133610589565b6108c85760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161079c565b6108d283836113a9565b505050565b6108e13382611417565b6108fd5760405162461bcd60e51b815260040161079c90612562565b6108d283838361150e565b600061091383610bed565b82106109755760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161079c565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6108d28383836040518060200160405280600081525061106e565b600a546001600160a01b031633146109e35760405162461bcd60e51b815260040161079c9061253e565b600b546000818152600d602090815260409091208551610a0592870190611ef0565b506000818152600d602052604090206001808201859055600382018490556006909101805460ff191682179055600b54610a3e916125b3565b600b5550505050565b6000828152600d60205260409020600601548290610100900460ff1615610a805760405162461bcd60e51b815260040161079c90612507565b600a546001600160a01b03163314610aaa5760405162461bcd60e51b815260040161079c9061253e565b6000838152600d602090815260409091208351610acf92600490920191850190611ef0565b50505050565b6000610ae060085490565b8210610b435760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161079c565b60088281548110610b6457634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b03168061065c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161079c565b60006001600160a01b038216610c585760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161079c565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610c9e5760405162461bcd60e51b815260040161079c9061253e565b6000908152600d60205260409020600601805460ff19811660ff90911615179055565b6000818152600d60205260409020600401805460609190610ce190612641565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0d90612641565b8015610d5a5780601f10610d2f57610100808354040283529160200191610d5a565b820191906000526020600020905b815481529060010190602001808311610d3d57829003601f168201915b50505050509050919050565b600a546001600160a01b03163314610d905760405162461bcd60e51b815260040161079c9061253e565b6000818152600d60205260409020600601548190610100900460ff1615610dc95760405162461bcd60e51b815260040161079c90612507565b506000908152600d60205260409020600601805461ff001916610100179055565b6000818152600d6020526040812060010154341015610e5e5760405162461bcd60e51b815260206004820152602a60248201527f4d7573742073656e64206174206c656173742063757272656e74207072696365604482015269103337b9103a37b5b2b760b11b606482015260840161079c565b6000828152600d602052604090206003810154600290910154610e829060016125b3565b1115610edc5760405162461bcd60e51b815260206004820152602360248201527f4d757374206e6f7420657863656564206d6178696d756d20696e766f636174696044820152626f6e7360e81b606482015260840161079c565b6000828152600d602052604090206006015460ff161580610f075750600a546001600160a01b031633145b610f535760405162461bcd60e51b815260206004820152601c60248201527f507572636861736573206d757374206e6f742062652070617573656400000000604482015260640161079c565b6000610f5f84846116b9565b9050610f6a83611839565b9392505050565b600f602052816000526040600020818154811061071257600080fd5b60606001805461067390612641565b6001600160a01b038216331415610ff55760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161079c565b3360008181526005602090815260408083206001600160a01b0387168085529252909120805460ff1916841515179055906001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611062911515815260200190565b60405180910390a35050565b6110783383611417565b6110945760405162461bcd60e51b815260040161079c90612562565b610acf848484846118d0565b6060816110c4816000908152600260205260409020546001600160a01b0316151590565b6111105760405162461bcd60e51b815260206004820152601760248201527f546f6b656e20494420646f6573206e6f74206578697374000000000000000000604482015260640161079c565b6000838152600e60209081526040808320548352600c909152902061113484611903565b604051602001611145929190612325565b60405160208183030381529060405291505b50919050565b60606000806000806000600d6000888152602001908152602001600020600001805461118890612641565b80601f01602080910402602001604051908101604052809291908181526020018280546111b490612641565b80156112015780601f106111d657610100808354040283529160200191611201565b820191906000526020600020905b8154815290600101906020018083116111e457829003601f168201915b5050506000998a525050600d6020526040909720600181015460038201546002830154600690930154999a9199929850965060ff80831696506101009092049091169350915050565b60606040518060600160405280603581526020016126fe60359139905090565b600061065c3383610dea565b6000818152600d60205260409020600601548190610100900460ff16156112af5760405162461bcd60e51b815260040161079c90612507565b600a546001600160a01b031633146112d95760405162461bcd60e51b815260040161079c9061253e565b6000828152600c602090815260409091208451610acf92860190611ef0565b6000818152600f6020908152604091829020805483518184028101840190945280845260609392830182828015610d5a57602002820191906000526020600020905b81548152602001906001019080831161133a5750505050509050919050565b60006001600160e01b031982166380ac58cd60e01b148061138a57506001600160e01b03198216635b5e139f60e01b145b8061065c57506301ffc9a760e01b6001600160e01b031983161461065c565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906113de82610b76565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166114905760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161079c565b600061149b83610b76565b9050806001600160a01b0316846001600160a01b031614806114d65750836001600160a01b03166114cb84610727565b6001600160a01b0316145b8061150657506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661152182610b76565b6001600160a01b0316146115895760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161079c565b6001600160a01b0382166115eb5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161079c565b6115f6838383611a1e565b6116016000826113a9565b6001600160a01b038316600090815260036020526040812080546001929061162a9084906125fe565b90915550506001600160a01b03821660009081526003602052604081208054600192906116589084906125b3565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000818152600d602052604081206002015481906116da620f4240856125df565b6116e491906125b3565b6000848152600d60205260409020600201549091506117049060016125b3565b6000848152600d602090815260408083206002018490555191926117519290914391339101928352602083019190915260601b6bffffffffffffffffffffffff1916604082015260540190565b60408051601f1981840301815291815281516020928301206000858152601084528281208054600181018255908252848220018290558181526011909352912083905590506117a08583611adb565b6000828152600e60209081526040808320879055868352600f825280832080546001818101835591855283852001869055878452600d9092529182902060028101549101549151869285926001600160a01b038a16927f94c792774c59479f7bd68442f3af3691c02123a5aabee8b6f9116d8af8aa666992611829928252602082015260400190565b60405180910390a4509392505050565b34156118cd576000818152600d60205260408120600101549061185c82346125fe565b9050801561189357604051339082156108fc029083906000818181858888f19350505050158015611891573d6000803e3d6000fd5b505b600a546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015610acf573d6000803e3d6000fd5b50565b6118db84848461150e565b6118e784848484611c29565b610acf5760405162461bcd60e51b815260040161079c906124b5565b60608161192857506040805180820190915260018152600360fc1b602082015261065f565b8160005b8115611952578061193c81612676565b915061194b9050600a836125cb565b915061192c565b60008167ffffffffffffffff81111561197b57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156119a5576020820181803683370190505b5090505b8415611506576119ba6001836125fe565b91506119c7600a86612691565b6119d29060306125b3565b60f81b8183815181106119f557634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611a17600a866125cb565b94506119a9565b6001600160a01b038316611a7957611a7481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611a9c565b816001600160a01b0316836001600160a01b031614611a9c57611a9c8382611d36565b6001600160a01b038216611ab857611ab381611dd3565b6108d2565b826001600160a01b0316826001600160a01b0316146108d2576108d28282611eac565b6001600160a01b038216611b315760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161079c565b6000818152600260205260409020546001600160a01b031615611b965760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161079c565b611ba260008383611a1e565b6001600160a01b0382166000908152600360205260408120805460019290611bcb9084906125b3565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b15611d2b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611c6d9033908990889088906004016123e1565b602060405180830381600087803b158015611c8757600080fd5b505af1925050508015611cb7575060408051601f3d908101601f19168201909252611cb4918101906121b4565b60015b611d11573d808015611ce5576040519150601f19603f3d011682016040523d82523d6000602084013e611cea565b606091505b508051611d095760405162461bcd60e51b815260040161079c906124b5565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611506565b506001949350505050565b60006001611d4384610bed565b611d4d91906125fe565b600083815260076020526040902054909150808214611da0576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611de5906001906125fe565b60008381526009602052604081205460088054939450909284908110611e1b57634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110611e4a57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611e9057634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000611eb783610bed565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054611efc90612641565b90600052602060002090601f016020900481019282611f1e5760008555611f64565b82601f10611f3757805160ff1916838001178555611f64565b82800160010185558215611f64579182015b82811115611f64578251825591602001919060010190611f49565b50611f70929150611f74565b5090565b5b80821115611f705760008155600101611f75565b600067ffffffffffffffff80841115611fa457611fa46126d1565b604051601f8501601f19908116603f01168101908282118183101715611fcc57611fcc6126d1565b81604052809350858152868686011115611fe557600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461065f57600080fd5b600082601f830112612026578081fd5b610f6a83833560208501611f89565b600060208284031215612046578081fd5b610f6a82611fff565b60008060408385031215612061578081fd5b61206a83611fff565b915061207860208401611fff565b90509250929050565b600080600060608486031215612095578081fd5b61209e84611fff565b92506120ac60208501611fff565b9150604084013590509250925092565b600080600080608085870312156120d1578081fd5b6120da85611fff565b93506120e860208601611fff565b925060408501359150606085013567ffffffffffffffff81111561210a578182fd5b8501601f8101871361211a578182fd5b61212987823560208401611f89565b91505092959194509250565b60008060408385031215612147578182fd5b61215083611fff565b915060208301358015158114612164578182fd5b809150509250929050565b60008060408385031215612181578182fd5b61218a83611fff565b946020939093013593505050565b6000602082840312156121a9578081fd5b8135610f6a816126e7565b6000602082840312156121c5578081fd5b8151610f6a816126e7565b600080604083850312156121e2578182fd5b823567ffffffffffffffff8111156121f8578283fd5b61220485828601612016565b95602094909401359450505050565b600080600060608486031215612227578283fd5b833567ffffffffffffffff81111561223d578384fd5b61224986828701612016565b9660208601359650604090950135949350505050565b600060208284031215612270578081fd5b5035919050565b60008060408385031215612289578182fd5b82359150602083013567ffffffffffffffff8111156122a6578182fd5b6122b285828601612016565b9150509250929050565b600080604083850312156122ce578182fd5b50508035926020909101359150565b600081518084526122f5816020860160208601612615565b601f01601f19169290920160200192915050565b6000815161231b818560208601612615565b9290920192915050565b600080845482600182811c91508083168061234157607f831692505b602080841082141561236157634e487b7160e01b87526022600452602487fd5b8180156123755760018114612386576123b2565b60ff198616895284890196506123b2565b60008b815260209020885b868110156123aa5781548b820152908501908301612391565b505084890196505b5050505050506123d86123d282662f746f6b656e2f60c81b815260070190565b85612309565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612414908301846122dd565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156124565783518352928401929184019160010161243a565b50909695505050505050565b600060208252610f6a60208301846122dd565b600060c0825261248860c08301896122dd565b6020830197909752506040810194909452606084019290925215156080830152151560a090910152919050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526019908201527f4f6e6c7920756e6c6f636b656420636f6c6c656374696f6e7300000000000000604082015260600190565b6020808252600a908201526927b7363c9030b236b4b760b11b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156125c6576125c66126a5565b500190565b6000826125da576125da6126bb565b500490565b60008160001904831182151516156125f9576125f96126a5565b500290565b600082821015612610576126106126a5565b500390565b60005b83811015612630578181015183820152602001612618565b83811115610acf5750506000910152565b600181811c9082168061265557607f821691505b6020821081141561115757634e487b7160e01b600052602260045260246000fd5b600060001982141561268a5761268a6126a5565b5060010190565b6000826126a0576126a06126bb565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146118cd57600080fdfe697066733a2f2f516d654d417943623556566967586b62394d466870504c586b6252475556324543596f6333394a34574271374a41a264697066735822122054718bae50466e4a01f1b74de4e1549b23210492f06af50bd030ba12eceee24b64736f6c6343000803003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000e48656176656e436f6d7075746572000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000348564e0000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106101e35760003560e01c80637e7e8bd611610102578063de93a82511610095578063efef39a111610064578063efef39a1146105b7578063f851a440146105ca578063fc23d74f146105ea578063fdb886071461060a576101e3565b8063de93a82514610511578063e77d6f7c14610543578063e8a3d48514610559578063e985e9c51461056e576101e3565b806395d89b41116100d157806395d89b411461049c578063a22cb465146104b1578063b88d4fde146104d1578063c87b56dd146104f1576101e3565b80637e7e8bd6146104295780637f4258e714610449578063891407c014610469578063942448901461047c576101e3565b806342842e0e1161017a5780636352211e116101495780636352211e1461039c57806370a08231146103bc578063734edac9146103dc57806375c10ffa146103fc576101e3565b806342842e0e1461031c578063468e50e91461033c5780634d1907931461035c5780634f6ccce71461037c576101e3565b8063095ea7b3116101b6578063095ea7b3146102a557806318160ddd146102c757806323b872dd146102dc5780632f745c59146102fc576101e3565b806301ffc9a7146101e857806306fdde031461021d578063078a811d1461023f578063081812fc1461026d575b600080fd5b3480156101f457600080fd5b50610208610203366004612198565b610637565b60405190151581526020015b60405180910390f35b34801561022957600080fd5b50610232610664565b6040516102149190612462565b34801561024b57600080fd5b5061025f61025a3660046122bc565b6106f6565b604051908152602001610214565b34801561027957600080fd5b5061028d61028836600461225f565b610727565b6040516001600160a01b039091168152602001610214565b3480156102b157600080fd5b506102c56102c036600461216f565b6107c1565b005b3480156102d357600080fd5b5060085461025f565b3480156102e857600080fd5b506102c56102f7366004612081565b6108d7565b34801561030857600080fd5b5061025f61031736600461216f565b610908565b34801561032857600080fd5b506102c5610337366004612081565b61099e565b34801561034857600080fd5b506102c5610357366004612213565b6109b9565b34801561036857600080fd5b506102c5610377366004612277565b610a47565b34801561038857600080fd5b5061025f61039736600461225f565b610ad5565b3480156103a857600080fd5b5061028d6103b736600461225f565b610b76565b3480156103c857600080fd5b5061025f6103d7366004612035565b610bed565b3480156103e857600080fd5b506102c56103f736600461225f565b610c74565b34801561040857600080fd5b5061025f61041736600461225f565b600e6020526000908152604090205481565b34801561043557600080fd5b5061023261044436600461225f565b610cc1565b34801561045557600080fd5b506102c561046436600461225f565b610d66565b61025f61047736600461216f565b610dea565b34801561048857600080fd5b5061025f6104973660046122bc565b610f71565b3480156104a857600080fd5b50610232610f8d565b3480156104bd57600080fd5b506102c56104cc366004612135565b610f9c565b3480156104dd57600080fd5b506102c56104ec3660046120bc565b61106e565b3480156104fd57600080fd5b5061023261050c36600461225f565b6110a0565b34801561051d57600080fd5b5061053161052c36600461225f565b61115d565b60405161021496959493929190612475565b34801561054f57600080fd5b5061025f600b5481565b34801561056557600080fd5b5061023261124a565b34801561057a57600080fd5b5061020861058936600461204f565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61025f6105c536600461225f565b61126a565b3480156105d657600080fd5b50600a5461028d906001600160a01b031681565b3480156105f657600080fd5b506102c56106053660046121d0565b611276565b34801561061657600080fd5b5061062a61062536600461225f565b6112f8565b604051610214919061241e565b60006001600160e01b0319821663780e9d6360e01b148061065c575061065c82611359565b90505b919050565b60606000805461067390612641565b80601f016020809104026020016040519081016040528092919081815260200182805461069f90612641565b80156106ec5780601f106106c1576101008083540402835291602001916106ec565b820191906000526020600020905b8154815290600101906020018083116106cf57829003601f168201915b5050505050905090565b6010602052816000526040600020818154811061071257600080fd5b90600052602060002001600091509150505481565b6000818152600260205260408120546001600160a01b03166107a55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006107cc82610b76565b9050806001600160a01b0316836001600160a01b0316141561083a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161079c565b336001600160a01b038216148061085657506108568133610589565b6108c85760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161079c565b6108d283836113a9565b505050565b6108e13382611417565b6108fd5760405162461bcd60e51b815260040161079c90612562565b6108d283838361150e565b600061091383610bed565b82106109755760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161079c565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6108d28383836040518060200160405280600081525061106e565b600a546001600160a01b031633146109e35760405162461bcd60e51b815260040161079c9061253e565b600b546000818152600d602090815260409091208551610a0592870190611ef0565b506000818152600d602052604090206001808201859055600382018490556006909101805460ff191682179055600b54610a3e916125b3565b600b5550505050565b6000828152600d60205260409020600601548290610100900460ff1615610a805760405162461bcd60e51b815260040161079c90612507565b600a546001600160a01b03163314610aaa5760405162461bcd60e51b815260040161079c9061253e565b6000838152600d602090815260409091208351610acf92600490920191850190611ef0565b50505050565b6000610ae060085490565b8210610b435760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161079c565b60088281548110610b6457634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b03168061065c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161079c565b60006001600160a01b038216610c585760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161079c565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610c9e5760405162461bcd60e51b815260040161079c9061253e565b6000908152600d60205260409020600601805460ff19811660ff90911615179055565b6000818152600d60205260409020600401805460609190610ce190612641565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0d90612641565b8015610d5a5780601f10610d2f57610100808354040283529160200191610d5a565b820191906000526020600020905b815481529060010190602001808311610d3d57829003601f168201915b50505050509050919050565b600a546001600160a01b03163314610d905760405162461bcd60e51b815260040161079c9061253e565b6000818152600d60205260409020600601548190610100900460ff1615610dc95760405162461bcd60e51b815260040161079c90612507565b506000908152600d60205260409020600601805461ff001916610100179055565b6000818152600d6020526040812060010154341015610e5e5760405162461bcd60e51b815260206004820152602a60248201527f4d7573742073656e64206174206c656173742063757272656e74207072696365604482015269103337b9103a37b5b2b760b11b606482015260840161079c565b6000828152600d602052604090206003810154600290910154610e829060016125b3565b1115610edc5760405162461bcd60e51b815260206004820152602360248201527f4d757374206e6f7420657863656564206d6178696d756d20696e766f636174696044820152626f6e7360e81b606482015260840161079c565b6000828152600d602052604090206006015460ff161580610f075750600a546001600160a01b031633145b610f535760405162461bcd60e51b815260206004820152601c60248201527f507572636861736573206d757374206e6f742062652070617573656400000000604482015260640161079c565b6000610f5f84846116b9565b9050610f6a83611839565b9392505050565b600f602052816000526040600020818154811061071257600080fd5b60606001805461067390612641565b6001600160a01b038216331415610ff55760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161079c565b3360008181526005602090815260408083206001600160a01b0387168085529252909120805460ff1916841515179055906001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611062911515815260200190565b60405180910390a35050565b6110783383611417565b6110945760405162461bcd60e51b815260040161079c90612562565b610acf848484846118d0565b6060816110c4816000908152600260205260409020546001600160a01b0316151590565b6111105760405162461bcd60e51b815260206004820152601760248201527f546f6b656e20494420646f6573206e6f74206578697374000000000000000000604482015260640161079c565b6000838152600e60209081526040808320548352600c909152902061113484611903565b604051602001611145929190612325565b60405160208183030381529060405291505b50919050565b60606000806000806000600d6000888152602001908152602001600020600001805461118890612641565b80601f01602080910402602001604051908101604052809291908181526020018280546111b490612641565b80156112015780601f106111d657610100808354040283529160200191611201565b820191906000526020600020905b8154815290600101906020018083116111e457829003601f168201915b5050506000998a525050600d6020526040909720600181015460038201546002830154600690930154999a9199929850965060ff80831696506101009092049091169350915050565b60606040518060600160405280603581526020016126fe60359139905090565b600061065c3383610dea565b6000818152600d60205260409020600601548190610100900460ff16156112af5760405162461bcd60e51b815260040161079c90612507565b600a546001600160a01b031633146112d95760405162461bcd60e51b815260040161079c9061253e565b6000828152600c602090815260409091208451610acf92860190611ef0565b6000818152600f6020908152604091829020805483518184028101840190945280845260609392830182828015610d5a57602002820191906000526020600020905b81548152602001906001019080831161133a5750505050509050919050565b60006001600160e01b031982166380ac58cd60e01b148061138a57506001600160e01b03198216635b5e139f60e01b145b8061065c57506301ffc9a760e01b6001600160e01b031983161461065c565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906113de82610b76565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166114905760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161079c565b600061149b83610b76565b9050806001600160a01b0316846001600160a01b031614806114d65750836001600160a01b03166114cb84610727565b6001600160a01b0316145b8061150657506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661152182610b76565b6001600160a01b0316146115895760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161079c565b6001600160a01b0382166115eb5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161079c565b6115f6838383611a1e565b6116016000826113a9565b6001600160a01b038316600090815260036020526040812080546001929061162a9084906125fe565b90915550506001600160a01b03821660009081526003602052604081208054600192906116589084906125b3565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000818152600d602052604081206002015481906116da620f4240856125df565b6116e491906125b3565b6000848152600d60205260409020600201549091506117049060016125b3565b6000848152600d602090815260408083206002018490555191926117519290914391339101928352602083019190915260601b6bffffffffffffffffffffffff1916604082015260540190565b60408051601f1981840301815291815281516020928301206000858152601084528281208054600181018255908252848220018290558181526011909352912083905590506117a08583611adb565b6000828152600e60209081526040808320879055868352600f825280832080546001818101835591855283852001869055878452600d9092529182902060028101549101549151869285926001600160a01b038a16927f94c792774c59479f7bd68442f3af3691c02123a5aabee8b6f9116d8af8aa666992611829928252602082015260400190565b60405180910390a4509392505050565b34156118cd576000818152600d60205260408120600101549061185c82346125fe565b9050801561189357604051339082156108fc029083906000818181858888f19350505050158015611891573d6000803e3d6000fd5b505b600a546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015610acf573d6000803e3d6000fd5b50565b6118db84848461150e565b6118e784848484611c29565b610acf5760405162461bcd60e51b815260040161079c906124b5565b60608161192857506040805180820190915260018152600360fc1b602082015261065f565b8160005b8115611952578061193c81612676565b915061194b9050600a836125cb565b915061192c565b60008167ffffffffffffffff81111561197b57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156119a5576020820181803683370190505b5090505b8415611506576119ba6001836125fe565b91506119c7600a86612691565b6119d29060306125b3565b60f81b8183815181106119f557634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611a17600a866125cb565b94506119a9565b6001600160a01b038316611a7957611a7481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611a9c565b816001600160a01b0316836001600160a01b031614611a9c57611a9c8382611d36565b6001600160a01b038216611ab857611ab381611dd3565b6108d2565b826001600160a01b0316826001600160a01b0316146108d2576108d28282611eac565b6001600160a01b038216611b315760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161079c565b6000818152600260205260409020546001600160a01b031615611b965760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161079c565b611ba260008383611a1e565b6001600160a01b0382166000908152600360205260408120805460019290611bcb9084906125b3565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b15611d2b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611c6d9033908990889088906004016123e1565b602060405180830381600087803b158015611c8757600080fd5b505af1925050508015611cb7575060408051601f3d908101601f19168201909252611cb4918101906121b4565b60015b611d11573d808015611ce5576040519150601f19603f3d011682016040523d82523d6000602084013e611cea565b606091505b508051611d095760405162461bcd60e51b815260040161079c906124b5565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611506565b506001949350505050565b60006001611d4384610bed565b611d4d91906125fe565b600083815260076020526040902054909150808214611da0576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611de5906001906125fe565b60008381526009602052604081205460088054939450909284908110611e1b57634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110611e4a57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611e9057634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000611eb783610bed565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054611efc90612641565b90600052602060002090601f016020900481019282611f1e5760008555611f64565b82601f10611f3757805160ff1916838001178555611f64565b82800160010185558215611f64579182015b82811115611f64578251825591602001919060010190611f49565b50611f70929150611f74565b5090565b5b80821115611f705760008155600101611f75565b600067ffffffffffffffff80841115611fa457611fa46126d1565b604051601f8501601f19908116603f01168101908282118183101715611fcc57611fcc6126d1565b81604052809350858152868686011115611fe557600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461065f57600080fd5b600082601f830112612026578081fd5b610f6a83833560208501611f89565b600060208284031215612046578081fd5b610f6a82611fff565b60008060408385031215612061578081fd5b61206a83611fff565b915061207860208401611fff565b90509250929050565b600080600060608486031215612095578081fd5b61209e84611fff565b92506120ac60208501611fff565b9150604084013590509250925092565b600080600080608085870312156120d1578081fd5b6120da85611fff565b93506120e860208601611fff565b925060408501359150606085013567ffffffffffffffff81111561210a578182fd5b8501601f8101871361211a578182fd5b61212987823560208401611f89565b91505092959194509250565b60008060408385031215612147578182fd5b61215083611fff565b915060208301358015158114612164578182fd5b809150509250929050565b60008060408385031215612181578182fd5b61218a83611fff565b946020939093013593505050565b6000602082840312156121a9578081fd5b8135610f6a816126e7565b6000602082840312156121c5578081fd5b8151610f6a816126e7565b600080604083850312156121e2578182fd5b823567ffffffffffffffff8111156121f8578283fd5b61220485828601612016565b95602094909401359450505050565b600080600060608486031215612227578283fd5b833567ffffffffffffffff81111561223d578384fd5b61224986828701612016565b9660208601359650604090950135949350505050565b600060208284031215612270578081fd5b5035919050565b60008060408385031215612289578182fd5b82359150602083013567ffffffffffffffff8111156122a6578182fd5b6122b285828601612016565b9150509250929050565b600080604083850312156122ce578182fd5b50508035926020909101359150565b600081518084526122f5816020860160208601612615565b601f01601f19169290920160200192915050565b6000815161231b818560208601612615565b9290920192915050565b600080845482600182811c91508083168061234157607f831692505b602080841082141561236157634e487b7160e01b87526022600452602487fd5b8180156123755760018114612386576123b2565b60ff198616895284890196506123b2565b60008b815260209020885b868110156123aa5781548b820152908501908301612391565b505084890196505b5050505050506123d86123d282662f746f6b656e2f60c81b815260070190565b85612309565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612414908301846122dd565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156124565783518352928401929184019160010161243a565b50909695505050505050565b600060208252610f6a60208301846122dd565b600060c0825261248860c08301896122dd565b6020830197909752506040810194909452606084019290925215156080830152151560a090910152919050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526019908201527f4f6e6c7920756e6c6f636b656420636f6c6c656374696f6e7300000000000000604082015260600190565b6020808252600a908201526927b7363c9030b236b4b760b11b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156125c6576125c66126a5565b500190565b6000826125da576125da6126bb565b500490565b60008160001904831182151516156125f9576125f96126a5565b500290565b600082821015612610576126106126a5565b500390565b60005b83811015612630578181015183820152602001612618565b83811115610acf5750506000910152565b600181811c9082168061265557607f821691505b6020821081141561115757634e487b7160e01b600052602260045260246000fd5b600060001982141561268a5761268a6126a5565b5060010190565b6000826126a0576126a06126bb565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146118cd57600080fdfe697066733a2f2f516d654d417943623556566967586b62394d466870504c586b6252475556324543596f6333394a34574271374a41a264697066735822122054718bae50466e4a01f1b74de4e1549b23210492f06af50bd030ba12eceee24b64736f6c63430008030033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000e48656176656e436f6d7075746572000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000348564e0000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _tokenName (string): HeavenComputer
Arg [1] : _tokenSymbol (string): HVN
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [3] : 48656176656e436f6d7075746572000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : 48564e0000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
40898:5976:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34636:224;;;;;;;;;;-1:-1:-1;34636:224:0;;;;;:::i;:::-;;:::i;:::-;;;9280:14:1;;9273:22;9255:41;;9243:2;9228:18;34636:224:0;;;;;;;;21521:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;41735:52::-;;;;;;;;;;-1:-1:-1;41735:52:0;;;;;:::i;:::-;;:::i;:::-;;;9453:25:1;;;9441:2;9426:18;41735:52:0;9408:76:1;23080:221:0;;;;;;;;;;-1:-1:-1;23080:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7938:32:1;;;7920:51;;7908:2;7893:18;23080:221:0;7875:102:1;22603:411:0;;;;;;;;;;-1:-1:-1;22603:411:0;;;;;:::i;:::-;;:::i;:::-;;35276:113;;;;;;;;;;-1:-1:-1;35364:10:0;:17;35276:113;;23970:339;;;;;;;;;;-1:-1:-1;23970:339:0;;;;;:::i;:::-;;:::i;34944:256::-;;;;;;;;;;-1:-1:-1;34944:256:0;;;;;:::i;:::-;;:::i;24380:185::-;;;;;;;;;;-1:-1:-1;24380:185:0;;;;;:::i;:::-;;:::i;44735:455::-;;;;;;;;;;-1:-1:-1;44735:455:0;;;;;:::i;:::-;;:::i;45198:182::-;;;;;;;;;;-1:-1:-1;45198:182:0;;;;;:::i;:::-;;:::i;35466:233::-;;;;;;;;;;-1:-1:-1;35466:233:0;;;;;:::i;:::-;;:::i;21215:239::-;;;;;;;;;;-1:-1:-1;21215:239:0;;;;;:::i;:::-;;:::i;20945:208::-;;;;;;;;;;-1:-1:-1;20945:208:0;;;;;:::i;:::-;;:::i;44573:154::-;;;;;;;;;;-1:-1:-1;44573:154:0;;;;;:::i;:::-;;:::i;41606:56::-;;;;;;;;;;-1:-1:-1;41606:56:0;;;;;:::i;:::-;;;;;;;;;;;;;;46145:147;;;;;;;;;;-1:-1:-1;46145:147:0;;;;;:::i;:::-;;:::i;44414:151::-;;;;;;;;;;-1:-1:-1;44414:151:0;;;;;:::i;:::-;;:::i;42545:601::-;;;;;;:::i;:::-;;:::i;41669:59::-;;;;;;;;;;-1:-1:-1;41669:59:0;;;;;:::i;:::-;;:::i;21690:104::-;;;;;;;;;;;;;:::i;23373:295::-;;;;;;;;;;-1:-1:-1;23373:295:0;;;;;:::i;:::-;;:::i;24636:328::-;;;;;;;;;;-1:-1:-1;24636:328:0;;;;;:::i;:::-;;:::i;46618:253::-;;;;;;;;;;-1:-1:-1;46618:253:0;;;;;:::i;:::-;;:::i;45580:557::-;;;;;;;;;;-1:-1:-1;45580:557:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;41409:31::-;;;;;;;;;;;;;;;;46462:148;;;;;;;;;;;;;:::i;23739:164::-;;;;;;;;;;-1:-1:-1;23739:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;23860:25:0;;;23836:4;23860:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23739:164;42391:146;;;;;;:::i;:::-;;:::i;41382:20::-;;;;;;;;;;-1:-1:-1;41382:20:0;;;;-1:-1:-1;;;;;41382:20:0;;;45388:184;;;;;;;;;;-1:-1:-1;45388:184:0;;;;;:::i;:::-;;:::i;46300:154::-;;;;;;;;;;-1:-1:-1;46300:154:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;34636:224::-;34738:4;-1:-1:-1;;;;;;34762:50:0;;-1:-1:-1;;;34762:50:0;;:90;;;34816:36;34840:11;34816:23;:36::i;:::-;34755:97;;34636:224;;;;:::o;21521:100::-;21575:13;21608:5;21601:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21521:100;:::o;41735:52::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23080:221::-;23156:7;26563:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26563:16:0;23176:73;;;;-1:-1:-1;;;23176:73:0;;16702:2:1;23176:73:0;;;16684:21:1;16741:2;16721:18;;;16714:30;16780:34;16760:18;;;16753:62;-1:-1:-1;;;16831:18:1;;;16824:42;16883:19;;23176:73:0;;;;;;;;;-1:-1:-1;23269:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23269:24:0;;23080:221::o;22603:411::-;22684:13;22700:23;22715:7;22700:14;:23::i;:::-;22684:39;;22748:5;-1:-1:-1;;;;;22742:11:0;:2;-1:-1:-1;;;;;22742:11:0;;;22734:57;;;;-1:-1:-1;;;22734:57:0;;17525:2:1;22734:57:0;;;17507:21:1;17564:2;17544:18;;;17537:30;17603:34;17583:18;;;17576:62;-1:-1:-1;;;17654:18:1;;;17647:31;17695:19;;22734:57:0;17497:223:1;22734:57:0;16058:10;-1:-1:-1;;;;;22826:21:0;;;;:62;;-1:-1:-1;22851:37:0;22868:5;16058:10;22875:12;15978:98;22851:37;22804:168;;;;-1:-1:-1;;;22804:168:0;;15095:2:1;22804:168:0;;;15077:21:1;15134:2;15114:18;;;15107:30;15173:34;15153:18;;;15146:62;15244:26;15224:18;;;15217:54;15288:19;;22804:168:0;15067:246:1;22804:168:0;22985:21;22994:2;22998:7;22985:8;:21::i;:::-;22603:411;;;:::o;23970:339::-;24165:41;16058:10;24198:7;24165:18;:41::i;:::-;24157:103;;;;-1:-1:-1;;;24157:103:0;;;;;;;:::i;:::-;24273:28;24283:4;24289:2;24293:7;24273:9;:28::i;34944:256::-;35041:7;35077:23;35094:5;35077:16;:23::i;:::-;35069:5;:31;35061:87;;;;-1:-1:-1;;;35061:87:0;;10875:2:1;35061:87:0;;;10857:21:1;10914:2;10894:18;;;10887:30;10953:34;10933:18;;;10926:62;-1:-1:-1;;;11004:18:1;;;10997:41;11055:19;;35061:87:0;10847:233:1;35061:87:0;-1:-1:-1;;;;;;35166:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;34944:256::o;24380:185::-;24518:39;24535:4;24541:2;24545:7;24518:39;;;;;;;;;;;;:16;:39::i;44735:455::-;42343:5;;-1:-1:-1;;;;;42343:5:0;42329:10;:19;42321:42;;;;-1:-1:-1;;;42321:42:0;;;;;;;:::i;:::-;44881:16:::1;::::0;44858:20:::1;44908:25:::0;;;:11:::1;:25;::::0;;;;;;;:38;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;44957:25:0::1;::::0;;;:11:::1;:25;::::0;;;;:41:::1;::::0;;::::1;:60:::0;;;45028:40:::1;::::0;::::1;:58:::0;;;45097:32:::1;::::0;;::::1;:37:::0;;-1:-1:-1;;45097:37:0::1;::::0;::::1;::::0;;45164:16:::1;::::0;:18:::1;::::0;::::1;:::i;:::-;45145:16;:37:::0;-1:-1:-1;;;;44735:455:0:o;45198:182::-;42198:26;;;;:11;:26;;;;;:33;;;:26;;:33;;;;;42197:34;42189:72;;;;-1:-1:-1;;;42189:72:0;;;;;;;:::i;:::-;42343:5:::1;::::0;-1:-1:-1;;;;;42343:5:0::1;42329:10;:19;42321:42;;;;-1:-1:-1::0;;;42321:42:0::1;;;;;;;:::i;:::-;45329:26:::2;::::0;;;:11:::2;:26;::::0;;;;;;;:43;;::::2;::::0;:33:::2;::::0;;::::2;::::0;:43;::::2;::::0;::::2;:::i;:::-;;45198:182:::0;;;:::o;35466:233::-;35541:7;35577:30;35364:10;:17;35276:113;;35577:30;35569:5;:38;35561:95;;;;-1:-1:-1;;;35561:95:0;;18345:2:1;35561:95:0;;;18327:21:1;18384:2;18364:18;;;18357:30;18423:34;18403:18;;;18396:62;-1:-1:-1;;;18474:18:1;;;18467:42;18526:19;;35561:95:0;18317:234:1;35561:95:0;35674:10;35685:5;35674:17;;;;;;-1:-1:-1;;;35674:17:0;;;;;;;;;;;;;;;;;35667:24;;35466:233;;;:::o;21215:239::-;21287:7;21323:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21323:16:0;21358:19;21350:73;;;;-1:-1:-1;;;21350:73:0;;15931:2:1;21350:73:0;;;15913:21:1;15970:2;15950:18;;;15943:30;16009:34;15989:18;;;15982:62;-1:-1:-1;;;16060:18:1;;;16053:39;16109:19;;21350:73:0;15903:231:1;20945:208:0;21017:7;-1:-1:-1;;;;;21045:19:0;;21037:74;;;;-1:-1:-1;;;21037:74:0;;15520:2:1;21037:74:0;;;15502:21:1;15559:2;15539:18;;;15532:30;15598:34;15578:18;;;15571:62;-1:-1:-1;;;15649:18:1;;;15642:40;15699:19;;21037:74:0;15492:232:1;21037:74:0;-1:-1:-1;;;;;;21129:16:0;;;;;:9;:16;;;;;;;20945:208::o;44573:154::-;42343:5;;-1:-1:-1;;;;;42343:5:0;42329:10;:19;42321:42;;;;-1:-1:-1;;;42321:42:0;;;;;;;:::i;:::-;44686:26:::1;::::0;;;:11:::1;:26;::::0;;;;:33:::1;;::::0;;-1:-1:-1;;44649:70:0;::::1;44686:33;::::0;;::::1;44685:34;44649:70;::::0;;44573:154::o;46145:147::-;46251:26;;;;:11;:26;;;;;:33;;46244:40;;46219:13;;46251:33;46244:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46145:147;;;:::o;44414:151::-;42343:5;;-1:-1:-1;;;;;42343:5:0;42329:10;:19;42321:42;;;;-1:-1:-1;;;42321:42:0;;;;;;;:::i;:::-;42198:26:::1;::::0;;;:11:::1;:26;::::0;;;;:33:::1;;::::0;:26;;:33:::1;::::0;::::1;;;42197:34;42189:72;;;;-1:-1:-1::0;;;42189:72:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;44517:26:0::2;::::0;;;:11:::2;:26;::::0;;;;:33:::2;;:40:::0;;-1:-1:-1;;44517:40:0::2;;;::::0;;44414:151::o;42545:601::-;42625:16;42675:26;;;:11;:26;;;;;:42;;;42662:9;:55;;42654:110;;;;-1:-1:-1;;;42654:110:0;;12417:2:1;42654:110:0;;;12399:21:1;12456:2;12436:18;;;12429:30;12495:34;12475:18;;;12468:62;-1:-1:-1;;;12546:18:1;;;12539:40;12596:19;;42654:110:0;12389:232:1;42654:110:0;42827:26;;;;:11;:26;;;;;:41;;;;42783:38;;;;;:40;;42822:1;42783:40;:::i;:::-;:85;;42775:133;;;;-1:-1:-1;;;42775:133:0;;12828:2:1;42775:133:0;;;12810:21:1;12867:2;12847:18;;;12840:30;12906:34;12886:18;;;12879:62;-1:-1:-1;;;12957:18:1;;;12950:33;13000:19;;42775:133:0;12800:225:1;42775:133:0;42928:26;;;;:11;:26;;;;;:33;;;;;42927:34;;:57;;-1:-1:-1;42979:5:0;;-1:-1:-1;;;;;42979:5:0;42965:10;:19;42927:57;42919:98;;;;-1:-1:-1;;;42919:98:0;;10518:2:1;42919:98:0;;;10500:21:1;10557:2;10537:18;;;10530:30;10596;10576:18;;;10569:58;10644:18;;42919:98:0;10490:178:1;42919:98:0;43028:15;43046:30;43057:3;43062:13;43046:10;:30::i;:::-;43028:48;;43087:26;43099:13;43087:11;:26::i;:::-;43131:7;42545:601;-1:-1:-1;;;42545:601:0:o;41669:59::-;;;;;;;;;;;;;;;;;;;;21690:104;21746:13;21779:7;21772:14;;;;;:::i;23373:295::-;-1:-1:-1;;;;;23476:24:0;;16058:10;23476:24;;23468:62;;;;-1:-1:-1;;;23468:62:0;;13637:2:1;23468:62:0;;;13619:21:1;13676:2;13656:18;;;13649:30;13715:27;13695:18;;;13688:55;13760:18;;23468:62:0;13609:175:1;23468:62:0;16058:10;23543:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;23543:42:0;;;;;;;;;;:53;;-1:-1:-1;;23543:53:0;;;;;;;:42;-1:-1:-1;;;;;23612:48:0;;23651:8;23612:48;;;;9280:14:1;9273:22;9255:41;;9243:2;9228:18;;9210:92;23612:48:0;;;;;;;;23373:295;;:::o;24636:328::-;24811:41;16058:10;24844:7;24811:18;:41::i;:::-;24803:103;;;;-1:-1:-1;;;24803:103:0;;;;;;;:::i;:::-;24917:39;24931:4;24937:2;24941:7;24950:5;24917:13;:39::i;46618:253::-;46711:13;46683:8;42060:17;42068:8;26539:4;26563:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26563:16:0;:30;;;26474:127;42060:17;42052:53;;;;-1:-1:-1;;;42052:53:0;;13991:2:1;42052:53:0;;;13973:21:1;14030:2;14010:18;;;14003:30;14069:25;14049:18;;;14042:53;14112:18;;42052:53:0;13963:173:1;42052:53:0;46768:54:::1;46790:31:::0;;;:21:::1;:31;::::0;;;;;;;;46768:54;;:21:::1;:54:::0;;;;;46835:26:::1;46812:8:::0;46835:16:::1;:26::i;:::-;46751:111;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46737:126;;42116:1;46618:253:::0;;;;:::o;45580:557::-;45655:18;45675:23;45700:19;45721:22;45745:11;45758;45789;:26;45801:13;45789:26;;;;;;;;;;;:31;;45782:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45849:26:0;;;;-1:-1:-1;;45849:11:0;:26;;;;;;:42;;;;45919:41;;;;45985:38;;;;46043:33;;;;;45782:38;;45849:42;;45985:38;;-1:-1:-1;45919:41:0;-1:-1:-1;46043:33:0;;;;;-1:-1:-1;46043:33:0;46096;;;;;;;-1:-1:-1;45580:557:0;-1:-1:-1;;45580:557:0:o;46462:148::-;46506:13;46539:63;;;;;;;;;;;;;;;;;46532:70;;46462:148;:::o;42391:146::-;42456:16;42492:37;42503:10;42515:13;42492:10;:37::i;45388:184::-;42198:26;;;;:11;:26;;;;;:33;;;:26;;:33;;;;;42197:34;42189:72;;;;-1:-1:-1;;;42189:72:0;;;;;;;:::i;:::-;42343:5:::1;::::0;-1:-1:-1;;;;;42343:5:0::1;42329:10;:19;42321:42;;;;-1:-1:-1::0;;;42321:42:0::1;;;;;;;:::i;:::-;45514:36:::2;::::0;;;:21:::2;:36;::::0;;;;;;;:50;;::::2;::::0;;::::2;::::0;::::2;:::i;46300:154::-:0;46409:37;;;;:22;:37;;;;;;;;;46402:44;;;;;;;;;;;;;;;;;46374:16;;46402:44;;;46409:37;46402:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46300:154;;;:::o;20576:305::-;20678:4;-1:-1:-1;;;;;;20715:40:0;;-1:-1:-1;;;20715:40:0;;:105;;-1:-1:-1;;;;;;;20772:48:0;;-1:-1:-1;;;20772:48:0;20715:105;:158;;;-1:-1:-1;;;;;;;;;;19183:40:0;;;20837:36;19074:157;30456:174;30531:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30531:29:0;-1:-1:-1;;;;;30531:29:0;;;;;;;;:24;;30585:23;30531:24;30585:14;:23::i;:::-;-1:-1:-1;;;;;30576:46:0;;;;;;;;;;;30456:174;;:::o;26768:348::-;26861:4;26563:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26563:16:0;26878:73;;;;-1:-1:-1;;;26878:73:0;;14682:2:1;26878:73:0;;;14664:21:1;14721:2;14701:18;;;14694:30;14760:34;14740:18;;;14733:62;-1:-1:-1;;;14811:18:1;;;14804:42;14863:19;;26878:73:0;14654:234:1;26878:73:0;26962:13;26978:23;26993:7;26978:14;:23::i;:::-;26962:39;;27031:5;-1:-1:-1;;;;;27020:16:0;:7;-1:-1:-1;;;;;27020:16:0;;:51;;;;27064:7;-1:-1:-1;;;;;27040:31:0;:20;27052:7;27040:11;:20::i;:::-;-1:-1:-1;;;;;27040:31:0;;27020:51;:87;;;-1:-1:-1;;;;;;23860:25:0;;;23836:4;23860:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27075:32;27012:96;26768:348;-1:-1:-1;;;;26768:348:0:o;29760:578::-;29919:4;-1:-1:-1;;;;;29892:31:0;:23;29907:7;29892:14;:23::i;:::-;-1:-1:-1;;;;;29892:31:0;;29884:85;;;;-1:-1:-1;;;29884:85:0;;17115:2:1;29884:85:0;;;17097:21:1;17154:2;17134:18;;;17127:30;17193:34;17173:18;;;17166:62;-1:-1:-1;;;17244:18:1;;;17237:39;17293:19;;29884:85:0;17087:231:1;29884:85:0;-1:-1:-1;;;;;29988:16:0;;29980:65;;;;-1:-1:-1;;;29980:65:0;;13232:2:1;29980:65:0;;;13214:21:1;13271:2;13251:18;;;13244:30;13310:34;13290:18;;;13283:62;-1:-1:-1;;;13361:18:1;;;13354:34;13405:19;;29980:65:0;13204:226:1;29980:65:0;30058:39;30079:4;30085:2;30089:7;30058:20;:39::i;:::-;30162:29;30179:1;30183:7;30162:8;:29::i;:::-;-1:-1:-1;;;;;30204:15:0;;;;;;:9;:15;;;;;:20;;30223:1;;30204:15;:20;;30223:1;;30204:20;:::i;:::-;;;;-1:-1:-1;;;;;;;30235:13:0;;;;;;:9;:13;;;;;:18;;30252:1;;30235:13;:18;;30252:1;;30235:18;:::i;:::-;;;;-1:-1:-1;;30264:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30264:21:0;-1:-1:-1;;;;;30264:21:0;;;;;;;;;30303:27;;30264:16;;30303:27;;;;;;;29760:578;;;:::o;43154:844::-;43228:16;43311:26;;;:11;:26;;;;;:38;;;43228:16;;43280:27;41478:7;43323:13;43280:27;:::i;:::-;43279:70;;;;:::i;:::-;43401:26;;;;:11;:26;;;;;:38;;;43257:92;;-1:-1:-1;43401:40:0;;43440:1;43401:40;:::i;:::-;43360:26;;;;:11;:26;;;;;;;;:38;;:81;;;43480:82;43360:26;;43480:82;;43360:81;;43537:12;;43551:10;;43480:82;7595:19:1;;;7639:2;7630:12;;7623:28;;;;7689:2;7685:15;-1:-1:-1;;7681:53:1;7676:2;7667:12;;7660:75;7760:2;7751:12;;7585:184;43480:82:0;;;;-1:-1:-1;;43480:82:0;;;;;;;;;43470:93;;43480:82;43470:93;;;;43574:28;;;;:15;:28;;;;;:42;;;;;;;;;;;;;;;;;43627:22;;;:13;:22;;;;;:36;;;43470:93;-1:-1:-1;43674:23:0;43680:3;43590:11;43674:5;:23::i;:::-;43708:34;;;;:21;:34;;;;;;;;:50;;;43769:37;;;:22;:37;;;;;:55;;;;;;;;;;;;;;;;;;43878:26;;;:11;:26;;;;;;;:38;;;;43918:42;;;43840:121;;43745:13;;43730:11;;-1:-1:-1;;;;;43840:121:0;;;;;;;18912:25:1;;18968:2;18953:18;;18946:34;18900:2;18885:18;;18867:119;43840:121:0;;;;;;;;-1:-1:-1;43979:11:0;43154:844;-1:-1:-1;;;43154:844:0:o;44006:400::-;44074:9;:13;44070:329;;44104:23;44130:26;;;:11;:26;;;;;:42;;;;44204:27;44130:42;44204:9;:27;:::i;:::-;44187:44;-1:-1:-1;44250:10:0;;44246:87;;44281:36;;44289:10;;44281:36;;;;;44310:6;;44281:36;;;;44310:6;44289:10;44281:36;;;;;;;;;;;;;;;;;;;;;44246:87;44355:5;;44347:40;;-1:-1:-1;;;;;44355:5:0;;;;44347:40;;;;;44371:15;;44355:5;44347:40;44355:5;44347:40;44371:15;44355:5;44347:40;;;;;;;;;;;;;;;;;;;44070:329;44006:400;:::o;25846:315::-;26003:28;26013:4;26019:2;26023:7;26003:9;:28::i;:::-;26050:48;26073:4;26079:2;26083:7;26092:5;26050:22;:48::i;:::-;26042:111;;;;-1:-1:-1;;;26042:111:0;;;;;;;:::i;16511:723::-;16567:13;16788:10;16784:53;;-1:-1:-1;16815:10:0;;;;;;;;;;;;-1:-1:-1;;;16815:10:0;;;;;;16784:53;16862:5;16847:12;16903:78;16910:9;;16903:78;;16936:8;;;;:::i;:::-;;-1:-1:-1;16959:10:0;;-1:-1:-1;16967:2:0;16959:10;;:::i;:::-;;;16903:78;;;16991:19;17023:6;17013:17;;;;;;-1:-1:-1;;;17013:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17013:17:0;;16991:39;;17041:154;17048:10;;17041:154;;17075:11;17085:1;17075:11;;:::i;:::-;;-1:-1:-1;17144:10:0;17152:2;17144:5;:10;:::i;:::-;17131:24;;:2;:24;:::i;:::-;17118:39;;17101:6;17108;17101:14;;;;;;-1:-1:-1;;;17101:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;17101:56:0;;;;;;;;-1:-1:-1;17172:11:0;17181:2;17172:11;;:::i;:::-;;;17041:154;;36312:589;-1:-1:-1;;;;;36518:18:0;;36514:187;;36553:40;36585:7;37728:10;:17;;37701:24;;;;:15;:24;;;;;:44;;;37756:24;;;;;;;;;;;;37624:164;36553:40;36514:187;;;36623:2;-1:-1:-1;;;;;36615:10:0;:4;-1:-1:-1;;;;;36615:10:0;;36611:90;;36642:47;36675:4;36681:7;36642:32;:47::i;:::-;-1:-1:-1;;;;;36715:16:0;;36711:183;;36748:45;36785:7;36748:36;:45::i;:::-;36711:183;;;36821:4;-1:-1:-1;;;;;36815:10:0;:2;-1:-1:-1;;;;;36815:10:0;;36811:83;;36842:40;36870:2;36874:7;36842:27;:40::i;28452:382::-;-1:-1:-1;;;;;28532:16:0;;28524:61;;;;-1:-1:-1;;;28524:61:0;;16341:2:1;28524:61:0;;;16323:21:1;;;16360:18;;;16353:30;16419:34;16399:18;;;16392:62;16471:18;;28524:61:0;16313:182:1;28524:61:0;26539:4;26563:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26563:16:0;:30;28596:58;;;;-1:-1:-1;;;28596:58:0;;11706:2:1;28596:58:0;;;11688:21:1;11745:2;11725:18;;;11718:30;11784;11764:18;;;11757:58;11832:18;;28596:58:0;11678:178:1;28596:58:0;28667:45;28696:1;28700:2;28704:7;28667:20;:45::i;:::-;-1:-1:-1;;;;;28725:13:0;;;;;;:9;:13;;;;;:18;;28742:1;;28725:13;:18;;28742:1;;28725:18;:::i;:::-;;;;-1:-1:-1;;28754:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28754:21:0;-1:-1:-1;;;;;28754:21:0;;;;;;;;28793:33;;28754:16;;;28793:33;;28754:16;;28793:33;28452:382;;:::o;31195:803::-;31350:4;-1:-1:-1;;;;;31371:13:0;;8555:20;8603:8;31367:624;;31407:72;;-1:-1:-1;;;31407:72:0;;-1:-1:-1;;;;;31407:36:0;;;;;:72;;16058:10;;31458:4;;31464:7;;31473:5;;31407:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31407:72:0;;;;;;;;-1:-1:-1;;31407:72:0;;;;;;;;;;;;:::i;:::-;;;31403:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31653:13:0;;31649:272;;31696:60;;-1:-1:-1;;;31696:60:0;;;;;;;:::i;31649:272::-;31871:6;31865:13;31856:6;31852:2;31848:15;31841:38;31403:533;-1:-1:-1;;;;;;31530:55:0;-1:-1:-1;;;31530:55:0;;-1:-1:-1;31523:62:0;;31367:624;-1:-1:-1;31975:4:0;31195:803;;;;;;:::o;38415:988::-;38681:22;38731:1;38706:22;38723:4;38706:16;:22::i;:::-;:26;;;;:::i;:::-;38743:18;38764:26;;;:17;:26;;;;;;38681:51;;-1:-1:-1;38897:28:0;;;38893:328;;-1:-1:-1;;;;;38964:18:0;;38942:19;38964:18;;;:12;:18;;;;;;;;:34;;;;;;;;;39015:30;;;;;;:44;;;39132:30;;:17;:30;;;;;:43;;;38893:328;-1:-1:-1;39317:26:0;;;;:17;:26;;;;;;;;39310:33;;;-1:-1:-1;;;;;39361:18:0;;;;;:12;:18;;;;;:34;;;;;;;39354:41;38415:988::o;39698:1079::-;39976:10;:17;39951:22;;39976:21;;39996:1;;39976:21;:::i;:::-;40008:18;40029:24;;;:15;:24;;;;;;40402:10;:26;;39951:46;;-1:-1:-1;40029:24:0;;39951:46;;40402:26;;;;-1:-1:-1;;;40402:26:0;;;;;;;;;;;;;;;;;40380:48;;40466:11;40441:10;40452;40441:22;;;;;;-1:-1:-1;;;40441:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;40546:28;;;:15;:28;;;;;;;:41;;;40718:24;;;;;40711:31;40753:10;:16;;;;;-1:-1:-1;;;40753:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;39698:1079;;;;:::o;37202:221::-;37287:14;37304:20;37321:2;37304:16;:20::i;:::-;-1:-1:-1;;;;;37335:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;37380:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;37202:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:2;;813:1;810;803:12;828:229;;924:3;917:4;909:6;905:17;901:27;891:2;;946:5;939;932:20;891:2;972:79;1047:3;1038:6;1025:20;1018:4;1010:6;1006:17;972:79;:::i;1062:196::-;;1174:2;1162:9;1153:7;1149:23;1145:32;1142:2;;;1195:6;1187;1180:22;1142:2;1223:29;1242:9;1223:29;:::i;1263:270::-;;;1392:2;1380:9;1371:7;1367:23;1363:32;1360:2;;;1413:6;1405;1398:22;1360:2;1441:29;1460:9;1441:29;:::i;:::-;1431:39;;1489:38;1523:2;1512:9;1508:18;1489:38;:::i;:::-;1479:48;;1350:183;;;;;:::o;1538:338::-;;;;1684:2;1672:9;1663:7;1659:23;1655:32;1652:2;;;1705:6;1697;1690:22;1652:2;1733:29;1752:9;1733:29;:::i;:::-;1723:39;;1781:38;1815:2;1804:9;1800:18;1781:38;:::i;:::-;1771:48;;1866:2;1855:9;1851:18;1838:32;1828:42;;1642:234;;;;;:::o;1881:696::-;;;;;2053:3;2041:9;2032:7;2028:23;2024:33;2021:2;;;2075:6;2067;2060:22;2021:2;2103:29;2122:9;2103:29;:::i;:::-;2093:39;;2151:38;2185:2;2174:9;2170:18;2151:38;:::i;:::-;2141:48;;2236:2;2225:9;2221:18;2208:32;2198:42;;2291:2;2280:9;2276:18;2263:32;2318:18;2310:6;2307:30;2304:2;;;2355:6;2347;2340:22;2304:2;2383:22;;2436:4;2428:13;;2424:27;-1:-1:-1;2414:2:1;;2470:6;2462;2455:22;2414:2;2498:73;2563:7;2558:2;2545:16;2540:2;2536;2532:11;2498:73;:::i;:::-;2488:83;;;2011:566;;;;;;;:::o;2582:367::-;;;2708:2;2696:9;2687:7;2683:23;2679:32;2676:2;;;2729:6;2721;2714:22;2676:2;2757:29;2776:9;2757:29;:::i;:::-;2747:39;;2836:2;2825:9;2821:18;2808:32;2883:5;2876:13;2869:21;2862:5;2859:32;2849:2;;2910:6;2902;2895:22;2849:2;2938:5;2928:15;;;2666:283;;;;;:::o;2954:264::-;;;3083:2;3071:9;3062:7;3058:23;3054:32;3051:2;;;3104:6;3096;3089:22;3051:2;3132:29;3151:9;3132:29;:::i;:::-;3122:39;3208:2;3193:18;;;;3180:32;;-1:-1:-1;;;3041:177:1:o;3223:255::-;;3334:2;3322:9;3313:7;3309:23;3305:32;3302:2;;;3355:6;3347;3340:22;3302:2;3399:9;3386:23;3418:30;3442:5;3418:30;:::i;3483:259::-;;3605:2;3593:9;3584:7;3580:23;3576:32;3573:2;;;3626:6;3618;3611:22;3573:2;3663:9;3657:16;3682:30;3706:5;3682:30;:::i;3747:410::-;;;3886:2;3874:9;3865:7;3861:23;3857:32;3854:2;;;3907:6;3899;3892:22;3854:2;3952:9;3939:23;3985:18;3977:6;3974:30;3971:2;;;4022:6;4014;4007:22;3971:2;4050:50;4092:7;4083:6;4072:9;4068:22;4050:50;:::i;:::-;4040:60;4147:2;4132:18;;;;4119:32;;-1:-1:-1;;;;3844:313:1:o;4162:478::-;;;;4318:2;4306:9;4297:7;4293:23;4289:32;4286:2;;;4339:6;4331;4324:22;4286:2;4384:9;4371:23;4417:18;4409:6;4406:30;4403:2;;;4454:6;4446;4439:22;4403:2;4482:50;4524:7;4515:6;4504:9;4500:22;4482:50;:::i;:::-;4472:60;4579:2;4564:18;;4551:32;;-1:-1:-1;4630:2:1;4615:18;;;4602:32;;4276:364;-1:-1:-1;;;;4276:364:1:o;4645:190::-;;4757:2;4745:9;4736:7;4732:23;4728:32;4725:2;;;4778:6;4770;4763:22;4725:2;-1:-1:-1;4806:23:1;;4715:120;-1:-1:-1;4715:120:1:o;4840:410::-;;;4979:2;4967:9;4958:7;4954:23;4950:32;4947:2;;;5000:6;4992;4985:22;4947:2;5041:9;5028:23;5018:33;;5102:2;5091:9;5087:18;5074:32;5129:18;5121:6;5118:30;5115:2;;;5166:6;5158;5151:22;5115:2;5194:50;5236:7;5227:6;5216:9;5212:22;5194:50;:::i;:::-;5184:60;;;4937:313;;;;;:::o;5255:258::-;;;5384:2;5372:9;5363:7;5359:23;5355:32;5352:2;;;5405:6;5397;5390:22;5352:2;-1:-1:-1;;5433:23:1;;;5503:2;5488:18;;;5475:32;;-1:-1:-1;5342:171:1:o;5518:257::-;;5597:5;5591:12;5624:6;5619:3;5612:19;5640:63;5696:6;5689:4;5684:3;5680:14;5673:4;5666:5;5662:16;5640:63;:::i;:::-;5757:2;5736:15;-1:-1:-1;;5732:29:1;5723:39;;;;5764:4;5719:50;;5567:208;-1:-1:-1;;5567:208:1:o;5780:185::-;;5860:5;5854:12;5875:52;5920:6;5915:3;5908:4;5901:5;5897:16;5875:52;:::i;:::-;5943:16;;;;;5830:135;-1:-1:-1;;5830:135:1:o;6095:1310::-;;6401:3;6436:6;6430:13;6466:3;6488:1;6516:9;6512:2;6508:18;6498:28;;6576:2;6565:9;6561:18;6598;6588:2;;6642:4;6634:6;6630:17;6620:27;;6588:2;6668;6716;6708:6;6705:14;6685:18;6682:38;6679:2;;;-1:-1:-1;;;6743:33:1;;6799:4;6796:1;6789:15;6829:4;6750:3;6817:17;6679:2;6860:18;6887:104;;;;7005:1;7000:322;;;;6853:469;;6887:104;-1:-1:-1;;6920:24:1;;6908:37;;6965:16;;;;-1:-1:-1;6887:104:1;;7000:322;18991:127;19057:17;;;19107:4;19091:21;;7095:3;7111:165;7125:6;7122:1;7119:13;7111:165;;;7203:14;;7190:11;;;7183:35;7246:16;;;;7140:10;;7111:165;;;7115:3;;7305:6;7300:3;7296:16;7289:23;;6853:469;;;;;;;7338:61;7364:34;7394:3;-1:-1:-1;;;6035:22:1;;6082:1;6073:11;;6025:65;7364:34;7356:6;7338:61;:::i;:::-;7331:68;6380:1025;-1:-1:-1;;;;;6380:1025:1:o;7982:488::-;-1:-1:-1;;;;;8251:15:1;;;8233:34;;8303:15;;8298:2;8283:18;;8276:43;8350:2;8335:18;;8328:34;;;8398:3;8393:2;8378:18;;8371:31;;;7982:488;;8419:45;;8444:19;;8436:6;8419:45;:::i;:::-;8411:53;8185:285;-1:-1:-1;;;;;;8185:285:1:o;8475:635::-;8646:2;8698:21;;;8768:13;;8671:18;;;8790:22;;;8475:635;;8646:2;8869:15;;;;8843:2;8828:18;;;8475:635;8915:169;8929:6;8926:1;8923:13;8915:169;;;8990:13;;8978:26;;9059:15;;;;9024:12;;;;8951:1;8944:9;8915:169;;;-1:-1:-1;9101:3:1;;8626:484;-1:-1:-1;;;;;;8626:484:1:o;9489:219::-;;9638:2;9627:9;9620:21;9658:44;9698:2;9687:9;9683:18;9675:6;9658:44;:::i;9713:598::-;;9990:3;9979:9;9972:22;10011:45;10051:3;10040:9;10036:19;10028:6;10011:45;:::i;:::-;10087:2;10072:18;;10065:34;;;;-1:-1:-1;10130:2:1;10115:18;;10108:34;;;;10173:2;10158:18;;10151:34;;;;10229:14;10222:22;10216:3;10201:19;;10194:51;10289:14;10282:22;10276:3;10261:19;;;10254:51;10003:53;9962:349;-1:-1:-1;9962:349:1:o;11085:414::-;11287:2;11269:21;;;11326:2;11306:18;;;11299:30;11365:34;11360:2;11345:18;;11338:62;-1:-1:-1;;;11431:2:1;11416:18;;11409:48;11489:3;11474:19;;11259:240::o;11861:349::-;12063:2;12045:21;;;12102:2;12082:18;;;12075:30;12141:27;12136:2;12121:18;;12114:55;12201:2;12186:18;;12035:175::o;14141:334::-;14343:2;14325:21;;;14382:2;14362:18;;;14355:30;-1:-1:-1;;;14416:2:1;14401:18;;14394:40;14466:2;14451:18;;14315:160::o;17725:413::-;17927:2;17909:21;;;17966:2;17946:18;;;17939:30;18005:34;18000:2;17985:18;;17978:62;-1:-1:-1;;;18071:2:1;18056:18;;18049:47;18128:3;18113:19;;17899:239::o;19123:128::-;;19194:1;19190:6;19187:1;19184:13;19181:2;;;19200:18;;:::i;:::-;-1:-1:-1;19236:9:1;;19171:80::o;19256:120::-;;19322:1;19312:2;;19327:18;;:::i;:::-;-1:-1:-1;19361:9:1;;19302:74::o;19381:168::-;;19487:1;19483;19479:6;19475:14;19472:1;19469:21;19464:1;19457:9;19450:17;19446:45;19443:2;;;19494:18;;:::i;:::-;-1:-1:-1;19534:9:1;;19433:116::o;19554:125::-;;19622:1;19619;19616:8;19613:2;;;19627:18;;:::i;:::-;-1:-1:-1;19664:9:1;;19603:76::o;19684:258::-;19756:1;19766:113;19780:6;19777:1;19774:13;19766:113;;;19856:11;;;19850:18;19837:11;;;19830:39;19802:2;19795:10;19766:113;;;19897:6;19894:1;19891:13;19888:2;;;-1:-1:-1;;19932:1:1;19914:16;;19907:27;19737:205::o;19947:380::-;20026:1;20022:12;;;;20069;;;20090:2;;20144:4;20136:6;20132:17;20122:27;;20090:2;20197;20189:6;20186:14;20166:18;20163:38;20160:2;;;20243:10;20238:3;20234:20;20231:1;20224:31;20278:4;20275:1;20268:15;20306:4;20303:1;20296:15;20332:135;;-1:-1:-1;;20392:17:1;;20389:2;;;20412:18;;:::i;:::-;-1:-1:-1;20459:1:1;20448:13;;20379:88::o;20472:112::-;;20530:1;20520:2;;20535:18;;:::i;:::-;-1:-1:-1;20569:9:1;;20510:74::o;20589:127::-;20650:10;20645:3;20641:20;20638:1;20631:31;20681:4;20678:1;20671:15;20705:4;20702:1;20695:15;20721:127;20782:10;20777:3;20773:20;20770:1;20763:31;20813:4;20810:1;20803:15;20837:4;20834:1;20827:15;20853:127;20914:10;20909:3;20905:20;20902:1;20895:31;20945:4;20942:1;20935:15;20969:4;20966:1;20959:15;20985:131;-1:-1:-1;;;;;;21059:32:1;;21049:43;;21039:2;;21106:1;21103;21096:12
Swarm Source
ipfs://54718bae50466e4a01f1b74de4e1549b23210492f06af50bd030ba12eceee24b
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.