ETH Price: $2,706.95 (+8.89%)
 

Overview

Max Total Supply

0 4EVRRUGS

Holders

763

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
4 4EVRRUGS
0x604b93b2C16554a39F1b136638E8B1a728e78Dfe
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ForeverRugs

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-03
*/

// File: node_modules/@openzeppelin/contracts/utils/Strings.sol



pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: node_modules/@openzeppelin/contracts/utils/Context.sol



pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: node_modules/@openzeppelin/contracts/utils/Address.sol



pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: node_modules/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol



pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol



pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol



pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol



pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

// File: node_modules/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: node_modules/@openzeppelin/contracts/token/ERC721/ERC721.sol



pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: node_modules/@openzeppelin/contracts/utils/math/SafeMath.sol



pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: contracts/TokenContract.sol

pragma solidity ^0.8.0;



contract ForeverRugs is ERC721 {
    using SafeMath for uint256;

    event Mint(
        address indexed _to,
        uint256 _tokenId,
        uint256 indexed _projectId,
        string params
    );

    struct Project {
        string name;
        string artist;
        string description;
        string website;
        string projectBaseURI;
        string projectBaseIpfsURI;
        uint256 invocations;
        uint256 maxInvocations;
        bool useIpfs;
        bool active;
        bool locked;
        mapping(string => bool) seenNonces;
    }

    mapping(uint256 => Project) projects;
    mapping(uint256 => uint256) public projectIdToPricePerTokenInWei;
    mapping(uint256 => uint256) public tokenIdToProjectId;
    mapping(uint256 => uint256[]) internal projectIdToTokenIds;
    mapping(address => bool) public isAdmin;

    uint256 constant ONE_MILLION = 1_000_000;
    uint256 public nextProjectId = 0;
    address public owner;
    address public verifier;

    modifier onlyValidTokenId(uint256 _tokenId) {
        require(_exists(_tokenId), "Token ID does not exist");
        _;
    }

    modifier onlyUnlocked(uint256 _projectId) {
        require(!projects[_projectId].locked, "Only if unlocked");
        _;
    }

    modifier onlyAdmin() {
        require(isAdmin[msg.sender], "Only admin");
        _;
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "Only owner");
        _;
    }

    constructor(string memory _tokenName, string memory _tokenSymbol, address _verifier) ERC721(_tokenName, _tokenSymbol) payable {
        owner = msg.sender;
        isAdmin[msg.sender] = true;
        verifier = _verifier;
    }

    function contractURI() public view returns (string memory) {
        return "https://d3q9esgymjsewz.cloudfront.net/foreverrugs.json";
    }

    function mint(address _to, uint256 _projectId, bytes memory signedParams, string memory params, string memory nonce) external payable returns (uint256 _tokenId) {
        require(projects[_projectId].active || isAdmin[msg.sender], "Project not enabled.");

        require(projects[_projectId].invocations.add(1) <= projects[_projectId].maxInvocations, "Must not exceed max invocations");
        require(msg.value >= projectIdToPricePerTokenInWei[_projectId], "Not enough ether.");

        require(!projects[_projectId].seenNonces[nonce]);
        require(isSignedMint(signedParams, params, nonce), "Invalid signature.");

        projects[_projectId].seenNonces[nonce] = true;

        uint256 tokenId = _mintToken(_to, _projectId, params);
        return tokenId;
    }

    function _mintToken(address _to, uint256 _projectId, string memory params) internal returns (uint256 _tokenId) {
        uint256 tokenIdToBe;
        if (_projectId == 0) {
            tokenIdToBe = _projectId + projects[_projectId].invocations;
        } 
        else {
            tokenIdToBe = (_projectId * ONE_MILLION) + projects[_projectId].invocations;
        }
        
        projects[_projectId].invocations = projects[_projectId].invocations.add(1);

        _mint(_to, tokenIdToBe);

        tokenIdToProjectId[tokenIdToBe] = _projectId;
        projectIdToTokenIds[_projectId].push(tokenIdToBe);
    
        emit Mint(_to, tokenIdToBe, _projectId, params);

        return tokenIdToBe;
    }

    function isSignedMint(bytes memory signedParams, string memory params, string memory nonce) internal view returns (bool) {
        // recreate the message hash that was signed on the client
        bytes32 hash = keccak256(abi.encodePacked(params, nonce));
        bytes32 messageHash = toEthSignedMessageHash(hash);

        address signer = verify(messageHash, signedParams);
        return signer == verifier;
    }

    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    function setVerifier(address _verifier) external onlyOwner {
        verifier = _verifier;
    }

    function addAdmin(address _address) public onlyOwner {
        isAdmin[_address] = true;
    }

    function toggleProjectIsLocked(uint256 _projectId) public onlyAdmin onlyUnlocked(_projectId) {
        projects[_projectId].locked = true;
    }

    function toggleProjectIsActive(uint256 _projectId) public onlyAdmin {
        projects[_projectId].active = !projects[_projectId].active;
    }

    function toggleProjectUseIpfs(uint256 _projectId) public onlyAdmin onlyUnlocked(_projectId) {
        projects[_projectId].useIpfs = !projects[_projectId].useIpfs;
    }

    function addProject(string memory _projectName, uint256 _pricePerTokenInWei, uint256 maxInvocations) public onlyAdmin {
        uint256 projectId = nextProjectId;
        projects[projectId].name = _projectName;
        projectIdToPricePerTokenInWei[projectId] = _pricePerTokenInWei;
        projects[projectId].maxInvocations = maxInvocations;
        projects[projectId].active = false;
        projects[projectId].useIpfs = false;
        nextProjectId = nextProjectId.add(1);
    }

    function updateProjectPricePerTokenInWei(uint256 _projectId, uint256 _pricePerTokenInWei) onlyAdmin public {
        projectIdToPricePerTokenInWei[_projectId] = _pricePerTokenInWei;
    }

    function updateProjectName(uint256 _projectId, string memory _projectName) onlyUnlocked(_projectId) onlyAdmin public {
        projects[_projectId].name = _projectName;
    }

    function updateProjectArtistName(uint256 _projectId, string memory _projectArtistName) onlyUnlocked(_projectId) onlyAdmin public {
        projects[_projectId].artist = _projectArtistName;
    }

    function updateProjectDescription(uint256 _projectId, string memory _projectDescription) onlyAdmin public {
        projects[_projectId].description = _projectDescription;
    }

    function updateProjectWebsite(uint256 _projectId, string memory _projectWebsite) onlyAdmin public {
        projects[_projectId].website = _projectWebsite;
    }

    function updateProjectMaxInvocations(uint256 _projectId, uint256 _maxInvocations) onlyUnlocked(_projectId) onlyAdmin public {
        require(_maxInvocations < projects[_projectId].maxInvocations, "Max invocations can not be increased, only decreased.");
        require(_maxInvocations > projects[_projectId].invocations, "You must set max invocations greater than current invocations");
        require(_maxInvocations <= ONE_MILLION, "Cannot exceed 1,000,000");
        projects[_projectId].maxInvocations = _maxInvocations;
    }

    function updateProjectBaseURI(uint256 _projectId, string memory _newBaseURI) onlyUnlocked(_projectId) onlyAdmin public {
        projects[_projectId].projectBaseURI = _newBaseURI;
    }

    function updateProjectBaseIpfsURI(uint256 _projectId, string memory _projectBaseIpfsURI) onlyUnlocked(_projectId) onlyAdmin public {
        projects[_projectId].projectBaseIpfsURI = _projectBaseIpfsURI;
    }

    function projectDetails(uint256 _projectId) view public returns (string memory projectName, string memory artist, string memory description, string memory website) {
        projectName = projects[_projectId].name;
        artist = projects[_projectId].artist;
        description = projects[_projectId].description;
        website = projects[_projectId].website;
    }

    function projectTokenInfo(uint256 _projectId) view public returns (uint256 pricePerTokenInWei, uint256 invocations, uint256 maxInvocations, bool active) {
        pricePerTokenInWei = projectIdToPricePerTokenInWei[_projectId];
        invocations = projects[_projectId].invocations;
        maxInvocations = projects[_projectId].maxInvocations;
        active = projects[_projectId].active;
    }

    function projectURIInfo(uint256 _projectId) view public returns (string memory projectBaseURI, string memory projectBaseIpfsURI, bool useIpfs) {
        projectBaseURI = projects[_projectId].projectBaseURI;
        projectBaseIpfsURI = projects[_projectId].projectBaseIpfsURI;
        useIpfs = projects[_projectId].useIpfs;
    }

    function projectShowAllTokens(uint _projectId) public view returns (uint256[] memory){
        return projectIdToTokenIds[_projectId];
    }

    function append(string memory a, string memory b) internal pure returns (string memory) {
        return string(abi.encodePacked(a, b));
    }

    function uintToString(uint v) internal pure returns (string memory str) {
        uint maxlength = 100;
        bytes memory reversed = new bytes(maxlength);
        uint i = 0;

        if (v == 0) {
            return '0';
        }

        while (v != 0) {
            uint remainder = v % 10;
            v = v / 10;
            reversed[i++] = bytes1(uint8(48 + remainder));
        }
        bytes memory s = new bytes(i + 1);
        for (uint j = 0; j <= i; j++) {
            s[j] = reversed[i - j];
        }
        str = string(s);
    }

    function tokenURI(uint256 _tokenId) public view override(ERC721) onlyValidTokenId(_tokenId) returns (string memory) {
        if (projects[tokenIdToProjectId[_tokenId]].useIpfs)
        {
            string memory st = append(projects[tokenIdToProjectId[_tokenId]].projectBaseIpfsURI, uintToString(_tokenId));
            return append(st, ".json");
        }

        string memory s = append(projects[tokenIdToProjectId[_tokenId]].projectBaseURI, uintToString(_tokenId));

        return append(s, ".json");
    }

    function withdraw(uint256 amount) public onlyOwner {
        uint256 balance = address(this).balance;
        require(amount <= balance);
        payable(owner).transfer(amount);
    }

    function splitSignature(bytes memory sig)
        public
        pure
        returns (
            bytes32 r,
            bytes32 s,
            uint8 v
        )
    {
        require(sig.length == 65, "invalid signature length");

        assembly {
            /*
            First 32 bytes stores the length of the signature

            add(sig, 32) = pointer of sig + 32
            effectively, skips first 32 bytes of signature

            mload(p) loads next 32 bytes starting at the memory address p into memory
            */

            // first 32 bytes, after the length prefix
            r := mload(add(sig, 32))
            // second 32 bytes
            s := mload(add(sig, 64))
            // final byte (first byte of the next 32 bytes)
            v := byte(0, mload(add(sig, 96)))
        }

        // implicitly return (r, s, v)
    }

    // verifies that the verifier is the signer of the message
    function verify(bytes32 _ethSignedMessageHash, bytes memory _signature) public pure returns (address) {
        (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature);
        return ecrecover(_ethSignedMessageHash, v, r, s);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"},{"internalType":"address","name":"_verifier","type":"address"}],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_projectId","type":"uint256"},{"indexed":false,"internalType":"string","name":"params","type":"string"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_projectName","type":"string"},{"internalType":"uint256","name":"_pricePerTokenInWei","type":"uint256"},{"internalType":"uint256","name":"maxInvocations","type":"uint256"}],"name":"addProject","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":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"bytes","name":"signedParams","type":"bytes"},{"internalType":"string","name":"params","type":"string"},{"internalType":"string","name":"nonce","type":"string"}],"name":"mint","outputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextProjectId","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":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"projectDetails","outputs":[{"internalType":"string","name":"projectName","type":"string"},{"internalType":"string","name":"artist","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"website","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"projectIdToPricePerTokenInWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"projectShowAllTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"projectTokenInfo","outputs":[{"internalType":"uint256","name":"pricePerTokenInWei","type":"uint256"},{"internalType":"uint256","name":"invocations","type":"uint256"},{"internalType":"uint256","name":"maxInvocations","type":"uint256"},{"internalType":"bool","name":"active","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"projectURIInfo","outputs":[{"internalType":"string","name":"projectBaseURI","type":"string"},{"internalType":"string","name":"projectBaseIpfsURI","type":"string"},{"internalType":"bool","name":"useIpfs","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_verifier","type":"address"}],"name":"setVerifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"splitSignature","outputs":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"}],"stateMutability":"pure","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":"_projectId","type":"uint256"}],"name":"toggleProjectIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"toggleProjectIsLocked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"toggleProjectUseIpfs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdToProjectId","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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_projectArtistName","type":"string"}],"name":"updateProjectArtistName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_projectBaseIpfsURI","type":"string"}],"name":"updateProjectBaseIpfsURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"updateProjectBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_projectDescription","type":"string"}],"name":"updateProjectDescription","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"uint256","name":"_maxInvocations","type":"uint256"}],"name":"updateProjectMaxInvocations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_projectName","type":"string"}],"name":"updateProjectName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"uint256","name":"_pricePerTokenInWei","type":"uint256"}],"name":"updateProjectPricePerTokenInWei","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_projectWebsite","type":"string"}],"name":"updateProjectWebsite","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"verifier","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_ethSignedMessageHash","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"verify","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600b5560405162003401380380620034018339810160408190526200002b916200020d565b82518390839062000044906000906020850190620000b0565b5080516200005a906001906020840190620000b0565b5050600c8054336001600160a01b031991821681179092556000918252600a6020526040909120805460ff19166001179055600d80549091166001600160a01b03939093169290921790915550620002ed915050565b828054620000be906200029a565b90600052602060002090601f016020900481019282620000e257600085556200012d565b82601f10620000fd57805160ff19168380011785556200012d565b828001600101855582156200012d579182015b828111156200012d57825182559160200191906001019062000110565b506200013b9291506200013f565b5090565b5b808211156200013b576000815560010162000140565b600082601f8301126200016857600080fd5b81516001600160401b0380821115620001855762000185620002d7565b604051601f8301601f19908116603f01168101908282118183101715620001b057620001b0620002d7565b81604052838152602092508683858801011115620001cd57600080fd5b600091505b83821015620001f15785820183015181830184015290820190620001d2565b83821115620002035760008385830101525b9695505050505050565b6000806000606084860312156200022357600080fd5b83516001600160401b03808211156200023b57600080fd5b620002498783880162000156565b945060208601519150808211156200026057600080fd5b506200026f8682870162000156565b604086015190935090506001600160a01b03811681146200028f57600080fd5b809150509250925092565b600181811c90821680620002af57607f821691505b60208210811415620002d157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61310480620002fd6000396000f3fe6080604052600436106102515760003560e01c8063778bafe711610139578063a3b2cca6116100b6578063c87b56dd1161007a578063c87b56dd146107bb578063d03c390c146107db578063e8a3d485146107fb578063e935b7b114610810578063e985e9c514610826578063f70c0f041461086f57600080fd5b8063a3b2cca6146106f0578063a7bb580314610710578063b7b04fae1461074e578063b88d4fde1461076e578063bee04f9c1461078e57600080fd5b80638da5cb5b116100fd5780638da5cb5b1461064b5780638dd91a561461066b57806395d89b411461069b57806397dc86cf146106b0578063a22cb465146106d057600080fd5b8063778bafe714610561578063826fc3911461058157806384e7286c146105a15780638ba8f14d146105b45780638c2c3622146105d457600080fd5b80632d9c0205116101d257806342842e0e1161019657806342842e0e146104a15780635437988d146104c15780636352211e146104e15780636bd5d59114610501578063704802751461052157806370a082311461054157600080fd5b80632d9c0205146103f25780632e1a7d4d1461042157806337859963146104415780633ae10ec1146104615780633e48e8481461048157600080fd5b80631b689c0b116102195780631b689c0b1461032757806323b872dd1461036257806324d7806c14610382578063258ae582146103b25780632b7ac3f3146103d257600080fd5b806301ffc9a71461025657806306fdde031461028b578063081812fc146102ad578063095ea7b3146102e55780630d17067314610307575b600080fd5b34801561026257600080fd5b50610276610271366004612b7f565b61089c565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b506102a06108ee565b6040516102829190612d6f565b3480156102b957600080fd5b506102cd6102c8366004612c3c565b610980565b6040516001600160a01b039091168152602001610282565b3480156102f157600080fd5b50610305610300366004612a6b565b610a1a565b005b34801561031357600080fd5b50610305610322366004612b38565b610b30565b34801561033357600080fd5b50610354610342366004612c3c565b60086020526000908152604090205481565b604051908152602001610282565b34801561036e57600080fd5b5061030561037d36600461298b565b610bbe565b34801561038e57600080fd5b5061027661039d36600461293d565b600a6020526000908152604090205460ff1681565b3480156103be57600080fd5b506102cd6103cd366004612b38565b610bef565b3480156103de57600080fd5b50600d546102cd906001600160a01b031681565b3480156103fe57600080fd5b5061041261040d366004612c3c565b610c6e565b60405161028293929190612d82565b34801561042d57600080fd5b5061030561043c366004612c3c565b610dce565b34801561044d57600080fd5b5061030561045c366004612b38565b610e40565b34801561046d57600080fd5b5061030561047c366004612bee565b610e94565b34801561048d57600080fd5b5061030561049c366004612b38565b610f2b565b3480156104ad57600080fd5b506103056104bc36600461298b565b610fb9565b3480156104cd57600080fd5b506103056104dc36600461293d565b610fd4565b3480156104ed57600080fd5b506102cd6104fc366004612c3c565b611020565b34801561050d57600080fd5b5061030561051c366004612b38565b611097565b34801561052d57600080fd5b5061030561053c36600461293d565b611125565b34801561054d57600080fd5b5061035461055c36600461293d565b611173565b34801561056d57600080fd5b5061030561057c366004612c3c565b6111fa565b34801561058d57600080fd5b5061030561059c366004612c55565b611287565b6103546105af366004612a95565b61145e565b3480156105c057600080fd5b506103056105cf366004612c3c565b611684565b3480156105e057600080fd5b506106296105ef366004612c3c565b6000908152600760208181526040808420546006928390529320908101549181015460089091015492939192909161010090910460ff1690565b6040805194855260208501939093529183015215156060820152608001610282565b34801561065757600080fd5b50600c546102cd906001600160a01b031681565b34801561067757600080fd5b5061068b610686366004612c3c565b611710565b6040516102829493929190612dba565b3480156106a757600080fd5b506102a0611996565b3480156106bc57600080fd5b506103056106cb366004612c55565b6119a5565b3480156106dc57600080fd5b506103056106eb366004612a2f565b6119e6565b3480156106fc57600080fd5b5061030561070b366004612b38565b611aab565b34801561071c57600080fd5b5061073061072b366004612bb9565b611aff565b60408051938452602084019290925260ff1690820152606001610282565b34801561075a57600080fd5b50610305610769366004612b38565b611b73565b34801561077a57600080fd5b506103056107893660046129c7565b611c01565b34801561079a57600080fd5b506107ae6107a9366004612c3c565b611c33565b6040516102829190612d2b565b3480156107c757600080fd5b506102a06107d6366004612c3c565b611c95565b3480156107e757600080fd5b506103056107f6366004612c3c565b611e77565b34801561080757600080fd5b506102a0611ed2565b34801561081c57600080fd5b50610354600b5481565b34801561083257600080fd5b50610276610841366004612958565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561087b57600080fd5b5061035461088a366004612c3c565b60076020526000908152604090205481565b60006001600160e01b031982166380ac58cd60e01b14806108cd57506001600160e01b03198216635b5e139f60e01b145b806108e857506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546108fd90612fc3565b80601f016020809104026020016040519081016040528092919081815260200182805461092990612fc3565b80156109765780601f1061094b57610100808354040283529160200191610976565b820191906000526020600020905b81548152906001019060200180831161095957829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109fe5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a2582611020565b9050806001600160a01b0316836001600160a01b03161415610a935760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109f5565b336001600160a01b0382161480610aaf5750610aaf8133610841565b610b215760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109f5565b610b2b8383611ef2565b505050565b600082815260066020526040902060080154829062010000900460ff1615610b6a5760405162461bcd60e51b81526004016109f590612ea1565b336000908152600a602052604090205460ff16610b995760405162461bcd60e51b81526004016109f590612e7d565b60008381526006602090815260409091208351610bb8928501906127fb565b50505050565b610bc83382611f60565b610be45760405162461bcd60e51b81526004016109f590612ecb565b610b2b838383612057565b600080600080610bfe85611aff565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa158015610c59573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b6000818152600660205260408120600401805460609283929091610c9190612fc3565b80601f0160208091040260200160405190810160405280929190818152602001828054610cbd90612fc3565b8015610d0a5780601f10610cdf57610100808354040283529160200191610d0a565b820191906000526020600020905b815481529060010190602001808311610ced57829003601f168201915b5050506000878152600660205260409020600501805493965092610d3092509050612fc3565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5c90612fc3565b8015610da95780601f10610d7e57610100808354040283529160200191610da9565b820191906000526020600020905b815481529060010190602001808311610d8c57829003601f168201915b505050600096875250506006602052604090942060080154929460ff90931692915050565b600c546001600160a01b03163314610df85760405162461bcd60e51b81526004016109f590612e07565b4780821115610e0657600080fd5b600c546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015610b2b573d6000803e3d6000fd5b336000908152600a602052604090205460ff16610e6f5760405162461bcd60e51b81526004016109f590612e7d565b60008281526006602090815260409091208251610b2b926003909201918401906127fb565b336000908152600a602052604090205460ff16610ec35760405162461bcd60e51b81526004016109f590612e7d565b600b5460008181526006602090815260409091208551610ee5928701906127fb565b5060008181526007602081815260408084208790556006909152909120908101839055600801805461ffff19169055600b54610f229060016121f7565b600b5550505050565b600082815260066020526040902060080154829062010000900460ff1615610f655760405162461bcd60e51b81526004016109f590612ea1565b336000908152600a602052604090205460ff16610f945760405162461bcd60e51b81526004016109f590612e7d565b60008381526006602090815260409091208351610bb8926004909201918501906127fb565b610b2b83838360405180602001604052806000815250611c01565b600c546001600160a01b03163314610ffe5760405162461bcd60e51b81526004016109f590612e07565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600260205260408120546001600160a01b0316806108e85760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109f5565b600082815260066020526040902060080154829062010000900460ff16156110d15760405162461bcd60e51b81526004016109f590612ea1565b336000908152600a602052604090205460ff166111005760405162461bcd60e51b81526004016109f590612e7d565b60008381526006602090815260409091208351610bb8926005909201918501906127fb565b600c546001600160a01b0316331461114f5760405162461bcd60e51b81526004016109f590612e07565b6001600160a01b03166000908152600a60205260409020805460ff19166001179055565b60006001600160a01b0382166111de5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016109f5565b506001600160a01b031660009081526003602052604090205490565b336000908152600a602052604090205460ff166112295760405162461bcd60e51b81526004016109f590612e7d565b600081815260066020526040902060080154819062010000900460ff16156112635760405162461bcd60e51b81526004016109f590612ea1565b506000908152600660205260409020600801805460ff19811660ff90911615179055565b600082815260066020526040902060080154829062010000900460ff16156112c15760405162461bcd60e51b81526004016109f590612ea1565b336000908152600a602052604090205460ff166112f05760405162461bcd60e51b81526004016109f590612e7d565b600083815260066020526040902060070154821061136e5760405162461bcd60e51b815260206004820152603560248201527f4d617820696e766f636174696f6e732063616e206e6f7420626520696e63726560448201527430b9b2b2161037b7363c903232b1b932b0b9b2b21760591b60648201526084016109f5565b6000838152600660208190526040909120015482116113f55760405162461bcd60e51b815260206004820152603d60248201527f596f75206d75737420736574206d617820696e766f636174696f6e732067726560448201527f61746572207468616e2063757272656e7420696e766f636174696f6e7300000060648201526084016109f5565b620f42408211156114485760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f742065786365656420312c3030302c30303000000000000000000060448201526064016109f5565b5060009182526006602052604090912060070155565b600084815260066020526040812060080154610100900460ff16806114925750336000908152600a602052604090205460ff165b6114d55760405162461bcd60e51b8152602060048201526014602482015273283937b532b1ba103737ba1032b730b13632b21760611b60448201526064016109f5565b600085815260066020819052604090912060078101549101546114f99060016121f7565b11156115475760405162461bcd60e51b815260206004820152601f60248201527f4d757374206e6f7420657863656564206d617820696e766f636174696f6e730060448201526064016109f5565b6000858152600760205260409020543410156115995760405162461bcd60e51b81526020600482015260116024820152702737ba1032b737bab3b41032ba3432b91760791b60448201526064016109f5565b60066000868152602001908152602001600020600901826040516115bd9190612ca3565b9081526040519081900360200190205460ff16156115da57600080fd5b6115e584848461220a565b6116265760405162461bcd60e51b815260206004820152601260248201527124b73b30b634b21039b4b3b730ba3ab9329760711b60448201526064016109f5565b6001600660008781526020019081526020016000206009018360405161164c9190612ca3565b908152604051908190036020019020805491151560ff1990921691909117905560006116798787866122bb565b979650505050505050565b336000908152600a602052604090205460ff166116b35760405162461bcd60e51b81526004016109f590612e7d565b600081815260066020526040902060080154819062010000900460ff16156116ed5760405162461bcd60e51b81526004016109f590612ea1565b506000908152600660205260409020600801805462ff0000191662010000179055565b6000818152600660205260409020805460609182918291829161173290612fc3565b80601f016020809104026020016040519081016040528092919081815260200182805461175e90612fc3565b80156117ab5780601f10611780576101008083540402835291602001916117ab565b820191906000526020600020905b81548152906001019060200180831161178e57829003601f168201915b50505060008881526006602052604090206001018054939750926117d192509050612fc3565b80601f01602080910402602001604051908101604052809291908181526020018280546117fd90612fc3565b801561184a5780601f1061181f5761010080835404028352916020019161184a565b820191906000526020600020905b81548152906001019060200180831161182d57829003601f168201915b505050600088815260066020526040902060020180549396509261187092509050612fc3565b80601f016020809104026020016040519081016040528092919081815260200182805461189c90612fc3565b80156118e95780601f106118be576101008083540402835291602001916118e9565b820191906000526020600020905b8154815290600101906020018083116118cc57829003601f168201915b505050600088815260066020526040902060030180549395509261190f92509050612fc3565b80601f016020809104026020016040519081016040528092919081815260200182805461193b90612fc3565b80156119885780601f1061195d57610100808354040283529160200191611988565b820191906000526020600020905b81548152906001019060200180831161196b57829003601f168201915b505050505090509193509193565b6060600180546108fd90612fc3565b336000908152600a602052604090205460ff166119d45760405162461bcd60e51b81526004016109f590612e7d565b60009182526007602052604090912055565b6001600160a01b038216331415611a3f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109f5565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b336000908152600a602052604090205460ff16611ada5760405162461bcd60e51b81526004016109f590612e7d565b60008281526006602090815260409091208251610b2b926002909201918401906127fb565b60008060008351604114611b555760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e677468000000000000000060448201526064016109f5565b50505060208101516040820151606090920151909260009190911a90565b600082815260066020526040902060080154829062010000900460ff1615611bad5760405162461bcd60e51b81526004016109f590612ea1565b336000908152600a602052604090205460ff16611bdc5760405162461bcd60e51b81526004016109f590612e7d565b60008381526006602090815260409091208351610bb8926001909201918501906127fb565b611c0b3383611f60565b611c275760405162461bcd60e51b81526004016109f590612ecb565b610bb8848484846123cd565b600081815260096020908152604091829020805483518184028101840190945280845260609392830182828015611c8957602002820191906000526020600020905b815481526020019060010190808311611c75575b50505050509050919050565b606081611cb9816000908152600260205260409020546001600160a01b0316151590565b611d055760405162461bcd60e51b815260206004820152601760248201527f546f6b656e20494420646f6573206e6f7420657869737400000000000000000060448201526064016109f5565b60008381526008602081815260408084205484526006909152909120015460ff1615611e16576000838152600860209081526040808320548352600690915281206005018054611de59190611d5990612fc3565b80601f0160208091040260200160405190810160405280929190818152602001828054611d8590612fc3565b8015611dd25780601f10611da757610100808354040283529160200191611dd2565b820191906000526020600020905b815481529060010190602001808311611db557829003601f168201915b5050505050611de086612400565b612580565b9050611e0e8160405180604001604052806005815260200164173539b7b760d91b815250612580565b925050611e71565b6000838152600860209081526040808320548352600690915281206004018054611e449190611d5990612fc3565b9050611e6d8160405180604001604052806005815260200164173539b7b760d91b815250612580565b9250505b50919050565b336000908152600a602052604090205460ff16611ea65760405162461bcd60e51b81526004016109f590612e7d565b6000908152600660205260409020600801805461ff001981166101009182900460ff1615909102179055565b606060405180606001604052806036815260200161309960369139905090565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611f2782611020565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611fd95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109f5565b6000611fe483611020565b9050806001600160a01b0316846001600160a01b0316148061201f5750836001600160a01b031661201484610980565b6001600160a01b0316145b8061204f57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661206a82611020565b6001600160a01b0316146120d25760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016109f5565b6001600160a01b0382166121345760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109f5565b61213f600082611ef2565b6001600160a01b0383166000908152600360205260408120805460019290612168908490612f80565b90915550506001600160a01b0382166000908152600360205260408120805460019290612196908490612f35565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006122038284612f35565b9392505050565b6000808383604051602001612220929190612cbf565b6040516020818303038152906040528051906020012090506000612291826040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9050600061229f8288610bef565b600d546001600160a01b03908116911614979650505050505050565b600080836122e757600084815260066020819052604090912001546122e09085612f35565b9050612314565b60008481526006602081905260409091200154612307620f424086612f61565b6123119190612f35565b90505b600084815260066020819052604090912001546123329060016121f7565b6000858152600660208190526040909120015561234f85826125ac565b600081815260086020908152604080832087905586835260098252808320805460018101825590845291909220018290555184906001600160a01b038716907fcd0e00beb8e6d5ab96ee16e6a1a735ff07cae8702f2e48feb32fefe40f25692c906123bd9085908890612f1c565b60405180910390a3949350505050565b6123d8848484612057565b6123e4848484846126ee565b610bb85760405162461bcd60e51b81526004016109f590612e2b565b60408051606480825260a08201909252606091906000908260208201818036833701905050905060008461244f5750506040805180820190915260018152600360fc1b60208201529392505050565b84156124b9576000612462600a87613013565b905061246f600a87612f4d565b955061247c816030612f35565b60f81b838361248a81612ff8565b94508151811061249c5761249c613053565b60200101906001600160f81b031916908160001a9053505061244f565b60006124c6826001612f35565b67ffffffffffffffff8111156124de576124de613069565b6040519080825280601f01601f191660200182016040528015612508576020820181803683370190505b50905060005b82811161257657836125208285612f80565b8151811061253057612530613053565b602001015160f81c60f81b82828151811061254d5761254d613053565b60200101906001600160f81b031916908160001a9053508061256e81612ff8565b91505061250e565b5095945050505050565b60608282604051602001612595929190612cbf565b604051602081830303815290604052905092915050565b6001600160a01b0382166126025760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109f5565b6000818152600260205260409020546001600160a01b0316156126675760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109f5565b6001600160a01b0382166000908152600360205260408120805460019290612690908490612f35565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b156127f057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612732903390899088908890600401612cee565b602060405180830381600087803b15801561274c57600080fd5b505af192505050801561277c575060408051601f3d908101601f1916820190925261277991810190612b9c565b60015b6127d6573d8080156127aa576040519150601f19603f3d011682016040523d82523d6000602084013e6127af565b606091505b5080516127ce5760405162461bcd60e51b81526004016109f590612e2b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061204f565b506001949350505050565b82805461280790612fc3565b90600052602060002090601f016020900481019282612829576000855561286f565b82601f1061284257805160ff191683800117855561286f565b8280016001018555821561286f579182015b8281111561286f578251825591602001919060010190612854565b5061287b92915061287f565b5090565b5b8082111561287b5760008155600101612880565b80356001600160a01b03811681146128ab57600080fd5b919050565b600082601f8301126128c157600080fd5b813567ffffffffffffffff808211156128dc576128dc613069565b604051601f8301601f19908116603f0116810190828211818310171561290457612904613069565b8160405283815286602085880101111561291d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561294f57600080fd5b61220382612894565b6000806040838503121561296b57600080fd5b61297483612894565b915061298260208401612894565b90509250929050565b6000806000606084860312156129a057600080fd5b6129a984612894565b92506129b760208501612894565b9150604084013590509250925092565b600080600080608085870312156129dd57600080fd5b6129e685612894565b93506129f460208601612894565b925060408501359150606085013567ffffffffffffffff811115612a1757600080fd5b612a23878288016128b0565b91505092959194509250565b60008060408385031215612a4257600080fd5b612a4b83612894565b915060208301358015158114612a6057600080fd5b809150509250929050565b60008060408385031215612a7e57600080fd5b612a8783612894565b946020939093013593505050565b600080600080600060a08688031215612aad57600080fd5b612ab686612894565b945060208601359350604086013567ffffffffffffffff80821115612ada57600080fd5b612ae689838a016128b0565b94506060880135915080821115612afc57600080fd5b612b0889838a016128b0565b93506080880135915080821115612b1e57600080fd5b50612b2b888289016128b0565b9150509295509295909350565b60008060408385031215612b4b57600080fd5b82359150602083013567ffffffffffffffff811115612b6957600080fd5b612b75858286016128b0565b9150509250929050565b600060208284031215612b9157600080fd5b81356122038161307f565b600060208284031215612bae57600080fd5b81516122038161307f565b600060208284031215612bcb57600080fd5b813567ffffffffffffffff811115612be257600080fd5b61204f848285016128b0565b600080600060608486031215612c0357600080fd5b833567ffffffffffffffff811115612c1a57600080fd5b612c26868287016128b0565b9660208601359650604090950135949350505050565b600060208284031215612c4e57600080fd5b5035919050565b60008060408385031215612c6857600080fd5b50508035926020909101359150565b60008151808452612c8f816020860160208601612f97565b601f01601f19169290920160200192915050565b60008251612cb5818460208701612f97565b9190910192915050565b60008351612cd1818460208801612f97565b835190830190612ce5818360208801612f97565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d2190830184612c77565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612d6357835183529284019291840191600101612d47565b50909695505050505050565b6020815260006122036020830184612c77565b606081526000612d956060830186612c77565b8281036020840152612da78186612c77565b9150508215156040830152949350505050565b608081526000612dcd6080830187612c77565b8281036020840152612ddf8187612c77565b90508281036040840152612df38186612c77565b905082810360608401526116798185612c77565b6020808252600a908201526927b7363c9037bbb732b960b11b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252600a908201526927b7363c9030b236b4b760b11b604082015260600190565b60208082526010908201526f13db9b1e481a59881d5b9b1bd8dad95960821b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b82815260406020820152600061204f6040830184612c77565b60008219821115612f4857612f48613027565b500190565b600082612f5c57612f5c61303d565b500490565b6000816000190483118215151615612f7b57612f7b613027565b500290565b600082821015612f9257612f92613027565b500390565b60005b83811015612fb2578181015183820152602001612f9a565b83811115610bb85750506000910152565b600181811c90821680612fd757607f821691505b60208210811415611e7157634e487b7160e01b600052602260045260246000fd5b600060001982141561300c5761300c613027565b5060010190565b6000826130225761302261303d565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461309557600080fd5b5056fe68747470733a2f2f64337139657367796d6a7365777a2e636c6f756466726f6e742e6e65742f666f7265766572727567732e6a736f6ea2646970667358221220a037f9e160497ceeaf0c78386b53dbaeb5b1e8c3f152ccc47cc9020963ebdeb264736f6c63430008070033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000c3bdec2cecfdf7c34e155e37b62fbe750d9c5839000000000000000000000000000000000000000000000000000000000000000c466f72657665722052756773000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083445565252554753000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102515760003560e01c8063778bafe711610139578063a3b2cca6116100b6578063c87b56dd1161007a578063c87b56dd146107bb578063d03c390c146107db578063e8a3d485146107fb578063e935b7b114610810578063e985e9c514610826578063f70c0f041461086f57600080fd5b8063a3b2cca6146106f0578063a7bb580314610710578063b7b04fae1461074e578063b88d4fde1461076e578063bee04f9c1461078e57600080fd5b80638da5cb5b116100fd5780638da5cb5b1461064b5780638dd91a561461066b57806395d89b411461069b57806397dc86cf146106b0578063a22cb465146106d057600080fd5b8063778bafe714610561578063826fc3911461058157806384e7286c146105a15780638ba8f14d146105b45780638c2c3622146105d457600080fd5b80632d9c0205116101d257806342842e0e1161019657806342842e0e146104a15780635437988d146104c15780636352211e146104e15780636bd5d59114610501578063704802751461052157806370a082311461054157600080fd5b80632d9c0205146103f25780632e1a7d4d1461042157806337859963146104415780633ae10ec1146104615780633e48e8481461048157600080fd5b80631b689c0b116102195780631b689c0b1461032757806323b872dd1461036257806324d7806c14610382578063258ae582146103b25780632b7ac3f3146103d257600080fd5b806301ffc9a71461025657806306fdde031461028b578063081812fc146102ad578063095ea7b3146102e55780630d17067314610307575b600080fd5b34801561026257600080fd5b50610276610271366004612b7f565b61089c565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b506102a06108ee565b6040516102829190612d6f565b3480156102b957600080fd5b506102cd6102c8366004612c3c565b610980565b6040516001600160a01b039091168152602001610282565b3480156102f157600080fd5b50610305610300366004612a6b565b610a1a565b005b34801561031357600080fd5b50610305610322366004612b38565b610b30565b34801561033357600080fd5b50610354610342366004612c3c565b60086020526000908152604090205481565b604051908152602001610282565b34801561036e57600080fd5b5061030561037d36600461298b565b610bbe565b34801561038e57600080fd5b5061027661039d36600461293d565b600a6020526000908152604090205460ff1681565b3480156103be57600080fd5b506102cd6103cd366004612b38565b610bef565b3480156103de57600080fd5b50600d546102cd906001600160a01b031681565b3480156103fe57600080fd5b5061041261040d366004612c3c565b610c6e565b60405161028293929190612d82565b34801561042d57600080fd5b5061030561043c366004612c3c565b610dce565b34801561044d57600080fd5b5061030561045c366004612b38565b610e40565b34801561046d57600080fd5b5061030561047c366004612bee565b610e94565b34801561048d57600080fd5b5061030561049c366004612b38565b610f2b565b3480156104ad57600080fd5b506103056104bc36600461298b565b610fb9565b3480156104cd57600080fd5b506103056104dc36600461293d565b610fd4565b3480156104ed57600080fd5b506102cd6104fc366004612c3c565b611020565b34801561050d57600080fd5b5061030561051c366004612b38565b611097565b34801561052d57600080fd5b5061030561053c36600461293d565b611125565b34801561054d57600080fd5b5061035461055c36600461293d565b611173565b34801561056d57600080fd5b5061030561057c366004612c3c565b6111fa565b34801561058d57600080fd5b5061030561059c366004612c55565b611287565b6103546105af366004612a95565b61145e565b3480156105c057600080fd5b506103056105cf366004612c3c565b611684565b3480156105e057600080fd5b506106296105ef366004612c3c565b6000908152600760208181526040808420546006928390529320908101549181015460089091015492939192909161010090910460ff1690565b6040805194855260208501939093529183015215156060820152608001610282565b34801561065757600080fd5b50600c546102cd906001600160a01b031681565b34801561067757600080fd5b5061068b610686366004612c3c565b611710565b6040516102829493929190612dba565b3480156106a757600080fd5b506102a0611996565b3480156106bc57600080fd5b506103056106cb366004612c55565b6119a5565b3480156106dc57600080fd5b506103056106eb366004612a2f565b6119e6565b3480156106fc57600080fd5b5061030561070b366004612b38565b611aab565b34801561071c57600080fd5b5061073061072b366004612bb9565b611aff565b60408051938452602084019290925260ff1690820152606001610282565b34801561075a57600080fd5b50610305610769366004612b38565b611b73565b34801561077a57600080fd5b506103056107893660046129c7565b611c01565b34801561079a57600080fd5b506107ae6107a9366004612c3c565b611c33565b6040516102829190612d2b565b3480156107c757600080fd5b506102a06107d6366004612c3c565b611c95565b3480156107e757600080fd5b506103056107f6366004612c3c565b611e77565b34801561080757600080fd5b506102a0611ed2565b34801561081c57600080fd5b50610354600b5481565b34801561083257600080fd5b50610276610841366004612958565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561087b57600080fd5b5061035461088a366004612c3c565b60076020526000908152604090205481565b60006001600160e01b031982166380ac58cd60e01b14806108cd57506001600160e01b03198216635b5e139f60e01b145b806108e857506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546108fd90612fc3565b80601f016020809104026020016040519081016040528092919081815260200182805461092990612fc3565b80156109765780601f1061094b57610100808354040283529160200191610976565b820191906000526020600020905b81548152906001019060200180831161095957829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109fe5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a2582611020565b9050806001600160a01b0316836001600160a01b03161415610a935760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109f5565b336001600160a01b0382161480610aaf5750610aaf8133610841565b610b215760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109f5565b610b2b8383611ef2565b505050565b600082815260066020526040902060080154829062010000900460ff1615610b6a5760405162461bcd60e51b81526004016109f590612ea1565b336000908152600a602052604090205460ff16610b995760405162461bcd60e51b81526004016109f590612e7d565b60008381526006602090815260409091208351610bb8928501906127fb565b50505050565b610bc83382611f60565b610be45760405162461bcd60e51b81526004016109f590612ecb565b610b2b838383612057565b600080600080610bfe85611aff565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa158015610c59573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b6000818152600660205260408120600401805460609283929091610c9190612fc3565b80601f0160208091040260200160405190810160405280929190818152602001828054610cbd90612fc3565b8015610d0a5780601f10610cdf57610100808354040283529160200191610d0a565b820191906000526020600020905b815481529060010190602001808311610ced57829003601f168201915b5050506000878152600660205260409020600501805493965092610d3092509050612fc3565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5c90612fc3565b8015610da95780601f10610d7e57610100808354040283529160200191610da9565b820191906000526020600020905b815481529060010190602001808311610d8c57829003601f168201915b505050600096875250506006602052604090942060080154929460ff90931692915050565b600c546001600160a01b03163314610df85760405162461bcd60e51b81526004016109f590612e07565b4780821115610e0657600080fd5b600c546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015610b2b573d6000803e3d6000fd5b336000908152600a602052604090205460ff16610e6f5760405162461bcd60e51b81526004016109f590612e7d565b60008281526006602090815260409091208251610b2b926003909201918401906127fb565b336000908152600a602052604090205460ff16610ec35760405162461bcd60e51b81526004016109f590612e7d565b600b5460008181526006602090815260409091208551610ee5928701906127fb565b5060008181526007602081815260408084208790556006909152909120908101839055600801805461ffff19169055600b54610f229060016121f7565b600b5550505050565b600082815260066020526040902060080154829062010000900460ff1615610f655760405162461bcd60e51b81526004016109f590612ea1565b336000908152600a602052604090205460ff16610f945760405162461bcd60e51b81526004016109f590612e7d565b60008381526006602090815260409091208351610bb8926004909201918501906127fb565b610b2b83838360405180602001604052806000815250611c01565b600c546001600160a01b03163314610ffe5760405162461bcd60e51b81526004016109f590612e07565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600260205260408120546001600160a01b0316806108e85760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109f5565b600082815260066020526040902060080154829062010000900460ff16156110d15760405162461bcd60e51b81526004016109f590612ea1565b336000908152600a602052604090205460ff166111005760405162461bcd60e51b81526004016109f590612e7d565b60008381526006602090815260409091208351610bb8926005909201918501906127fb565b600c546001600160a01b0316331461114f5760405162461bcd60e51b81526004016109f590612e07565b6001600160a01b03166000908152600a60205260409020805460ff19166001179055565b60006001600160a01b0382166111de5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016109f5565b506001600160a01b031660009081526003602052604090205490565b336000908152600a602052604090205460ff166112295760405162461bcd60e51b81526004016109f590612e7d565b600081815260066020526040902060080154819062010000900460ff16156112635760405162461bcd60e51b81526004016109f590612ea1565b506000908152600660205260409020600801805460ff19811660ff90911615179055565b600082815260066020526040902060080154829062010000900460ff16156112c15760405162461bcd60e51b81526004016109f590612ea1565b336000908152600a602052604090205460ff166112f05760405162461bcd60e51b81526004016109f590612e7d565b600083815260066020526040902060070154821061136e5760405162461bcd60e51b815260206004820152603560248201527f4d617820696e766f636174696f6e732063616e206e6f7420626520696e63726560448201527430b9b2b2161037b7363c903232b1b932b0b9b2b21760591b60648201526084016109f5565b6000838152600660208190526040909120015482116113f55760405162461bcd60e51b815260206004820152603d60248201527f596f75206d75737420736574206d617820696e766f636174696f6e732067726560448201527f61746572207468616e2063757272656e7420696e766f636174696f6e7300000060648201526084016109f5565b620f42408211156114485760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f742065786365656420312c3030302c30303000000000000000000060448201526064016109f5565b5060009182526006602052604090912060070155565b600084815260066020526040812060080154610100900460ff16806114925750336000908152600a602052604090205460ff165b6114d55760405162461bcd60e51b8152602060048201526014602482015273283937b532b1ba103737ba1032b730b13632b21760611b60448201526064016109f5565b600085815260066020819052604090912060078101549101546114f99060016121f7565b11156115475760405162461bcd60e51b815260206004820152601f60248201527f4d757374206e6f7420657863656564206d617820696e766f636174696f6e730060448201526064016109f5565b6000858152600760205260409020543410156115995760405162461bcd60e51b81526020600482015260116024820152702737ba1032b737bab3b41032ba3432b91760791b60448201526064016109f5565b60066000868152602001908152602001600020600901826040516115bd9190612ca3565b9081526040519081900360200190205460ff16156115da57600080fd5b6115e584848461220a565b6116265760405162461bcd60e51b815260206004820152601260248201527124b73b30b634b21039b4b3b730ba3ab9329760711b60448201526064016109f5565b6001600660008781526020019081526020016000206009018360405161164c9190612ca3565b908152604051908190036020019020805491151560ff1990921691909117905560006116798787866122bb565b979650505050505050565b336000908152600a602052604090205460ff166116b35760405162461bcd60e51b81526004016109f590612e7d565b600081815260066020526040902060080154819062010000900460ff16156116ed5760405162461bcd60e51b81526004016109f590612ea1565b506000908152600660205260409020600801805462ff0000191662010000179055565b6000818152600660205260409020805460609182918291829161173290612fc3565b80601f016020809104026020016040519081016040528092919081815260200182805461175e90612fc3565b80156117ab5780601f10611780576101008083540402835291602001916117ab565b820191906000526020600020905b81548152906001019060200180831161178e57829003601f168201915b50505060008881526006602052604090206001018054939750926117d192509050612fc3565b80601f01602080910402602001604051908101604052809291908181526020018280546117fd90612fc3565b801561184a5780601f1061181f5761010080835404028352916020019161184a565b820191906000526020600020905b81548152906001019060200180831161182d57829003601f168201915b505050600088815260066020526040902060020180549396509261187092509050612fc3565b80601f016020809104026020016040519081016040528092919081815260200182805461189c90612fc3565b80156118e95780601f106118be576101008083540402835291602001916118e9565b820191906000526020600020905b8154815290600101906020018083116118cc57829003601f168201915b505050600088815260066020526040902060030180549395509261190f92509050612fc3565b80601f016020809104026020016040519081016040528092919081815260200182805461193b90612fc3565b80156119885780601f1061195d57610100808354040283529160200191611988565b820191906000526020600020905b81548152906001019060200180831161196b57829003601f168201915b505050505090509193509193565b6060600180546108fd90612fc3565b336000908152600a602052604090205460ff166119d45760405162461bcd60e51b81526004016109f590612e7d565b60009182526007602052604090912055565b6001600160a01b038216331415611a3f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109f5565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b336000908152600a602052604090205460ff16611ada5760405162461bcd60e51b81526004016109f590612e7d565b60008281526006602090815260409091208251610b2b926002909201918401906127fb565b60008060008351604114611b555760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e677468000000000000000060448201526064016109f5565b50505060208101516040820151606090920151909260009190911a90565b600082815260066020526040902060080154829062010000900460ff1615611bad5760405162461bcd60e51b81526004016109f590612ea1565b336000908152600a602052604090205460ff16611bdc5760405162461bcd60e51b81526004016109f590612e7d565b60008381526006602090815260409091208351610bb8926001909201918501906127fb565b611c0b3383611f60565b611c275760405162461bcd60e51b81526004016109f590612ecb565b610bb8848484846123cd565b600081815260096020908152604091829020805483518184028101840190945280845260609392830182828015611c8957602002820191906000526020600020905b815481526020019060010190808311611c75575b50505050509050919050565b606081611cb9816000908152600260205260409020546001600160a01b0316151590565b611d055760405162461bcd60e51b815260206004820152601760248201527f546f6b656e20494420646f6573206e6f7420657869737400000000000000000060448201526064016109f5565b60008381526008602081815260408084205484526006909152909120015460ff1615611e16576000838152600860209081526040808320548352600690915281206005018054611de59190611d5990612fc3565b80601f0160208091040260200160405190810160405280929190818152602001828054611d8590612fc3565b8015611dd25780601f10611da757610100808354040283529160200191611dd2565b820191906000526020600020905b815481529060010190602001808311611db557829003601f168201915b5050505050611de086612400565b612580565b9050611e0e8160405180604001604052806005815260200164173539b7b760d91b815250612580565b925050611e71565b6000838152600860209081526040808320548352600690915281206004018054611e449190611d5990612fc3565b9050611e6d8160405180604001604052806005815260200164173539b7b760d91b815250612580565b9250505b50919050565b336000908152600a602052604090205460ff16611ea65760405162461bcd60e51b81526004016109f590612e7d565b6000908152600660205260409020600801805461ff001981166101009182900460ff1615909102179055565b606060405180606001604052806036815260200161309960369139905090565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611f2782611020565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611fd95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109f5565b6000611fe483611020565b9050806001600160a01b0316846001600160a01b0316148061201f5750836001600160a01b031661201484610980565b6001600160a01b0316145b8061204f57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661206a82611020565b6001600160a01b0316146120d25760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016109f5565b6001600160a01b0382166121345760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109f5565b61213f600082611ef2565b6001600160a01b0383166000908152600360205260408120805460019290612168908490612f80565b90915550506001600160a01b0382166000908152600360205260408120805460019290612196908490612f35565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006122038284612f35565b9392505050565b6000808383604051602001612220929190612cbf565b6040516020818303038152906040528051906020012090506000612291826040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9050600061229f8288610bef565b600d546001600160a01b03908116911614979650505050505050565b600080836122e757600084815260066020819052604090912001546122e09085612f35565b9050612314565b60008481526006602081905260409091200154612307620f424086612f61565b6123119190612f35565b90505b600084815260066020819052604090912001546123329060016121f7565b6000858152600660208190526040909120015561234f85826125ac565b600081815260086020908152604080832087905586835260098252808320805460018101825590845291909220018290555184906001600160a01b038716907fcd0e00beb8e6d5ab96ee16e6a1a735ff07cae8702f2e48feb32fefe40f25692c906123bd9085908890612f1c565b60405180910390a3949350505050565b6123d8848484612057565b6123e4848484846126ee565b610bb85760405162461bcd60e51b81526004016109f590612e2b565b60408051606480825260a08201909252606091906000908260208201818036833701905050905060008461244f5750506040805180820190915260018152600360fc1b60208201529392505050565b84156124b9576000612462600a87613013565b905061246f600a87612f4d565b955061247c816030612f35565b60f81b838361248a81612ff8565b94508151811061249c5761249c613053565b60200101906001600160f81b031916908160001a9053505061244f565b60006124c6826001612f35565b67ffffffffffffffff8111156124de576124de613069565b6040519080825280601f01601f191660200182016040528015612508576020820181803683370190505b50905060005b82811161257657836125208285612f80565b8151811061253057612530613053565b602001015160f81c60f81b82828151811061254d5761254d613053565b60200101906001600160f81b031916908160001a9053508061256e81612ff8565b91505061250e565b5095945050505050565b60608282604051602001612595929190612cbf565b604051602081830303815290604052905092915050565b6001600160a01b0382166126025760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109f5565b6000818152600260205260409020546001600160a01b0316156126675760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109f5565b6001600160a01b0382166000908152600360205260408120805460019290612690908490612f35565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b156127f057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612732903390899088908890600401612cee565b602060405180830381600087803b15801561274c57600080fd5b505af192505050801561277c575060408051601f3d908101601f1916820190925261277991810190612b9c565b60015b6127d6573d8080156127aa576040519150601f19603f3d011682016040523d82523d6000602084013e6127af565b606091505b5080516127ce5760405162461bcd60e51b81526004016109f590612e2b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061204f565b506001949350505050565b82805461280790612fc3565b90600052602060002090601f016020900481019282612829576000855561286f565b82601f1061284257805160ff191683800117855561286f565b8280016001018555821561286f579182015b8281111561286f578251825591602001919060010190612854565b5061287b92915061287f565b5090565b5b8082111561287b5760008155600101612880565b80356001600160a01b03811681146128ab57600080fd5b919050565b600082601f8301126128c157600080fd5b813567ffffffffffffffff808211156128dc576128dc613069565b604051601f8301601f19908116603f0116810190828211818310171561290457612904613069565b8160405283815286602085880101111561291d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561294f57600080fd5b61220382612894565b6000806040838503121561296b57600080fd5b61297483612894565b915061298260208401612894565b90509250929050565b6000806000606084860312156129a057600080fd5b6129a984612894565b92506129b760208501612894565b9150604084013590509250925092565b600080600080608085870312156129dd57600080fd5b6129e685612894565b93506129f460208601612894565b925060408501359150606085013567ffffffffffffffff811115612a1757600080fd5b612a23878288016128b0565b91505092959194509250565b60008060408385031215612a4257600080fd5b612a4b83612894565b915060208301358015158114612a6057600080fd5b809150509250929050565b60008060408385031215612a7e57600080fd5b612a8783612894565b946020939093013593505050565b600080600080600060a08688031215612aad57600080fd5b612ab686612894565b945060208601359350604086013567ffffffffffffffff80821115612ada57600080fd5b612ae689838a016128b0565b94506060880135915080821115612afc57600080fd5b612b0889838a016128b0565b93506080880135915080821115612b1e57600080fd5b50612b2b888289016128b0565b9150509295509295909350565b60008060408385031215612b4b57600080fd5b82359150602083013567ffffffffffffffff811115612b6957600080fd5b612b75858286016128b0565b9150509250929050565b600060208284031215612b9157600080fd5b81356122038161307f565b600060208284031215612bae57600080fd5b81516122038161307f565b600060208284031215612bcb57600080fd5b813567ffffffffffffffff811115612be257600080fd5b61204f848285016128b0565b600080600060608486031215612c0357600080fd5b833567ffffffffffffffff811115612c1a57600080fd5b612c26868287016128b0565b9660208601359650604090950135949350505050565b600060208284031215612c4e57600080fd5b5035919050565b60008060408385031215612c6857600080fd5b50508035926020909101359150565b60008151808452612c8f816020860160208601612f97565b601f01601f19169290920160200192915050565b60008251612cb5818460208701612f97565b9190910192915050565b60008351612cd1818460208801612f97565b835190830190612ce5818360208801612f97565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d2190830184612c77565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612d6357835183529284019291840191600101612d47565b50909695505050505050565b6020815260006122036020830184612c77565b606081526000612d956060830186612c77565b8281036020840152612da78186612c77565b9150508215156040830152949350505050565b608081526000612dcd6080830187612c77565b8281036020840152612ddf8187612c77565b90508281036040840152612df38186612c77565b905082810360608401526116798185612c77565b6020808252600a908201526927b7363c9037bbb732b960b11b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252600a908201526927b7363c9030b236b4b760b11b604082015260600190565b60208082526010908201526f13db9b1e481a59881d5b9b1bd8dad95960821b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b82815260406020820152600061204f6040830184612c77565b60008219821115612f4857612f48613027565b500190565b600082612f5c57612f5c61303d565b500490565b6000816000190483118215151615612f7b57612f7b613027565b500290565b600082821015612f9257612f92613027565b500390565b60005b83811015612fb2578181015183820152602001612f9a565b83811115610bb85750506000910152565b600181811c90821680612fd757607f821691505b60208210811415611e7157634e487b7160e01b600052602260045260246000fd5b600060001982141561300c5761300c613027565b5060010190565b6000826130225761302261303d565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461309557600080fd5b5056fe68747470733a2f2f64337139657367796d6a7365777a2e636c6f756466726f6e742e6e65742f666f7265766572727567732e6a736f6ea2646970667358221220a037f9e160497ceeaf0c78386b53dbaeb5b1e8c3f152ccc47cc9020963ebdeb264736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000c3bdec2cecfdf7c34e155e37b62fbe750d9c5839000000000000000000000000000000000000000000000000000000000000000c466f72657665722052756773000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083445565252554753000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _tokenName (string): Forever Rugs
