ERC-721
Overview
Max Total Supply
3,287 ZMICE
Holders
172
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 ZMICELoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ZombieMice
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-09-21 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/introspection/IERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/utils/Context.sol pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: contracts/zombiemice.sol pragma solidity ^0.8.0; // contract inheritance interface ICheeth { function getStaker(uint256 tokenId) external returns (address); } contract ZombieMice is ERC721Enumerable, Ownable { address public anonymiceAddress = 0xbad6186E92002E312078b5a1dAfd5ddf63d3f731; address public cheethAddress = 0x5f7BA84c7984Aa5ef329B66E313498F0aEd6d23A; uint public maxTokens = 6450; uint public mintingCost = 0.02 ether; string private baseTokenURI; uint public miceClaimed = 0; uint public maxMiceClaimed = 3550; uint public normalMinted = 0; uint public maxNormalMinted = 2900; uint public maxMintPerTx = 10; mapping(uint => uint) miceUsedToClaim; event Mint(address to, uint tokenId); event MintWithMice(address to, uint tokenId); constructor() ERC721("Zombiemice", "ZMICE") {} // modifiers bool claimIsEnabled; modifier claimEnabled { require(claimIsEnabled); _; } modifier onlySender() { require(msg.sender == tx.origin); _; } // owner functions function setClaimStatus(bool bool_) external onlyOwner { claimIsEnabled = bool_; } function setClaimedMiceToMintable() external onlyOwner { maxNormalMinted = maxNormalMinted + (maxMiceClaimed - miceClaimed); } function withdrawEther() external onlyOwner { payable(msg.sender).transfer(address(this).balance); } function setBaseTokenURI(string memory uri_) external onlyOwner { baseTokenURI = uri_; } // functions function mintWithStakedMice(uint tokenId_) external onlySender claimEnabled { require(msg.sender == ICheeth(cheethAddress).getStaker(tokenId_), "You are not the staker!"); require(miceUsedToClaim[tokenId_] == 0, "Mice already used to claim!"); require(miceClaimed + 1 <= maxMiceClaimed, "No more claimable mice!"); uint _mintId = totalSupply(); miceUsedToClaim[tokenId_]++; miceClaimed++; _mint(msg.sender, _mintId); emit MintWithMice(msg.sender, _mintId); } function mintWithMice(uint tokenId_) external onlySender claimEnabled { require(msg.sender == IERC721(anonymiceAddress).ownerOf(tokenId_), "You are not the owner!"); require(miceUsedToClaim[tokenId_] == 0, "Mice already used to claim!"); require(miceClaimed + 1 <= maxMiceClaimed, "No more claimable mice!"); uint _mintId = totalSupply(); miceUsedToClaim[tokenId_]++; miceClaimed++; _mint(msg.sender, _mintId); emit MintWithMice(msg.sender, _mintId); } function mint(uint amount_) payable external onlySender { require(amount_ <= maxMintPerTx, "Over Maximum Mints per TX!"); require(msg.value == (mintingCost * amount_), "Invalid value!"); require(normalMinted + amount_ <= maxNormalMinted, "No more mintable mice!"); uint _startMintId = totalSupply(); normalMinted = normalMinted + amount_; // this mints the amount of tokens for (uint i = 0; i < amount_; i++) { uint _mintId = _startMintId + i; _mint(msg.sender, _mintId); emit Mint(msg.sender, _mintId); } } // view functions function tokenURI(uint tokenId_) public view override returns (string memory) { return string(abi.encodePacked(baseTokenURI, Strings.toString(tokenId_))); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"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":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"MintWithMice","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"anonymiceAddress","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":[],"name":"cheethAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMiceClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxNormalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"miceClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"mintWithMice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"mintWithStakedMice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintingCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"normalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bool_","type":"bool"}],"name":"setClaimStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setClaimedMiceToMintable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600b80546001600160a01b031990811673bad6186e92002e312078b5a1dafd5ddf63d3f73117909155600c8054909116735f7ba84c7984aa5ef329b66e313498f0aed6d23a179055611932600d5566470de4df820000600e5560006010819055610dde601155601255610b54601355600a6014553480156200008557600080fd5b50604080518082018252600a8152695a6f6d6269656d69636560b01b6020808301918252835180850190945260058452645a4d49434560d81b908401528151919291620000d59160009162000164565b508051620000eb90600190602084019062000164565b50505062000108620001026200010e60201b60201c565b62000112565b62000247565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462000172906200020a565b90600052602060002090601f016020900481019282620001965760008555620001e1565b82601f10620001b157805160ff1916838001178555620001e1565b82800160010185558215620001e1579182015b82811115620001e1578251825591602001919060010190620001c4565b50620001ef929150620001f3565b5090565b5b80821115620001ef5760008155600101620001f4565b600181811c908216806200021f57607f821691505b602082108114156200024157634e487b7160e01b600052602260045260246000fd5b50919050565b6123ee80620002576000396000f3fe6080604052600436106102045760003560e01c8063715018a611610118578063a22cb465116100a0578063de7fcb1d1161006f578063de7fcb1d1461059a578063e8315742146105b0578063e985e9c5146105c6578063ebf98abf1461060f578063f2fde38b1461062557600080fd5b8063a22cb46514610525578063ae0aadd414610545578063b88d4fde1461055a578063c87b56dd1461057a57600080fd5b80638da5cb5b116100e75780638da5cb5b146104a957806395d89b41146104c75780639ff2c0c7146104dc578063a0712d68146104fc578063a0df3be51461050f57600080fd5b8063715018a6146104495780637362377b1461045e578063789c9c161461047357806382b102621461049357600080fd5b806318160ddd1161019b57806342842e0e1161016a57806342842e0e146103a95780634f6ccce7146103c95780636352211e146103e9578063654f97a31461040957806370a082311461042957600080fd5b806318160ddd1461033457806323b872dd146103495780632f745c591461036957806330176e131461038957600080fd5b8063095ea7b3116101d7578063095ea7b3146102ba5780630aef4d4f146102da5780630f89a0f8146102fe57806314716ac81461031457600080fd5b806301ffc9a714610209578063024336e61461023e57806306fdde0314610260578063081812fc14610282575b600080fd5b34801561021557600080fd5b50610229610224366004611f74565b610645565b60405190151581526020015b60405180910390f35b34801561024a57600080fd5b5061025e610259366004611ff7565b610670565b005b34801561026c57600080fd5b506102756108a9565b604051610235919061213c565b34801561028e57600080fd5b506102a261029d366004611ff7565b61093b565b6040516001600160a01b039091168152602001610235565b3480156102c657600080fd5b5061025e6102d5366004611f2d565b6109d0565b3480156102e657600080fd5b506102f060115481565b604051908152602001610235565b34801561030a57600080fd5b506102f060105481565b34801561032057600080fd5b50600b546102a2906001600160a01b031681565b34801561034057600080fd5b506008546102f0565b34801561035557600080fd5b5061025e610364366004611e37565b610ae6565b34801561037557600080fd5b506102f0610384366004611f2d565b610b17565b34801561039557600080fd5b5061025e6103a4366004611fae565b610bad565b3480156103b557600080fd5b5061025e6103c4366004611e37565b610bee565b3480156103d557600080fd5b506102f06103e4366004611ff7565b610c09565b3480156103f557600080fd5b506102a2610404366004611ff7565b610c9c565b34801561041557600080fd5b5061025e610424366004611f59565b610d13565b34801561043557600080fd5b506102f0610444366004611dbd565b610d50565b34801561045557600080fd5b5061025e610dd7565b34801561046a57600080fd5b5061025e610e0d565b34801561047f57600080fd5b5061025e61048e366004611ff7565b610e66565b34801561049f57600080fd5b506102f060125481565b3480156104b557600080fd5b50600a546001600160a01b03166102a2565b3480156104d357600080fd5b50610275610f5f565b3480156104e857600080fd5b50600c546102a2906001600160a01b031681565b61025e61050a366004611ff7565b610f6e565b34801561051b57600080fd5b506102f060135481565b34801561053157600080fd5b5061025e610540366004611ef8565b6110fe565b34801561055157600080fd5b5061025e6111c3565b34801561056657600080fd5b5061025e610575366004611e78565b61120f565b34801561058657600080fd5b50610275610595366004611ff7565b611247565b3480156105a657600080fd5b506102f060145481565b3480156105bc57600080fd5b506102f0600d5481565b3480156105d257600080fd5b506102296105e1366004611dfe565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561061b57600080fd5b506102f0600e5481565b34801561063157600080fd5b5061025e610640366004611dbd565b61127b565b60006001600160e01b0319821663780e9d6360e01b148061066a575061066a82611313565b92915050565b33321461067c57600080fd5b60165460ff1661068b57600080fd5b600b546040516331a9108f60e11b8152600481018390526001600160a01b0390911690636352211e9060240160206040518083038186803b1580156106cf57600080fd5b505afa1580156106e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107079190611de1565b6001600160a01b0316336001600160a01b0316146107655760405162461bcd60e51b8152602060048201526016602482015275596f7520617265206e6f7420746865206f776e65722160501b60448201526064015b60405180910390fd5b600081815260156020526040902054156107c15760405162461bcd60e51b815260206004820152601b60248201527f4d69636520616c7265616479207573656420746f20636c61696d210000000000604482015260640161075c565b6011546010546107d2906001612227565b11156108205760405162461bcd60e51b815260206004820152601760248201527f4e6f206d6f726520636c61696d61626c65206d69636521000000000000000000604482015260640161075c565b600061082b60085490565b6000838152601560205260408120805492935090610848836122f0565b90915550506010805490600061085d836122f0565b919050555061086c3382611363565b60408051338152602081018390527fc3cd8a2f806e19c9e97cf657caab0ed51008c90401a3c8f851a4fa69f34fa8db910160405180910390a15050565b6060600080546108b8906122b5565b80601f01602080910402602001604051908101604052809291908181526020018280546108e4906122b5565b80156109315780601f1061090657610100808354040283529160200191610931565b820191906000526020600020905b81548152906001019060200180831161091457829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109b45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161075c565b506000908152600460205260409020546001600160a01b031690565b60006109db82610c9c565b9050806001600160a01b0316836001600160a01b03161415610a495760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161075c565b336001600160a01b0382161480610a655750610a6581336105e1565b610ad75760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161075c565b610ae183836114b1565b505050565b610af0338261151f565b610b0c5760405162461bcd60e51b815260040161075c906121d6565b610ae1838383611616565b6000610b2283610d50565b8210610b845760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161075c565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610bd75760405162461bcd60e51b815260040161075c906121a1565b8051610bea90600f906020840190611c99565b5050565b610ae18383836040518060200160405280600081525061120f565b6000610c1460085490565b8210610c775760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161075c565b60088281548110610c8a57610c8a612361565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b03168061066a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161075c565b600a546001600160a01b03163314610d3d5760405162461bcd60e51b815260040161075c906121a1565b6016805460ff1916911515919091179055565b60006001600160a01b038216610dbb5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161075c565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610e015760405162461bcd60e51b815260040161075c906121a1565b610e0b60006117c1565b565b600a546001600160a01b03163314610e375760405162461bcd60e51b815260040161075c906121a1565b60405133904780156108fc02916000818181858888f19350505050158015610e63573d6000803e3d6000fd5b50565b333214610e7257600080fd5b60165460ff16610e8157600080fd5b600c546040516371e4cc7f60e11b8152600481018390526001600160a01b039091169063e3c998fe90602401602060405180830381600087803b158015610ec757600080fd5b505af1158015610edb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eff9190611de1565b6001600160a01b0316336001600160a01b0316146107655760405162461bcd60e51b815260206004820152601760248201527f596f7520617265206e6f7420746865207374616b657221000000000000000000604482015260640161075c565b6060600180546108b8906122b5565b333214610f7a57600080fd5b601454811115610fcc5760405162461bcd60e51b815260206004820152601a60248201527f4f766572204d6178696d756d204d696e74732070657220545821000000000000604482015260640161075c565b80600e54610fda9190612253565b34146110195760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642076616c75652160901b604482015260640161075c565b6013548160125461102a9190612227565b11156110715760405162461bcd60e51b81526020600482015260166024820152754e6f206d6f7265206d696e7461626c65206d6963652160501b604482015260640161075c565b600061107c60085490565b90508160125461108c9190612227565b60125560005b82811015610ae15760006110a68284612227565b90506110b23382611363565b60408051338152602081018390527f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885910160405180910390a150806110f6816122f0565b915050611092565b6001600160a01b0382163314156111575760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161075c565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633146111ed5760405162461bcd60e51b815260040161075c906121a1565b6010546011546111fd9190612272565b60135461120a9190612227565b601355565b611219338361151f565b6112355760405162461bcd60e51b815260040161075c906121d6565b61124184848484611813565b50505050565b6060600f61125483611846565b604051602001611265929190612058565b6040516020818303038152906040529050919050565b600a546001600160a01b031633146112a55760405162461bcd60e51b815260040161075c906121a1565b6001600160a01b03811661130a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161075c565b610e63816117c1565b60006001600160e01b031982166380ac58cd60e01b148061134457506001600160e01b03198216635b5e139f60e01b145b8061066a57506301ffc9a760e01b6001600160e01b031983161461066a565b6001600160a01b0382166113b95760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161075c565b6000818152600260205260409020546001600160a01b03161561141e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161075c565b61142a60008383611944565b6001600160a01b0382166000908152600360205260408120805460019290611453908490612227565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906114e682610c9c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166115985760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161075c565b60006115a383610c9c565b9050806001600160a01b0316846001600160a01b031614806115de5750836001600160a01b03166115d38461093b565b6001600160a01b0316145b8061160e57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661162982610c9c565b6001600160a01b0316146116915760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161075c565b6001600160a01b0382166116f35760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161075c565b6116fe838383611944565b6117096000826114b1565b6001600160a01b0383166000908152600360205260408120805460019290611732908490612272565b90915550506001600160a01b0382166000908152600360205260408120805460019290611760908490612227565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61181e848484611616565b61182a848484846119fc565b6112415760405162461bcd60e51b815260040161075c9061214f565b60608161186a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611894578061187e816122f0565b915061188d9050600a8361223f565b915061186e565b60008167ffffffffffffffff8111156118af576118af612377565b6040519080825280601f01601f1916602001820160405280156118d9576020820181803683370190505b5090505b841561160e576118ee600183612272565b91506118fb600a8661230b565b611906906030612227565b60f81b81838151811061191b5761191b612361565b60200101906001600160f81b031916908160001a90535061193d600a8661223f565b94506118dd565b6001600160a01b03831661199f5761199a81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6119c2565b816001600160a01b0316836001600160a01b0316146119c2576119c28382611b09565b6001600160a01b0382166119d957610ae181611ba6565b826001600160a01b0316826001600160a01b031614610ae157610ae18282611c55565b60006001600160a01b0384163b15611afe57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611a409033908990889088906004016120ff565b602060405180830381600087803b158015611a5a57600080fd5b505af1925050508015611a8a575060408051601f3d908101601f19168201909252611a8791810190611f91565b60015b611ae4573d808015611ab8576040519150601f19603f3d011682016040523d82523d6000602084013e611abd565b606091505b508051611adc5760405162461bcd60e51b815260040161075c9061214f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061160e565b506001949350505050565b60006001611b1684610d50565b611b209190612272565b600083815260076020526040902054909150808214611b73576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611bb890600190612272565b60008381526009602052604081205460088054939450909284908110611be057611be0612361565b906000526020600020015490508060088381548110611c0157611c01612361565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611c3957611c3961234b565b6001900381819060005260206000200160009055905550505050565b6000611c6083610d50565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054611ca5906122b5565b90600052602060002090601f016020900481019282611cc75760008555611d0d565b82601f10611ce057805160ff1916838001178555611d0d565b82800160010185558215611d0d579182015b82811115611d0d578251825591602001919060010190611cf2565b50611d19929150611d1d565b5090565b5b80821115611d195760008155600101611d1e565b600067ffffffffffffffff80841115611d4d57611d4d612377565b604051601f8501601f19908116603f01168101908282118183101715611d7557611d75612377565b81604052809350858152868686011115611d8e57600080fd5b858560208301376000602087830101525050509392505050565b80358015158114611db857600080fd5b919050565b600060208284031215611dcf57600080fd5b8135611dda8161238d565b9392505050565b600060208284031215611df357600080fd5b8151611dda8161238d565b60008060408385031215611e1157600080fd5b8235611e1c8161238d565b91506020830135611e2c8161238d565b809150509250929050565b600080600060608486031215611e4c57600080fd5b8335611e578161238d565b92506020840135611e678161238d565b929592945050506040919091013590565b60008060008060808587031215611e8e57600080fd5b8435611e998161238d565b93506020850135611ea98161238d565b925060408501359150606085013567ffffffffffffffff811115611ecc57600080fd5b8501601f81018713611edd57600080fd5b611eec87823560208401611d32565b91505092959194509250565b60008060408385031215611f0b57600080fd5b8235611f168161238d565b9150611f2460208401611da8565b90509250929050565b60008060408385031215611f4057600080fd5b8235611f4b8161238d565b946020939093013593505050565b600060208284031215611f6b57600080fd5b611dda82611da8565b600060208284031215611f8657600080fd5b8135611dda816123a2565b600060208284031215611fa357600080fd5b8151611dda816123a2565b600060208284031215611fc057600080fd5b813567ffffffffffffffff811115611fd757600080fd5b8201601f81018413611fe857600080fd5b61160e84823560208401611d32565b60006020828403121561200957600080fd5b5035919050565b60008151808452612028816020860160208601612289565b601f01601f19169290920160200192915050565b6000815161204e818560208601612289565b9290920192915050565b600080845481600182811c91508083168061207457607f831692505b602080841082141561209457634e487b7160e01b86526022600452602486fd5b8180156120a857600181146120b9576120e6565b60ff198616895284890196506120e6565b60008b81526020902060005b868110156120de5781548b8201529085019083016120c5565b505084890196505b5050505050506120f6818561203c565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061213290830184612010565b9695505050505050565b602081526000611dda6020830184612010565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561223a5761223a61231f565b500190565b60008261224e5761224e612335565b500490565b600081600019048311821515161561226d5761226d61231f565b500290565b6000828210156122845761228461231f565b500390565b60005b838110156122a457818101518382015260200161228c565b838111156112415750506000910152565b600181811c908216806122c957607f821691505b602082108114156122ea57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156123045761230461231f565b5060010190565b60008261231a5761231a612335565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610e6357600080fd5b6001600160e01b031981168114610e6357600080fdfea26469706673582212204313e078ef468d7cdaa31a5e672f4c0ae0c78808cf7a9aa7a36c67a9bb38522464736f6c63430008070033
Deployed Bytecode
0x6080604052600436106102045760003560e01c8063715018a611610118578063a22cb465116100a0578063de7fcb1d1161006f578063de7fcb1d1461059a578063e8315742146105b0578063e985e9c5146105c6578063ebf98abf1461060f578063f2fde38b1461062557600080fd5b8063a22cb46514610525578063ae0aadd414610545578063b88d4fde1461055a578063c87b56dd1461057a57600080fd5b80638da5cb5b116100e75780638da5cb5b146104a957806395d89b41146104c75780639ff2c0c7146104dc578063a0712d68146104fc578063a0df3be51461050f57600080fd5b8063715018a6146104495780637362377b1461045e578063789c9c161461047357806382b102621461049357600080fd5b806318160ddd1161019b57806342842e0e1161016a57806342842e0e146103a95780634f6ccce7146103c95780636352211e146103e9578063654f97a31461040957806370a082311461042957600080fd5b806318160ddd1461033457806323b872dd146103495780632f745c591461036957806330176e131461038957600080fd5b8063095ea7b3116101d7578063095ea7b3146102ba5780630aef4d4f146102da5780630f89a0f8146102fe57806314716ac81461031457600080fd5b806301ffc9a714610209578063024336e61461023e57806306fdde0314610260578063081812fc14610282575b600080fd5b34801561021557600080fd5b50610229610224366004611f74565b610645565b60405190151581526020015b60405180910390f35b34801561024a57600080fd5b5061025e610259366004611ff7565b610670565b005b34801561026c57600080fd5b506102756108a9565b604051610235919061213c565b34801561028e57600080fd5b506102a261029d366004611ff7565b61093b565b6040516001600160a01b039091168152602001610235565b3480156102c657600080fd5b5061025e6102d5366004611f2d565b6109d0565b3480156102e657600080fd5b506102f060115481565b604051908152602001610235565b34801561030a57600080fd5b506102f060105481565b34801561032057600080fd5b50600b546102a2906001600160a01b031681565b34801561034057600080fd5b506008546102f0565b34801561035557600080fd5b5061025e610364366004611e37565b610ae6565b34801561037557600080fd5b506102f0610384366004611f2d565b610b17565b34801561039557600080fd5b5061025e6103a4366004611fae565b610bad565b3480156103b557600080fd5b5061025e6103c4366004611e37565b610bee565b3480156103d557600080fd5b506102f06103e4366004611ff7565b610c09565b3480156103f557600080fd5b506102a2610404366004611ff7565b610c9c565b34801561041557600080fd5b5061025e610424366004611f59565b610d13565b34801561043557600080fd5b506102f0610444366004611dbd565b610d50565b34801561045557600080fd5b5061025e610dd7565b34801561046a57600080fd5b5061025e610e0d565b34801561047f57600080fd5b5061025e61048e366004611ff7565b610e66565b34801561049f57600080fd5b506102f060125481565b3480156104b557600080fd5b50600a546001600160a01b03166102a2565b3480156104d357600080fd5b50610275610f5f565b3480156104e857600080fd5b50600c546102a2906001600160a01b031681565b61025e61050a366004611ff7565b610f6e565b34801561051b57600080fd5b506102f060135481565b34801561053157600080fd5b5061025e610540366004611ef8565b6110fe565b34801561055157600080fd5b5061025e6111c3565b34801561056657600080fd5b5061025e610575366004611e78565b61120f565b34801561058657600080fd5b50610275610595366004611ff7565b611247565b3480156105a657600080fd5b506102f060145481565b3480156105bc57600080fd5b506102f0600d5481565b3480156105d257600080fd5b506102296105e1366004611dfe565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561061b57600080fd5b506102f0600e5481565b34801561063157600080fd5b5061025e610640366004611dbd565b61127b565b60006001600160e01b0319821663780e9d6360e01b148061066a575061066a82611313565b92915050565b33321461067c57600080fd5b60165460ff1661068b57600080fd5b600b546040516331a9108f60e11b8152600481018390526001600160a01b0390911690636352211e9060240160206040518083038186803b1580156106cf57600080fd5b505afa1580156106e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107079190611de1565b6001600160a01b0316336001600160a01b0316146107655760405162461bcd60e51b8152602060048201526016602482015275596f7520617265206e6f7420746865206f776e65722160501b60448201526064015b60405180910390fd5b600081815260156020526040902054156107c15760405162461bcd60e51b815260206004820152601b60248201527f4d69636520616c7265616479207573656420746f20636c61696d210000000000604482015260640161075c565b6011546010546107d2906001612227565b11156108205760405162461bcd60e51b815260206004820152601760248201527f4e6f206d6f726520636c61696d61626c65206d69636521000000000000000000604482015260640161075c565b600061082b60085490565b6000838152601560205260408120805492935090610848836122f0565b90915550506010805490600061085d836122f0565b919050555061086c3382611363565b60408051338152602081018390527fc3cd8a2f806e19c9e97cf657caab0ed51008c90401a3c8f851a4fa69f34fa8db910160405180910390a15050565b6060600080546108b8906122b5565b80601f01602080910402602001604051908101604052809291908181526020018280546108e4906122b5565b80156109315780601f1061090657610100808354040283529160200191610931565b820191906000526020600020905b81548152906001019060200180831161091457829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109b45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161075c565b506000908152600460205260409020546001600160a01b031690565b60006109db82610c9c565b9050806001600160a01b0316836001600160a01b03161415610a495760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161075c565b336001600160a01b0382161480610a655750610a6581336105e1565b610ad75760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161075c565b610ae183836114b1565b505050565b610af0338261151f565b610b0c5760405162461bcd60e51b815260040161075c906121d6565b610ae1838383611616565b6000610b2283610d50565b8210610b845760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161075c565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610bd75760405162461bcd60e51b815260040161075c906121a1565b8051610bea90600f906020840190611c99565b5050565b610ae18383836040518060200160405280600081525061120f565b6000610c1460085490565b8210610c775760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161075c565b60088281548110610c8a57610c8a612361565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b03168061066a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161075c565b600a546001600160a01b03163314610d3d5760405162461bcd60e51b815260040161075c906121a1565b6016805460ff1916911515919091179055565b60006001600160a01b038216610dbb5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161075c565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610e015760405162461bcd60e51b815260040161075c906121a1565b610e0b60006117c1565b565b600a546001600160a01b03163314610e375760405162461bcd60e51b815260040161075c906121a1565b60405133904780156108fc02916000818181858888f19350505050158015610e63573d6000803e3d6000fd5b50565b333214610e7257600080fd5b60165460ff16610e8157600080fd5b600c546040516371e4cc7f60e11b8152600481018390526001600160a01b039091169063e3c998fe90602401602060405180830381600087803b158015610ec757600080fd5b505af1158015610edb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eff9190611de1565b6001600160a01b0316336001600160a01b0316146107655760405162461bcd60e51b815260206004820152601760248201527f596f7520617265206e6f7420746865207374616b657221000000000000000000604482015260640161075c565b6060600180546108b8906122b5565b333214610f7a57600080fd5b601454811115610fcc5760405162461bcd60e51b815260206004820152601a60248201527f4f766572204d6178696d756d204d696e74732070657220545821000000000000604482015260640161075c565b80600e54610fda9190612253565b34146110195760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642076616c75652160901b604482015260640161075c565b6013548160125461102a9190612227565b11156110715760405162461bcd60e51b81526020600482015260166024820152754e6f206d6f7265206d696e7461626c65206d6963652160501b604482015260640161075c565b600061107c60085490565b90508160125461108c9190612227565b60125560005b82811015610ae15760006110a68284612227565b90506110b23382611363565b60408051338152602081018390527f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885910160405180910390a150806110f6816122f0565b915050611092565b6001600160a01b0382163314156111575760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161075c565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633146111ed5760405162461bcd60e51b815260040161075c906121a1565b6010546011546111fd9190612272565b60135461120a9190612227565b601355565b611219338361151f565b6112355760405162461bcd60e51b815260040161075c906121d6565b61124184848484611813565b50505050565b6060600f61125483611846565b604051602001611265929190612058565b6040516020818303038152906040529050919050565b600a546001600160a01b031633146112a55760405162461bcd60e51b815260040161075c906121a1565b6001600160a01b03811661130a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161075c565b610e63816117c1565b60006001600160e01b031982166380ac58cd60e01b148061134457506001600160e01b03198216635b5e139f60e01b145b8061066a57506301ffc9a760e01b6001600160e01b031983161461066a565b6001600160a01b0382166113b95760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161075c565b6000818152600260205260409020546001600160a01b03161561141e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161075c565b61142a60008383611944565b6001600160a01b0382166000908152600360205260408120805460019290611453908490612227565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906114e682610c9c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166115985760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161075c565b60006115a383610c9c565b9050806001600160a01b0316846001600160a01b031614806115de5750836001600160a01b03166115d38461093b565b6001600160a01b0316145b8061160e57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661162982610c9c565b6001600160a01b0316146116915760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161075c565b6001600160a01b0382166116f35760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161075c565b6116fe838383611944565b6117096000826114b1565b6001600160a01b0383166000908152600360205260408120805460019290611732908490612272565b90915550506001600160a01b0382166000908152600360205260408120805460019290611760908490612227565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61181e848484611616565b61182a848484846119fc565b6112415760405162461bcd60e51b815260040161075c9061214f565b60608161186a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611894578061187e816122f0565b915061188d9050600a8361223f565b915061186e565b60008167ffffffffffffffff8111156118af576118af612377565b6040519080825280601f01601f1916602001820160405280156118d9576020820181803683370190505b5090505b841561160e576118ee600183612272565b91506118fb600a8661230b565b611906906030612227565b60f81b81838151811061191b5761191b612361565b60200101906001600160f81b031916908160001a90535061193d600a8661223f565b94506118dd565b6001600160a01b03831661199f5761199a81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6119c2565b816001600160a01b0316836001600160a01b0316146119c2576119c28382611b09565b6001600160a01b0382166119d957610ae181611ba6565b826001600160a01b0316826001600160a01b031614610ae157610ae18282611c55565b60006001600160a01b0384163b15611afe57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611a409033908990889088906004016120ff565b602060405180830381600087803b158015611a5a57600080fd5b505af1925050508015611a8a575060408051601f3d908101601f19168201909252611a8791810190611f91565b60015b611ae4573d808015611ab8576040519150601f19603f3d011682016040523d82523d6000602084013e611abd565b606091505b508051611adc5760405162461bcd60e51b815260040161075c9061214f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061160e565b506001949350505050565b60006001611b1684610d50565b611b209190612272565b600083815260076020526040902054909150808214611b73576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611bb890600190612272565b60008381526009602052604081205460088054939450909284908110611be057611be0612361565b906000526020600020015490508060088381548110611c0157611c01612361565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611c3957611c3961234b565b6001900381819060005260206000200160009055905550505050565b6000611c6083610d50565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054611ca5906122b5565b90600052602060002090601f016020900481019282611cc75760008555611d0d565b82601f10611ce057805160ff1916838001178555611d0d565b82800160010185558215611d0d579182015b82811115611d0d578251825591602001919060010190611cf2565b50611d19929150611d1d565b5090565b5b80821115611d195760008155600101611d1e565b600067ffffffffffffffff80841115611d4d57611d4d612377565b604051601f8501601f19908116603f01168101908282118183101715611d7557611d75612377565b81604052809350858152868686011115611d8e57600080fd5b858560208301376000602087830101525050509392505050565b80358015158114611db857600080fd5b919050565b600060208284031215611dcf57600080fd5b8135611dda8161238d565b9392505050565b600060208284031215611df357600080fd5b8151611dda8161238d565b60008060408385031215611e1157600080fd5b8235611e1c8161238d565b91506020830135611e2c8161238d565b809150509250929050565b600080600060608486031215611e4c57600080fd5b8335611e578161238d565b92506020840135611e678161238d565b929592945050506040919091013590565b60008060008060808587031215611e8e57600080fd5b8435611e998161238d565b93506020850135611ea98161238d565b925060408501359150606085013567ffffffffffffffff811115611ecc57600080fd5b8501601f81018713611edd57600080fd5b611eec87823560208401611d32565b91505092959194509250565b60008060408385031215611f0b57600080fd5b8235611f168161238d565b9150611f2460208401611da8565b90509250929050565b60008060408385031215611f4057600080fd5b8235611f4b8161238d565b946020939093013593505050565b600060208284031215611f6b57600080fd5b611dda82611da8565b600060208284031215611f8657600080fd5b8135611dda816123a2565b600060208284031215611fa357600080fd5b8151611dda816123a2565b600060208284031215611fc057600080fd5b813567ffffffffffffffff811115611fd757600080fd5b8201601f81018413611fe857600080fd5b61160e84823560208401611d32565b60006020828403121561200957600080fd5b5035919050565b60008151808452612028816020860160208601612289565b601f01601f19169290920160200192915050565b6000815161204e818560208601612289565b9290920192915050565b600080845481600182811c91508083168061207457607f831692505b602080841082141561209457634e487b7160e01b86526022600452602486fd5b8180156120a857600181146120b9576120e6565b60ff198616895284890196506120e6565b60008b81526020902060005b868110156120de5781548b8201529085019083016120c5565b505084890196505b5050505050506120f6818561203c565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061213290830184612010565b9695505050505050565b602081526000611dda6020830184612010565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561223a5761223a61231f565b500190565b60008261224e5761224e612335565b500490565b600081600019048311821515161561226d5761226d61231f565b500290565b6000828210156122845761228461231f565b500390565b60005b838110156122a457818101518382015260200161228c565b838111156112415750506000910152565b600181811c908216806122c957607f821691505b602082108114156122ea57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156123045761230461231f565b5060010190565b60008261231a5761231a612335565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610e6357600080fd5b6001600160e01b031981168114610e6357600080fdfea26469706673582212204313e078ef468d7cdaa31a5e672f4c0ae0c78808cf7a9aa7a36c67a9bb38522464736f6c63430008070033
Deployed Bytecode Sourcemap
43350:3415:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37008:224;;;;;;;;;;-1:-1:-1;37008:224:0;;;;;:::i;:::-;;:::i;:::-;;;7721:14:1;;7714:22;7696:41;;7684:2;7669:18;37008:224:0;;;;;;;;45389:533;;;;;;;;;;-1:-1:-1;45389:533:0;;;;;:::i;:::-;;:::i;:::-;;24900:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;26459:221::-;;;;;;;;;;-1:-1:-1;26459:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6740:32:1;;;6722:51;;6710:2;6695:18;26459:221:0;6576:203:1;25982:411:0;;;;;;;;;;-1:-1:-1;25982:411:0;;;;;:::i;:::-;;:::i;43717:33::-;;;;;;;;;;;;;;;;;;;17369:25:1;;;17357:2;17342:18;43717:33:0;17223:177:1;43683:27:0;;;;;;;;;;;;;;;;43406:76;;;;;;;;;;-1:-1:-1;43406:76:0;;;;-1:-1:-1;;;;;43406:76:0;;;37648:113;;;;;;;;;;-1:-1:-1;37736:10:0;:17;37648:113;;27349:339;;;;;;;;;;-1:-1:-1;27349:339:0;;;;;:::i;:::-;;:::i;37316:256::-;;;;;;;;;;-1:-1:-1;37316:256:0;;;;;:::i;:::-;;:::i;44710:102::-;;;;;;;;;;-1:-1:-1;44710:102:0;;;;;:::i;:::-;;:::i;27759:185::-;;;;;;;;;;-1:-1:-1;27759:185:0;;;;;:::i;:::-;;:::i;37838:233::-;;;;;;;;;;-1:-1:-1;37838:233:0;;;;;:::i;:::-;;:::i;24594:239::-;;;;;;;;;;-1:-1:-1;24594:239:0;;;;;:::i;:::-;;:::i;44324:96::-;;;;;;;;;;-1:-1:-1;44324:96:0;;;;;:::i;:::-;;:::i;24324:208::-;;;;;;;;;;-1:-1:-1;24324:208:0;;;;;:::i;:::-;;:::i;8175:94::-;;;;;;;;;;;;;:::i;44584:114::-;;;;;;;;;;;;;:::i;44838:539::-;;;;;;;;;;-1:-1:-1;44838:539:0;;;;;:::i;:::-;;:::i;43759:28::-;;;;;;;;;;;;;;;;7524:87;;;;;;;;;;-1:-1:-1;7597:6:0;;-1:-1:-1;;;;;7597:6:0;7524:87;;25069:104;;;;;;;;;;;;;:::i;43489:73::-;;;;;;;;;;-1:-1:-1;43489:73:0;;;;-1:-1:-1;;;;;43489:73:0;;;45934:627;;;;;;:::i;:::-;;:::i;43794:34::-;;;;;;;;;;;;;;;;26752:295;;;;;;;;;;-1:-1:-1;26752:295:0;;;;;:::i;:::-;;:::i;44432:140::-;;;;;;;;;;;;;:::i;28015:328::-;;;;;;;;;;-1:-1:-1;28015:328:0;;;;;:::i;:::-;;:::i;46592:170::-;;;;;;;;;;-1:-1:-1;46592:170:0;;;;;:::i;:::-;;:::i;43835:29::-;;;;;;;;;;;;;;;;43569:28;;;;;;;;;;;;;;;;27118:164;;;;;;;;;;-1:-1:-1;27118:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;27239:25:0;;;27215:4;27239:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;27118:164;43604:36;;;;;;;;;;;;;;;;8424:192;;;;;;;;;;-1:-1:-1;8424:192:0;;;;;:::i;:::-;;:::i;37008:224::-;37110:4;-1:-1:-1;;;;;;37134:50:0;;-1:-1:-1;;;37134:50:0;;:90;;;37188:36;37212:11;37188:23;:36::i;:::-;37127:97;37008:224;-1:-1:-1;;37008:224:0:o;45389:533::-;44248:10;44262:9;44248:23;44240:32;;;;;;44160:14:::1;::::0;::::1;;44152:23;;;::::0;::::1;;45500:16:::2;::::0;45492:43:::2;::::0;-1:-1:-1;;;45492:43:0;;::::2;::::0;::::2;17369:25:1::0;;;-1:-1:-1;;;;;45500:16:0;;::::2;::::0;45492:33:::2;::::0;17342:18:1;;45492:43:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;45478:57:0::2;:10;-1:-1:-1::0;;;;;45478:57:0::2;;45470:92;;;::::0;-1:-1:-1;;;45470:92:0;;8174:2:1;45470:92:0::2;::::0;::::2;8156:21:1::0;8213:2;8193:18;;;8186:30;-1:-1:-1;;;8232:18:1;;;8225:52;8294:18;;45470:92:0::2;;;;;;;;;45581:25;::::0;;;:15:::2;:25;::::0;;;;;:30;45573:70:::2;;;::::0;-1:-1:-1;;;45573:70:0;;14300:2:1;45573:70:0::2;::::0;::::2;14282:21:1::0;14339:2;14319:18;;;14312:30;14378:29;14358:18;;;14351:57;14425:18;;45573:70:0::2;14098:351:1::0;45573:70:0::2;45681:14;::::0;45662:11:::2;::::0;:15:::2;::::0;45676:1:::2;45662:15;:::i;:::-;:33;;45654:69;;;::::0;-1:-1:-1;;;45654:69:0;;17073:2:1;45654:69:0::2;::::0;::::2;17055:21:1::0;17112:2;17092:18;;;17085:30;17151:25;17131:18;;;17124:53;17194:18;;45654:69:0::2;16871:347:1::0;45654:69:0::2;45736:12;45751:13;37736:10:::0;:17;;37648:113;45751:13:::2;45775:25;::::0;;;:15:::2;:25;::::0;;;;:27;;45736:28;;-1:-1:-1;45775:25:0;:27:::2;::::0;::::2;:::i;:::-;::::0;;;-1:-1:-1;;45813:11:0::2;:13:::0;;;:11:::2;:13;::::0;::::2;:::i;:::-;;;;;;45839:26;45845:10;45857:7;45839:5;:26::i;:::-;45881:33;::::0;;45894:10:::2;7451:51:1::0;;7533:2;7518:18;;7511:34;;;45881:33:0::2;::::0;7424:18:1;45881:33:0::2;;;;;;;45459:463;45389:533:::0;:::o;24900:100::-;24954:13;24987:5;24980:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24900:100;:::o;26459:221::-;26535:7;29942:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29942:16:0;26555:73;;;;-1:-1:-1;;;26555:73:0;;14656:2:1;26555:73:0;;;14638:21:1;14695:2;14675:18;;;14668:30;14734:34;14714:18;;;14707:62;-1:-1:-1;;;14785:18:1;;;14778:42;14837:19;;26555:73:0;14454:408:1;26555:73:0;-1:-1:-1;26648:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;26648:24:0;;26459:221::o;25982:411::-;26063:13;26079:23;26094:7;26079:14;:23::i;:::-;26063:39;;26127:5;-1:-1:-1;;;;;26121:11:0;:2;-1:-1:-1;;;;;26121:11:0;;;26113:57;;;;-1:-1:-1;;;26113:57:0;;15840:2:1;26113:57:0;;;15822:21:1;15879:2;15859:18;;;15852:30;15918:34;15898:18;;;15891:62;-1:-1:-1;;;15969:18:1;;;15962:31;16010:19;;26113:57:0;15638:397:1;26113:57:0;6394:10;-1:-1:-1;;;;;26205:21:0;;;;:62;;-1:-1:-1;26230:37:0;26247:5;6394:10;27118:164;:::i;26230:37::-;26183:168;;;;-1:-1:-1;;;26183:168:0;;11647:2:1;26183:168:0;;;11629:21:1;11686:2;11666:18;;;11659:30;11725:34;11705:18;;;11698:62;11796:26;11776:18;;;11769:54;11840:19;;26183:168:0;11445:420:1;26183:168:0;26364:21;26373:2;26377:7;26364:8;:21::i;:::-;26052:341;25982:411;;:::o;27349:339::-;27544:41;6394:10;27577:7;27544:18;:41::i;:::-;27536:103;;;;-1:-1:-1;;;27536:103:0;;;;;;;:::i;:::-;27652:28;27662:4;27668:2;27672:7;27652:9;:28::i;37316:256::-;37413:7;37449:23;37466:5;37449:16;:23::i;:::-;37441:5;:31;37433:87;;;;-1:-1:-1;;;37433:87:0;;8525:2:1;37433:87:0;;;8507:21:1;8564:2;8544:18;;;8537:30;8603:34;8583:18;;;8576:62;-1:-1:-1;;;8654:18:1;;;8647:41;8705:19;;37433:87:0;8323:407:1;37433:87:0;-1:-1:-1;;;;;;37538:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;37316:256::o;44710:102::-;7597:6;;-1:-1:-1;;;;;7597:6:0;6394:10;7744:23;7736:68;;;;-1:-1:-1;;;7736:68:0;;;;;;;:::i;:::-;44785:19;;::::1;::::0;:12:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;:::-;;44710:102:::0;:::o;27759:185::-;27897:39;27914:4;27920:2;27924:7;27897:39;;;;;;;;;;;;:16;:39::i;37838:233::-;37913:7;37949:30;37736:10;:17;;37648:113;37949:30;37941:5;:38;37933:95;;;;-1:-1:-1;;;37933:95:0;;16660:2:1;37933:95:0;;;16642:21:1;16699:2;16679:18;;;16672:30;16738:34;16718:18;;;16711:62;-1:-1:-1;;;16789:18:1;;;16782:42;16841:19;;37933:95:0;16458:408:1;37933:95:0;38046:10;38057:5;38046:17;;;;;;;;:::i;:::-;;;;;;;;;38039:24;;37838:233;;;:::o;24594:239::-;24666:7;24702:16;;;:7;:16;;;;;;-1:-1:-1;;;;;24702:16:0;24737:19;24729:73;;;;-1:-1:-1;;;24729:73:0;;12483:2:1;24729:73:0;;;12465:21:1;12522:2;12502:18;;;12495:30;12561:34;12541:18;;;12534:62;-1:-1:-1;;;12612:18:1;;;12605:39;12661:19;;24729:73:0;12281:405:1;44324:96:0;7597:6;;-1:-1:-1;;;;;7597:6:0;6394:10;7744:23;7736:68;;;;-1:-1:-1;;;7736:68:0;;;;;;;:::i;:::-;44390:14:::1;:22:::0;;-1:-1:-1;;44390:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;44324:96::o;24324:208::-;24396:7;-1:-1:-1;;;;;24424:19:0;;24416:74;;;;-1:-1:-1;;;24416:74:0;;12072:2:1;24416:74:0;;;12054:21:1;12111:2;12091:18;;;12084:30;12150:34;12130:18;;;12123:62;-1:-1:-1;;;12201:18:1;;;12194:40;12251:19;;24416:74:0;11870:406:1;24416:74:0;-1:-1:-1;;;;;;24508:16:0;;;;;:9;:16;;;;;;;24324:208::o;8175:94::-;7597:6;;-1:-1:-1;;;;;7597:6:0;6394:10;7744:23;7736:68;;;;-1:-1:-1;;;7736:68:0;;;;;;;:::i;:::-;8240:21:::1;8258:1;8240:9;:21::i;:::-;8175:94::o:0;44584:114::-;7597:6;;-1:-1:-1;;;;;7597:6:0;6394:10;7744:23;7736:68;;;;-1:-1:-1;;;7736:68:0;;;;;;;:::i;:::-;44639:51:::1;::::0;44647:10:::1;::::0;44668:21:::1;44639:51:::0;::::1;;;::::0;::::1;::::0;;;44668:21;44647:10;44639:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;44584:114::o:0;44838:539::-;44248:10;44262:9;44248:23;44240:32;;;;;;44160:14:::1;::::0;::::1;;44152:23;;;::::0;::::1;;44955:13:::2;::::0;44947:42:::2;::::0;-1:-1:-1;;;44947:42:0;;::::2;::::0;::::2;17369:25:1::0;;;-1:-1:-1;;;;;44955:13:0;;::::2;::::0;44947:32:::2;::::0;17342:18:1;;44947:42:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;44933:56:0::2;:10;-1:-1:-1::0;;;;;44933:56:0::2;;44925:92;;;::::0;-1:-1:-1;;;44925:92:0;;13587:2:1;44925:92:0::2;::::0;::::2;13569:21:1::0;13626:2;13606:18;;;13599:30;13665:25;13645:18;;;13638:53;13708:18;;44925:92:0::2;13385:347:1::0;25069:104:0;25125:13;25158:7;25151:14;;;;;:::i;45934:627::-;44248:10;44262:9;44248:23;44240:32;;;;;;46020:12:::1;;46009:7;:23;;46001:62;;;::::0;-1:-1:-1;;;46001:62:0;;10879:2:1;46001:62:0::1;::::0;::::1;10861:21:1::0;10918:2;10898:18;;;10891:30;10957:28;10937:18;;;10930:56;11003:18;;46001:62:0::1;10677:350:1::0;46001:62:0::1;46110:7;46096:11;;:21;;;;:::i;:::-;46082:9;:36;46074:63;;;::::0;-1:-1:-1;;;46074:63:0;;13244:2:1;46074:63:0::1;::::0;::::1;13226:21:1::0;13283:2;13263:18;;;13256:30;-1:-1:-1;;;13302:18:1;;;13295:44;13356:18;;46074:63:0::1;13042:338:1::0;46074:63:0::1;46182:15;;46171:7;46156:12;;:22;;;;:::i;:::-;:41;;46148:76;;;::::0;-1:-1:-1;;;46148:76:0;;12893:2:1;46148:76:0::1;::::0;::::1;12875:21:1::0;12932:2;12912:18;;;12905:30;-1:-1:-1;;;12951:18:1;;;12944:52;13013:18;;46148:76:0::1;12691:346:1::0;46148:76:0::1;46237:17;46257:13;37736:10:::0;:17;;37648:113;46257:13:::1;46237:33;;46311:7;46296:12;;:22;;;;:::i;:::-;46281:12;:37:::0;46380:6:::1;46375:179;46396:7;46392:1;:11;46375:179;;;46425:12;46440:16;46455:1:::0;46440:12;:16:::1;:::i;:::-;46425:31;;46471:26;46477:10;46489:7;46471:5;:26::i;:::-;46517:25;::::0;;46522:10:::1;7451:51:1::0;;7533:2;7518:18;;7511:34;;;46517:25:0::1;::::0;7424:18:1;46517:25:0::1;;;;;;;-1:-1:-1::0;46405:3:0;::::1;::::0;::::1;:::i;:::-;;;;46375:179;;26752:295:::0;-1:-1:-1;;;;;26855:24:0;;6394:10;26855:24;;26847:62;;;;-1:-1:-1;;;26847:62:0;;10525:2:1;26847:62:0;;;10507:21:1;10564:2;10544:18;;;10537:30;10603:27;10583:18;;;10576:55;10648:18;;26847:62:0;10323:349:1;26847:62:0;6394:10;26922:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;26922:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;26922:53:0;;;;;;;;;;26991:48;;7696:41:1;;;26922:42:0;;6394:10;26991:48;;7669:18:1;26991:48:0;;;;;;;26752:295;;:::o;44432:140::-;7597:6;;-1:-1:-1;;;;;7597:6:0;6394:10;7744:23;7736:68;;;;-1:-1:-1;;;7736:68:0;;;;;;;:::i;:::-;44552:11:::1;;44535:14;;:28;;;;:::i;:::-;44516:15;;:48;;;;:::i;:::-;44498:15;:66:::0;44432:140::o;28015:328::-;28190:41;6394:10;28223:7;28190:18;:41::i;:::-;28182:103;;;;-1:-1:-1;;;28182:103:0;;;;;;;:::i;:::-;28296:39;28310:4;28316:2;28320:7;28329:5;28296:13;:39::i;:::-;28015:328;;;;:::o;46592:170::-;46655:13;46712:12;46726:26;46743:8;46726:16;:26::i;:::-;46695:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46681:73;;46592:170;;;:::o;8424:192::-;7597:6;;-1:-1:-1;;;;;7597:6:0;6394:10;7744:23;7736:68;;;;-1:-1:-1;;;7736:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8513:22:0;::::1;8505:73;;;::::0;-1:-1:-1;;;8505:73:0;;9356:2:1;8505:73:0::1;::::0;::::1;9338:21:1::0;9395:2;9375:18;;;9368:30;9434:34;9414:18;;;9407:62;-1:-1:-1;;;9485:18:1;;;9478:36;9531:19;;8505:73:0::1;9154:402:1::0;8505:73:0::1;8589:19;8599:8;8589:9;:19::i;23955:305::-:0;24057:4;-1:-1:-1;;;;;;24094:40:0;;-1:-1:-1;;;24094:40:0;;:105;;-1:-1:-1;;;;;;;24151:48:0;;-1:-1:-1;;;24151:48:0;24094:105;:158;;;-1:-1:-1;;;;;;;;;;10702:40:0;;;24216:36;10593:157;31831:382;-1:-1:-1;;;;;31911:16:0;;31903:61;;;;-1:-1:-1;;;31903:61:0;;13939:2:1;31903:61:0;;;13921:21:1;;;13958:18;;;13951:30;14017:34;13997:18;;;13990:62;14069:18;;31903:61:0;13737:356:1;31903:61:0;29918:4;29942:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29942:16:0;:30;31975:58;;;;-1:-1:-1;;;31975:58:0;;9763:2:1;31975:58:0;;;9745:21:1;9802:2;9782:18;;;9775:30;9841;9821:18;;;9814:58;9889:18;;31975:58:0;9561:352:1;31975:58:0;32046:45;32075:1;32079:2;32083:7;32046:20;:45::i;:::-;-1:-1:-1;;;;;32104:13:0;;;;;;:9;:13;;;;;:18;;32121:1;;32104:13;:18;;32121:1;;32104:18;:::i;:::-;;;;-1:-1:-1;;32133:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32133:21:0;-1:-1:-1;;;;;32133:21:0;;;;;;;;32172:33;;32133:16;;;32172:33;;32133:16;;32172:33;31831:382;;:::o;33835:174::-;33910:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;33910:29:0;-1:-1:-1;;;;;33910:29:0;;;;;;;;:24;;33964:23;33910:24;33964:14;:23::i;:::-;-1:-1:-1;;;;;33955:46:0;;;;;;;;;;;33835:174;;:::o;30147:348::-;30240:4;29942:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29942:16:0;30257:73;;;;-1:-1:-1;;;30257:73:0;;11234:2:1;30257:73:0;;;11216:21:1;11273:2;11253:18;;;11246:30;11312:34;11292:18;;;11285:62;-1:-1:-1;;;11363:18:1;;;11356:42;11415:19;;30257:73:0;11032:408:1;30257:73:0;30341:13;30357:23;30372:7;30357:14;:23::i;:::-;30341:39;;30410:5;-1:-1:-1;;;;;30399:16:0;:7;-1:-1:-1;;;;;30399:16:0;;:51;;;;30443:7;-1:-1:-1;;;;;30419:31:0;:20;30431:7;30419:11;:20::i;:::-;-1:-1:-1;;;;;30419:31:0;;30399:51;:87;;;-1:-1:-1;;;;;;27239:25:0;;;27215:4;27239:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;30454:32;30391:96;30147:348;-1:-1:-1;;;;30147:348:0:o;33139:578::-;33298:4;-1:-1:-1;;;;;33271:31:0;:23;33286:7;33271:14;:23::i;:::-;-1:-1:-1;;;;;33271:31:0;;33263:85;;;;-1:-1:-1;;;33263:85:0;;15430:2:1;33263:85:0;;;15412:21:1;15469:2;15449:18;;;15442:30;15508:34;15488:18;;;15481:62;-1:-1:-1;;;15559:18:1;;;15552:39;15608:19;;33263:85:0;15228:405:1;33263:85:0;-1:-1:-1;;;;;33367:16:0;;33359:65;;;;-1:-1:-1;;;33359:65:0;;10120:2:1;33359:65:0;;;10102:21:1;10159:2;10139:18;;;10132:30;10198:34;10178:18;;;10171:62;-1:-1:-1;;;10249:18:1;;;10242:34;10293:19;;33359:65:0;9918:400:1;33359:65:0;33437:39;33458:4;33464:2;33468:7;33437:20;:39::i;:::-;33541:29;33558:1;33562:7;33541:8;:29::i;:::-;-1:-1:-1;;;;;33583:15:0;;;;;;:9;:15;;;;;:20;;33602:1;;33583:15;:20;;33602:1;;33583:20;:::i;:::-;;;;-1:-1:-1;;;;;;;33614:13:0;;;;;;:9;:13;;;;;:18;;33631:1;;33614:13;:18;;33631:1;;33614:18;:::i;:::-;;;;-1:-1:-1;;33643:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;33643:21:0;-1:-1:-1;;;;;33643:21:0;;;;;;;;;33682:27;;33643:16;;33682:27;;;;;;;33139:578;;;:::o;8624:173::-;8699:6;;;-1:-1:-1;;;;;8716:17:0;;;-1:-1:-1;;;;;;8716:17:0;;;;;;;8749:40;;8699:6;;;8716:17;8699:6;;8749:40;;8680:16;;8749:40;8669:128;8624:173;:::o;29225:315::-;29382:28;29392:4;29398:2;29402:7;29382:9;:28::i;:::-;29429:48;29452:4;29458:2;29462:7;29471:5;29429:22;:48::i;:::-;29421:111;;;;-1:-1:-1;;;29421:111:0;;;;;;;:::i;11068:723::-;11124:13;11345:10;11341:53;;-1:-1:-1;;11372:10:0;;;;;;;;;;;;-1:-1:-1;;;11372:10:0;;;;;11068:723::o;11341:53::-;11419:5;11404:12;11460:78;11467:9;;11460:78;;11493:8;;;;:::i;:::-;;-1:-1:-1;11516:10:0;;-1:-1:-1;11524:2:0;11516:10;;:::i;:::-;;;11460:78;;;11548:19;11580:6;11570:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11570:17:0;;11548:39;;11598:154;11605:10;;11598:154;;11632:11;11642:1;11632:11;;:::i;:::-;;-1:-1:-1;11701:10:0;11709:2;11701:5;:10;:::i;:::-;11688:24;;:2;:24;:::i;:::-;11675:39;;11658:6;11665;11658:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;11658:56:0;;;;;;;;-1:-1:-1;11729:11:0;11738:2;11729:11;;:::i;:::-;;;11598:154;;38684:589;-1:-1:-1;;;;;38890:18:0;;38886:187;;38925:40;38957:7;40100:10;:17;;40073:24;;;;:15;:24;;;;;:44;;;40128:24;;;;;;;;;;;;39996:164;38925:40;38886:187;;;38995:2;-1:-1:-1;;;;;38987:10:0;:4;-1:-1:-1;;;;;38987:10:0;;38983:90;;39014:47;39047:4;39053:7;39014:32;:47::i;:::-;-1:-1:-1;;;;;39087:16:0;;39083:183;;39120:45;39157:7;39120:36;:45::i;39083:183::-;39193:4;-1:-1:-1;;;;;39187:10:0;:2;-1:-1:-1;;;;;39187:10:0;;39183:83;;39214:40;39242:2;39246:7;39214:27;:40::i;34574:799::-;34729:4;-1:-1:-1;;;;;34750:13:0;;13918:20;13966:8;34746:620;;34786:72;;-1:-1:-1;;;34786:72:0;;-1:-1:-1;;;;;34786:36:0;;;;;:72;;6394:10;;34837:4;;34843:7;;34852:5;;34786:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34786:72:0;;;;;;;;-1:-1:-1;;34786:72:0;;;;;;;;;;;;:::i;:::-;;;34782:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35028:13:0;;35024:272;;35071:60;;-1:-1:-1;;;35071:60:0;;;;;;;:::i;35024:272::-;35246:6;35240:13;35231:6;35227:2;35223:15;35216:38;34782:529;-1:-1:-1;;;;;;34909:51:0;-1:-1:-1;;;34909:51:0;;-1:-1:-1;34902:58:0;;34746:620;-1:-1:-1;35350:4:0;34574:799;;;;;;:::o;40787:988::-;41053:22;41103:1;41078:22;41095:4;41078:16;:22::i;:::-;:26;;;;:::i;:::-;41115:18;41136:26;;;:17;:26;;;;;;41053:51;;-1:-1:-1;41269:28:0;;;41265:328;;-1:-1:-1;;;;;41336:18:0;;41314:19;41336:18;;;:12;:18;;;;;;;;:34;;;;;;;;;41387:30;;;;;;:44;;;41504:30;;:17;:30;;;;;:43;;;41265:328;-1:-1:-1;41689:26:0;;;;:17;:26;;;;;;;;41682:33;;;-1:-1:-1;;;;;41733:18:0;;;;;:12;:18;;;;;:34;;;;;;;41726:41;40787:988::o;42070:1079::-;42348:10;:17;42323:22;;42348:21;;42368:1;;42348:21;:::i;:::-;42380:18;42401:24;;;:15;:24;;;;;;42774:10;:26;;42323:46;;-1:-1:-1;42401:24:0;;42323:46;;42774:26;;;;;;:::i;:::-;;;;;;;;;42752:48;;42838:11;42813:10;42824;42813:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;42918:28;;;:15;:28;;;;;;;:41;;;43090:24;;;;;43083:31;43125:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;42141:1008;;;42070:1079;:::o;39574:221::-;39659:14;39676:20;39693:2;39676:16;:20::i;:::-;-1:-1:-1;;;;;39707:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;39752:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;39574:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:160::-;715:20;;771:13;;764:21;754:32;;744:60;;800:1;797;790:12;744:60;650:160;;;:::o;815:247::-;874:6;927:2;915:9;906:7;902:23;898:32;895:52;;;943:1;940;933:12;895:52;982:9;969:23;1001:31;1026:5;1001:31;:::i;:::-;1051:5;815:247;-1:-1:-1;;;815:247:1:o;1067:251::-;1137:6;1190:2;1178:9;1169:7;1165:23;1161:32;1158:52;;;1206:1;1203;1196:12;1158:52;1238:9;1232:16;1257:31;1282:5;1257:31;:::i;1323:388::-;1391:6;1399;1452:2;1440:9;1431:7;1427:23;1423:32;1420:52;;;1468:1;1465;1458:12;1420:52;1507:9;1494:23;1526:31;1551:5;1526:31;:::i;:::-;1576:5;-1:-1:-1;1633:2:1;1618:18;;1605:32;1646:33;1605:32;1646:33;:::i;:::-;1698:7;1688:17;;;1323:388;;;;;:::o;1716:456::-;1793:6;1801;1809;1862:2;1850:9;1841:7;1837:23;1833:32;1830:52;;;1878:1;1875;1868:12;1830:52;1917:9;1904:23;1936:31;1961:5;1936:31;:::i;:::-;1986:5;-1:-1:-1;2043:2:1;2028:18;;2015:32;2056:33;2015:32;2056:33;:::i;:::-;1716:456;;2108:7;;-1:-1:-1;;;2162:2:1;2147:18;;;;2134:32;;1716:456::o;2177:794::-;2272:6;2280;2288;2296;2349:3;2337:9;2328:7;2324:23;2320:33;2317:53;;;2366:1;2363;2356:12;2317:53;2405:9;2392:23;2424:31;2449:5;2424:31;:::i;:::-;2474:5;-1:-1:-1;2531:2:1;2516:18;;2503:32;2544:33;2503:32;2544:33;:::i;:::-;2596:7;-1:-1:-1;2650:2:1;2635:18;;2622:32;;-1:-1:-1;2705:2:1;2690:18;;2677:32;2732:18;2721:30;;2718:50;;;2764:1;2761;2754:12;2718:50;2787:22;;2840:4;2832:13;;2828:27;-1:-1:-1;2818:55:1;;2869:1;2866;2859:12;2818:55;2892:73;2957:7;2952:2;2939:16;2934:2;2930;2926:11;2892:73;:::i;:::-;2882:83;;;2177:794;;;;;;;:::o;2976:315::-;3041:6;3049;3102:2;3090:9;3081:7;3077:23;3073:32;3070:52;;;3118:1;3115;3108:12;3070:52;3157:9;3144:23;3176:31;3201:5;3176:31;:::i;:::-;3226:5;-1:-1:-1;3250:35:1;3281:2;3266:18;;3250:35;:::i;:::-;3240:45;;2976:315;;;;;:::o;3296:::-;3364:6;3372;3425:2;3413:9;3404:7;3400:23;3396:32;3393:52;;;3441:1;3438;3431:12;3393:52;3480:9;3467:23;3499:31;3524:5;3499:31;:::i;:::-;3549:5;3601:2;3586:18;;;;3573:32;;-1:-1:-1;;;3296:315:1:o;3616:180::-;3672:6;3725:2;3713:9;3704:7;3700:23;3696:32;3693:52;;;3741:1;3738;3731:12;3693:52;3764:26;3780:9;3764:26;:::i;3801:245::-;3859:6;3912:2;3900:9;3891:7;3887:23;3883:32;3880:52;;;3928:1;3925;3918:12;3880:52;3967:9;3954:23;3986:30;4010:5;3986:30;:::i;4051:249::-;4120:6;4173:2;4161:9;4152:7;4148:23;4144:32;4141:52;;;4189:1;4186;4179:12;4141:52;4221:9;4215:16;4240:30;4264:5;4240:30;:::i;4305:450::-;4374:6;4427:2;4415:9;4406:7;4402:23;4398:32;4395:52;;;4443:1;4440;4433:12;4395:52;4483:9;4470:23;4516:18;4508:6;4505:30;4502:50;;;4548:1;4545;4538:12;4502:50;4571:22;;4624:4;4616:13;;4612:27;-1:-1:-1;4602:55:1;;4653:1;4650;4643:12;4602:55;4676:73;4741:7;4736:2;4723:16;4718:2;4714;4710:11;4676:73;:::i;4760:180::-;4819:6;4872:2;4860:9;4851:7;4847:23;4843:32;4840:52;;;4888:1;4885;4878:12;4840:52;-1:-1:-1;4911:23:1;;4760:180;-1:-1:-1;4760:180:1:o;4945:257::-;4986:3;5024:5;5018:12;5051:6;5046:3;5039:19;5067:63;5123:6;5116:4;5111:3;5107:14;5100:4;5093:5;5089:16;5067:63;:::i;:::-;5184:2;5163:15;-1:-1:-1;;5159:29:1;5150:39;;;;5191:4;5146:50;;4945:257;-1:-1:-1;;4945:257:1:o;5207:185::-;5249:3;5287:5;5281:12;5302:52;5347:6;5342:3;5335:4;5328:5;5324:16;5302:52;:::i;:::-;5370:16;;;;;5207:185;-1:-1:-1;;5207:185:1:o;5397:1174::-;5573:3;5602:1;5635:6;5629:13;5665:3;5687:1;5715:9;5711:2;5707:18;5697:28;;5775:2;5764:9;5760:18;5797;5787:61;;5841:4;5833:6;5829:17;5819:27;;5787:61;5867:2;5915;5907:6;5904:14;5884:18;5881:38;5878:165;;;-1:-1:-1;;;5942:33:1;;5998:4;5995:1;5988:15;6028:4;5949:3;6016:17;5878:165;6059:18;6086:104;;;;6204:1;6199:320;;;;6052:467;;6086:104;-1:-1:-1;;6119:24:1;;6107:37;;6164:16;;;;-1:-1:-1;6086:104:1;;6199:320;17478:1;17471:14;;;17515:4;17502:18;;6294:1;6308:165;6322:6;6319:1;6316:13;6308:165;;;6400:14;;6387:11;;;6380:35;6443:16;;;;6337:10;;6308:165;;;6312:3;;6502:6;6497:3;6493:16;6486:23;;6052:467;;;;;;;6535:30;6561:3;6553:6;6535:30;:::i;:::-;6528:37;5397:1174;-1:-1:-1;;;;;5397:1174:1:o;6784:488::-;-1:-1:-1;;;;;7053:15:1;;;7035:34;;7105:15;;7100:2;7085:18;;7078:43;7152:2;7137:18;;7130:34;;;7200:3;7195:2;7180:18;;7173:31;;;6978:4;;7221:45;;7246:19;;7238:6;7221:45;:::i;:::-;7213:53;6784:488;-1:-1:-1;;;;;;6784:488:1:o;7748:219::-;7897:2;7886:9;7879:21;7860:4;7917:44;7957:2;7946:9;7942:18;7934:6;7917:44;:::i;8735:414::-;8937:2;8919:21;;;8976:2;8956:18;;;8949:30;9015:34;9010:2;8995:18;;8988:62;-1:-1:-1;;;9081:2:1;9066:18;;9059:48;9139:3;9124:19;;8735:414::o;14867:356::-;15069:2;15051:21;;;15088:18;;;15081:30;15147:34;15142:2;15127:18;;15120:62;15214:2;15199:18;;14867:356::o;16040:413::-;16242:2;16224:21;;;16281:2;16261:18;;;16254:30;16320:34;16315:2;16300:18;;16293:62;-1:-1:-1;;;16386:2:1;16371:18;;16364:47;16443:3;16428:19;;16040:413::o;17531:128::-;17571:3;17602:1;17598:6;17595:1;17592:13;17589:39;;;17608:18;;:::i;:::-;-1:-1:-1;17644:9:1;;17531:128::o;17664:120::-;17704:1;17730;17720:35;;17735:18;;:::i;:::-;-1:-1:-1;17769:9:1;;17664:120::o;17789:168::-;17829:7;17895:1;17891;17887:6;17883:14;17880:1;17877:21;17872:1;17865:9;17858:17;17854:45;17851:71;;;17902:18;;:::i;:::-;-1:-1:-1;17942:9:1;;17789:168::o;17962:125::-;18002:4;18030:1;18027;18024:8;18021:34;;;18035:18;;:::i;:::-;-1:-1:-1;18072:9:1;;17962:125::o;18092:258::-;18164:1;18174:113;18188:6;18185:1;18182:13;18174:113;;;18264:11;;;18258:18;18245:11;;;18238:39;18210:2;18203:10;18174:113;;;18305:6;18302:1;18299:13;18296:48;;;-1:-1:-1;;18340:1:1;18322:16;;18315:27;18092:258::o;18355:380::-;18434:1;18430:12;;;;18477;;;18498:61;;18552:4;18544:6;18540:17;18530:27;;18498:61;18605:2;18597:6;18594:14;18574:18;18571:38;18568:161;;;18651:10;18646:3;18642:20;18639:1;18632:31;18686:4;18683:1;18676:15;18714:4;18711:1;18704:15;18568:161;;18355:380;;;:::o;18740:135::-;18779:3;-1:-1:-1;;18800:17:1;;18797:43;;;18820:18;;:::i;:::-;-1:-1:-1;18867:1:1;18856:13;;18740:135::o;18880:112::-;18912:1;18938;18928:35;;18943:18;;:::i;:::-;-1:-1:-1;18977:9:1;;18880:112::o;18997:127::-;19058:10;19053:3;19049:20;19046:1;19039:31;19089:4;19086:1;19079:15;19113:4;19110:1;19103:15;19129:127;19190:10;19185:3;19181:20;19178:1;19171:31;19221:4;19218:1;19211:15;19245:4;19242:1;19235:15;19261:127;19322:10;19317:3;19313:20;19310:1;19303:31;19353:4;19350:1;19343:15;19377:4;19374:1;19367:15;19393:127;19454:10;19449:3;19445:20;19442:1;19435:31;19485:4;19482:1;19475:15;19509:4;19506:1;19499:15;19525:127;19586:10;19581:3;19577:20;19574:1;19567:31;19617:4;19614:1;19607:15;19641:4;19638:1;19631:15;19657:131;-1:-1:-1;;;;;19732:31:1;;19722:42;;19712:70;;19778:1;19775;19768:12;19793:131;-1:-1:-1;;;;;;19867:32:1;;19857:43;;19847:71;;19914:1;19911;19904:12
Swarm Source
ipfs://4313e078ef468d7cdaa31a5e672f4c0ae0c78808cf7a9aa7a36c67a9bb385224
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.