ERC-721
Overview
Max Total Supply
49 AiMage
Holders
28
Total Transfers
-
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
AIMage
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-04-12 */ /* TG : https://t.me/AiMageTools Twitter : https://twitter.com/AiMageTools Website : https://aimagetools.com */ // SPDX-License-Identifier: MIT 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; } } /** * @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); } } /** * @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); } /** * @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; } /** * @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); } /** * @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); } /** * @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); } } } } /** * @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); } } /** * @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; } } /** * @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 {} } /** * @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); } /** * @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(); } } contract AIMage is ERC721Enumerable, Ownable { using Strings for uint256; event MintAIMage(address indexed sender, uint256 startWith, uint256 times); event WhitelistUpdated(address indexed user, bool status, uint256 allowedMints); //supply counters uint256 public totalNFTs; uint256 public totalPublicNFTs; uint256 public totalPrivateNFTs; uint256 public maxPublic = 555; uint256 public maxPrivate = 0; // Stages uint256 public selectedStage = 1; uint256 public totalStageNFTs; uint256 public stageMaxBatch = 55; uint256 public maxBatch = 5; // Other uint256 public price = 900000000000000; // 900000000000000 = 0.0009 ETH address public mintAddress; // Whitelisting struct WhitelistUser { bool isWhitelisted; uint256 allowedMints; uint256 tokensMinted; } mapping(address => WhitelistUser) public whitelist; bool public whitelistStage = true; // URIs string private baseURI; string public hiddenURI; // Status flags bool private started = false; bool private revealed = true; constructor(string memory name_, string memory symbol_, string memory baseURI_, bool started_) ERC721(name_, symbol_) { baseURI = baseURI_; started = started_; } function setBaseURI(string memory _newURI) public onlyOwner { baseURI = _newURI; } function setHiddenURI(string memory _newHiddenURI) public onlyOwner { hiddenURI = _newHiddenURI; } function setMintAddress(address mint_) public onlyOwner { mintAddress = mint_; } function setNewStage() public onlyOwner { selectedStage++; totalStageNFTs = 0; } function setWhitelistStage(bool _enabled) public onlyOwner { whitelistStage = _enabled; } function setNFTPrice(uint256 price_) public onlyOwner { price = price_; } function setStageMaxBatch(uint256 maxBatch_) public onlyOwner { stageMaxBatch = maxBatch_; } function setStart(bool _start) public onlyOwner { started = _start; } function reveal() public onlyOwner { revealed = true; } function addToWhitelist(address[] calldata _addresses, uint256[] calldata _allowedMints) external onlyOwner { require(_addresses.length == _allowedMints.length, "Arrays length mismatch"); for(uint256 i = 0; i < _addresses.length; i++) { whitelist[_addresses[i]] = WhitelistUser(true, _allowedMints[i], 0); emit WhitelistUpdated(_addresses[i], true, _allowedMints[i]); } } function removeFromWhitelist(address[] calldata _addresses) external onlyOwner { for(uint256 i = 0; i < _addresses.length; i++) { delete whitelist[_addresses[i]]; emit WhitelistUpdated(_addresses[i], false, 0); } } // ERC721 function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token."); if(revealed == false) { return hiddenURI; } string memory baseURI_ = _baseURI(); return bytes(baseURI_).length > 0 ? string(abi.encodePacked(baseURI_, tokenId.toString(), ".json")) : '.json'; } // View functions function _baseURI() internal view virtual override returns (string memory){ return baseURI; } function tokensOfOwner(address owner) public view returns (uint256[] memory) { uint256 count = balanceOf(owner); uint256[] memory ids = new uint256[](count); for (uint256 i = 0; i < count; i++) { ids[i] = tokenOfOwnerByIndex(owner, i); } return ids; } function stageNumber() public view returns (uint256) { return selectedStage; } function totalNFTSupply() public view returns (uint256) { return maxPublic + maxPrivate; } function stageTotalNFTSupply() public view returns (uint256) { return stageMaxBatch; } function NFTCount() public view returns (uint256) { return totalNFTs; } function isWhitelisted(address addr) public view returns (bool) { return whitelist[addr].isWhitelisted && (whitelist[addr].allowedMints != whitelist[addr].tokensMinted); } function stageNFTCount() public view returns (uint256) { return totalStageNFTs; } function isStarted() public view returns (bool) { return started; } function nftPrice() public view returns (uint256) { return price; } function maxNFTBatch() public view returns (uint256) { return maxBatch; } function mintDev(address to, uint256 _times) external { require(_msgSender() == owner() || _msgSender() == mintAddress, "only owner or the mintAddress are allowed"); require(totalPrivateNFTs + _times <= maxPrivate, "max supply reached for owner"); emit MintAIMage(_msgSender(), totalNFTs + 1, _times); for(uint256 i = 0; i < _times; i++){ totalPrivateNFTs++; totalNFTs++; _mint(to, totalNFTs); } } function mintWhitelist(uint256 _times) payable public { require(started, "Not started"); require(_times > 0 && _times <= maxBatch, "Must mint fewer in each batch"); require(totalPublicNFTs + _times <= maxPublic, "Max supply reached!"); require(totalStageNFTs + _times <= stageMaxBatch, "Max stage supply reached!"); require(whitelist[msg.sender].isWhitelisted, "You are not whitelisted"); require(whitelist[msg.sender].tokensMinted + _times <= whitelist[msg.sender].allowedMints, "You have minted the whitelist max allocation amount"); emit MintAIMage(_msgSender(), totalNFTs+1, _times); for(uint256 i=0; i< _times; i++){ totalPublicNFTs++; totalStageNFTs++; totalNFTs++; _mint(msg.sender, totalNFTs); whitelist[msg.sender].tokensMinted++; } } function mint(uint256 _times) payable public { require(started, "Not started"); require(_times > 0 && _times <= maxBatch, "Must mint fewer in each batch"); require(totalPublicNFTs + _times <= maxPublic, "Max supply reached!"); require(totalStageNFTs + _times <= stageMaxBatch, "Max stage supply reached!"); require(msg.value == _times * price, "value error, please check price."); require(whitelistStage == false, "Currently in whitelist stage. Please wait"); payable(owner()).transfer(msg.value); emit MintAIMage(_msgSender(), totalNFTs+1, _times); for(uint256 i=0; i< _times; i++){ totalPublicNFTs++; totalStageNFTs++; totalNFTs++; _mint(_msgSender(), totalNFTs); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"bool","name":"started_","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"startWith","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"times","type":"uint256"}],"name":"MintAIMage","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"},{"indexed":false,"internalType":"uint256","name":"allowedMints","type":"uint256"}],"name":"WhitelistUpdated","type":"event"},{"inputs":[],"name":"NFTCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256[]","name":"_allowedMints","type":"uint256[]"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"isStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBatch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxNFTBatch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPrivate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_times","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"_times","type":"uint256"}],"name":"mintDev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_times","type":"uint256"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPrice","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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","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":[],"name":"selectedStage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"_newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newHiddenURI","type":"string"}],"name":"setHiddenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"mint_","type":"address"}],"name":"setMintAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"name":"setNFTPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setNewStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxBatch_","type":"uint256"}],"name":"setStageMaxBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_start","type":"bool"}],"name":"setStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setWhitelistStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stageMaxBatch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stageNFTCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stageNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stageTotalNFTSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalNFTSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalNFTs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPrivateNFTs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPublicNFTs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStageNFTs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"isWhitelisted","type":"bool"},{"internalType":"uint256","name":"allowedMints","type":"uint256"},{"internalType":"uint256","name":"tokensMinted","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistStage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405261022b600e556000600f5560016010819055603760125560056013556603328b944c40006014556017805460ff19169091179055601a805461ffff19166101001790553480156200005457600080fd5b50604051620038923803806200389283398101604081905262000077916200029b565b835184908490620000909060009060208501906200014a565b508051620000a69060019060208401906200014a565b505050620000c3620000bd620000f460201b60201c565b620000f8565b8151620000d89060189060208501906200014a565b50601a805460ff19169115159190911790555062000393915050565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001589062000340565b90600052602060002090601f0160209004810192826200017c5760008555620001c7565b82601f106200019757805160ff1916838001178555620001c7565b82800160010185558215620001c7579182015b82811115620001c7578251825591602001919060010190620001aa565b50620001d5929150620001d9565b5090565b5b80821115620001d55760008155600101620001da565b600082601f83011262000201578081fd5b81516001600160401b03808211156200021e576200021e6200037d565b6040516020601f8401601f19168201810183811183821017156200024657620002466200037d565b60405283825285840181018710156200025d578485fd5b8492505b8383101562000280578583018101518284018201529182019162000261565b838311156200029157848185840101525b5095945050505050565b60008060008060808587031215620002b1578384fd5b84516001600160401b0380821115620002c8578586fd5b620002d688838901620001f0565b95506020870151915080821115620002ec578485fd5b620002fa88838901620001f0565b9450604087015191508082111562000310578384fd5b506200031f87828801620001f0565b9250506060850151801515811462000335578182fd5b939692955090935050565b6002810460018216806200035557607f821691505b602082108114156200037757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6134ef80620003a36000396000f3fe6080604052600436106103765760003560e01c80637769d5db116101d1578063a22cb46511610102578063cb7728ea116100a0578063f2fde38b1161006f578063f2fde38b14610933578063f8d5054214610953578063fab3715414610973578063fc818c591461099357610376565b8063cb7728ea146108d4578063cffa4699146108e9578063e2c79281146108fe578063e985e9c51461091357610376565b8063b431a854116100dc578063b431a85414610854578063b88d4fde14610874578063bbaac02f14610894578063c87b56dd146108b457610376565b8063a22cb4651461080a578063a475b5dd1461082a578063a92c32311461083f57610376565b80638eb0f0da1161016f5780639b19251a116101495780639b19251a1461079e5780639dbc77bc146107cd578063a035b1fe146107e2578063a0712d68146107f757610376565b80638eb0f0da14610754578063909413231461076957806395d89b411461078957610376565b80638462151c116101ab5780638462151c146106e857806385504325146107155780638cc54e7f1461072a5780638da5cb5b1461073f57610376565b80637769d5db1461069e5780637dc42975146106b357806381530b68146106c857610376565b806342842e0e116102ab5780636746e8b3116102495780636df2a9e3116102235780636df2a9e31461063f57806370a0823114610654578063715018a614610674578063773326fe1461068957610376565b80636746e8b3146105f557806367765b871461060a57806368e243271461061f57610376565b8063544736e611610285578063544736e614610580578063548db1741461059557806355f804b3146105b55780636352211e146105d557610376565b806342842e0e1461052d5780634618163e1461054d5780634f6ccce71461056057610376565b8063183c37ed116103185780632f745c59116102f25780632f745c59146104b8578063324c6adc146104d85780633af32abf146104f8578063425d49801461051857610376565b8063183c37ed1461046e57806323b872dd146104835780632d38ba3e146104a357610376565b8063095ea7b311610354578063095ea7b3146104005780630d0e96da146104225780630d39fc811461044457806318160ddd1461045957610376565b806301ffc9a71461037b57806306fdde03146103b1578063081812fc146103d3575b600080fd5b34801561038757600080fd5b5061039b610396366004612a00565b6109a8565b6040516103a89190612b96565b60405180910390f35b3480156103bd57600080fd5b506103c66109d5565b6040516103a89190612bc9565b3480156103df57600080fd5b506103f36103ee366004612a7e565b610a67565b6040516103a89190612b01565b34801561040c57600080fd5b5061042061041b366004612914565b610ab3565b005b34801561042e57600080fd5b50610437610b4b565b6040516103a89190613352565b34801561045057600080fd5b50610437610b51565b34801561046557600080fd5b50610437610b57565b34801561047a57600080fd5b50610437610b5d565b34801561048f57600080fd5b5061042061049e366004612837565b610b63565b3480156104af57600080fd5b50610420610b9b565b3480156104c457600080fd5b506104376104d3366004612914565b610bf6565b3480156104e457600080fd5b506104206104f3366004612914565b610c48565b34801561050457600080fd5b5061039b6105133660046127eb565b610d86565b34801561052457600080fd5b506103f3610dd1565b34801561053957600080fd5b50610420610548366004612837565b610de0565b61042061055b366004612a7e565b610dfb565b34801561056c57600080fd5b5061043761057b366004612a7e565b611003565b34801561058c57600080fd5b5061039b61105e565b3480156105a157600080fd5b506104206105b036600461293d565b611067565b3480156105c157600080fd5b506104206105d0366004612a38565b6111a2565b3480156105e157600080fd5b506103f36105f0366004612a7e565b6111f4565b34801561060157600080fd5b5061039b611229565b34801561061657600080fd5b50610437611232565b34801561062b57600080fd5b5061042061063a3660046129e6565b611238565b34801561064b57600080fd5b5061043761128a565b34801561066057600080fd5b5061043761066f3660046127eb565b611290565b34801561068057600080fd5b506104206112d4565b34801561069557600080fd5b5061043761131f565b3480156106aa57600080fd5b50610437611325565b3480156106bf57600080fd5b5061043761132b565b3480156106d457600080fd5b506104206106e3366004612a7e565b611331565b3480156106f457600080fd5b506107086107033660046127eb565b611375565b6040516103a89190612b52565b34801561072157600080fd5b50610437611433565b34801561073657600080fd5b506103c6611439565b34801561074b57600080fd5b506103f36114c7565b34801561076057600080fd5b506104376114d6565b34801561077557600080fd5b506104206107843660046129e6565b6114dc565b34801561079557600080fd5b506103c661152e565b3480156107aa57600080fd5b506107be6107b93660046127eb565b61153d565b6040516103a893929190612bb1565b3480156107d957600080fd5b50610437611562565b3480156107ee57600080fd5b50610437611568565b610420610805366004612a7e565b61156e565b34801561081657600080fd5b506104206108253660046128eb565b611772565b34801561083657600080fd5b50610420611840565b34801561084b57600080fd5b50610437611890565b34801561086057600080fd5b5061042061086f366004612a7e565b611896565b34801561088057600080fd5b5061042061088f366004612872565b6118da565b3480156108a057600080fd5b506104206108af366004612a38565b611919565b3480156108c057600080fd5b506103c66108cf366004612a7e565b61196b565b3480156108e057600080fd5b50610437611a9d565b3480156108f557600080fd5b50610437611aa3565b34801561090a57600080fd5b50610437611aa9565b34801561091f57600080fd5b5061039b61092e366004612805565b611ac0565b34801561093f57600080fd5b5061042061094e3660046127eb565b611aee565b34801561095f57600080fd5b5061042061096e36600461297d565b611b5f565b34801561097f57600080fd5b5061042061098e3660046127eb565b611d3b565b34801561099f57600080fd5b50610437611d9c565b60006001600160e01b0319821663780e9d6360e01b14806109cd57506109cd82611da2565b90505b919050565b6060600080546109e4906133f7565b80601f0160208091040260200160405190810160405280929190818152602001828054610a10906133f7565b8015610a5d5780601f10610a3257610100808354040283529160200191610a5d565b820191906000526020600020905b815481529060010190602001808311610a4057829003601f168201915b5050505050905090565b6000610a7282611de2565b610a975760405162461bcd60e51b8152600401610a8e90612f6e565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610abe826111f4565b9050806001600160a01b0316836001600160a01b03161415610af25760405162461bcd60e51b8152600401610a8e9061310b565b806001600160a01b0316610b04611dff565b6001600160a01b03161480610b205750610b208161092e611dff565b610b3c5760405162461bcd60e51b8152600401610a8e90612e12565b610b468383611e03565b505050565b600b5481565b60145490565b60085490565b60115481565b610b74610b6e611dff565b82611e71565b610b905760405162461bcd60e51b8152600401610a8e90613181565b610b46838383611ef6565b610ba3611dff565b6001600160a01b0316610bb46114c7565b6001600160a01b031614610bda5760405162461bcd60e51b8152600401610a8e90612ff1565b60108054906000610bea83613432565b90915550506000601155565b6000610c0183611290565b8210610c1f5760405162461bcd60e51b8152600401610a8e90612bdc565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610c506114c7565b6001600160a01b0316610c61611dff565b6001600160a01b03161480610c9057506015546001600160a01b0316610c85611dff565b6001600160a01b0316145b610cac5760405162461bcd60e51b8152600401610a8e9061324b565b600f5481600d54610cbd9190613369565b1115610cdb5760405162461bcd60e51b8152600401610a8e90613294565b610ce3611dff565b6001600160a01b03167f377bddaa7094a301feffc156dfaadbaa97b1f65deeecd854b3faa040051463f0600b546001610d1c9190613369565b83604051610d2b92919061335b565b60405180910390a260005b81811015610b4657600d8054906000610d4e83613432565b9091555050600b8054906000610d6383613432565b9190505550610d7483600b54612023565b80610d7e81613432565b915050610d36565b6001600160a01b03811660009081526016602052604081205460ff1680156109cd5750506001600160a01b031660009081526016602052604090206002810154600190910154141590565b6015546001600160a01b031681565b610b46838383604051806020016040528060008152506118da565b601a5460ff16610e1d5760405162461bcd60e51b8152600401610a8e90612c27565b600081118015610e2f57506013548111155b610e4b5760405162461bcd60e51b8152600401610a8e90612fba565b600e5481600c54610e5c9190613369565b1115610e7a5760405162461bcd60e51b8152600401610a8e906131d2565b60125481601154610e8b9190613369565b1115610ea95760405162461bcd60e51b8152600401610a8e906132cb565b3360009081526016602052604090205460ff16610ed85760405162461bcd60e51b8152600401610a8e90612f37565b3360009081526016602052604090206001810154600290910154610efd908390613369565b1115610f1b5760405162461bcd60e51b8152600401610a8e9061306f565b610f23611dff565b6001600160a01b03167f377bddaa7094a301feffc156dfaadbaa97b1f65deeecd854b3faa040051463f0600b546001610f5c9190613369565b83604051610f6b92919061335b565b60405180910390a260005b81811015610fff57600c8054906000610f8e83613432565b909155505060118054906000610fa383613432565b9091555050600b8054906000610fb883613432565b9190505550610fc933600b54612023565b336000908152601660205260408120600201805491610fe783613432565b91905055508080610ff790613432565b915050610f76565b5050565b600061100d610b57565b821061102b5760405162461bcd60e51b8152600401610a8e906131ff565b6008828154811061104c57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b601a5460ff1690565b61106f611dff565b6001600160a01b03166110806114c7565b6001600160a01b0316146110a65760405162461bcd60e51b8152600401610a8e90612ff1565b60005b81811015610b4657601660008484848181106110d557634e487b7160e01b600052603260045260246000fd5b90506020020160208101906110ea91906127eb565b6001600160a01b0316815260208101919091526040016000908120805460ff19168155600181018290556002015582828281811061113857634e487b7160e01b600052603260045260246000fd5b905060200201602081019061114d91906127eb565b6001600160a01b03167f0f2ab3269df45d41960fdf14c84cd22dfb81c269985eecc7ee6b93764639ae45600080604051611188929190612ba1565b60405180910390a28061119a81613432565b9150506110a9565b6111aa611dff565b6001600160a01b03166111bb6114c7565b6001600160a01b0316146111e15760405162461bcd60e51b8152600401610a8e90612ff1565b8051610fff906018906020840190612672565b6000818152600260205260408120546001600160a01b0316806109cd5760405162461bcd60e51b8152600401610a8e90612eb9565b60175460ff1681565b60135481565b611240611dff565b6001600160a01b03166112516114c7565b6001600160a01b0316146112775760405162461bcd60e51b8152600401610a8e90612ff1565b601a805460ff1916911515919091179055565b600d5481565b60006001600160a01b0382166112b85760405162461bcd60e51b8152600401610a8e90612e6f565b506001600160a01b031660009081526003602052604090205490565b6112dc611dff565b6001600160a01b03166112ed6114c7565b6001600160a01b0316146113135760405162461bcd60e51b8152600401610a8e90612ff1565b61131d6000612102565b565b600f5481565b60115490565b600e5481565b611339611dff565b6001600160a01b031661134a6114c7565b6001600160a01b0316146113705760405162461bcd60e51b8152600401610a8e90612ff1565b601455565b6060600061138283611290565b905060008167ffffffffffffffff8111156113ad57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156113d6578160200160208202803683370190505b50905060005b8281101561142b576113ee8582610bf6565b82828151811061140e57634e487b7160e01b600052603260045260246000fd5b60209081029190910101528061142381613432565b9150506113dc565b509392505050565b600c5481565b60198054611446906133f7565b80601f0160208091040260200160405190810160405280929190818152602001828054611472906133f7565b80156114bf5780601f10611494576101008083540402835291602001916114bf565b820191906000526020600020905b8154815290600101906020018083116114a257829003601f168201915b505050505081565b600a546001600160a01b031690565b60105481565b6114e4611dff565b6001600160a01b03166114f56114c7565b6001600160a01b03161461151b5760405162461bcd60e51b8152600401610a8e90612ff1565b6017805460ff1916911515919091179055565b6060600180546109e4906133f7565b60166020526000908152604090208054600182015460029092015460ff909116919083565b60125481565b60145481565b601a5460ff166115905760405162461bcd60e51b8152600401610a8e90612c27565b6000811180156115a257506013548111155b6115be5760405162461bcd60e51b8152600401610a8e90612fba565b600e5481600c546115cf9190613369565b11156115ed5760405162461bcd60e51b8152600401610a8e906131d2565b601254816011546115fe9190613369565b111561161c5760405162461bcd60e51b8152600401610a8e906132cb565b6014546116299082613395565b34146116475760405162461bcd60e51b8152600401610a8e9061314c565b60175460ff161561166a5760405162461bcd60e51b8152600401610a8e906130c2565b6116726114c7565b6001600160a01b03166108fc349081150290604051600060405180830381858888f193505050501580156116aa573d6000803e3d6000fd5b506116b3611dff565b6001600160a01b03167f377bddaa7094a301feffc156dfaadbaa97b1f65deeecd854b3faa040051463f0600b5460016116ec9190613369565b836040516116fb92919061335b565b60405180910390a260005b81811015610fff57600c805490600061171e83613432565b90915550506011805490600061173383613432565b9091555050600b805490600061174883613432565b9190505550611760611758611dff565b600b54612023565b8061176a81613432565b915050611706565b61177a611dff565b6001600160a01b0316826001600160a01b031614156117ab5760405162461bcd60e51b8152600401610a8e90612d5f565b80600560006117b8611dff565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556117fc611dff565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118349190612b96565b60405180910390a35050565b611848611dff565b6001600160a01b03166118596114c7565b6001600160a01b03161461187f5760405162461bcd60e51b8152600401610a8e90612ff1565b601a805461ff001916610100179055565b60105490565b61189e611dff565b6001600160a01b03166118af6114c7565b6001600160a01b0316146118d55760405162461bcd60e51b8152600401610a8e90612ff1565b601255565b6118eb6118e5611dff565b83611e71565b6119075760405162461bcd60e51b8152600401610a8e90613181565b61191384848484612154565b50505050565b611921611dff565b6001600160a01b03166119326114c7565b6001600160a01b0316146119585760405162461bcd60e51b8152600401610a8e90612ff1565b8051610fff906019906020840190612672565b606061197682611de2565b6119925760405162461bcd60e51b8152600401610a8e90613302565b601a54610100900460ff16611a3357601980546119ae906133f7565b80601f01602080910402602001604051908101604052809291908181526020018280546119da906133f7565b8015611a275780601f106119fc57610100808354040283529160200191611a27565b820191906000526020600020905b815481529060010190602001808311611a0a57829003601f168201915b505050505090506109d0565b6000611a3d612187565b90506000815111611a6b5760405180604001604052806005815260200164173539b7b760d91b815250611a96565b80611a7584612196565b604051602001611a86929190612ac2565b6040516020818303038152906040525b9392505050565b600b5490565b60135490565b6000600f54600e54611abb9190613369565b905090565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b611af6611dff565b6001600160a01b0316611b076114c7565b6001600160a01b031614611b2d5760405162461bcd60e51b8152600401610a8e90612ff1565b6001600160a01b038116611b535760405162461bcd60e51b8152600401610a8e90612c9e565b611b5c81612102565b50565b611b67611dff565b6001600160a01b0316611b786114c7565b6001600160a01b031614611b9e5760405162461bcd60e51b8152600401610a8e90612ff1565b828114611bbd5760405162461bcd60e51b8152600401610a8e90612de2565b60005b83811015611d34576040518060600160405280600115158152602001848484818110611bfc57634e487b7160e01b600052603260045260246000fd5b905060200201358152602001600081525060166000878785818110611c3157634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611c4691906127eb565b6001600160a01b0316815260208082019290925260409081016000208351815460ff19169015151781559183015160018301559190910151600290910155848482818110611ca457634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611cb991906127eb565b6001600160a01b03167f0f2ab3269df45d41960fdf14c84cd22dfb81c269985eecc7ee6b93764639ae456001858585818110611d0557634e487b7160e01b600052603260045260246000fd5b90506020020135604051611d1a929190612ba1565b60405180910390a280611d2c81613432565b915050611bc0565b5050505050565b611d43611dff565b6001600160a01b0316611d546114c7565b6001600160a01b031614611d7a5760405162461bcd60e51b8152600401610a8e90612ff1565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b60125490565b60006001600160e01b031982166380ac58cd60e01b1480611dd357506001600160e01b03198216635b5e139f60e01b145b806109cd57506109cd826122b1565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611e38826111f4565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611e7c82611de2565b611e985760405162461bcd60e51b8152600401610a8e90612d96565b6000611ea3836111f4565b9050806001600160a01b0316846001600160a01b03161480611ede5750836001600160a01b0316611ed384610a67565b6001600160a01b0316145b80611eee5750611eee8185611ac0565b949350505050565b826001600160a01b0316611f09826111f4565b6001600160a01b031614611f2f5760405162461bcd60e51b8152600401610a8e90613026565b6001600160a01b038216611f555760405162461bcd60e51b8152600401610a8e90612d1b565b611f608383836122ca565b611f6b600082611e03565b6001600160a01b0383166000908152600360205260408120805460019290611f949084906133b4565b90915550506001600160a01b0382166000908152600360205260408120805460019290611fc2908490613369565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b0382166120495760405162461bcd60e51b8152600401610a8e90612f02565b61205281611de2565b1561206f5760405162461bcd60e51b8152600401610a8e90612ce4565b61207b600083836122ca565b6001600160a01b03821660009081526003602052604081208054600192906120a4908490613369565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61215f848484611ef6565b61216b84848484612353565b6119135760405162461bcd60e51b8152600401610a8e90612c4c565b6060601880546109e4906133f7565b6060816121bb57506040805180820190915260018152600360fc1b60208201526109d0565b8160005b81156121e557806121cf81613432565b91506121de9050600a83613381565b91506121bf565b60008167ffffffffffffffff81111561220e57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612238576020820181803683370190505b5090505b8415611eee5761224d6001836133b4565b915061225a600a8661344d565b612265906030613369565b60f81b81838151811061228857634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506122aa600a86613381565b945061223c565b6001600160e01b031981166301ffc9a760e01b14919050565b6122d5838383610b46565b6001600160a01b0383166122f1576122ec8161246e565b612314565b816001600160a01b0316836001600160a01b0316146123145761231483826124b2565b6001600160a01b0382166123305761232b8161254f565b610b46565b826001600160a01b0316826001600160a01b031614610b4657610b468282612628565b6000612367846001600160a01b031661266c565b1561246357836001600160a01b031663150b7a02612383611dff565b8786866040518563ffffffff1660e01b81526004016123a59493929190612b15565b602060405180830381600087803b1580156123bf57600080fd5b505af19250505080156123ef575060408051601f3d908101601f191682019092526123ec91810190612a1c565b60015b612449573d80801561241d576040519150601f19603f3d011682016040523d82523d6000602084013e612422565b606091505b5080516124415760405162461bcd60e51b8152600401610a8e90612c4c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611eee565b506001949350505050565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b600060016124bf84611290565b6124c991906133b4565b60008381526007602052604090205490915080821461251c576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612561906001906133b4565b6000838152600960205260408120546008805493945090928490811061259757634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080600883815481106125c657634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061260c57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061263383611290565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b3b151590565b82805461267e906133f7565b90600052602060002090601f0160209004810192826126a057600085556126e6565b82601f106126b957805160ff19168380011785556126e6565b828001600101855582156126e6579182015b828111156126e65782518255916020019190600101906126cb565b506126f29291506126f6565b5090565b5b808211156126f257600081556001016126f7565b600067ffffffffffffffff808411156127265761272661348d565b604051601f8501601f19168101602001828111828210171561274a5761274a61348d565b60405284815291508183850186101561276257600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b03811681146109d057600080fd5b60008083601f8401126127a3578081fd5b50813567ffffffffffffffff8111156127ba578182fd5b60208301915083602080830285010111156127d457600080fd5b9250929050565b803580151581146109d057600080fd5b6000602082840312156127fc578081fd5b611a968261277b565b60008060408385031215612817578081fd5b6128208361277b565b915061282e6020840161277b565b90509250929050565b60008060006060848603121561284b578081fd5b6128548461277b565b92506128626020850161277b565b9150604084013590509250925092565b60008060008060808587031215612887578081fd5b6128908561277b565b935061289e6020860161277b565b925060408501359150606085013567ffffffffffffffff8111156128c0578182fd5b8501601f810187136128d0578182fd5b6128df8782356020840161270b565b91505092959194509250565b600080604083850312156128fd578182fd5b6129068361277b565b915061282e602084016127db565b60008060408385031215612926578182fd5b61292f8361277b565b946020939093013593505050565b6000806020838503121561294f578182fd5b823567ffffffffffffffff811115612965578283fd5b61297185828601612792565b90969095509350505050565b60008060008060408587031215612992578384fd5b843567ffffffffffffffff808211156129a9578586fd5b6129b588838901612792565b909650945060208701359150808211156129cd578384fd5b506129da87828801612792565b95989497509550505050565b6000602082840312156129f7578081fd5b611a96826127db565b600060208284031215612a11578081fd5b8135611a96816134a3565b600060208284031215612a2d578081fd5b8151611a96816134a3565b600060208284031215612a49578081fd5b813567ffffffffffffffff811115612a5f578182fd5b8201601f81018413612a6f578182fd5b611eee8482356020840161270b565b600060208284031215612a8f578081fd5b5035919050565b60008151808452612aae8160208601602086016133cb565b601f01601f19169290920160200192915050565b60008351612ad48184602088016133cb565b835190830190612ae88183602088016133cb565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b4890830184612a96565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612b8a57835183529284019291840191600101612b6e565b50909695505050505050565b901515815260200190565b9115158252602082015260400190565b92151583526020830191909152604082015260600190565b600060208252611a966020830184612a96565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b6020808252600b908201526a139bdd081cdd185c9d195960aa1b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b602080825260169082015275082e4e4c2f2e640d8cadccee8d040dad2e6dac2e8c6d60531b604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526017908201527f596f7520617265206e6f742077686974656c6973746564000000000000000000604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252601d908201527f4d757374206d696e7420666577657220696e2065616368206261746368000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b60208082526033908201527f596f752068617665206d696e746564207468652077686974656c697374206d616040820152721e08185b1b1bd8d85d1a5bdb88185b5bdd5b9d606a1b606082015260800190565b60208082526029908201527f43757272656e746c7920696e2077686974656c6973742073746167652e20506c60408201526819585cd9481dd85a5d60ba1b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b6020808252818101527f76616c7565206572726f722c20706c6561736520636865636b2070726963652e604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601390820152724d617820737570706c7920726561636865642160681b604082015260600190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b60208082526029908201527f6f6e6c79206f776e6572206f7220746865206d696e74416464726573732061726040820152681948185b1b1bddd95960ba1b606082015260800190565b6020808252601c908201527f6d617820737570706c79207265616368656420666f72206f776e657200000000604082015260600190565b60208082526019908201527f4d617820737461676520737570706c7920726561636865642100000000000000604082015260600190565b60208082526030908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526f3732bc34b9ba32b73a103a37b5b2b71760811b606082015260800190565b90815260200190565b918252602082015260400190565b6000821982111561337c5761337c613461565b500190565b60008261339057613390613477565b500490565b60008160001904831182151516156133af576133af613461565b500290565b6000828210156133c6576133c6613461565b500390565b60005b838110156133e65781810151838201526020016133ce565b838111156119135750506000910152565b60028104600182168061340b57607f821691505b6020821081141561342c57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561344657613446613461565b5060010190565b60008261345c5761345c613477565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611b5c57600080fdfea26469706673582212201fd20017e1ab9313ce916eb7766eefa3f749a8c586806f60b339ba8490c3a64b64736f6c63430008000033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000741694d6167657300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000641694d61676500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5567763754584777646d504c334e45694a5165774b5a446e7462457a72764a636578716d5a36364d435a56762f00000000000000000000
Deployed Bytecode
0x6080604052600436106103765760003560e01c80637769d5db116101d1578063a22cb46511610102578063cb7728ea116100a0578063f2fde38b1161006f578063f2fde38b14610933578063f8d5054214610953578063fab3715414610973578063fc818c591461099357610376565b8063cb7728ea146108d4578063cffa4699146108e9578063e2c79281146108fe578063e985e9c51461091357610376565b8063b431a854116100dc578063b431a85414610854578063b88d4fde14610874578063bbaac02f14610894578063c87b56dd146108b457610376565b8063a22cb4651461080a578063a475b5dd1461082a578063a92c32311461083f57610376565b80638eb0f0da1161016f5780639b19251a116101495780639b19251a1461079e5780639dbc77bc146107cd578063a035b1fe146107e2578063a0712d68146107f757610376565b80638eb0f0da14610754578063909413231461076957806395d89b411461078957610376565b80638462151c116101ab5780638462151c146106e857806385504325146107155780638cc54e7f1461072a5780638da5cb5b1461073f57610376565b80637769d5db1461069e5780637dc42975146106b357806381530b68146106c857610376565b806342842e0e116102ab5780636746e8b3116102495780636df2a9e3116102235780636df2a9e31461063f57806370a0823114610654578063715018a614610674578063773326fe1461068957610376565b80636746e8b3146105f557806367765b871461060a57806368e243271461061f57610376565b8063544736e611610285578063544736e614610580578063548db1741461059557806355f804b3146105b55780636352211e146105d557610376565b806342842e0e1461052d5780634618163e1461054d5780634f6ccce71461056057610376565b8063183c37ed116103185780632f745c59116102f25780632f745c59146104b8578063324c6adc146104d85780633af32abf146104f8578063425d49801461051857610376565b8063183c37ed1461046e57806323b872dd146104835780632d38ba3e146104a357610376565b8063095ea7b311610354578063095ea7b3146104005780630d0e96da146104225780630d39fc811461044457806318160ddd1461045957610376565b806301ffc9a71461037b57806306fdde03146103b1578063081812fc146103d3575b600080fd5b34801561038757600080fd5b5061039b610396366004612a00565b6109a8565b6040516103a89190612b96565b60405180910390f35b3480156103bd57600080fd5b506103c66109d5565b6040516103a89190612bc9565b3480156103df57600080fd5b506103f36103ee366004612a7e565b610a67565b6040516103a89190612b01565b34801561040c57600080fd5b5061042061041b366004612914565b610ab3565b005b34801561042e57600080fd5b50610437610b4b565b6040516103a89190613352565b34801561045057600080fd5b50610437610b51565b34801561046557600080fd5b50610437610b57565b34801561047a57600080fd5b50610437610b5d565b34801561048f57600080fd5b5061042061049e366004612837565b610b63565b3480156104af57600080fd5b50610420610b9b565b3480156104c457600080fd5b506104376104d3366004612914565b610bf6565b3480156104e457600080fd5b506104206104f3366004612914565b610c48565b34801561050457600080fd5b5061039b6105133660046127eb565b610d86565b34801561052457600080fd5b506103f3610dd1565b34801561053957600080fd5b50610420610548366004612837565b610de0565b61042061055b366004612a7e565b610dfb565b34801561056c57600080fd5b5061043761057b366004612a7e565b611003565b34801561058c57600080fd5b5061039b61105e565b3480156105a157600080fd5b506104206105b036600461293d565b611067565b3480156105c157600080fd5b506104206105d0366004612a38565b6111a2565b3480156105e157600080fd5b506103f36105f0366004612a7e565b6111f4565b34801561060157600080fd5b5061039b611229565b34801561061657600080fd5b50610437611232565b34801561062b57600080fd5b5061042061063a3660046129e6565b611238565b34801561064b57600080fd5b5061043761128a565b34801561066057600080fd5b5061043761066f3660046127eb565b611290565b34801561068057600080fd5b506104206112d4565b34801561069557600080fd5b5061043761131f565b3480156106aa57600080fd5b50610437611325565b3480156106bf57600080fd5b5061043761132b565b3480156106d457600080fd5b506104206106e3366004612a7e565b611331565b3480156106f457600080fd5b506107086107033660046127eb565b611375565b6040516103a89190612b52565b34801561072157600080fd5b50610437611433565b34801561073657600080fd5b506103c6611439565b34801561074b57600080fd5b506103f36114c7565b34801561076057600080fd5b506104376114d6565b34801561077557600080fd5b506104206107843660046129e6565b6114dc565b34801561079557600080fd5b506103c661152e565b3480156107aa57600080fd5b506107be6107b93660046127eb565b61153d565b6040516103a893929190612bb1565b3480156107d957600080fd5b50610437611562565b3480156107ee57600080fd5b50610437611568565b610420610805366004612a7e565b61156e565b34801561081657600080fd5b506104206108253660046128eb565b611772565b34801561083657600080fd5b50610420611840565b34801561084b57600080fd5b50610437611890565b34801561086057600080fd5b5061042061086f366004612a7e565b611896565b34801561088057600080fd5b5061042061088f366004612872565b6118da565b3480156108a057600080fd5b506104206108af366004612a38565b611919565b3480156108c057600080fd5b506103c66108cf366004612a7e565b61196b565b3480156108e057600080fd5b50610437611a9d565b3480156108f557600080fd5b50610437611aa3565b34801561090a57600080fd5b50610437611aa9565b34801561091f57600080fd5b5061039b61092e366004612805565b611ac0565b34801561093f57600080fd5b5061042061094e3660046127eb565b611aee565b34801561095f57600080fd5b5061042061096e36600461297d565b611b5f565b34801561097f57600080fd5b5061042061098e3660046127eb565b611d3b565b34801561099f57600080fd5b50610437611d9c565b60006001600160e01b0319821663780e9d6360e01b14806109cd57506109cd82611da2565b90505b919050565b6060600080546109e4906133f7565b80601f0160208091040260200160405190810160405280929190818152602001828054610a10906133f7565b8015610a5d5780601f10610a3257610100808354040283529160200191610a5d565b820191906000526020600020905b815481529060010190602001808311610a4057829003601f168201915b5050505050905090565b6000610a7282611de2565b610a975760405162461bcd60e51b8152600401610a8e90612f6e565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610abe826111f4565b9050806001600160a01b0316836001600160a01b03161415610af25760405162461bcd60e51b8152600401610a8e9061310b565b806001600160a01b0316610b04611dff565b6001600160a01b03161480610b205750610b208161092e611dff565b610b3c5760405162461bcd60e51b8152600401610a8e90612e12565b610b468383611e03565b505050565b600b5481565b60145490565b60085490565b60115481565b610b74610b6e611dff565b82611e71565b610b905760405162461bcd60e51b8152600401610a8e90613181565b610b46838383611ef6565b610ba3611dff565b6001600160a01b0316610bb46114c7565b6001600160a01b031614610bda5760405162461bcd60e51b8152600401610a8e90612ff1565b60108054906000610bea83613432565b90915550506000601155565b6000610c0183611290565b8210610c1f5760405162461bcd60e51b8152600401610a8e90612bdc565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610c506114c7565b6001600160a01b0316610c61611dff565b6001600160a01b03161480610c9057506015546001600160a01b0316610c85611dff565b6001600160a01b0316145b610cac5760405162461bcd60e51b8152600401610a8e9061324b565b600f5481600d54610cbd9190613369565b1115610cdb5760405162461bcd60e51b8152600401610a8e90613294565b610ce3611dff565b6001600160a01b03167f377bddaa7094a301feffc156dfaadbaa97b1f65deeecd854b3faa040051463f0600b546001610d1c9190613369565b83604051610d2b92919061335b565b60405180910390a260005b81811015610b4657600d8054906000610d4e83613432565b9091555050600b8054906000610d6383613432565b9190505550610d7483600b54612023565b80610d7e81613432565b915050610d36565b6001600160a01b03811660009081526016602052604081205460ff1680156109cd5750506001600160a01b031660009081526016602052604090206002810154600190910154141590565b6015546001600160a01b031681565b610b46838383604051806020016040528060008152506118da565b601a5460ff16610e1d5760405162461bcd60e51b8152600401610a8e90612c27565b600081118015610e2f57506013548111155b610e4b5760405162461bcd60e51b8152600401610a8e90612fba565b600e5481600c54610e5c9190613369565b1115610e7a5760405162461bcd60e51b8152600401610a8e906131d2565b60125481601154610e8b9190613369565b1115610ea95760405162461bcd60e51b8152600401610a8e906132cb565b3360009081526016602052604090205460ff16610ed85760405162461bcd60e51b8152600401610a8e90612f37565b3360009081526016602052604090206001810154600290910154610efd908390613369565b1115610f1b5760405162461bcd60e51b8152600401610a8e9061306f565b610f23611dff565b6001600160a01b03167f377bddaa7094a301feffc156dfaadbaa97b1f65deeecd854b3faa040051463f0600b546001610f5c9190613369565b83604051610f6b92919061335b565b60405180910390a260005b81811015610fff57600c8054906000610f8e83613432565b909155505060118054906000610fa383613432565b9091555050600b8054906000610fb883613432565b9190505550610fc933600b54612023565b336000908152601660205260408120600201805491610fe783613432565b91905055508080610ff790613432565b915050610f76565b5050565b600061100d610b57565b821061102b5760405162461bcd60e51b8152600401610a8e906131ff565b6008828154811061104c57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b601a5460ff1690565b61106f611dff565b6001600160a01b03166110806114c7565b6001600160a01b0316146110a65760405162461bcd60e51b8152600401610a8e90612ff1565b60005b81811015610b4657601660008484848181106110d557634e487b7160e01b600052603260045260246000fd5b90506020020160208101906110ea91906127eb565b6001600160a01b0316815260208101919091526040016000908120805460ff19168155600181018290556002015582828281811061113857634e487b7160e01b600052603260045260246000fd5b905060200201602081019061114d91906127eb565b6001600160a01b03167f0f2ab3269df45d41960fdf14c84cd22dfb81c269985eecc7ee6b93764639ae45600080604051611188929190612ba1565b60405180910390a28061119a81613432565b9150506110a9565b6111aa611dff565b6001600160a01b03166111bb6114c7565b6001600160a01b0316146111e15760405162461bcd60e51b8152600401610a8e90612ff1565b8051610fff906018906020840190612672565b6000818152600260205260408120546001600160a01b0316806109cd5760405162461bcd60e51b8152600401610a8e90612eb9565b60175460ff1681565b60135481565b611240611dff565b6001600160a01b03166112516114c7565b6001600160a01b0316146112775760405162461bcd60e51b8152600401610a8e90612ff1565b601a805460ff1916911515919091179055565b600d5481565b60006001600160a01b0382166112b85760405162461bcd60e51b8152600401610a8e90612e6f565b506001600160a01b031660009081526003602052604090205490565b6112dc611dff565b6001600160a01b03166112ed6114c7565b6001600160a01b0316146113135760405162461bcd60e51b8152600401610a8e90612ff1565b61131d6000612102565b565b600f5481565b60115490565b600e5481565b611339611dff565b6001600160a01b031661134a6114c7565b6001600160a01b0316146113705760405162461bcd60e51b8152600401610a8e90612ff1565b601455565b6060600061138283611290565b905060008167ffffffffffffffff8111156113ad57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156113d6578160200160208202803683370190505b50905060005b8281101561142b576113ee8582610bf6565b82828151811061140e57634e487b7160e01b600052603260045260246000fd5b60209081029190910101528061142381613432565b9150506113dc565b509392505050565b600c5481565b60198054611446906133f7565b80601f0160208091040260200160405190810160405280929190818152602001828054611472906133f7565b80156114bf5780601f10611494576101008083540402835291602001916114bf565b820191906000526020600020905b8154815290600101906020018083116114a257829003601f168201915b505050505081565b600a546001600160a01b031690565b60105481565b6114e4611dff565b6001600160a01b03166114f56114c7565b6001600160a01b03161461151b5760405162461bcd60e51b8152600401610a8e90612ff1565b6017805460ff1916911515919091179055565b6060600180546109e4906133f7565b60166020526000908152604090208054600182015460029092015460ff909116919083565b60125481565b60145481565b601a5460ff166115905760405162461bcd60e51b8152600401610a8e90612c27565b6000811180156115a257506013548111155b6115be5760405162461bcd60e51b8152600401610a8e90612fba565b600e5481600c546115cf9190613369565b11156115ed5760405162461bcd60e51b8152600401610a8e906131d2565b601254816011546115fe9190613369565b111561161c5760405162461bcd60e51b8152600401610a8e906132cb565b6014546116299082613395565b34146116475760405162461bcd60e51b8152600401610a8e9061314c565b60175460ff161561166a5760405162461bcd60e51b8152600401610a8e906130c2565b6116726114c7565b6001600160a01b03166108fc349081150290604051600060405180830381858888f193505050501580156116aa573d6000803e3d6000fd5b506116b3611dff565b6001600160a01b03167f377bddaa7094a301feffc156dfaadbaa97b1f65deeecd854b3faa040051463f0600b5460016116ec9190613369565b836040516116fb92919061335b565b60405180910390a260005b81811015610fff57600c805490600061171e83613432565b90915550506011805490600061173383613432565b9091555050600b805490600061174883613432565b9190505550611760611758611dff565b600b54612023565b8061176a81613432565b915050611706565b61177a611dff565b6001600160a01b0316826001600160a01b031614156117ab5760405162461bcd60e51b8152600401610a8e90612d5f565b80600560006117b8611dff565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556117fc611dff565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118349190612b96565b60405180910390a35050565b611848611dff565b6001600160a01b03166118596114c7565b6001600160a01b03161461187f5760405162461bcd60e51b8152600401610a8e90612ff1565b601a805461ff001916610100179055565b60105490565b61189e611dff565b6001600160a01b03166118af6114c7565b6001600160a01b0316146118d55760405162461bcd60e51b8152600401610a8e90612ff1565b601255565b6118eb6118e5611dff565b83611e71565b6119075760405162461bcd60e51b8152600401610a8e90613181565b61191384848484612154565b50505050565b611921611dff565b6001600160a01b03166119326114c7565b6001600160a01b0316146119585760405162461bcd60e51b8152600401610a8e90612ff1565b8051610fff906019906020840190612672565b606061197682611de2565b6119925760405162461bcd60e51b8152600401610a8e90613302565b601a54610100900460ff16611a3357601980546119ae906133f7565b80601f01602080910402602001604051908101604052809291908181526020018280546119da906133f7565b8015611a275780601f106119fc57610100808354040283529160200191611a27565b820191906000526020600020905b815481529060010190602001808311611a0a57829003601f168201915b505050505090506109d0565b6000611a3d612187565b90506000815111611a6b5760405180604001604052806005815260200164173539b7b760d91b815250611a96565b80611a7584612196565b604051602001611a86929190612ac2565b6040516020818303038152906040525b9392505050565b600b5490565b60135490565b6000600f54600e54611abb9190613369565b905090565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b611af6611dff565b6001600160a01b0316611b076114c7565b6001600160a01b031614611b2d5760405162461bcd60e51b8152600401610a8e90612ff1565b6001600160a01b038116611b535760405162461bcd60e51b8152600401610a8e90612c9e565b611b5c81612102565b50565b611b67611dff565b6001600160a01b0316611b786114c7565b6001600160a01b031614611b9e5760405162461bcd60e51b8152600401610a8e90612ff1565b828114611bbd5760405162461bcd60e51b8152600401610a8e90612de2565b60005b83811015611d34576040518060600160405280600115158152602001848484818110611bfc57634e487b7160e01b600052603260045260246000fd5b905060200201358152602001600081525060166000878785818110611c3157634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611c4691906127eb565b6001600160a01b0316815260208082019290925260409081016000208351815460ff19169015151781559183015160018301559190910151600290910155848482818110611ca457634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611cb991906127eb565b6001600160a01b03167f0f2ab3269df45d41960fdf14c84cd22dfb81c269985eecc7ee6b93764639ae456001858585818110611d0557634e487b7160e01b600052603260045260246000fd5b90506020020135604051611d1a929190612ba1565b60405180910390a280611d2c81613432565b915050611bc0565b5050505050565b611d43611dff565b6001600160a01b0316611d546114c7565b6001600160a01b031614611d7a5760405162461bcd60e51b8152600401610a8e90612ff1565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b60125490565b60006001600160e01b031982166380ac58cd60e01b1480611dd357506001600160e01b03198216635b5e139f60e01b145b806109cd57506109cd826122b1565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611e38826111f4565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611e7c82611de2565b611e985760405162461bcd60e51b8152600401610a8e90612d96565b6000611ea3836111f4565b9050806001600160a01b0316846001600160a01b03161480611ede5750836001600160a01b0316611ed384610a67565b6001600160a01b0316145b80611eee5750611eee8185611ac0565b949350505050565b826001600160a01b0316611f09826111f4565b6001600160a01b031614611f2f5760405162461bcd60e51b8152600401610a8e90613026565b6001600160a01b038216611f555760405162461bcd60e51b8152600401610a8e90612d1b565b611f608383836122ca565b611f6b600082611e03565b6001600160a01b0383166000908152600360205260408120805460019290611f949084906133b4565b90915550506001600160a01b0382166000908152600360205260408120805460019290611fc2908490613369565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b0382166120495760405162461bcd60e51b8152600401610a8e90612f02565b61205281611de2565b1561206f5760405162461bcd60e51b8152600401610a8e90612ce4565b61207b600083836122ca565b6001600160a01b03821660009081526003602052604081208054600192906120a4908490613369565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61215f848484611ef6565b61216b84848484612353565b6119135760405162461bcd60e51b8152600401610a8e90612c4c565b6060601880546109e4906133f7565b6060816121bb57506040805180820190915260018152600360fc1b60208201526109d0565b8160005b81156121e557806121cf81613432565b91506121de9050600a83613381565b91506121bf565b60008167ffffffffffffffff81111561220e57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612238576020820181803683370190505b5090505b8415611eee5761224d6001836133b4565b915061225a600a8661344d565b612265906030613369565b60f81b81838151811061228857634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506122aa600a86613381565b945061223c565b6001600160e01b031981166301ffc9a760e01b14919050565b6122d5838383610b46565b6001600160a01b0383166122f1576122ec8161246e565b612314565b816001600160a01b0316836001600160a01b0316146123145761231483826124b2565b6001600160a01b0382166123305761232b8161254f565b610b46565b826001600160a01b0316826001600160a01b031614610b4657610b468282612628565b6000612367846001600160a01b031661266c565b1561246357836001600160a01b031663150b7a02612383611dff565b8786866040518563ffffffff1660e01b81526004016123a59493929190612b15565b602060405180830381600087803b1580156123bf57600080fd5b505af19250505080156123ef575060408051601f3d908101601f191682019092526123ec91810190612a1c565b60015b612449573d80801561241d576040519150601f19603f3d011682016040523d82523d6000602084013e612422565b606091505b5080516124415760405162461bcd60e51b8152600401610a8e90612c4c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611eee565b506001949350505050565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b600060016124bf84611290565b6124c991906133b4565b60008381526007602052604090205490915080821461251c576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612561906001906133b4565b6000838152600960205260408120546008805493945090928490811061259757634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080600883815481106125c657634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061260c57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061263383611290565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b3b151590565b82805461267e906133f7565b90600052602060002090601f0160209004810192826126a057600085556126e6565b82601f106126b957805160ff19168380011785556126e6565b828001600101855582156126e6579182015b828111156126e65782518255916020019190600101906126cb565b506126f29291506126f6565b5090565b5b808211156126f257600081556001016126f7565b600067ffffffffffffffff808411156127265761272661348d565b604051601f8501601f19168101602001828111828210171561274a5761274a61348d565b60405284815291508183850186101561276257600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b03811681146109d057600080fd5b60008083601f8401126127a3578081fd5b50813567ffffffffffffffff8111156127ba578182fd5b60208301915083602080830285010111156127d457600080fd5b9250929050565b803580151581146109d057600080fd5b6000602082840312156127fc578081fd5b611a968261277b565b60008060408385031215612817578081fd5b6128208361277b565b915061282e6020840161277b565b90509250929050565b60008060006060848603121561284b578081fd5b6128548461277b565b92506128626020850161277b565b9150604084013590509250925092565b60008060008060808587031215612887578081fd5b6128908561277b565b935061289e6020860161277b565b925060408501359150606085013567ffffffffffffffff8111156128c0578182fd5b8501601f810187136128d0578182fd5b6128df8782356020840161270b565b91505092959194509250565b600080604083850312156128fd578182fd5b6129068361277b565b915061282e602084016127db565b60008060408385031215612926578182fd5b61292f8361277b565b946020939093013593505050565b6000806020838503121561294f578182fd5b823567ffffffffffffffff811115612965578283fd5b61297185828601612792565b90969095509350505050565b60008060008060408587031215612992578384fd5b843567ffffffffffffffff808211156129a9578586fd5b6129b588838901612792565b909650945060208701359150808211156129cd578384fd5b506129da87828801612792565b95989497509550505050565b6000602082840312156129f7578081fd5b611a96826127db565b600060208284031215612a11578081fd5b8135611a96816134a3565b600060208284031215612a2d578081fd5b8151611a96816134a3565b600060208284031215612a49578081fd5b813567ffffffffffffffff811115612a5f578182fd5b8201601f81018413612a6f578182fd5b611eee8482356020840161270b565b600060208284031215612a8f578081fd5b5035919050565b60008151808452612aae8160208601602086016133cb565b601f01601f19169290920160200192915050565b60008351612ad48184602088016133cb565b835190830190612ae88183602088016133cb565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b4890830184612a96565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612b8a57835183529284019291840191600101612b6e565b50909695505050505050565b901515815260200190565b9115158252602082015260400190565b92151583526020830191909152604082015260600190565b600060208252611a966020830184612a96565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b6020808252600b908201526a139bdd081cdd185c9d195960aa1b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b602080825260169082015275082e4e4c2f2e640d8cadccee8d040dad2e6dac2e8c6d60531b604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526017908201527f596f7520617265206e6f742077686974656c6973746564000000000000000000604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252601d908201527f4d757374206d696e7420666577657220696e2065616368206261746368000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b60208082526033908201527f596f752068617665206d696e746564207468652077686974656c697374206d616040820152721e08185b1b1bd8d85d1a5bdb88185b5bdd5b9d606a1b606082015260800190565b60208082526029908201527f43757272656e746c7920696e2077686974656c6973742073746167652e20506c60408201526819585cd9481dd85a5d60ba1b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b6020808252818101527f76616c7565206572726f722c20706c6561736520636865636b2070726963652e604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601390820152724d617820737570706c7920726561636865642160681b604082015260600190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b60208082526029908201527f6f6e6c79206f776e6572206f7220746865206d696e74416464726573732061726040820152681948185b1b1bddd95960ba1b606082015260800190565b6020808252601c908201527f6d617820737570706c79207265616368656420666f72206f776e657200000000604082015260600190565b60208082526019908201527f4d617820737461676520737570706c7920726561636865642100000000000000604082015260600190565b60208082526030908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526f3732bc34b9ba32b73a103a37b5b2b71760811b606082015260800190565b90815260200190565b918252602082015260400190565b6000821982111561337c5761337c613461565b500190565b60008261339057613390613477565b500490565b60008160001904831182151516156133af576133af613461565b500290565b6000828210156133c6576133c6613461565b500390565b60005b838110156133e65781810151838201526020016133ce565b838111156119135750506000910152565b60028104600182168061340b57607f821691505b6020821081141561342c57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561344657613446613461565b5060010190565b60008261345c5761345c613477565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611b5c57600080fdfea26469706673582212201fd20017e1ab9313ce916eb7766eefa3f749a8c586806f60b339ba8490c3a64b64736f6c63430008000033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000741694d6167657300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000641694d61676500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5567763754584777646d504c334e45694a5165774b5a446e7462457a72764a636578716d5a36364d435a56762f00000000000000000000
-----Decoded View---------------
Arg [0] : name_ (string): AiMages
Arg [1] : symbol_ (string): AiMage
Arg [2] : baseURI_ (string): ipfs://QmUgv7TXGwdmPL3NEiJQewKZDntbEzrvJcexqmZ66MCZVv/
Arg [3] : started_ (bool): False
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [5] : 41694d6167657300000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [7] : 41694d6167650000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [9] : 697066733a2f2f516d5567763754584777646d504c334e45694a5165774b5a44
Arg [10] : 6e7462457a72764a636578716d5a36364d435a56762f00000000000000000000
Deployed Bytecode Sourcemap
42137:7369:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35989:224;;;;;;;;;;-1:-1:-1;35989:224:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23117:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24676:221::-;;;;;;;;;;-1:-1:-1;24676:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;24199:411::-;;;;;;;;;;-1:-1:-1;24199:411:0;;;;;:::i;:::-;;:::i;:::-;;42414:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;47045:108::-;;;;;;;;;;;;;:::i;36629:113::-;;;;;;;;;;;;;:::i;42649:29::-;;;;;;;;;;;;;:::i;25566:339::-;;;;;;;;;;-1:-1:-1;25566:339:0;;;;;:::i;:::-;;:::i;43822:103::-;;;;;;;;;;;;;:::i;36297:256::-;;;;;;;;;;-1:-1:-1;36297:256:0;;;;;:::i;:::-;;:::i;47283:488::-;;;;;;;;;;-1:-1:-1;47283:488:0;;;;;:::i;:::-;;:::i;46606:185::-;;;;;;;;;;-1:-1:-1;46606:185:0;;;;;:::i;:::-;;:::i;42852:26::-;;;;;;;;;;;;;:::i;25976:185::-;;;;;;;;;;-1:-1:-1;25976:185:0;;;;;:::i;:::-;;:::i;47779:896::-;;;;;;:::i;:::-;;:::i;36819:233::-;;;;;;;;;;-1:-1:-1;36819:233:0;;;;;:::i;:::-;;:::i;46929:108::-;;;;;;;;;;;;;:::i;44858:263::-;;;;;;;;;;-1:-1:-1;44858:263:0;;;;;:::i;:::-;;:::i;43496:96::-;;;;;;;;;;-1:-1:-1;43496:96:0;;;;;:::i;:::-;;:::i;22811:239::-;;;;;;;;;;-1:-1:-1;22811:239:0;;;;;:::i;:::-;;:::i;43091:33::-;;;;;;;;;;;;;:::i;42725:27::-;;;;;;;;;;;;;:::i;44253:83::-;;;;;;;;;;-1:-1:-1;44253:83:0;;;;;:::i;:::-;;:::i;42482:31::-;;;;;;;;;;;;;:::i;22541:208::-;;;;;;;;;;-1:-1:-1;22541:208:0;;;;;:::i;:::-;;:::i;2502:94::-;;;;;;;;;;;;;:::i;42557:29::-;;;;;;;;;;;;;:::i;46799:122::-;;;;;;;;;;;;;:::i;42520:30::-;;;;;;;;;;;;;:::i;44044:87::-;;;;;;;;;;-1:-1:-1;44044:87:0;;;;;:::i;:::-;;:::i;45732:341::-;;;;;;;;;;-1:-1:-1;45732:341:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;42445:30::-;;;;;;;;;;;;;:::i;43179:23::-;;;;;;;;;;;;;:::i;1851:87::-;;;;;;;;;;;;;:::i;42610:32::-;;;;;;;;;;;;;:::i;43933:103::-;;;;;;;;;;-1:-1:-1;43933:103:0;;;;;:::i;:::-;;:::i;23286:104::-;;;;;;;;;;;;;:::i;43034:50::-;;;;;;;;;;-1:-1:-1;43034:50:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;42685:33::-;;;;;;;;;;;;;:::i;42775:38::-;;;;;;;;;;;;;:::i;48684:818::-;;;;;;:::i;:::-;;:::i;24969:295::-;;;;;;;;;;-1:-1:-1;24969:295:0;;;;;:::i;:::-;;:::i;44344:69::-;;;;;;;;;;;;;:::i;46081:119::-;;;;;;;;;;;;;:::i;44139:106::-;;;;;;;;;;-1:-1:-1;44139:106:0;;;;;:::i;:::-;;:::i;26232:328::-;;;;;;;;;;-1:-1:-1;26232:328:0;;;;;:::i;:::-;;:::i;43600:112::-;;;;;;;;;;-1:-1:-1;43600:112:0;;;;;:::i;:::-;;:::i;45144:442::-;;;;;;;;;;-1:-1:-1;45144:442:0;;;;;:::i;:::-;;:::i;46486:112::-;;;;;;;;;;;;;:::i;47161:114::-;;;;;;;;;;;;;:::i;46208:131::-;;;;;;;;;;;;;:::i;25335:164::-;;;;;;;;;;-1:-1:-1;25335:164:0;;;;;:::i;:::-;;:::i;2751:192::-;;;;;;;;;;-1:-1:-1;2751:192:0;;;;;:::i;:::-;;:::i;44421:429::-;;;;;;;;;;-1:-1:-1;44421:429:0;;;;;:::i;:::-;;:::i;43720:94::-;;;;;;;;;;-1:-1:-1;43720:94:0;;;;;:::i;:::-;;:::i;46347:127::-;;;;;;;;;;;;;:::i;35989:224::-;36091:4;-1:-1:-1;;;;;;36115:50:0;;-1:-1:-1;;;36115:50:0;;:90;;;36169:36;36193:11;36169:23;:36::i;:::-;36108:97;;35989:224;;;;:::o;23117:100::-;23171:13;23204:5;23197:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23117:100;:::o;24676:221::-;24752:7;24780:16;24788:7;24780;:16::i;:::-;24772:73;;;;-1:-1:-1;;;24772:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;24865:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24865:24:0;;24676:221::o;24199:411::-;24280:13;24296:23;24311:7;24296:14;:23::i;:::-;24280:39;;24344:5;-1:-1:-1;;;;;24338:11:0;:2;-1:-1:-1;;;;;24338:11:0;;;24330:57;;;;-1:-1:-1;;;24330:57:0;;;;;;;:::i;:::-;24438:5;-1:-1:-1;;;;;24422:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;24422:21:0;;:62;;;;24447:37;24464:5;24471:12;:10;:12::i;24447:37::-;24400:168;;;;-1:-1:-1;;;24400:168:0;;;;;;;:::i;:::-;24581:21;24590:2;24594:7;24581:8;:21::i;:::-;24199:411;;;:::o;42414:24::-;;;;:::o;47045:108::-;47140:5;;47045:108;:::o;36629:113::-;36717:10;:17;36629:113;:::o;42649:29::-;;;;:::o;25566:339::-;25761:41;25780:12;:10;:12::i;:::-;25794:7;25761:18;:41::i;:::-;25753:103;;;;-1:-1:-1;;;25753:103:0;;;;;;;:::i;:::-;25869:28;25879:4;25885:2;25889:7;25869:9;:28::i;43822:103::-;2082:12;:10;:12::i;:::-;-1:-1:-1;;;;;2071:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2071:23:0;;2063:68;;;;-1:-1:-1;;;2063:68:0;;;;;;;:::i;:::-;43873:13:::1;:15:::0;;;:13:::1;:15;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;43916:1:0::1;43899:14;:18:::0;43822:103::o;36297:256::-;36394:7;36430:23;36447:5;36430:16;:23::i;:::-;36422:5;:31;36414:87;;;;-1:-1:-1;;;36414:87:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;36519:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;36297:256::o;47283:488::-;47372:7;:5;:7::i;:::-;-1:-1:-1;;;;;47356:23:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;47356:23:0;;:54;;;-1:-1:-1;47399:11:0;;-1:-1:-1;;;;;47399:11:0;47383:12;:10;:12::i;:::-;-1:-1:-1;;;;;47383:27:0;;47356:54;47348:108;;;;-1:-1:-1;;;47348:108:0;;;;;;;:::i;:::-;47504:10;;47494:6;47475:16;;:25;;;;:::i;:::-;:39;;47467:80;;;;-1:-1:-1;;;47467:80:0;;;;;;;:::i;:::-;47574:12;:10;:12::i;:::-;-1:-1:-1;;;;;47563:47:0;;47588:9;;47600:1;47588:13;;;;:::i;:::-;47603:6;47563:47;;;;;;;:::i;:::-;;;;;;;;47627:9;47623:141;47646:6;47642:1;:10;47623:141;;;47673:16;:18;;;:16;:18;;;:::i;:::-;;;;-1:-1:-1;;47706:9:0;:11;;;:9;:11;;;:::i;:::-;;;;;;47732:20;47738:2;47742:9;;47732:5;:20::i;:::-;47654:3;;;;:::i;:::-;;;;47623:141;;46606:185;-1:-1:-1;;;;;46688:15:0;;46664:4;46688:15;;;:9;:15;;;;;:29;;;:95;;;;-1:-1:-1;;;;;;;46754:15:0;;;;;:9;:15;;;;;:28;;;;46722;;;;;:60;;;46606:185::o;42852:26::-;;;-1:-1:-1;;;;;42852:26:0;;:::o;25976:185::-;26114:39;26131:4;26137:2;26141:7;26114:39;;;;;;;;;;;;:16;:39::i;47779:896::-;47852:7;;;;47844:31;;;;-1:-1:-1;;;47844:31:0;;;;;;;:::i;:::-;47903:1;47894:6;:10;:32;;;;;47918:8;;47908:6;:18;;47894:32;47886:74;;;;-1:-1:-1;;;47886:74:0;;;;;;;:::i;:::-;48007:9;;47997:6;47979:15;;:24;;;;:::i;:::-;:37;;47971:69;;;;-1:-1:-1;;;47971:69:0;;;;;;;:::i;:::-;48086:13;;48076:6;48059:14;;:23;;;;:::i;:::-;:40;;48051:78;;;;-1:-1:-1;;;48051:78:0;;;;;;;:::i;:::-;48158:10;48148:21;;;;:9;:21;;;;;:35;;;48140:71;;;;-1:-1:-1;;;48140:71:0;;;;;;;:::i;:::-;48287:10;48277:21;;;;:9;:21;;;;;:34;;;;48230;;;;;:43;;48267:6;;48230:43;:::i;:::-;:81;;48222:145;;;;-1:-1:-1;;;48222:145:0;;;;;;;:::i;:::-;48396:12;:10;:12::i;:::-;-1:-1:-1;;;;;48385:45:0;;48410:9;;48420:1;48410:11;;;;:::i;:::-;48423:6;48385:45;;;;;;;:::i;:::-;;;;;;;;48445:9;48441:227;48461:6;48458:1;:9;48441:227;;;48488:15;:17;;;:15;:17;;;:::i;:::-;;;;-1:-1:-1;;48520:14:0;:16;;;:14;:16;;;:::i;:::-;;;;-1:-1:-1;;48551:9:0;:11;;;:9;:11;;;:::i;:::-;;;;;;48577:28;48583:10;48595:9;;48577:5;:28::i;:::-;48630:10;48620:21;;;;:9;:21;;;;;:34;;:36;;;;;;:::i;:::-;;;;;;48469:3;;;;;:::i;:::-;;;;48441:227;;;;47779:896;:::o;36819:233::-;36894:7;36930:30;:28;:30::i;:::-;36922:5;:38;36914:95;;;;-1:-1:-1;;;36914:95:0;;;;;;;:::i;:::-;37027:10;37038:5;37027:17;;;;;;-1:-1:-1;;;37027:17:0;;;;;;;;;;;;;;;;;37020:24;;36819:233;;;:::o;46929:108::-;47022:7;;;;46929:108;:::o;44858:263::-;2082:12;:10;:12::i;:::-;-1:-1:-1;;;;;2071:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2071:23:0;;2063:68;;;;-1:-1:-1;;;2063:68:0;;;;;;;:::i;:::-;44952:9:::1;44948:166;44967:21:::0;;::::1;44948:166;;;45017:9;:24;45027:10;;45038:1;45027:13;;;;;-1:-1:-1::0;;;45027:13:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;45017:24:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;45017:24:0;;;45010:31;;-1:-1:-1;;45010:31:0::1;::::0;;;;::::1;::::0;;;::::1;;::::0;45078:10;;45089:1;45078:13;;::::1;;;-1:-1:-1::0;;;45078:13:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;45061:41:0::1;;45093:5;45100:1:::0;45061:41:::1;;;;;;;:::i;:::-;;;;;;;;44990:3:::0;::::1;::::0;::::1;:::i;:::-;;;;44948:166;;43496:96:::0;2082:12;:10;:12::i;:::-;-1:-1:-1;;;;;2071:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2071:23:0;;2063:68;;;;-1:-1:-1;;;2063:68:0;;;;;;;:::i;:::-;43567:17;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;22811:239::-:0;22883:7;22919:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22919:16:0;22954:19;22946:73;;;;-1:-1:-1;;;22946:73:0;;;;;;;:::i;43091:33::-;;;;;;:::o;42725:27::-;;;;:::o;44253:83::-;2082:12;:10;:12::i;:::-;-1:-1:-1;;;;;2071:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2071:23:0;;2063:68;;;;-1:-1:-1;;;2063:68:0;;;;;;;:::i;:::-;44312:7:::1;:16:::0;;-1:-1:-1;;44312:16:0::1;::::0;::::1;;::::0;;;::::1;::::0;;44253:83::o;42482:31::-;;;;:::o;22541:208::-;22613:7;-1:-1:-1;;;;;22641:19:0;;22633:74;;;;-1:-1:-1;;;22633:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;22725:16:0;;;;;:9;:16;;;;;;;22541:208::o;2502:94::-;2082:12;:10;:12::i;:::-;-1:-1:-1;;;;;2071:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2071:23:0;;2063:68;;;;-1:-1:-1;;;2063:68:0;;;;;;;:::i;:::-;2567:21:::1;2585:1;2567:9;:21::i;:::-;2502:94::o:0;42557:29::-;;;;:::o;46799:122::-;46899:14;;46799:122;:::o;42520:30::-;;;;:::o;44044:87::-;2082:12;:10;:12::i;:::-;-1:-1:-1;;;;;2071:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2071:23:0;;2063:68;;;;-1:-1:-1;;;2063:68:0;;;;;;;:::i;:::-;44109:5:::1;:14:::0;44044:87::o;45732:341::-;45818:16;45847:13;45863:16;45873:5;45863:9;:16::i;:::-;45847:32;;45890:20;45927:5;45913:20;;;;;;-1:-1:-1;;;45913:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45913:20:0;;45890:43;;45949:9;45944:101;45968:5;45964:1;:9;45944:101;;;46004:29;46024:5;46031:1;46004:19;:29::i;:::-;45995:3;45999:1;45995:6;;;;;;-1:-1:-1;;;45995:6:0;;;;;;;;;;;;;;;;;;:38;45975:3;;;;:::i;:::-;;;;45944:101;;;-1:-1:-1;46062:3:0;45732:341;-1:-1:-1;;;45732:341:0:o;42445:30::-;;;;:::o;43179:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1851:87::-;1924:6;;-1:-1:-1;;;;;1924:6:0;1851:87;:::o;42610:32::-;;;;:::o;43933:103::-;2082:12;:10;:12::i;:::-;-1:-1:-1;;;;;2071:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2071:23:0;;2063:68;;;;-1:-1:-1;;;2063:68:0;;;;;;;:::i;:::-;44003:14:::1;:25:::0;;-1:-1:-1;;44003:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;43933:103::o;23286:104::-;23342:13;23375:7;23368:14;;;;;:::i;43034:50::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42685:33::-;;;;:::o;42775:38::-;;;;:::o;48684:818::-;48748:7;;;;48740:31;;;;-1:-1:-1;;;48740:31:0;;;;;;;:::i;:::-;48799:1;48790:6;:10;:32;;;;;48814:8;;48804:6;:18;;48790:32;48782:74;;;;-1:-1:-1;;;48782:74:0;;;;;;;:::i;:::-;48903:9;;48893:6;48875:15;;:24;;;;:::i;:::-;:37;;48867:69;;;;-1:-1:-1;;;48867:69:0;;;;;;;:::i;:::-;48982:13;;48972:6;48955:14;;:23;;;;:::i;:::-;:40;;48947:78;;;;-1:-1:-1;;;48947:78:0;;;;;;;:::i;:::-;49066:5;;49057:14;;:6;:14;:::i;:::-;49044:9;:27;49036:72;;;;-1:-1:-1;;;49036:72:0;;;;;;;:::i;:::-;49127:14;;;;:23;49119:77;;;;-1:-1:-1;;;49119:77:0;;;;;;;:::i;:::-;49215:7;:5;:7::i;:::-;-1:-1:-1;;;;;49207:25:0;:36;49233:9;49207:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49272:12;:10;:12::i;:::-;-1:-1:-1;;;;;49261:45:0;;49286:9;;49296:1;49286:11;;;;:::i;:::-;49299:6;49261:45;;;;;;;:::i;:::-;;;;;;;;49321:9;49317:178;49337:6;49334:1;:9;49317:178;;;49364:15;:17;;;:15;:17;;;:::i;:::-;;;;-1:-1:-1;;49396:14:0;:16;;;:14;:16;;;:::i;:::-;;;;-1:-1:-1;;49427:9:0;:11;;;:9;:11;;;:::i;:::-;;;;;;49453:30;49459:12;:10;:12::i;:::-;49473:9;;49453:5;:30::i;:::-;49345:3;;;;:::i;:::-;;;;49317:178;;24969:295;25084:12;:10;:12::i;:::-;-1:-1:-1;;;;;25072:24:0;:8;-1:-1:-1;;;;;25072:24:0;;;25064:62;;;;-1:-1:-1;;;25064:62:0;;;;;;;:::i;:::-;25184:8;25139:18;:32;25158:12;:10;:12::i;:::-;-1:-1:-1;;;;;25139:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;25139:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;25139:53:0;;;;;;;;;;;25223:12;:10;:12::i;:::-;-1:-1:-1;;;;;25208:48:0;;25247:8;25208:48;;;;;;:::i;:::-;;;;;;;;24969:295;;:::o;44344:69::-;2082:12;:10;:12::i;:::-;-1:-1:-1;;;;;2071:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2071:23:0;;2063:68;;;;-1:-1:-1;;;2063:68:0;;;;;;;:::i;:::-;44390:8:::1;:15:::0;;-1:-1:-1;;44390:15:0::1;;;::::0;;44344:69::o;46081:119::-;46179:13;;46081:119;:::o;44139:106::-;2082:12;:10;:12::i;:::-;-1:-1:-1;;;;;2071:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2071:23:0;;2063:68;;;;-1:-1:-1;;;2063:68:0;;;;;;;:::i;:::-;44212:13:::1;:25:::0;44139:106::o;26232:328::-;26407:41;26426:12;:10;:12::i;:::-;26440:7;26407:18;:41::i;:::-;26399:103;;;;-1:-1:-1;;;26399:103:0;;;;;;;:::i;:::-;26513:39;26527:4;26533:2;26537:7;26546:5;26513:13;:39::i;:::-;26232:328;;;;:::o;43600:112::-;2082:12;:10;:12::i;:::-;-1:-1:-1;;;;;2071:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2071:23:0;;2063:68;;;;-1:-1:-1;;;2063:68:0;;;;;;;:::i;:::-;43679:25;;::::1;::::0;:9:::1;::::0;:25:::1;::::0;::::1;::::0;::::1;:::i;45144:442::-:0;45217:13;45251:16;45259:7;45251;:16::i;:::-;45243:77;;;;-1:-1:-1;;;45243:77:0;;;;;;;:::i;:::-;45336:8;;;;;;;45333:65;;45377:9;45370:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45333:65;45410:22;45435:10;:8;:10::i;:::-;45410:35;;45488:1;45469:8;45463:22;:26;:115;;;;;;;;;;;;;;;-1:-1:-1;;;45463:115:0;;;;;;45529:8;45539:18;:7;:16;:18::i;:::-;45512:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45463:115;45456:122;45144:442;-1:-1:-1;;;45144:442:0:o;46486:112::-;46581:9;;46486:112;:::o;47161:114::-;47259:8;;47161:114;:::o;46208:131::-;46282:7;46321:10;;46309:9;;:22;;;;:::i;:::-;46302:29;;46208:131;:::o;25335:164::-;-1:-1:-1;;;;;25456:25:0;;;25432:4;25456:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25335:164::o;2751:192::-;2082:12;:10;:12::i;:::-;-1:-1:-1;;;;;2071:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2071:23:0;;2063:68;;;;-1:-1:-1;;;2063:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2840:22:0;::::1;2832:73;;;;-1:-1:-1::0;;;2832:73:0::1;;;;;;;:::i;:::-;2916:19;2926:8;2916:9;:19::i;:::-;2751:192:::0;:::o;44421:429::-;2082:12;:10;:12::i;:::-;-1:-1:-1;;;;;2071:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2071:23:0;;2063:68;;;;-1:-1:-1;;;2063:68:0;;;;;;;:::i;:::-;44548:41;;::::1;44540:76;;;;-1:-1:-1::0;;;44540:76:0::1;;;;;;;:::i;:::-;44631:9;44627:216;44646:21:::0;;::::1;44627:216;;;44716:40;;;;;;;;44730:4;44716:40;;;;;;44736:13;;44750:1;44736:16;;;;;-1:-1:-1::0;;;44736:16:0::1;;;;;;;;;;;;;;;44716:40;;;;44754:1;44716:40;;::::0;44689:9:::1;:24;44699:10;;44710:1;44699:13;;;;;-1:-1:-1::0;;;44699:13:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;44689:24:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;44689:24:0;:67;;;;-1:-1:-1;;44689:67:0::1;::::0;::::1;;;::::0;;;;::::1;::::0;-1:-1:-1;44689:67:0;::::1;::::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;44793:10;;44804:1;44793:13;;::::1;;;-1:-1:-1::0;;;44793:13:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;44776:55:0::1;;44808:4;44814:13;;44828:1;44814:16;;;;;-1:-1:-1::0;;;44814:16:0::1;;;;;;;;;;;;;;;44776:55;;;;;;;:::i;:::-;;;;;;;;44669:3:::0;::::1;::::0;::::1;:::i;:::-;;;;44627:216;;;;44421:429:::0;;;;:::o;43720:94::-;2082:12;:10;:12::i;:::-;-1:-1:-1;;;;;2071:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2071:23:0;;2063:68;;;;-1:-1:-1;;;2063:68:0;;;;;;;:::i;:::-;43787:11:::1;:19:::0;;-1:-1:-1;;;;;;43787:19:0::1;-1:-1:-1::0;;;;;43787:19:0;;;::::1;::::0;;;::::1;::::0;;43720:94::o;46347:127::-;46453:13;;46347:127;:::o;22172:305::-;22274:4;-1:-1:-1;;;;;;22311:40:0;;-1:-1:-1;;;22311:40:0;;:105;;-1:-1:-1;;;;;;;22368:48:0;;-1:-1:-1;;;22368:48:0;22311:105;:158;;;;22433:36;22457:11;22433:23;:36::i;28070:127::-;28135:4;28159:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28159:16:0;:30;;;28070:127::o;725:98::-;805:10;725:98;:::o;32052:174::-;32127:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32127:29:0;-1:-1:-1;;;;;32127:29:0;;;;;;;;:24;;32181:23;32127:24;32181:14;:23::i;:::-;-1:-1:-1;;;;;32172:46:0;;;;;;;;;;;32052:174;;:::o;28364:348::-;28457:4;28482:16;28490:7;28482;:16::i;:::-;28474:73;;;;-1:-1:-1;;;28474:73:0;;;;;;;:::i;:::-;28558:13;28574:23;28589:7;28574:14;:23::i;:::-;28558:39;;28627:5;-1:-1:-1;;;;;28616:16:0;:7;-1:-1:-1;;;;;28616:16:0;;:51;;;;28660:7;-1:-1:-1;;;;;28636:31:0;:20;28648:7;28636:11;:20::i;:::-;-1:-1:-1;;;;;28636:31:0;;28616:51;:87;;;;28671:32;28688:5;28695:7;28671:16;:32::i;:::-;28608:96;28364:348;-1:-1:-1;;;;28364:348:0:o;31356:578::-;31515:4;-1:-1:-1;;;;;31488:31:0;:23;31503:7;31488:14;:23::i;:::-;-1:-1:-1;;;;;31488:31:0;;31480:85;;;;-1:-1:-1;;;31480:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31584:16:0;;31576:65;;;;-1:-1:-1;;;31576:65:0;;;;;;;:::i;:::-;31654:39;31675:4;31681:2;31685:7;31654:20;:39::i;:::-;31758:29;31775:1;31779:7;31758:8;:29::i;:::-;-1:-1:-1;;;;;31800:15:0;;;;;;:9;:15;;;;;:20;;31819:1;;31800:15;:20;;31819:1;;31800:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31831:13:0;;;;;;:9;:13;;;;;:18;;31848:1;;31831:13;:18;;31848:1;;31831:18;:::i;:::-;;;;-1:-1:-1;;31860:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31860:21:0;-1:-1:-1;;;;;31860:21:0;;;;;;;;;31899:27;;31860:16;;31899:27;;;;;;;31356:578;;;:::o;30048:382::-;-1:-1:-1;;;;;30128:16:0;;30120:61;;;;-1:-1:-1;;;30120:61:0;;;;;;;:::i;:::-;30201:16;30209:7;30201;:16::i;:::-;30200:17;30192:58;;;;-1:-1:-1;;;30192:58:0;;;;;;;:::i;:::-;30263:45;30292:1;30296:2;30300:7;30263:20;:45::i;:::-;-1:-1:-1;;;;;30321:13:0;;;;;;:9;:13;;;;;:18;;30338:1;;30321:13;:18;;30338:1;;30321:18;:::i;:::-;;;;-1:-1:-1;;30350:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30350:21:0;-1:-1:-1;;;;;30350:21:0;;;;;;;;30389:33;;30350:16;;;30389:33;;30350:16;;30389:33;30048:382;;:::o;2951:173::-;3026:6;;;-1:-1:-1;;;;;3043:17:0;;;-1:-1:-1;;;;;;3043:17:0;;;;;;;3076:40;;3026:6;;;3043:17;3026:6;;3076:40;;3007:16;;3076:40;2951:173;;:::o;27442:315::-;27599:28;27609:4;27615:2;27619:7;27599:9;:28::i;:::-;27646:48;27669:4;27675:2;27679:7;27688:5;27646:22;:48::i;:::-;27638:111;;;;-1:-1:-1;;;27638:111:0;;;;;;;:::i;45617:107::-;45677:13;45709:7;45702:14;;;;;:::i;18320:723::-;18376:13;18597:10;18593:53;;-1:-1:-1;18624:10:0;;;;;;;;;;;;-1:-1:-1;;;18624:10:0;;;;;;18593:53;18671:5;18656:12;18712:78;18719:9;;18712:78;;18745:8;;;;:::i;:::-;;-1:-1:-1;18768:10:0;;-1:-1:-1;18776:2:0;18768:10;;:::i;:::-;;;18712:78;;;18800:19;18832:6;18822:17;;;;;;-1:-1:-1;;;18822:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18822:17:0;;18800:39;;18850:154;18857:10;;18850:154;;18884:11;18894:1;18884:11;;:::i;:::-;;-1:-1:-1;18953:10:0;18961:2;18953:5;:10;:::i;:::-;18940:24;;:2;:24;:::i;:::-;18927:39;;18910:6;18917;18910:14;;;;;;-1:-1:-1;;;18910:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;18910:56:0;;;;;;;;-1:-1:-1;18981:11:0;18990:2;18981:11;;:::i;:::-;;;18850:154;;20779:157;-1:-1:-1;;;;;;20888:40:0;;-1:-1:-1;;;20888:40:0;20779:157;;;:::o;37665:589::-;37809:45;37836:4;37842:2;37846:7;37809:26;:45::i;:::-;-1:-1:-1;;;;;37871:18:0;;37867:187;;37906:40;37938:7;37906:31;:40::i;:::-;37867:187;;;37976:2;-1:-1:-1;;;;;37968:10:0;:4;-1:-1:-1;;;;;37968:10:0;;37964:90;;37995:47;38028:4;38034:7;37995:32;:47::i;:::-;-1:-1:-1;;;;;38068:16:0;;38064:183;;38101:45;38138:7;38101:36;:45::i;:::-;38064:183;;;38174:4;-1:-1:-1;;;;;38168:10:0;:2;-1:-1:-1;;;;;38168:10:0;;38164:83;;38195:40;38223:2;38227:7;38195:27;:40::i;32791:799::-;32946:4;32967:15;:2;-1:-1:-1;;;;;32967:13:0;;:15::i;:::-;32963:620;;;33019:2;-1:-1:-1;;;;;33003:36:0;;33040:12;:10;:12::i;:::-;33054:4;33060:7;33069:5;33003:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33003:72:0;;;;;;;;-1:-1:-1;;33003:72:0;;;;;;;;;;;;:::i;:::-;;;32999:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33245:13:0;;33241:272;;33288:60;;-1:-1:-1;;;33288:60:0;;;;;;;:::i;33241:272::-;33463:6;33457:13;33448:6;33444:2;33440:15;33433:38;32999:529;-1:-1:-1;;;;;;33126:51:0;-1:-1:-1;;;33126:51:0;;-1:-1:-1;33119:58:0;;32963:620;-1:-1:-1;33567:4:0;32791:799;;;;;;:::o;38977:164::-;39081:10;:17;;39054:24;;;;:15;:24;;;;;:44;;;39109:24;;;;;;;;;;;;38977:164::o;39768:988::-;40034:22;40084:1;40059:22;40076:4;40059:16;:22::i;:::-;:26;;;;:::i;:::-;40096:18;40117:26;;;:17;:26;;;;;;40034:51;;-1:-1:-1;40250:28:0;;;40246:328;;-1:-1:-1;;;;;40317:18:0;;40295:19;40317:18;;;:12;:18;;;;;;;;:34;;;;;;;;;40368:30;;;;;;:44;;;40485:30;;:17;:30;;;;;:43;;;40246:328;-1:-1:-1;40670:26:0;;;;:17;:26;;;;;;;;40663:33;;;-1:-1:-1;;;;;40714:18:0;;;;;:12;:18;;;;;:34;;;;;;;40707:41;39768:988::o;41051:1079::-;41329:10;:17;41304:22;;41329:21;;41349:1;;41329:21;:::i;:::-;41361:18;41382:24;;;:15;:24;;;;;;41755:10;:26;;41304:46;;-1:-1:-1;41382:24:0;;41304:46;;41755:26;;;;-1:-1:-1;;;41755:26:0;;;;;;;;;;;;;;;;;41733:48;;41819:11;41794:10;41805;41794:22;;;;;;-1:-1:-1;;;41794:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;41899:28;;;:15;:28;;;;;;;:41;;;42071:24;;;;;42064:31;42106:10;:16;;;;;-1:-1:-1;;;42106:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;41051:1079;;;;:::o;38555:221::-;38640:14;38657:20;38674:2;38657:16;:20::i;:::-;-1:-1:-1;;;;;38688:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;38733:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;38555:221:0:o;10761:387::-;11084:20;11132:8;;;10761:387::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:607:1;;110:18;151:2;143:6;140:14;137:2;;;157:18;;:::i;:::-;206:2;200:9;279:2;256:17;;-1:-1:-1;;252:31:1;240:44;;286:4;236:55;306:18;;;326:22;;;303:46;300:2;;;352:18;;:::i;:::-;388:2;381:22;436;;;421:6;-1:-1:-1;421:6:1;473:16;;;470:25;-1:-1:-1;467:2:1;;;508:1;505;498:12;467:2;558:6;553:3;546:4;538:6;534:17;521:44;613:1;606:4;597:6;589;585:19;581:30;574:41;;;90:531;;;;;:::o;626:175::-;696:20;;-1:-1:-1;;;;;745:31:1;;735:42;;725:2;;791:1;788;781:12;806:400;;;939:3;932:4;924:6;920:17;916:27;906:2;;962:6;954;947:22;906:2;-1:-1:-1;990:20:1;;1033:18;1022:30;;1019:2;;;1072:8;1062;1055:26;1019:2;1116:4;1108:6;1104:17;1092:29;;1179:3;1172:4;1164;1156:6;1152:17;1144:6;1140:30;1136:41;1133:50;1130:2;;;1196:1;1193;1186:12;1130:2;896:310;;;;;:::o;1211:162::-;1278:20;;1334:13;;1327:21;1317:32;;1307:2;;1363:1;1360;1353:12;1378:198;;1490:2;1478:9;1469:7;1465:23;1461:32;1458:2;;;1511:6;1503;1496:22;1458:2;1539:31;1560:9;1539:31;:::i;1581:274::-;;;1710:2;1698:9;1689:7;1685:23;1681:32;1678:2;;;1731:6;1723;1716:22;1678:2;1759:31;1780:9;1759:31;:::i;:::-;1749:41;;1809:40;1845:2;1834:9;1830:18;1809:40;:::i;:::-;1799:50;;1668:187;;;;;:::o;1860:342::-;;;;2006:2;1994:9;1985:7;1981:23;1977:32;1974:2;;;2027:6;2019;2012:22;1974:2;2055:31;2076:9;2055:31;:::i;:::-;2045:41;;2105:40;2141:2;2130:9;2126:18;2105:40;:::i;:::-;2095:50;;2192:2;2181:9;2177:18;2164:32;2154:42;;1964:238;;;;;:::o;2207:702::-;;;;;2379:3;2367:9;2358:7;2354:23;2350:33;2347:2;;;2401:6;2393;2386:22;2347:2;2429:31;2450:9;2429:31;:::i;:::-;2419:41;;2479:40;2515:2;2504:9;2500:18;2479:40;:::i;:::-;2469:50;;2566:2;2555:9;2551:18;2538:32;2528:42;;2621:2;2610:9;2606:18;2593:32;2648:18;2640:6;2637:30;2634:2;;;2685:6;2677;2670:22;2634:2;2713:22;;2766:4;2758:13;;2754:27;-1:-1:-1;2744:2:1;;2800:6;2792;2785:22;2744:2;2828:75;2895:7;2890:2;2877:16;2872:2;2868;2864:11;2828:75;:::i;:::-;2818:85;;;2337:572;;;;;;;:::o;2914:268::-;;;3040:2;3028:9;3019:7;3015:23;3011:32;3008:2;;;3061:6;3053;3046:22;3008:2;3089:31;3110:9;3089:31;:::i;:::-;3079:41;;3139:37;3172:2;3161:9;3157:18;3139:37;:::i;3187:266::-;;;3316:2;3304:9;3295:7;3291:23;3287:32;3284:2;;;3337:6;3329;3322:22;3284:2;3365:31;3386:9;3365:31;:::i;:::-;3355:41;3443:2;3428:18;;;;3415:32;;-1:-1:-1;;;3274:179:1:o;3458:463::-;;;3605:2;3593:9;3584:7;3580:23;3576:32;3573:2;;;3626:6;3618;3611:22;3573:2;3671:9;3658:23;3704:18;3696:6;3693:30;3690:2;;;3741:6;3733;3726:22;3690:2;3785:76;3853:7;3844:6;3833:9;3829:22;3785:76;:::i;:::-;3880:8;;3759:102;;-1:-1:-1;3563:358:1;-1:-1:-1;;;;3563:358:1:o;3926:815::-;;;;;4125:2;4113:9;4104:7;4100:23;4096:32;4093:2;;;4146:6;4138;4131:22;4093:2;4191:9;4178:23;4220:18;4261:2;4253:6;4250:14;4247:2;;;4282:6;4274;4267:22;4247:2;4326:76;4394:7;4385:6;4374:9;4370:22;4326:76;:::i;:::-;4421:8;;-1:-1:-1;4300:102:1;-1:-1:-1;4509:2:1;4494:18;;4481:32;;-1:-1:-1;4525:16:1;;;4522:2;;;4559:6;4551;4544:22;4522:2;;4603:78;4673:7;4662:8;4651:9;4647:24;4603:78;:::i;:::-;4083:658;;;;-1:-1:-1;4700:8:1;-1:-1:-1;;;;4083:658:1:o;4746:192::-;;4855:2;4843:9;4834:7;4830:23;4826:32;4823:2;;;4876:6;4868;4861:22;4823:2;4904:28;4922:9;4904:28;:::i;4943:257::-;;5054:2;5042:9;5033:7;5029:23;5025:32;5022:2;;;5075:6;5067;5060:22;5022:2;5119:9;5106:23;5138:32;5164:5;5138:32;:::i;5205:261::-;;5327:2;5315:9;5306:7;5302:23;5298:32;5295:2;;;5348:6;5340;5333:22;5295:2;5385:9;5379:16;5404:32;5430:5;5404:32;:::i;5471:482::-;;5593:2;5581:9;5572:7;5568:23;5564:32;5561:2;;;5614:6;5606;5599:22;5561:2;5659:9;5646:23;5692:18;5684:6;5681:30;5678:2;;;5729:6;5721;5714:22;5678:2;5757:22;;5810:4;5802:13;;5798:27;-1:-1:-1;5788:2:1;;5844:6;5836;5829:22;5788:2;5872:75;5939:7;5934:2;5921:16;5916:2;5912;5908:11;5872:75;:::i;5958:190::-;;6070:2;6058:9;6049:7;6045:23;6041:32;6038:2;;;6091:6;6083;6076:22;6038:2;-1:-1:-1;6119:23:1;;6028:120;-1:-1:-1;6028:120:1:o;6153:259::-;;6234:5;6228:12;6261:6;6256:3;6249:19;6277:63;6333:6;6326:4;6321:3;6317:14;6310:4;6303:5;6299:16;6277:63;:::i;:::-;6394:2;6373:15;-1:-1:-1;;6369:29:1;6360:39;;;;6401:4;6356:50;;6204:208;-1:-1:-1;;6204:208:1:o;6417:637::-;;6735:6;6729:13;6751:53;6797:6;6792:3;6785:4;6777:6;6773:17;6751:53;:::i;:::-;6867:13;;6826:16;;;;6889:57;6867:13;6826:16;6923:4;6911:17;;6889:57;:::i;:::-;-1:-1:-1;;;6968:20:1;;6997:22;;;7046:1;7035:13;;6705:349;-1:-1:-1;;;;6705:349:1:o;7059:203::-;-1:-1:-1;;;;;7223:32:1;;;;7205:51;;7193:2;7178:18;;7160:102::o;7267:490::-;-1:-1:-1;;;;;7536:15:1;;;7518:34;;7588:15;;7583:2;7568:18;;7561:43;7635:2;7620:18;;7613:34;;;7683:3;7678:2;7663:18;;7656:31;;;7267:490;;7704:47;;7731:19;;7723:6;7704:47;:::i;:::-;7696:55;7470:287;-1:-1:-1;;;;;;7470:287:1:o;7762:635::-;7933:2;7985:21;;;8055:13;;7958:18;;;8077:22;;;7762:635;;7933:2;8156:15;;;;8130:2;8115:18;;;7762:635;8202:169;8216:6;8213:1;8210:13;8202:169;;;8277:13;;8265:26;;8346:15;;;;8311:12;;;;8238:1;8231:9;8202:169;;;-1:-1:-1;8388:3:1;;7913:484;-1:-1:-1;;;;;;7913:484:1:o;8402:187::-;8567:14;;8560:22;8542:41;;8530:2;8515:18;;8497:92::o;8594:266::-;8795:14;;8788:22;8770:41;;8842:2;8827:18;;8820:34;8758:2;8743:18;;8725:135::o;9128:329::-;9349:14;;9342:22;9324:41;;9396:2;9381:18;;9374:34;;;;9439:2;9424:18;;9417:34;9312:2;9297:18;;9279:178::o;9462:221::-;;9611:2;9600:9;9593:21;9631:46;9673:2;9662:9;9658:18;9650:6;9631:46;:::i;9688:407::-;9890:2;9872:21;;;9929:2;9909:18;;;9902:30;9968:34;9963:2;9948:18;;9941:62;-1:-1:-1;;;10034:2:1;10019:18;;10012:41;10085:3;10070:19;;9862:233::o;10100:335::-;10302:2;10284:21;;;10341:2;10321:18;;;10314:30;-1:-1:-1;;;10375:2:1;10360:18;;10353:41;10426:2;10411:18;;10274:161::o;10440:414::-;10642:2;10624:21;;;10681:2;10661:18;;;10654:30;10720:34;10715:2;10700:18;;10693:62;-1:-1:-1;;;10786:2:1;10771:18;;10764:48;10844:3;10829:19;;10614:240::o;10859:402::-;11061:2;11043:21;;;11100:2;11080:18;;;11073:30;11139:34;11134:2;11119:18;;11112:62;-1:-1:-1;;;11205:2:1;11190:18;;11183:36;11251:3;11236:19;;11033:228::o;11266:352::-;11468:2;11450:21;;;11507:2;11487:18;;;11480:30;11546;11541:2;11526:18;;11519:58;11609:2;11594:18;;11440:178::o;11623:400::-;11825:2;11807:21;;;11864:2;11844:18;;;11837:30;11903:34;11898:2;11883:18;;11876:62;-1:-1:-1;;;11969:2:1;11954:18;;11947:34;12013:3;11998:19;;11797:226::o;12028:349::-;12230:2;12212:21;;;12269:2;12249:18;;;12242:30;12308:27;12303:2;12288:18;;12281:55;12368:2;12353:18;;12202:175::o;12382:408::-;12584:2;12566:21;;;12623:2;12603:18;;;12596:30;12662:34;12657:2;12642:18;;12635:62;-1:-1:-1;;;12728:2:1;12713:18;;12706:42;12780:3;12765:19;;12556:234::o;12795:346::-;12997:2;12979:21;;;13036:2;13016:18;;;13009:30;-1:-1:-1;;;13070:2:1;13055:18;;13048:52;13132:2;13117:18;;12969:172::o;13146:420::-;13348:2;13330:21;;;13387:2;13367:18;;;13360:30;13426:34;13421:2;13406:18;;13399:62;13497:26;13492:2;13477:18;;13470:54;13556:3;13541:19;;13320:246::o;13571:406::-;13773:2;13755:21;;;13812:2;13792:18;;;13785:30;13851:34;13846:2;13831:18;;13824:62;-1:-1:-1;;;13917:2:1;13902:18;;13895:40;13967:3;13952:19;;13745:232::o;13982:405::-;14184:2;14166:21;;;14223:2;14203:18;;;14196:30;14262:34;14257:2;14242:18;;14235:62;-1:-1:-1;;;14328:2:1;14313:18;;14306:39;14377:3;14362:19;;14156:231::o;14392:356::-;14594:2;14576:21;;;14613:18;;;14606:30;14672:34;14667:2;14652:18;;14645:62;14739:2;14724:18;;14566:182::o;14753:347::-;14955:2;14937:21;;;14994:2;14974:18;;;14967:30;15033:25;15028:2;15013:18;;15006:53;15091:2;15076:18;;14927:173::o;15105:408::-;15307:2;15289:21;;;15346:2;15326:18;;;15319:30;15385:34;15380:2;15365:18;;15358:62;-1:-1:-1;;;15451:2:1;15436:18;;15429:42;15503:3;15488:19;;15279:234::o;15518:353::-;15720:2;15702:21;;;15759:2;15739:18;;;15732:30;15798:31;15793:2;15778:18;;15771:59;15862:2;15847:18;;15692:179::o;15876:356::-;16078:2;16060:21;;;16097:18;;;16090:30;16156:34;16151:2;16136:18;;16129:62;16223:2;16208:18;;16050:182::o;16237:405::-;16439:2;16421:21;;;16478:2;16458:18;;;16451:30;16517:34;16512:2;16497:18;;16490:62;-1:-1:-1;;;16583:2:1;16568:18;;16561:39;16632:3;16617:19;;16411:231::o;16647:415::-;16849:2;16831:21;;;16888:2;16868:18;;;16861:30;16927:34;16922:2;16907:18;;16900:62;-1:-1:-1;;;16993:2:1;16978:18;;16971:49;17052:3;17037:19;;16821:241::o;17067:405::-;17269:2;17251:21;;;17308:2;17288:18;;;17281:30;17347:34;17342:2;17327:18;;17320:62;-1:-1:-1;;;17413:2:1;17398:18;;17391:39;17462:3;17447:19;;17241:231::o;17477:397::-;17679:2;17661:21;;;17718:2;17698:18;;;17691:30;17757:34;17752:2;17737:18;;17730:62;-1:-1:-1;;;17823:2:1;17808:18;;17801:31;17864:3;17849:19;;17651:223::o;17879:356::-;18081:2;18063:21;;;18100:18;;;18093:30;18159:34;18154:2;18139:18;;18132:62;18226:2;18211:18;;18053:182::o;18240:413::-;18442:2;18424:21;;;18481:2;18461:18;;;18454:30;18520:34;18515:2;18500:18;;18493:62;-1:-1:-1;;;18586:2:1;18571:18;;18564:47;18643:3;18628:19;;18414:239::o;18658:343::-;18860:2;18842:21;;;18899:2;18879:18;;;18872:30;-1:-1:-1;;;18933:2:1;18918:18;;18911:49;18992:2;18977:18;;18832:169::o;19006:408::-;19208:2;19190:21;;;19247:2;19227:18;;;19220:30;19286:34;19281:2;19266:18;;19259:62;-1:-1:-1;;;19352:2:1;19337:18;;19330:42;19404:3;19389:19;;19180:234::o;19419:405::-;19621:2;19603:21;;;19660:2;19640:18;;;19633:30;19699:34;19694:2;19679:18;;19672:62;-1:-1:-1;;;19765:2:1;19750:18;;19743:39;19814:3;19799:19;;19593:231::o;19829:352::-;20031:2;20013:21;;;20070:2;20050:18;;;20043:30;20109;20104:2;20089:18;;20082:58;20172:2;20157:18;;20003:178::o;20186:349::-;20388:2;20370:21;;;20427:2;20407:18;;;20400:30;20466:27;20461:2;20446:18;;20439:55;20526:2;20511:18;;20360:175::o;20540:412::-;20742:2;20724:21;;;20781:2;20761:18;;;20754:30;20820:34;20815:2;20800:18;;20793:62;-1:-1:-1;;;20886:2:1;20871:18;;20864:46;20942:3;20927:19;;20714:238::o;20957:177::-;21103:25;;;21091:2;21076:18;;21058:76::o;21139:248::-;21313:25;;;21369:2;21354:18;;21347:34;21301:2;21286:18;;21268:119::o;21392:128::-;;21463:1;21459:6;21456:1;21453:13;21450:2;;;21469:18;;:::i;:::-;-1:-1:-1;21505:9:1;;21440:80::o;21525:120::-;;21591:1;21581:2;;21596:18;;:::i;:::-;-1:-1:-1;21630:9:1;;21571:74::o;21650:168::-;;21756:1;21752;21748:6;21744:14;21741:1;21738:21;21733:1;21726:9;21719:17;21715:45;21712:2;;;21763:18;;:::i;:::-;-1:-1:-1;21803:9:1;;21702:116::o;21823:125::-;;21891:1;21888;21885:8;21882:2;;;21896:18;;:::i;:::-;-1:-1:-1;21933:9:1;;21872:76::o;21953:258::-;22025:1;22035:113;22049:6;22046:1;22043:13;22035:113;;;22125:11;;;22119:18;22106:11;;;22099:39;22071:2;22064:10;22035:113;;;22166:6;22163:1;22160:13;22157:2;;;-1:-1:-1;;22201:1:1;22183:16;;22176:27;22006:205::o;22216:380::-;22301:1;22291:12;;22348:1;22338:12;;;22359:2;;22413:4;22405:6;22401:17;22391:27;;22359:2;22466;22458:6;22455:14;22435:18;22432:38;22429:2;;;22512:10;22507:3;22503:20;22500:1;22493:31;22547:4;22544:1;22537:15;22575:4;22572:1;22565:15;22429:2;;22271:325;;;:::o;22601:135::-;;-1:-1:-1;;22661:17:1;;22658:2;;;22681:18;;:::i;:::-;-1:-1:-1;22728:1:1;22717:13;;22648:88::o;22741:112::-;;22799:1;22789:2;;22804:18;;:::i;:::-;-1:-1:-1;22838:9:1;;22779:74::o;22858:127::-;22919:10;22914:3;22910:20;22907:1;22900:31;22950:4;22947:1;22940:15;22974:4;22971:1;22964:15;22990:127;23051:10;23046:3;23042:20;23039:1;23032:31;23082:4;23079:1;23072:15;23106:4;23103:1;23096:15;23122:127;23183:10;23178:3;23174:20;23171:1;23164:31;23214:4;23211:1;23204:15;23238:4;23235:1;23228:15;23254:133;-1:-1:-1;;;;;;23330:32:1;;23320:43;;23310:2;;23377:1;23374;23367:12
Swarm Source
ipfs://1fd20017e1ab9313ce916eb7766eefa3f749a8c586806f60b339ba8490c3a64b
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.