Arg [1] : _tokenSymbol (string): 4EVRRUGS
Arg [2] : _verifier (address): 0xc3bDec2cEcfdF7C34E155E37b62fBE750D9C5839

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 000000000000000000000000c3bdec2cecfdf7c34e155e37b62fbe750d9c5839
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [4] : 466f726576657220527567730000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [6] : 3445565252554753000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

39926:11080:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20762:305;;;;;;;;;;-1:-1:-1;20762:305:0;;;;;:::i;:::-;;:::i;:::-;;;9167:14:1;;9160:22;9142:41;;9130:2;9115:18;20762:305:0;;;;;;;;21707:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23266:221::-;;;;;;;;;;-1:-1:-1;23266:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7828:32:1;;;7810:51;;7798:2;7783:18;23266:221:0;7664:203:1;22789:411:0;;;;;;;;;;-1:-1:-1;22789:411:0;;;;;:::i;:::-;;:::i;:::-;;45352:176;;;;;;;;;;-1:-1:-1;45352:176:0;;;;;:::i;:::-;;:::i;40631:53::-;;;;;;;;;;-1:-1:-1;40631:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;21009:25:1;;;20997:2;20982:18;40631:53:0;20863:177:1;24156:339:0;;;;;;;;;;-1:-1:-1;24156:339:0;;;;;:::i;:::-;;:::i;40756:39::-;;;;;;;;;;-1:-1:-1;40756:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;50763:240;;;;;;;;;;-1:-1:-1;50763:240:0;;;;;:::i;:::-;;:::i;40917:23::-;;;;;;;;;;-1:-1:-1;40917:23:0;;;;-1:-1:-1;;;;;40917:23:0;;;47850:334;;;;;;;;;;-1:-1:-1;47850:334:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;49604:188::-;;;;;;;;;;-1:-1:-1;49604:188:0;;;;;:::i;:::-;;:::i;45927:163::-;;;;;;;;;;-1:-1:-1;45927:163:0;;;;;:::i;:::-;;:::i;44654:493::-;;;;;;;;;;-1:-1:-1;44654:493:0;;;;;:::i;:::-;;:::i;46644:187::-;;;;;;;;;;-1:-1:-1;46644:187:0;;;;;:::i;:::-;;:::i;24566:185::-;;;;;;;;;;-1:-1:-1;24566:185:0;;;;;:::i;:::-;;:::i;43958:98::-;;;;;;;;;;-1:-1:-1;43958:98:0;;;;;:::i;:::-;;:::i;21401:239::-;;;;;;;;;;-1:-1:-1;21401:239:0;;;;;:::i;:::-;;:::i;46839:211::-;;;;;;;;;;-1:-1:-1;46839:211:0;;;;;:::i;:::-;;:::i;44064:96::-;;;;;;;;;;-1:-1:-1;44064:96:0;;;;;:::i;:::-;;:::i;21131:208::-;;;;;;;;;;-1:-1:-1;21131:208:0;;;;;:::i;:::-;;:::i;44475:171::-;;;;;;;;;;-1:-1:-1;44475:171:0;;;;;:::i;:::-;;:::i;46098:538::-;;;;;;;;;;-1:-1:-1;46098:538:0;;;;;:::i;:::-;;:::i;41815:786::-;;;;;;:::i;:::-;;:::i;44168:146::-;;;;;;;;;;-1:-1:-1;44168:146:0;;;;;:::i;:::-;;:::i;47441:401::-;;;;;;;;;;-1:-1:-1;47441:401:0;;;;;:::i;:::-;47508:26;47626:41;;;:29;:41;;;;;;;;;47692:8;:20;;;;;;:32;;;;47752:35;;;;47807:27;;;;;47626:41;;47692:32;;47752:35;;47807:27;;;;;;;47441:401;;;;;21565:25:1;;;21621:2;21606:18;;21599:34;;;;21649:18;;;21642:34;21719:14;21712:22;21707:2;21692:18;;21685:50;21552:3;21537:19;47441:401:0;21340::1;40890:20:0;;;;;;;;;;-1:-1:-1;40890:20:0;;;;-1:-1:-1;;;;;40890:20:0;;;47058:375;;;;;;;;;;-1:-1:-1;47058:375:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;21876:104::-;;;;;;;;;;;;;:::i;45155:189::-;;;;;;;;;;-1:-1:-1;45155:189:0;;;;;:::i;:::-;;:::i;23559:295::-;;;;;;;;;;-1:-1:-1;23559:295:0;;;;;:::i;:::-;;:::i;45740:179::-;;;;;;;;;;-1:-1:-1;45740:179:0;;;;;:::i;:::-;;:::i;49800:891::-;;;;;;;;;;-1:-1:-1;49800:891:0;;;;;:::i;:::-;;:::i;:::-;;;;9392:25:1;;;9448:2;9433:18;;9426:34;;;;9508:4;9496:17;9476:18;;;9469:45;9380:2;9365:18;49800:891:0;9194:326:1;45536:196:0;;;;;;;;;;-1:-1:-1;45536:196:0;;;;;:::i;:::-;;:::i;24822:328::-;;;;;;;;;;-1:-1:-1;24822:328:0;;;;;:::i;:::-;;:::i;48192:142::-;;;;;;;;;;-1:-1:-1;48192:142:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;49071:525::-;;;;;;;;;;-1:-1:-1;49071:525:0;;;;;:::i;:::-;;:::i;44322:145::-;;;;;;;;;;-1:-1:-1;44322:145:0;;;;;:::i;:::-;;:::i;41666:141::-;;;;;;;;;;;;;:::i;40851:32::-;;;;;;;;;;;;;;;;23925:164;;;;;;;;;;-1:-1:-1;23925:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;24046:25:0;;;24022:4;24046:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23925:164;40560:64;;;;;;;;;;-1:-1:-1;40560:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;20762:305;20864:4;-1:-1:-1;;;;;;20901:40:0;;-1:-1:-1;;;20901:40:0;;:105;;-1:-1:-1;;;;;;;20958:48:0;;-1:-1:-1;;;20958:48:0;20901:105;:158;;;-1:-1:-1;;;;;;;;;;13802:40:0;;;21023:36;20881:178;20762:305;-1:-1:-1;;20762:305:0:o;21707:100::-;21761:13;21794:5;21787:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21707:100;:::o;23266:221::-;23342:7;26749:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26749:16:0;23362:73;;;;-1:-1:-1;;;23362:73:0;;17661:2:1;23362:73:0;;;17643:21:1;17700:2;17680:18;;;17673:30;17739:34;17719:18;;;17712:62;-1:-1:-1;;;17790:18:1;;;17783:42;17842:19;;23362:73:0;;;;;;;;;-1:-1:-1;23455:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23455:24:0;;23266:221::o;22789:411::-;22870:13;22886:23;22901:7;22886:14;:23::i;:::-;22870:39;;22934:5;-1:-1:-1;;;;;22928:11:0;:2;-1:-1:-1;;;;;22928:11:0;;;22920:57;;;;-1:-1:-1;;;22920:57:0;;18484:2:1;22920:57:0;;;18466:21:1;18523:2;18503:18;;;18496:30;18562:34;18542:18;;;18535:62;-1:-1:-1;;;18613:18:1;;;18606:31;18654:19;;22920:57:0;18282:397:1;22920:57:0;2801:10;-1:-1:-1;;;;;23012:21:0;;;;:62;;-1:-1:-1;23037:37:0;23054:5;2801:10;23925:164;:::i;23037:37::-;22990:168;;;;-1:-1:-1;;;22990:168:0;;15624:2:1;22990:168:0;;;15606:21:1;15663:2;15643:18;;;15636:30;15702:34;15682:18;;;15675:62;15773:26;15753:18;;;15746:54;15817:19;;22990:168:0;15422:420:1;22990:168:0;23171:21;23180:2;23184:7;23171:8;:21::i;:::-;22859:341;22789:411;;:::o;45352:176::-;41147:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;41146:28;41138:57;;;;-1:-1:-1;;;41138:57:0;;;;;;;:::i;:::-;41271:10:::1;41263:19;::::0;;;:7:::1;:19;::::0;;;;;::::1;;41255:42;;;;-1:-1:-1::0;;;41255:42:0::1;;;;;;;:::i;:::-;45480:20:::2;::::0;;;:8:::2;:20;::::0;;;;;;;:40;;::::2;::::0;;::::2;::::0;::::2;:::i;:::-;;45352:176:::0;;;:::o;24156:339::-;24351:41;2801:10;24384:7;24351:18;:41::i;:::-;24343:103;;;;-1:-1:-1;;;24343:103:0;;;;;;;:::i;:::-;24459:28;24469:4;24475:2;24479:7;24459:9;:28::i;50763:240::-;50856:7;50877:9;50888;50899:7;50910:26;50925:10;50910:14;:26::i;:::-;50954:41;;;;;;;;;;;;9752:25:1;;;9825:4;9813:17;;9793:18;;;9786:45;;;;9847:18;;;9840:34;;;9890:18;;;9883:34;;;50876:60:0;;-1:-1:-1;50876:60:0;;-1:-1:-1;50876:60:0;-1:-1:-1;50954:41:0;;9724:19:1;;50954:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50954:41:0;;-1:-1:-1;;50954:41:0;;;50763:240;-1:-1:-1;;;;;;;50763:240:0:o;47850:334::-;47979:12;48021:20;;;:8;:20;;;;;:35;;48004:52;;47915:28;;;;47979:12;;48004:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48088:20:0;;;;:8;:20;;;;;:39;;48067:60;;48004:52;;-1:-1:-1;48088:39:0;48067:60;;-1:-1:-1;48067:60:0;-1:-1:-1;48067:60:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48148:20:0;;;;-1:-1:-1;;48148:8:0;:20;;;;;;:28;;;47850:334;;48148:28;;;;;47850:334;-1:-1:-1;;47850:334:0:o;49604:188::-;41379:5;;-1:-1:-1;;;;;41379:5:0;41365:10;:19;41357:42;;;;-1:-1:-1;;;41357:42:0;;;;;;;:::i;:::-;49684:21:::1;49724:17:::0;;::::1;;49716:26;;;::::0;::::1;;49761:5;::::0;49753:31:::1;::::0;-1:-1:-1;;;;;49761:5:0;;::::1;::::0;49753:31;::::1;;;::::0;49777:6;;49761:5:::1;49753:31:::0;49761:5;49753:31;49777:6;49761:5;49753:31;::::1;;;;;;;;;;;;;::::0;::::1;;;;45927:163:::0;41271:10;41263:19;;;;:7;:19;;;;;;;;41255:42;;;;-1:-1:-1;;;41255:42:0;;;;;;;:::i;:::-;46036:20:::1;::::0;;;:8:::1;:20;::::0;;;;;;;:46;;::::1;::::0;:28:::1;::::0;;::::1;::::0;:46;::::1;::::0;::::1;:::i;44654:493::-:0;41271:10;41263:19;;;;:7;:19;;;;;;;;41255:42;;;;-1:-1:-1;;;41255:42:0;;;;;;;:::i;:::-;44803:13:::1;::::0;44783:17:::1;44827:19:::0;;;:8:::1;:19;::::0;;;;;;;:39;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;44877:40:0::1;::::0;;;:29:::1;:40;::::0;;;;;;;:62;;;44950:8:::1;:19:::0;;;;;;:34;;::::1;:51:::0;;;45012:26:::1;;:34:::0;;-1:-1:-1;;45057:35:0;;;45119:13:::1;::::0;:20:::1;::::0;45012:26:::1;45119:17;:20::i;:::-;45103:13;:36:::0;-1:-1:-1;;;;44654:493:0:o;46644:187::-;41147:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;41146:28;41138:57;;;;-1:-1:-1;;;41138:57:0;;;;;;;:::i;:::-;41271:10:::1;41263:19;::::0;;;:7:::1;:19;::::0;;;;;::::1;;41255:42;;;;-1:-1:-1::0;;;41255:42:0::1;;;;;;;:::i;:::-;46774:20:::2;::::0;;;:8:::2;:20;::::0;;;;;;;:49;;::::2;::::0;:35:::2;::::0;;::::2;::::0;:49;::::2;::::0;::::2;:::i;24566:185::-:0;24704:39;24721:4;24727:2;24731:7;24704:39;;;;;;;;;;;;:16;:39::i;43958:98::-;41379:5;;-1:-1:-1;;;;;41379:5:0;41365:10;:19;41357:42;;;;-1:-1:-1;;;41357:42:0;;;;;;;:::i;:::-;44028:8:::1;:20:::0;;-1:-1:-1;;;;;;44028:20:0::1;-1:-1:-1::0;;;;;44028:20:0;;;::::1;::::0;;;::::1;::::0;;43958:98::o;21401:239::-;21473:7;21509:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21509:16:0;21544:19;21536:73;;;;-1:-1:-1;;;21536:73:0;;16460:2:1;21536:73:0;;;16442:21:1;16499:2;16479:18;;;16472:30;16538:34;16518:18;;;16511:62;-1:-1:-1;;;16589:18:1;;;16582:39;16638:19;;21536:73:0;16258:405:1;46839:211:0;41147:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;41146:28;41138:57;;;;-1:-1:-1;;;41138:57:0;;;;;;;:::i;:::-;41271:10:::1;41263:19;::::0;;;:7:::1;:19;::::0;;;;;::::1;;41255:42;;;;-1:-1:-1::0;;;41255:42:0::1;;;;;;;:::i;:::-;46981:20:::2;::::0;;;:8:::2;:20;::::0;;;;;;;:61;;::::2;::::0;:39:::2;::::0;;::::2;::::0;:61;::::2;::::0;::::2;:::i;44064:96::-:0;41379:5;;-1:-1:-1;;;;;41379:5:0;41365:10;:19;41357:42;;;;-1:-1:-1;;;41357:42:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44128:17:0::1;;::::0;;;:7:::1;:17;::::0;;;;:24;;-1:-1:-1;;44128:24:0::1;44148:4;44128:24;::::0;;44064:96::o;21131:208::-;21203:7;-1:-1:-1;;;;;21231:19:0;;21223:74;;;;-1:-1:-1;;;21223:74:0;;16049:2:1;21223:74:0;;;16031:21:1;16088:2;16068:18;;;16061:30;16127:34;16107:18;;;16100:62;-1:-1:-1;;;16178:18:1;;;16171:40;16228:19;;21223:74:0;15847:406:1;21223:74:0;-1:-1:-1;;;;;;21315:16:0;;;;;:9;:16;;;;;;;21131:208::o;44475:171::-;41271:10;41263:19;;;;:7;:19;;;;;;;;41255:42;;;;-1:-1:-1;;;41255:42:0;;;;;;;:::i;:::-;41147:20:::1;::::0;;;:8:::1;:20;::::0;;;;:27:::1;;::::0;:20;;:27;;::::1;;;41146:28;41138:57;;;;-1:-1:-1::0;;;41138:57:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;44610:20:0::2;::::0;;;:8:::2;:20;::::0;;;;:28:::2;;::::0;;-1:-1:-1;;44578:60:0;::::2;44610:28;::::0;;::::2;44609:29;44578:60;::::0;;44475:171::o;46098:538::-;41147:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;41146:28;41138:57;;;;-1:-1:-1;;;41138:57:0;;;;;;;:::i;:::-;41271:10:::1;41263:19;::::0;;;:7:::1;:19;::::0;;;;;::::1;;41255:42;;;;-1:-1:-1::0;;;41255:42:0::1;;;;;;;:::i;:::-;46259:20:::2;::::0;;;:8:::2;:20;::::0;;;;:35:::2;;::::0;46241:53;::::2;46233:119;;;::::0;-1:-1:-1;;;46233:119:0;;12291:2:1;46233:119:0::2;::::0;::::2;12273:21:1::0;12330:2;12310:18;;;12303:30;12369:34;12349:18;;;12342:62;-1:-1:-1;;;12420:18:1;;;12413:51;12481:19;;46233:119:0::2;12089:417:1::0;46233:119:0::2;46389:20;::::0;;;:8:::2;:20;::::0;;;;;;;:32:::2;::::0;46371:50;::::2;46363:124;;;::::0;-1:-1:-1;;;46363:124:0;;17231:2:1;46363:124:0::2;::::0;::::2;17213:21:1::0;17270:2;17250:18;;;17243:30;17309:34;17289:18;;;17282:62;17380:31;17360:18;;;17353:59;17429:19;;46363:124:0::2;17029:425:1::0;46363:124:0::2;40835:9;46506:15;:30;;46498:66;;;::::0;-1:-1:-1;;;46498:66:0;;19246:2:1;46498:66:0::2;::::0;::::2;19228:21:1::0;19285:2;19265:18;;;19258:30;19324:25;19304:18;;;19297:53;19367:18;;46498:66:0::2;19044:347:1::0;46498:66:0::2;-1:-1:-1::0;46575:20:0::2;::::0;;;:8:::2;:20;::::0;;;;;:35:::2;;:53:::0;46098:538::o;41815:786::-;41958:16;41995:20;;;:8;:20;;;;;:27;;;;;;;;;:50;;-1:-1:-1;42034:10:0;42026:19;;;;:7;:19;;;;;;;;41995:50;41987:83;;;;-1:-1:-1;;;41987:83:0;;20016:2:1;41987:83:0;;;19998:21:1;20055:2;20035:18;;;20028:30;-1:-1:-1;;;20074:18:1;;;20067:50;20134:18;;41987:83:0;19814:344:1;41987:83:0;42134:20;;;;:8;:20;;;;;;;;:35;;;;42091:32;;;:39;;42128:1;42091:36;:39::i;:::-;:78;;42083:122;;;;-1:-1:-1;;;42083:122:0;;18886:2:1;42083:122:0;;;18868:21:1;18925:2;18905:18;;;18898:30;18964:33;18944:18;;;18937:61;19015:18;;42083:122:0;18684:355:1;42083:122:0;42237:41;;;;:29;:41;;;;;;42224:9;:54;;42216:84;;;;-1:-1:-1;;;42216:84:0;;15278:2:1;42216:84:0;;;15260:21:1;15317:2;15297:18;;;15290:30;-1:-1:-1;;;15336:18:1;;;15329:47;15393:18;;42216:84:0;15076:341:1;42216:84:0;42322:8;:20;42331:10;42322:20;;;;;;;;;;;:31;;42354:5;42322:38;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;42321:39;42313:48;;;;;;42380:41;42393:12;42407:6;42415:5;42380:12;:41::i;:::-;42372:72;;;;-1:-1:-1;;;42372:72:0;;20365:2:1;42372:72:0;;;20347:21:1;20404:2;20384:18;;;20377:30;-1:-1:-1;;;20423:18:1;;;20416:48;20481:18;;42372:72:0;20163:342:1;42372:72:0;42498:4;42457:8;:20;42466:10;42457:20;;;;;;;;;;;:31;;42489:5;42457:38;;;;;;:::i;:::-;;;;;;;;;;;;;;:45;;;;;-1:-1:-1;;42457:45:0;;;;;;;;;:38;42533:35;42544:3;42549:10;42561:6;42533:10;:35::i;:::-;42515:53;41815:786;-1:-1:-1;;;;;;;41815:786:0:o;44168:146::-;41271:10;41263:19;;;;:7;:19;;;;;;;;41255:42;;;;-1:-1:-1;;;41255:42:0;;;;;;;:::i;:::-;41147:20:::1;::::0;;;:8:::1;:20;::::0;;;;:27:::1;;::::0;:20;;:27;;::::1;;;41146:28;41138:57;;;;-1:-1:-1::0;;;41138:57:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;44272:20:0::2;::::0;;;:8:::2;:20;::::0;;;;:27:::2;;:34:::0;;-1:-1:-1;;44272:34:0::2;::::0;::::2;::::0;;44168:146::o;47058:375::-;47247:20;;;;:8;:20;;;;;47233:39;;47123:25;;;;;;;;47233:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;47292:20:0;;;;:8;:20;;;;;:27;;47283:36;;47233:39;;-1:-1:-1;47292:27:0;47283:36;;-1:-1:-1;47283:36:0;-1:-1:-1;47283:36:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;47344:20:0;;;;:8;:20;;;;;:32;;47330:46;;47283:36;;-1:-1:-1;47344:32:0;47330:46;;-1:-1:-1;47330:46:0;-1:-1:-1;47330:46:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;47397:20:0;;;;:8;:20;;;;;:28;;47387:38;;47330:46;;-1:-1:-1;47397:28:0;47387:38;;-1:-1:-1;47387:38:0;-1:-1:-1;47387:38:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47058:375;;;;;:::o;21876:104::-;21932:13;21965:7;21958:14;;;;;:::i;45155:189::-;41271:10;41263:19;;;;:7;:19;;;;;;;;41255:42;;;;-1:-1:-1;;;41255:42:0;;;;;;;:::i;:::-;45273:41:::1;::::0;;;:29:::1;:41;::::0;;;;;:63;45155:189::o;23559:295::-;-1:-1:-1;;;;;23662:24:0;;2801:10;23662:24;;23654:62;;;;-1:-1:-1;;;23654:62:0;;13475:2:1;23654:62:0;;;13457:21:1;13514:2;13494:18;;;13487:30;13553:27;13533:18;;;13526:55;13598:18;;23654:62:0;13273:349:1;23654:62:0;2801:10;23729:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;23729:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;23729:53:0;;;;;;;;;;23798:48;;9142:41:1;;;23729:42:0;;2801:10;23798:48;;9115:18:1;23798:48:0;;;;;;;23559:295;;:::o;45740:179::-;41271:10;41263:19;;;;:7;:19;;;;;;;;41255:42;;;;-1:-1:-1;;;41255:42:0;;;;;;;:::i;:::-;45857:20:::1;::::0;;;:8:::1;:20;::::0;;;;;;;:54;;::::1;::::0;:32:::1;::::0;;::::1;::::0;:54;::::1;::::0;::::1;:::i;49800:891::-:0;49904:9;49928;49952:7;49995:3;:10;50009:2;49995:16;49987:53;;;;-1:-1:-1;;;49987:53:0;;20712:2:1;49987:53:0;;;20694:21:1;20751:2;20731:18;;;20724:30;20790:26;20770:18;;;20763:54;20834:18;;49987:53:0;20510:348:1;49987:53:0;-1:-1:-1;;;50449:2:0;50440:12;;50434:19;50519:2;50510:12;;50504:19;50626:2;50617:12;;;50611:19;50434;;50608:1;50603:28;;;;;49800:891::o;45536:196::-;41147:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;41146:28;41138:57;;;;-1:-1:-1;;;41138:57:0;;;;;;;:::i;:::-;41271:10:::1;41263:19;::::0;;;:7:::1;:19;::::0;;;;;::::1;;41255:42;;;;-1:-1:-1::0;;;41255:42:0::1;;;;;;;:::i;:::-;45676:20:::2;::::0;;;:8:::2;:20;::::0;;;;;;;:48;;::::2;::::0;:27:::2;::::0;;::::2;::::0;:48;::::2;::::0;::::2;:::i;24822:328::-:0;24997:41;2801:10;25030:7;24997:18;:41::i;:::-;24989:103;;;;-1:-1:-1;;;24989:103:0;;;;;;;:::i;:::-;25103:39;25117:4;25123:2;25127:7;25136:5;25103:13;:39::i;48192:142::-;48295:31;;;;:19;:31;;;;;;;;;48288:38;;;;;;;;;;;;;;;;;48260:16;;48288:38;;;48295:31;48288:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48192:142;;;:::o;49071:525::-;49172:13;49153:8;41012:17;41020:8;26725:4;26749:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26749:16:0;:30;;;26660:127;41012:17;41004:53;;;;-1:-1:-1;;;41004:53:0;;13829:2:1;41004:53:0;;;13811:21:1;13868:2;13848:18;;;13841:30;13907:25;13887:18;;;13880:53;13950:18;;41004:53:0;13627:347:1;41004:53:0;49202:38:::1;49211:28:::0;;;:18:::1;:28;::::0;;;;;;;;49202:38;;:8:::1;:38:::0;;;;;;:46:::1;::::0;::::1;;49198:237;;;49274:16;49309:28:::0;;;:18:::1;:28;::::0;;;;;;;;49300:38;;:8:::1;:38:::0;;;;;:57:::1;;49293:89:::0;;::::1;::::0;49300:57;49293:89:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49359:22;49372:8;49359:12;:22::i;:::-;49293:6;:89::i;:::-;49274:108;;49404:19;49411:2;49404:19;;;;;;;;;;;;;-1:-1:-1::0;;;49404:19:0::1;;::::0;:6:::1;:19::i;:::-;49397:26;;;;;49198:237;49447:15;49481:28:::0;;;:18:::1;:28;::::0;;;;;;;;49472:38;;:8:::1;:38:::0;;;;;:53:::1;;49465:85:::0;;::::1;::::0;49472:53;49465:85:::1;::::0;::::1;:::i;:::-;49447:103;;49570:18;49577:1;49570:18;;;;;;;;;;;;;-1:-1:-1::0;;;49570:18:0::1;;::::0;:6:::1;:18::i;:::-;49563:25;;;41068:1;49071:525:::0;;;;:::o;44322:145::-;41271:10;41263:19;;;;:7;:19;;;;;;;;41255:42;;;;-1:-1:-1;;;41255:42:0;;;;;;;:::i;:::-;44432:20:::1;::::0;;;:8:::1;:20;::::0;;;;:27:::1;;::::0;;-1:-1:-1;;44401:58:0;::::1;44432:27;::::0;;;::::1;;;44431:28;44401:58:::0;;::::1;;::::0;;44322:145::o;41666:141::-;41710:13;41736:63;;;;;;;;;;;;;;;;;;;41666:141;:::o;30642:174::-;30717:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30717:29:0;-1:-1:-1;;;;;30717:29:0;;;;;;;;:24;;30771:23;30717:24;30771:14;:23::i;:::-;-1:-1:-1;;;;;30762:46:0;;;;;;;;;;;30642:174;;:::o;26954:348::-;27047:4;26749:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26749:16:0;27064:73;;;;-1:-1:-1;;;27064:73:0;;14520:2:1;27064:73:0;;;14502:21:1;14559:2;14539:18;;;14532:30;14598:34;14578:18;;;14571:62;-1:-1:-1;;;14649:18:1;;;14642:42;14701:19;;27064:73:0;14318:408:1;27064:73:0;27148:13;27164:23;27179:7;27164:14;:23::i;:::-;27148:39;;27217:5;-1:-1:-1;;;;;27206:16:0;:7;-1:-1:-1;;;;;27206:16:0;;:51;;;;27250:7;-1:-1:-1;;;;;27226:31:0;:20;27238:7;27226:11;:20::i;:::-;-1:-1:-1;;;;;27226:31:0;;27206:51;:87;;;-1:-1:-1;;;;;;24046:25:0;;;24022:4;24046:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27261:32;27198:96;26954:348;-1:-1:-1;;;;26954:348:0:o;29946:578::-;30105:4;-1:-1:-1;;;;;30078:31:0;:23;30093:7;30078:14;:23::i;:::-;-1:-1:-1;;;;;30078:31:0;;30070:85;;;;-1:-1:-1;;;30070:85:0;;18074:2:1;30070:85:0;;;18056:21:1;18113:2;18093:18;;;18086:30;18152:34;18132:18;;;18125:62;-1:-1:-1;;;18203:18:1;;;18196:39;18252:19;;30070:85:0;17872:405:1;30070:85:0;-1:-1:-1;;;;;30174:16:0;;30166:65;;;;-1:-1:-1;;;30166:65:0;;13070:2:1;30166:65:0;;;13052:21:1;13109:2;13089:18;;;13082:30;13148:34;13128:18;;;13121:62;-1:-1:-1;;;13199:18:1;;;13192:34;13243:19;;30166:65:0;12868:400:1;30166:65:0;30348:29;30365:1;30369:7;30348:8;:29::i;:::-;-1:-1:-1;;;;;30390:15:0;;;;;;:9;:15;;;;;:20;;30409:1;;30390:15;:20;;30409:1;;30390:20;:::i;:::-;;;;-1:-1:-1;;;;;;;30421:13:0;;;;;;:9;:13;;;;;:18;;30438:1;;30421:13;:18;;30438:1;;30421:18;:::i;:::-;;;;-1:-1:-1;;30450:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30450:21:0;-1:-1:-1;;;;;30450:21:0;;;;;;;;;30489:27;;30450:16;;30489:27;;;;;;;29946:578;;;:::o;35690:98::-;35748:7;35775:5;35779:1;35775;:5;:::i;:::-;35768:12;35690:98;-1:-1:-1;;;35690:98:0:o;43344:425::-;43459:4;43544:12;43586:6;43594:5;43569:31;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43559:42;;;;;;43544:57;;43612:19;43634:28;43657:4;43883:58;;7521:66:1;43883:58:0;;;7509:79:1;7604:12;;;7597:28;;;43846:7:0;;7641:12:1;;43883:58:0;;;;;;;;;;;;43873:69;;;;;;43866:76;;43777:173;;;;43634:28;43612:50;;43675:14;43692:33;43699:11;43712:12;43692:6;:33::i;:::-;43753:8;;-1:-1:-1;;;;;43753:8:0;;;43743:18;;;;43344:425;-1:-1:-1;;;;;;;43344:425:0:o;42609:727::-;42702:16;;42765:15;42761:225;;42824:20;;;;:8;:20;;;;;;;;:32;;42811:45;;42833:10;42811:45;:::i;:::-;42797:59;;42761:225;;;42942:20;;;;:8;:20;;;;;;;;:32;;42914:24;40835:9;42951:10;42914:24;:::i;:::-;42913:61;;;;:::i;:::-;42899:75;;42761:225;43041:20;;;;:8;:20;;;;;;;;:32;;:39;;43078:1;43041:36;:39::i;:::-;43006:20;;;;:8;:20;;;;;;;;:32;:74;43093:23;43099:3;43104:11;43093:5;:23::i;:::-;43129:31;;;;:18;:31;;;;;;;;:44;;;43184:31;;;:19;:31;;;;;:49;;;;;;;;;;;;;;;;;;43255:42;43163:10;;-1:-1:-1;;;;;43255:42:0;;;;;;;43148:11;;43290:6;;43255:42;:::i;:::-;;;;;;;;43317:11;42609:727;-1:-1:-1;;;;42609:727:0:o;26032:315::-;26189:28;26199:4;26205:2;26209:7;26189:9;:28::i;:::-;26236:48;26259:4;26265:2;26269:7;26278:5;26236:22;:48::i;:::-;26228:111;;;;-1:-1:-1;;;26228:111:0;;;;;;;:::i;48494:569::-;48632:20;;;48594:3;48632:20;;;;;;;;;48547:17;;48594:3;48577:14;;48594:3;48632:20;;;;;;;;;;-1:-1:-1;;48608:44:0;-1:-1:-1;48663:6:0;48690;48686:49;;-1:-1:-1;;48713:10:0;;;;;;;;;;;;-1:-1:-1;;;48713:10:0;;;;;48494:569;-1:-1:-1;;;48494:569:0:o;48686:49::-;48754:6;;48747:150;;48777:14;48794:6;48798:2;48794:1;:6;:::i;:::-;48777:23;-1:-1:-1;48819:6:0;48823:2;48819:1;:6;:::i;:::-;48815:10;-1:-1:-1;48869:14:0;48874:9;48869:2;:14;:::i;:::-;48856:29;;48840:8;48849:3;;;;:::i;:::-;;;48840:13;;;;;;;;:::i;:::-;;;;:45;-1:-1:-1;;;;;48840:45:0;;;;;;;;;48762:135;48747:150;;;48907:14;48934:5;:1;48938;48934:5;:::i;:::-;48924:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48924:16:0;;48907:33;;48956:6;48951:79;48973:1;48968;:6;48951:79;;49003:8;49012:5;49016:1;49012;:5;:::i;:::-;49003:15;;;;;;;;:::i;:::-;;;;;;;;;48996:1;48998;48996:4;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;48996:22:0;;;;;;;;-1:-1:-1;48976:3:0;;;;:::i;:::-;;;;48951:79;;;-1:-1:-1;49053:1:0;48494:569;-1:-1:-1;;;;;48494:569:0:o;48342:144::-;48415:13;48472:1;48475;48455:22;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48441:37;;48342:144;;;;:::o;28638:382::-;-1:-1:-1;;;;;28718:16:0;;28710:61;;;;-1:-1:-1;;;28710:61:0;;16870:2:1;28710:61:0;;;16852:21:1;;;16889:18;;;16882:30;16948:34;16928:18;;;16921:62;17000:18;;28710:61:0;16668:356:1;28710:61:0;26725:4;26749:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26749:16:0;:30;28782:58;;;;-1:-1:-1;;;28782:58:0;;12713:2:1;28782:58:0;;;12695:21:1;12752:2;12732:18;;;12725:30;12791;12771:18;;;12764:58;12839:18;;28782:58:0;12511:352:1;28782:58:0;-1:-1:-1;;;;;28911:13:0;;;;;;:9;:13;;;;;:18;;28928:1;;28911:13;:18;;28928:1;;28911:18;:::i;:::-;;;;-1:-1:-1;;28940:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28940:21:0;-1:-1:-1;;;;;28940:21:0;;;;;;;;28979:33;;28940:16;;;28979:33;;28940:16;;28979:33;28638:382;;:::o;31381:799::-;31536:4;-1:-1:-1;;;;;31557:13:0;;4037:20;4085:8;31553:620;;31593:72;;-1:-1:-1;;;31593:72:0;;-1:-1:-1;;;;;31593:36:0;;;;;:72;;2801:10;;31644:4;;31650:7;;31659:5;;31593:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31593:72:0;;;;;;;;-1:-1:-1;;31593:72:0;;;;;;;;;;;;:::i;:::-;;;31589:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31835:13:0;;31831:272;;31878:60;;-1:-1:-1;;;31878:60:0;;;;;;;:::i;31831:272::-;32053:6;32047:13;32038:6;32034:2;32030:15;32023:38;31589:529;-1:-1:-1;;;;;;31716:51:0;-1:-1:-1;;;31716:51:0;;-1:-1:-1;31709:58:0;;31553:620;-1:-1:-1;32157:4:0;31381:799;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:718::-;234:5;287:3;280:4;272:6;268:17;264:27;254:55;;305:1;302;295:12;254:55;341:6;328:20;367:18;404:2;400;397:10;394:36;;;410:18;;:::i;:::-;485:2;479:9;453:2;539:13;;-1:-1:-1;;535:22:1;;;559:2;531:31;527:40;515:53;;;583:18;;;603:22;;;580:46;577:72;;;629:18;;:::i;:::-;669:10;665:2;658:22;704:2;696:6;689:18;750:3;743:4;738:2;730:6;726:15;722:26;719:35;716:55;;;767:1;764;757:12;716:55;831:2;824:4;816:6;812:17;805:4;797:6;793:17;780:54;878:1;871:4;866:2;858:6;854:15;850:26;843:37;898:6;889:15;;;;;;192:718;;;;:::o;915:186::-;974:6;1027:2;1015:9;1006:7;1002:23;998:32;995:52;;;1043:1;1040;1033:12;995:52;1066:29;1085:9;1066:29;:::i;1106:260::-;1174:6;1182;1235:2;1223:9;1214:7;1210:23;1206:32;1203:52;;;1251:1;1248;1241:12;1203:52;1274:29;1293:9;1274:29;:::i;:::-;1264:39;;1322:38;1356:2;1345:9;1341:18;1322:38;:::i;:::-;1312:48;;1106:260;;;;;:::o;1371:328::-;1448:6;1456;1464;1517:2;1505:9;1496:7;1492:23;1488:32;1485:52;;;1533:1;1530;1523:12;1485:52;1556:29;1575:9;1556:29;:::i;:::-;1546:39;;1604:38;1638:2;1627:9;1623:18;1604:38;:::i;:::-;1594:48;;1689:2;1678:9;1674:18;1661:32;1651:42;;1371:328;;;;;:::o;1704:537::-;1799:6;1807;1815;1823;1876:3;1864:9;1855:7;1851:23;1847:33;1844:53;;;1893:1;1890;1883:12;1844:53;1916:29;1935:9;1916:29;:::i;:::-;1906:39;;1964:38;1998:2;1987:9;1983:18;1964:38;:::i;:::-;1954:48;;2049:2;2038:9;2034:18;2021:32;2011:42;;2104:2;2093:9;2089:18;2076:32;2131:18;2123:6;2120:30;2117:50;;;2163:1;2160;2153:12;2117:50;2186:49;2227:7;2218:6;2207:9;2203:22;2186:49;:::i;:::-;2176:59;;;1704:537;;;;;;;:::o;2246:347::-;2311:6;2319;2372:2;2360:9;2351:7;2347:23;2343:32;2340:52;;;2388:1;2385;2378:12;2340:52;2411:29;2430:9;2411:29;:::i;:::-;2401:39;;2490:2;2479:9;2475:18;2462:32;2537:5;2530:13;2523:21;2516:5;2513:32;2503:60;;2559:1;2556;2549:12;2503:60;2582:5;2572:15;;;2246:347;;;;;:::o;2598:254::-;2666:6;2674;2727:2;2715:9;2706:7;2702:23;2698:32;2695:52;;;2743:1;2740;2733:12;2695:52;2766:29;2785:9;2766:29;:::i;:::-;2756:39;2842:2;2827:18;;;;2814:32;;-1:-1:-1;;;2598:254:1:o;2857:883::-;2981:6;2989;2997;3005;3013;3066:3;3054:9;3045:7;3041:23;3037:33;3034:53;;;3083:1;3080;3073:12;3034:53;3106:29;3125:9;3106:29;:::i;:::-;3096:39;;3182:2;3171:9;3167:18;3154:32;3144:42;;3237:2;3226:9;3222:18;3209:32;3260:18;3301:2;3293:6;3290:14;3287:34;;;3317:1;3314;3307:12;3287:34;3340:49;3381:7;3372:6;3361:9;3357:22;3340:49;:::i;:::-;3330:59;;3442:2;3431:9;3427:18;3414:32;3398:48;;3471:2;3461:8;3458:16;3455:36;;;3487:1;3484;3477:12;3455:36;3510:51;3553:7;3542:8;3531:9;3527:24;3510:51;:::i;:::-;3500:61;;3614:3;3603:9;3599:19;3586:33;3570:49;;3644:2;3634:8;3631:16;3628:36;;;3660:1;3657;3650:12;3628:36;;3683:51;3726:7;3715:8;3704:9;3700:24;3683:51;:::i;:::-;3673:61;;;2857:883;;;;;;;;:::o;3745:388::-;3822:6;3830;3883:2;3871:9;3862:7;3858:23;3854:32;3851:52;;;3899:1;3896;3889:12;3851:52;3935:9;3922:23;3912:33;;3996:2;3985:9;3981:18;3968:32;4023:18;4015:6;4012:30;4009:50;;;4055:1;4052;4045:12;4009:50;4078:49;4119:7;4110:6;4099:9;4095:22;4078:49;:::i;:::-;4068:59;;;3745:388;;;;;:::o;4138:245::-;4196:6;4249:2;4237:9;4228:7;4224:23;4220:32;4217:52;;;4265:1;4262;4255:12;4217:52;4304:9;4291:23;4323:30;4347:5;4323:30;:::i;4388:249::-;4457:6;4510:2;4498:9;4489:7;4485:23;4481:32;4478:52;;;4526:1;4523;4516:12;4478:52;4558:9;4552:16;4577:30;4601:5;4577:30;:::i;4642:320::-;4710:6;4763:2;4751:9;4742:7;4738:23;4734:32;4731:52;;;4779:1;4776;4769:12;4731:52;4819:9;4806:23;4852:18;4844:6;4841:30;4838:50;;;4884:1;4881;4874:12;4838:50;4907:49;4948:7;4939:6;4928:9;4924:22;4907:49;:::i;4967:457::-;5054:6;5062;5070;5123:2;5111:9;5102:7;5098:23;5094:32;5091:52;;;5139:1;5136;5129:12;5091:52;5179:9;5166:23;5212:18;5204:6;5201:30;5198:50;;;5244:1;5241;5234:12;5198:50;5267:49;5308:7;5299:6;5288:9;5284:22;5267:49;:::i;:::-;5257:59;5363:2;5348:18;;5335:32;;-1:-1:-1;5414:2:1;5399:18;;;5386:32;;4967:457;-1:-1:-1;;;;4967:457:1:o;5429:180::-;5488:6;5541:2;5529:9;5520:7;5516:23;5512:32;5509:52;;;5557:1;5554;5547:12;5509:52;-1:-1:-1;5580:23:1;;5429:180;-1:-1:-1;5429:180:1:o;6008:248::-;6076:6;6084;6137:2;6125:9;6116:7;6112:23;6108:32;6105:52;;;6153:1;6150;6143:12;6105:52;-1:-1:-1;;6176:23:1;;;6246:2;6231:18;;;6218:32;;-1:-1:-1;6008:248:1:o;6261:257::-;6302:3;6340:5;6334:12;6367:6;6362:3;6355:19;6383:63;6439:6;6432:4;6427:3;6423:14;6416:4;6409:5;6405:16;6383:63;:::i;:::-;6500:2;6479:15;-1:-1:-1;;6475:29:1;6466:39;;;;6507:4;6462:50;;6261:257;-1:-1:-1;;6261:257:1:o;6523:276::-;6654:3;6692:6;6686:13;6708:53;6754:6;6749:3;6742:4;6734:6;6730:17;6708:53;:::i;:::-;6777:16;;;;;6523:276;-1:-1:-1;;6523:276:1:o;6804:470::-;6983:3;7021:6;7015:13;7037:53;7083:6;7078:3;7071:4;7063:6;7059:17;7037:53;:::i;:::-;7153:13;;7112:16;;;;7175:57;7153:13;7112:16;7209:4;7197:17;;7175:57;:::i;:::-;7248:20;;6804:470;-1:-1:-1;;;;6804:470:1:o;7872:488::-;-1:-1:-1;;;;;8141:15:1;;;8123:34;;8193:15;;8188:2;8173:18;;8166:43;8240:2;8225:18;;8218:34;;;8288:3;8283:2;8268:18;;8261:31;;;8066:4;;8309:45;;8334:19;;8326:6;8309:45;:::i;:::-;8301:53;7872:488;-1:-1:-1;;;;;;7872:488:1:o;8365:632::-;8536:2;8588:21;;;8658:13;;8561:18;;;8680:22;;;8507:4;;8536:2;8759:15;;;;8733:2;8718:18;;;8507:4;8802:169;8816:6;8813:1;8810:13;8802:169;;;8877:13;;8865:26;;8946:15;;;;8911:12;;;;8838:1;8831:9;8802:169;;;-1:-1:-1;8988:3:1;;8365:632;-1:-1:-1;;;;;;8365:632:1:o;9928:219::-;10077:2;10066:9;10059:21;10040:4;10097:44;10137:2;10126:9;10122:18;10114:6;10097:44;:::i;10152:462::-;10371:2;10360:9;10353:21;10334:4;10397:44;10437:2;10426:9;10422:18;10414:6;10397:44;:::i;:::-;10489:9;10481:6;10477:22;10472:2;10461:9;10457:18;10450:50;10517:32;10542:6;10534;10517:32;:::i;:::-;10509:40;;;10599:6;10592:14;10585:22;10580:2;10569:9;10565:18;10558:50;10152:462;;;;;;:::o;10619:707::-;10912:3;10901:9;10894:22;10875:4;10939:45;10979:3;10968:9;10964:19;10956:6;10939:45;:::i;:::-;11032:9;11024:6;11020:22;11015:2;11004:9;11000:18;10993:50;11066:32;11091:6;11083;11066:32;:::i;:::-;11052:46;;11146:9;11138:6;11134:22;11129:2;11118:9;11114:18;11107:50;11180:32;11205:6;11197;11180:32;:::i;:::-;11166:46;;11260:9;11252:6;11248:22;11243:2;11232:9;11228:18;11221:50;11288:32;11313:6;11305;11288:32;:::i;11331:334::-;11533:2;11515:21;;;11572:2;11552:18;;;11545:30;-1:-1:-1;;;11606:2:1;11591:18;;11584:40;11656:2;11641:18;;11331:334::o;11670:414::-;11872:2;11854:21;;;11911:2;11891:18;;;11884:30;11950:34;11945:2;11930:18;;11923:62;-1:-1:-1;;;12016:2:1;12001:18;;11994:48;12074:3;12059:19;;11670:414::o;13979:334::-;14181:2;14163:21;;;14220:2;14200:18;;;14193:30;-1:-1:-1;;;14254:2:1;14239:18;;14232:40;14304:2;14289:18;;13979:334::o;14731:340::-;14933:2;14915:21;;;14972:2;14952:18;;;14945:30;-1:-1:-1;;;15006:2:1;14991:18;;14984:46;15062:2;15047:18;;14731:340::o;19396:413::-;19598:2;19580:21;;;19637:2;19617:18;;;19610:30;19676:34;19671:2;19656:18;;19649:62;-1:-1:-1;;;19742:2:1;19727:18;;19720:47;19799:3;19784:19;;19396:413::o;21045:290::-;21222:6;21211:9;21204:25;21265:2;21260;21249:9;21245:18;21238:30;21185:4;21285:44;21325:2;21314:9;21310:18;21302:6;21285:44;:::i;21746:128::-;21786:3;21817:1;21813:6;21810:1;21807:13;21804:39;;;21823:18;;:::i;:::-;-1:-1:-1;21859:9:1;;21746:128::o;21879:120::-;21919:1;21945;21935:35;;21950:18;;:::i;:::-;-1:-1:-1;21984:9:1;;21879:120::o;22004:168::-;22044:7;22110:1;22106;22102:6;22098:14;22095:1;22092:21;22087:1;22080:9;22073:17;22069:45;22066:71;;;22117:18;;:::i;:::-;-1:-1:-1;22157:9:1;;22004:168::o;22177:125::-;22217:4;22245:1;22242;22239:8;22236:34;;;22250:18;;:::i;:::-;-1:-1:-1;22287:9:1;;22177:125::o;22307:258::-;22379:1;22389:113;22403:6;22400:1;22397:13;22389:113;;;22479:11;;;22473:18;22460:11;;;22453:39;22425:2;22418:10;22389:113;;;22520:6;22517:1;22514:13;22511:48;;;-1:-1:-1;;22555:1:1;22537:16;;22530:27;22307:258::o;22570:380::-;22649:1;22645:12;;;;22692;;;22713:61;;22767:4;22759:6;22755:17;22745:27;;22713:61;22820:2;22812:6;22809:14;22789:18;22786:38;22783:161;;;22866:10;22861:3;22857:20;22854:1;22847:31;22901:4;22898:1;22891:15;22929:4;22926:1;22919:15;22955:135;22994:3;-1:-1:-1;;23015:17:1;;23012:43;;;23035:18;;:::i;:::-;-1:-1:-1;23082:1:1;23071:13;;22955:135::o;23095:112::-;23127:1;23153;23143:35;;23158:18;;:::i;:::-;-1:-1:-1;23192:9:1;;23095:112::o;23212:127::-;23273:10;23268:3;23264:20;23261:1;23254:31;23304:4;23301:1;23294:15;23328:4;23325:1;23318:15;23344:127;23405:10;23400:3;23396:20;23393:1;23386:31;23436:4;23433:1;23426:15;23460:4;23457:1;23450:15;23476:127;23537:10;23532:3;23528:20;23525:1;23518:31;23568:4;23565:1;23558:15;23592:4;23589:1;23582:15;23608:127;23669:10;23664:3;23660:20;23657:1;23650:31;23700:4;23697:1;23690:15;23724:4;23721:1;23714:15;23740:131;-1:-1:-1;;;;;;23814:32:1;;23804:43;;23794:71;;23861:1;23858;23851:12;23794:71;23740:131;:::o

Swarm Source

ipfs://a037f9e160497ceeaf0c78386b53dbaeb5b1e8c3f152ccc47cc9020963ebdeb2
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.