ETH Price: $3,422.59 (-5.58%)

Token

Gallery Membership Cards (GMC)
 

Overview

Max Total Supply

1,199 GMC

Holders

1,103

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
8270.eth
0xb697b9455eeee9574ec5c5350cb10c8a5b752a39
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Your NFTs deserve a beautiful home. Curate your pieces, connect with other collectors, and express yourself through ownership. [FAQ](https://gallery-so.notion.site/Gallery-FAQ-b5ee57c1d7f74c6695e42c84cb6964ba)

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Invite1155

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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

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

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

/**
 * @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;
}

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256 id,
        uint256 value
    );

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(
        address indexed account,
        address indexed operator,
        bool approved
    );

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id)
        external
        view
        returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator)
        external
        view
        returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

library StringUtils {
    /// @dev Does a byte-by-byte lexicographical comparison of two strings.
    /// @return a negative number if `_a` is smaller, zero if they are equal
    /// and a positive numbe if `_b` is smaller.
    function compare(string memory _a, string memory _b)
        internal
        pure
        returns (int256)
    {
        bytes memory a = bytes(_a);
        bytes memory b = bytes(_b);
        uint256 minLength = a.length;
        if (b.length < minLength) minLength = b.length;
        //@todo unroll the loop into increments of 32 and do full 32 byte comparisons
        for (uint256 i = 0; i < minLength; i++)
            if (a[i] < b[i]) return -1;
            else if (a[i] > b[i]) return 1;
        if (a.length < b.length) return -1;
        else if (a.length > b.length) return 1;
        else return 0;
    }

    /// @dev Compares two strings and returns true iff they are equal.
    function equal(string memory _a, string memory _b)
        internal
        pure
        returns (bool)
    {
        return compare(_a, _b) == 0;
    }

    /// @dev Finds the index of the first occurrence of _needle in _haystack
    function indexOf(string memory _haystack, string memory _needle)
        internal
        pure
        returns (int256)
    {
        bytes memory h = bytes(_haystack);
        bytes memory n = bytes(_needle);
        if (h.length < 1 || n.length < 1 || (n.length > h.length)) return -1;
        else if (h.length > (2**128 - 1))
            // since we have to be able to return -1 (if the char isn't found or input error), this function must return an "int" type with a max length of (2^128 - 1)
            return -1;
        else {
            uint256 subindex = 0;
            for (uint256 i = 0; i < h.length; i++) {
                if (h[i] == n[0]) // found the first char of b
                {
                    subindex = 1;
                    while (
                        subindex < n.length &&
                        (i + subindex) < h.length &&
                        h[i + subindex] == n[subindex] // search until the chars don't match or until we reach the end of a or b
                    ) {
                        subindex++;
                    }
                    if (subindex == n.length) return int256(i);
                }
            }
            return -1;
        }
    }
}

contract Whitelistable {
    using Address for address;
    using StringUtils for string;

    enum Specification {
        NONE,
        ERC721,
        ERC20
    }

    struct WhitelistCheck {
        Specification specification;
        address tokenAddress;
    }
    mapping(uint256 => WhitelistCheck) private whitelist;

    function setWhitelistCheck(
        string memory specification,
        address tokenAddress,
        uint256 _id
    ) public virtual {
        require(tokenAddress.isContract(), "Token address must be a contract");
        whitelist[_id].specification = specificationByValue(specification);
        whitelist[_id].tokenAddress = tokenAddress;
    }

    function isWhitelisted(address wallet, uint256 _id)
        internal
        view
        returns (bool)
    {
        if (whitelist[_id].specification == Specification.ERC721) {
            try IERC721(whitelist[_id].tokenAddress).balanceOf(wallet) {
                return
                    IERC721(whitelist[_id].tokenAddress).balanceOf(wallet) > 0;
            } catch Error(string memory) {
                return false;
            }
        } else if (whitelist[_id].specification == Specification.ERC20) {
            try IERC20(whitelist[_id].tokenAddress).balanceOf(wallet) {
                return
                    IERC20(whitelist[_id].tokenAddress).balanceOf(wallet) > 0;
            } catch Error(string memory) {
                return false;
            }
        } else {
            return false;
        }
    }

    function specificationByValue(string memory value)
        private
        pure
        returns (Specification)
    {
        if (value.equal("ERC721") || value.equal("ERC-721")) {
            return Specification.ERC721;
        } else if (value.equal("ERC20") || value.equal("ERC-20")) {
            return Specification.ERC20;
        } else {
            revert("Unknown specification");
        }
    }
}

/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) internal balances;

    // Mapping from account to operator approvals
    mapping(address => mapping(address => bool)) internal operatorApprovals;

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            account != address(0),
            "ERC1155: balance query for the zero address"
        );
        return balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(
            accounts.length == ids.length,
            "ERC1155: accounts and ids length mismatch"
        );

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        require(
            _msgSender() != operator,
            "ERC1155: setting approval status for self"
        );

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(
            operator,
            from,
            to,
            _asSingletonArray(id),
            _asSingletonArray(amount),
            data
        );

        uint256 fromBalance = balances[id][from];
        require(
            fromBalance >= amount,
            "ERC1155: insufficient balance for transfer"
        );
        unchecked {
            balances[id][from] = fromBalance - amount;
        }

        balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(
            ids.length == amounts.length,
            "ERC1155: ids and amounts length mismatch"
        );
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = balances[id][from];
            require(
                fromBalance >= amount,
                "ERC1155: insufficient balance for transfer"
            );
            unchecked {
                balances[id][from] = fromBalance - amount;
            }

            balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(
            operator,
            from,
            to,
            ids,
            amounts,
            data
        );
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `account`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - If `account` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address account,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(account != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(
            operator,
            address(0),
            account,
            _asSingletonArray(id),
            _asSingletonArray(amount),
            data
        );

        balances[id][account] += amount;
        emit TransferSingle(operator, address(0), account, id, amount);

        _doSafeTransferAcceptanceCheck(
            operator,
            address(0),
            account,
            id,
            amount,
            data
        );
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(
            ids.length == amounts.length,
            "ERC1155: ids and amounts length mismatch"
        );

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(
            operator,
            address(0),
            to,
            ids,
            amounts,
            data
        );
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `account`
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address account,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(account != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(
            operator,
            account,
            address(0),
            _asSingletonArray(id),
            _asSingletonArray(amount),
            ""
        );

        uint256 accountBalance = balances[id][account];
        require(
            accountBalance >= amount,
            "ERC1155: burn amount exceeds balance"
        );
        unchecked {
            balances[id][account] = accountBalance - amount;
        }

        emit TransferSingle(operator, account, address(0), id, amount);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(account != address(0), "ERC1155: burn from the zero address");
        require(
            ids.length == amounts.length,
            "ERC1155: ids and amounts length mismatch"
        );

        address operator = _msgSender();

        _beforeTokenTransfer(operator, account, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 accountBalance = balances[id][account];
            require(
                accountBalance >= amount,
                "ERC1155: burn amount exceeds balance"
            );
            unchecked {
                balances[id][account] = accountBalance - amount;
            }
        }

        emit TransferBatch(operator, account, address(0), ids, amounts);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal {
        if (to.isContract()) {
            try
                IERC1155Receiver(to).onERC1155Received(
                    operator,
                    from,
                    id,
                    amount,
                    data
                )
            returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal {
        if (to.isContract()) {
            try
                IERC1155Receiver(to).onERC1155BatchReceived(
                    operator,
                    from,
                    ids,
                    amounts,
                    data
                )
            returns (bytes4 response) {
                if (
                    response != IERC1155Receiver.onERC1155BatchReceived.selector
                ) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element)
        internal
        pure
        returns (uint256[] memory)
    {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

contract Invite1155 is ERC1155, Ownable, Whitelistable, ReentrancyGuard {
    using Strings for uint256;
    using Address for address payable;

    constructor(string memory _name, string memory _symbol) ERC1155("") {
        name = _name;
        symbol = _symbol;
    }

    struct TokenType {
        string uri;
        uint256 price;
        uint256 usedSupply;
        uint256 totalSupply;
    }

    mapping(uint256 => TokenType) _tokenTypes;
    mapping(uint256 => mapping(address => bool)) private _mintApprovals;
    mapping(address => mapping(uint256 => bool)) private _hasMinted;

    bool private canMint;

    string public name;
    string public symbol;

    function createType(
        uint256 _id,
        string memory _uri,
        uint256 _price,
        uint256 _totalSupply
    ) public onlyOwner {
        require(
            _tokenTypes[_id].totalSupply == 0,
            "Invite: type already defined"
        );
        require(
            _totalSupply > 0,
            "Invite: must set an above zero total supply"
        );
        require(bytes(_uri).length > 0, "Invite: must set a URI");
        TokenType memory tokenType;
        tokenType.uri = _uri;
        tokenType.price = _price;
        tokenType.usedSupply = 0;
        tokenType.totalSupply = _totalSupply;
        _tokenTypes[_id] = tokenType;
    }

    function uri(uint256 it)
        public
        view
        virtual
        override
        returns (string memory)
    {
        return _tokenTypes[it].uri;
    }

    function setCanMint(bool _canMint) public onlyOwner {
        canMint = _canMint;
    }

    function setPrice(uint256 id, uint256 price) public onlyOwner {
        _tokenTypes[id].price = price;
    }

    function getUsedSupply(uint256 id) public view returns (uint256) {
        return _tokenTypes[id].usedSupply;
    }

    function getTotalSupply(uint256 id) public view returns (uint256) {
        return _tokenTypes[id].totalSupply;
    }

    function getPrice(uint256 id) public view returns (uint256) {
        return _tokenTypes[id].price;
    }

    function mintToMany(address[] calldata _to, uint256 _id)
        external
        onlyOwner
    {
        require(
            _tokenTypes[_id].usedSupply + _to.length <
                _tokenTypes[_id].totalSupply,
            "Invite: total supply used up"
        );
        for (uint256 i = 0; i < _to.length; ++i) {
            address to = _to[i];
            require(
                !_hasMinted[to][_id] && balanceOf(to, _id) == 0,
                "Invite: cannot own more than one of an Invite"
            );
            _tokenTypes[_id].usedSupply++;
            _hasMinted[to][_id] = true;
            _mint(to, _id, 1, "");
        }
    }

    function mint(address to, uint256 id) external payable nonReentrant {
        require(canMint, "Invite: minting is disabled");
        require(
            _tokenTypes[id].usedSupply + 1 < _tokenTypes[id].totalSupply,
            "Invite: total supply used up"
        );
        require(
            balanceOf(to, id) == 0 && !_hasMinted[to][id],
            "Invite: cannot own more than one of an Invite"
        );
        if (_tokenTypes[id].price > 0) {
            require(
                msg.value >= _tokenTypes[id].price ||
                    (_mintApprovals[id][to] || isWhitelisted(to, id)),
                "Invite: not whitelisted and msg.value is not correct price"
            );
        } else {
            require(
                _mintApprovals[id][to] || isWhitelisted(to, id),
                "Invite: not approved to mint"
            );
            require(
                msg.value == 0,
                "Invite: sent value for non-payable token ID"
            );
        }
        _mintApprovals[id][to] = false;
        _tokenTypes[id].usedSupply++;
        _hasMinted[to][id] = true;
        _mint(to, id, 1, bytes(""));
    }

    function setMintApproval(
        address spender,
        bool value,
        uint256 id
    ) external onlyOwner {
        _mintApprovals[id][spender] = value;
    }

    function setMintApprovals(
        address[] calldata spenders,
        bool[] calldata values,
        uint256 id
    ) external onlyOwner {
        require(
            spenders.length == values.length,
            "Invite: spender and amounts arrays must be the same length"
        );
        for (uint256 i = 0; i < spenders.length; ++i) {
            _mintApprovals[id][spenders[i]] = values[i];
        }
    }

    function isMintApproved(address spender, uint256 id)
        external
        view
        returns (bool)
    {
        return _mintApprovals[id][spender];
    }

    function canMintToken(address minter, uint256 id)
        external
        view
        returns (bool)
    {
        return
            _tokenTypes[id].price > 0 ||
            _mintApprovals[id][minter] ||
            isWhitelisted(minter, id);
    }

    function setWhitelistCheck(
        string memory specification,
        address tokenAddress,
        uint256 _id
    ) public virtual override onlyOwner {
        super.setWhitelistCheck(specification, tokenAddress, _id);
    }

    function withdraw(uint256 amount, address payable to) external onlyOwner {
        require(address(this).balance >= amount, "Invite: not enough balance");
        if (amount == 0) {
            amount = address(this).balance;
        }
        if (to == address(0)) {
            to = payable(msg.sender);
        }
        to.sendValue(amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"canMintToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_totalSupply","type":"uint256"}],"name":"createType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getUsedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"isMintApproved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"mintToMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_canMint","type":"bool"}],"name":"setCanMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"bool","name":"value","type":"bool"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"setMintApproval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"spenders","type":"address[]"},{"internalType":"bool[]","name":"values","type":"bool[]"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"setMintApprovals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"specification","type":"string"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"setWhitelistCheck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"it","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address payable","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604051620032f1380380620032f1833981016040819052620000349162000257565b6040805160208101909152600081526200004e8162000093565b506200005a33620000ac565b600160055581516200007490600a906020850190620000fe565b5080516200008a90600b906020840190620000fe565b50505062000311565b8051620000a8906002906020840190620000fe565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200010c90620002be565b90600052602060002090601f0160209004810192826200013057600085556200017b565b82601f106200014b57805160ff19168380011785556200017b565b828001600101855582156200017b579182015b828111156200017b5782518255916020019190600101906200015e565b50620001899291506200018d565b5090565b5b808211156200018957600081556001016200018e565b600082601f830112620001b5578081fd5b81516001600160401b0380821115620001d257620001d2620002fb565b604051601f8301601f19908116603f01168101908282118183101715620001fd57620001fd620002fb565b8160405283815260209250868385880101111562000219578485fd5b8491505b838210156200023c57858201830151818301840152908201906200021d565b838211156200024d57848385830101525b9695505050505050565b600080604083850312156200026a578182fd5b82516001600160401b038082111562000281578384fd5b6200028f86838701620001a4565b93506020850151915080821115620002a5578283fd5b50620002b485828601620001a4565b9150509250929050565b600181811c90821680620002d357607f821691505b60208210811415620002f557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b612fd080620003216000396000f3fe60806040526004361061019a5760003560e01c80638a0b0360116100ec578063c9409c921161008a578063e985e9c511610064578063e985e9c5146104ed578063f242432a14610536578063f2fde38b14610556578063f7d975771461057657600080fd5b8063c9409c921461046d578063dd0d65401461048d578063e7572230146104bd57600080fd5b806395d89b41116100c657806395d89b41146103d35780639a57829a146103e8578063a22cb46514610408578063a8234dcb1461042857600080fd5b80638a0b03601461035b5780638da5cb5b1461037b57806392ab723e146103a357600080fd5b80632eb2c2d6116101595780634e1273f4116101335780634e1273f4146102d957806364cf572114610306578063715018a614610326578063813e0a6c1461033b57600080fd5b80632eb2c2d61461028657806340c10f19146102a65780634ae34c33146102b957600080fd5b8062f714ce1461019f578062fdd58e146101c157806301ffc9a7146101f457806306fdde03146102245780630e89341c1461024657806321d8c77714610266575b600080fd5b3480156101ab57600080fd5b506101bf6101ba366004612a77565b610596565b005b3480156101cd57600080fd5b506101e16101dc3660046127ee565b61064a565b6040519081526020015b60405180910390f35b34801561020057600080fd5b5061021461020f3660046129b8565b6106df565b60405190151581526020016101eb565b34801561023057600080fd5b5061023961072f565b6040516101eb9190612c79565b34801561025257600080fd5b50610239610261366004612a47565b6107bd565b34801561027257600080fd5b506101bf6102813660046129f0565b61085f565b34801561029257600080fd5b506101bf6102a136600461266e565b610899565b6101bf6102b43660046127ee565b610930565b3480156102c557600080fd5b506101bf6102d43660046127b1565b610d00565b3480156102e557600080fd5b506102f96102f43660046128d2565b610d61565b6040516101eb9190612c38565b34801561031257600080fd5b506102146103213660046127ee565b610ec2565b34801561033257600080fd5b506101bf610f1a565b34801561034757600080fd5b506101bf610356366004612a9b565b610f50565b34801561036757600080fd5b506101bf610376366004612889565b611113565b34801561038757600080fd5b506003546040516001600160a01b0390911681526020016101eb565b3480156103af57600080fd5b506101e16103be366004612a47565b60009081526006602052604090206003015490565b3480156103df57600080fd5b506102396112cd565b3480156103f457600080fd5b506101bf61040336600461299e565b6112da565b34801561041457600080fd5b506101bf61042336600461277d565b611317565b34801561043457600080fd5b506102146104433660046127ee565b60009081526007602090815260408083206001600160a01b03949094168352929052205460ff1690565b34801561047957600080fd5b506101bf610488366004612819565b6113ee565b34801561049957600080fd5b506101e16104a8366004612a47565b60009081526006602052604090206002015490565b3480156104c957600080fd5b506101e16104d8366004612a47565b60009081526006602052604090206001015490565b3480156104f957600080fd5b50610214610508366004612636565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561054257600080fd5b506101bf610551366004612717565b611551565b34801561056257600080fd5b506101bf61057136600461261a565b6115d8565b34801561058257600080fd5b506101bf610591366004612aef565b611673565b6003546001600160a01b031633146105c95760405162461bcd60e51b81526004016105c090612db0565b60405180910390fd5b814710156106195760405162461bcd60e51b815260206004820152601a60248201527f496e766974653a206e6f7420656e6f7567682062616c616e636500000000000060448201526064016105c0565b81610622574791505b6001600160a01b0381166106335750335b6106466001600160a01b038216836116b2565b5050565b60006001600160a01b0383166106b65760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016105c0565b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b148061071057506001600160e01b031982166303a24d0760e21b145b806106d957506301ffc9a760e01b6001600160e01b03198316146106d9565b600a805461073c90612e20565b80601f016020809104026020016040519081016040528092919081815260200182805461076890612e20565b80156107b55780601f1061078a576101008083540402835291602001916107b5565b820191906000526020600020905b81548152906001019060200180831161079857829003601f168201915b505050505081565b60008181526006602052604090208054606091906107da90612e20565b80601f016020809104026020016040519081016040528092919081815260200182805461080690612e20565b80156108535780601f1061082857610100808354040283529160200191610853565b820191906000526020600020905b81548152906001019060200180831161083657829003601f168201915b50505050509050919050565b6003546001600160a01b031633146108895760405162461bcd60e51b81526004016105c090612db0565b6108948383836117cb565b505050565b6001600160a01b0385163314806108b557506108b58533610508565b61091c5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016105c0565b610929858585858561189b565b5050505050565b600260055414156109835760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016105c0565b600260055560095460ff166109da5760405162461bcd60e51b815260206004820152601b60248201527f496e766974653a206d696e74696e672069732064697361626c6564000000000060448201526064016105c0565b600081815260066020526040902060038101546002909101546109fe906001612e08565b10610a4b5760405162461bcd60e51b815260206004820152601c60248201527f496e766974653a20746f74616c20737570706c7920757365642075700000000060448201526064016105c0565b610a55828261064a565b158015610a8657506001600160a01b038216600090815260086020908152604080832084845290915290205460ff16155b610aa25760405162461bcd60e51b81526004016105c090612cd4565b60008181526006602052604090206001015415610b815760008181526006602052604090206001015434101580610b0a575060008181526007602090815260408083206001600160a01b038616845290915290205460ff1680610b0a5750610b0a8282611a8c565b610b7c5760405162461bcd60e51b815260206004820152603a60248201527f496e766974653a206e6f742077686974656c697374656420616e64206d73672e60448201527f76616c7565206973206e6f7420636f727265637420707269636500000000000060648201526084016105c0565b610c65565b60008181526007602090815260408083206001600160a01b038616845290915290205460ff1680610bb75750610bb78282611a8c565b610c035760405162461bcd60e51b815260206004820152601c60248201527f496e766974653a206e6f7420617070726f76656420746f206d696e740000000060448201526064016105c0565b3415610c655760405162461bcd60e51b815260206004820152602b60248201527f496e766974653a2073656e742076616c756520666f72206e6f6e2d706179616260448201526a1b19481d1bdad95b88125160aa1b60648201526084016105c0565b60008181526007602090815260408083206001600160a01b03861684528252808320805460ff1916905583835260069091528120600201805491610ca883612e87565b90915550506001600160a01b03821660009081526008602090815260408083208484528252808320805460ff191660019081179091558151928301909152918152610cf7918491849190611cb8565b50506001600555565b6003546001600160a01b03163314610d2a5760405162461bcd60e51b81526004016105c090612db0565b60009081526007602090815260408083206001600160a01b0395909516835293905291909120805460ff1916911515919091179055565b60608151835114610dc65760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016105c0565b600083516001600160401b03811115610def57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610e18578160200160208202803683370190505b50905060005b8451811015610eba57610e7f858281518110610e4a57634e487b7160e01b600052603260045260246000fd5b6020026020010151858381518110610e7257634e487b7160e01b600052603260045260246000fd5b602002602001015161064a565b828281518110610e9f57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152610eb381612e87565b9050610e1e565b509392505050565b600081815260066020526040812060010154151580610f03575060008281526007602090815260408083206001600160a01b038716845290915290205460ff165b80610f135750610f138383611a8c565b9392505050565b6003546001600160a01b03163314610f445760405162461bcd60e51b81526004016105c090612db0565b610f4e6000611dc2565b565b6003546001600160a01b03163314610f7a5760405162461bcd60e51b81526004016105c090612db0565b60008481526006602052604090206003015415610fd95760405162461bcd60e51b815260206004820152601c60248201527f496e766974653a207479706520616c726561647920646566696e65640000000060448201526064016105c0565b6000811161103d5760405162461bcd60e51b815260206004820152602b60248201527f496e766974653a206d7573742073657420616e2061626f7665207a65726f207460448201526a6f74616c20737570706c7960a81b60648201526084016105c0565b60008351116110875760405162461bcd60e51b8152602060048201526016602482015275496e766974653a206d7573742073657420612055524960501b60448201526064016105c0565b6110b26040518060800160405280606081526020016000815260200160008152602001600081525090565b838152602080820184905260006040808401829052606084018590528782526006835290208251805184936110eb928492910190612446565b5060208201516001820155604082015160028201556060909101516003909101555050505050565b6003546001600160a01b0316331461113d5760405162461bcd60e51b81526004016105c090612db0565b60008181526006602052604090206003810154600290910154611161908490612e08565b106111ae5760405162461bcd60e51b815260206004820152601c60248201527f496e766974653a20746f74616c20737570706c7920757365642075700000000060448201526064016105c0565b60005b828110156112c75760008484838181106111db57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906111f0919061261a565b6001600160a01b038116600090815260086020908152604080832087845290915290205490915060ff1615801561122e575061122c818461064a565b155b61124a5760405162461bcd60e51b81526004016105c090612cd4565b600083815260066020526040812060020180549161126783612e87565b90915550506001600160a01b03811660009081526008602090815260408083208684528252808320805460ff1916600190811790915581519283019091529181526112b6918391869190611cb8565b506112c081612e87565b90506111b1565b50505050565b600b805461073c90612e20565b6003546001600160a01b031633146113045760405162461bcd60e51b81526004016105c090612db0565b6009805460ff1916911515919091179055565b336001600160a01b03831614156113825760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016105c0565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6003546001600160a01b031633146114185760405162461bcd60e51b81526004016105c090612db0565b83821461148d5760405162461bcd60e51b815260206004820152603a60248201527f496e766974653a207370656e64657220616e6420616d6f756e7473206172726160448201527f7973206d757374206265207468652073616d65206c656e67746800000000000060648201526084016105c0565b60005b84811015611549578383828181106114b857634e487b7160e01b600052603260045260246000fd5b90506020020160208101906114cd919061299e565b6000838152600760205260408120908888858181106114fc57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611511919061261a565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905561154281612e87565b9050611490565b505050505050565b6001600160a01b03851633148061156d575061156d8533610508565b6115cb5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b60648201526084016105c0565b6109298585858585611e14565b6003546001600160a01b031633146116025760405162461bcd60e51b81526004016105c090612db0565b6001600160a01b0381166116675760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105c0565b61167081611dc2565b50565b6003546001600160a01b0316331461169d5760405162461bcd60e51b81526004016105c090612db0565b60009182526006602052604090912060010155565b804710156117025760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016105c0565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461174f576040519150601f19603f3d011682016040523d82523d6000602084013e611754565b606091505b50509050806108945760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016105c0565b6001600160a01b0382163b6118225760405162461bcd60e51b815260206004820181905260248201527f546f6b656e2061646472657373206d757374206265206120636f6e747261637460448201526064016105c0565b61182b83611f31565b6000828152600460205260409020805460ff1916600183600281111561186157634e487b7160e01b600052602160045260246000fd5b0217905550600090815260046020526040902080546001600160a01b0390921661010002610100600160a81b031990921691909117905550565b81518351146118fd5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b60648201526084016105c0565b6001600160a01b0384166119235760405162461bcd60e51b81526004016105c090612d21565b3360005b8451811015611a2657600085828151811061195257634e487b7160e01b600052603260045260246000fd5b60200260200101519050600085838151811061197e57634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156119ce5760405162461bcd60e51b81526004016105c090612d66565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611a0b908490612e08565b9250508190555050505080611a1f90612e87565b9050611927565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611a76929190612c4b565b60405180910390a4611549818787878787612047565b6000600160008381526004602052604090205460ff166002811115611ac157634e487b7160e01b600052602160045260246000fd5b1415611c30576000828152600460208190526040918290205491516370a0823160e01b81526001600160a01b038681169282019290925261010090920416906370a08231906024015b60206040518083038186803b158015611b2257600080fd5b505afa925050508015611b52575060408051601f3d908101601f19168201909252611b4f91810190612a5f565b60015b611b9457611b5e612ece565b806308c379a01415611b885750611b73612ee6565b80611b7e5750611b8a565b60009150506106d9565b505b3d6000803e3d6000fd5b5060008281526004602081905260408083205490516370a0823160e01b81526001600160a01b0387811693820193909352610100909104909116906370a082319060240160206040518083038186803b158015611bf057600080fd5b505afa158015611c04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c289190612a5f565b1190506106d9565b600260008381526004602052604090205460ff166002811115611c6357634e487b7160e01b600052602160045260246000fd5b1415611cb0576000828152600460208190526040918290205491516370a0823160e01b81526001600160a01b038681169282019290925261010090920416906370a0823190602401611b0a565b5060006106d9565b6001600160a01b038416611d185760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016105c0565b33611d3281600087611d29886121b2565b610929886121b2565b6000848152602081815260408083206001600160a01b038916845290915281208054859290611d62908490612e08565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46109298160008787878761220b565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038416611e3a5760405162461bcd60e51b81526004016105c090612d21565b33611e4a818787611d29886121b2565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015611e8b5760405162461bcd60e51b81526004016105c090612d66565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290611ec8908490612e08565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611f2882888888888861220b565b50505050505050565b6000611f646040518060400160405280600681526020016545524337323160d01b815250836122d590919063ffffffff16565b80611f9357506040805180820190915260078152664552432d37323160c81b6020820152611f939083906122d5565b15611fa057506001919050565b604080518082019091526005815264045524332360dc1b6020820152611fc79083906122d5565b80611ff5575060408051808201909152600681526504552432d32360d41b6020820152611ff59083906122d5565b1561200257506002919050565b60405162461bcd60e51b81526020600482015260156024820152742ab735b737bbb71039b832b1b4b334b1b0ba34b7b760591b60448201526064016105c0565b919050565b6001600160a01b0384163b156115495760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061208b9089908990889088908890600401612b95565b602060405180830381600087803b1580156120a557600080fd5b505af19250505080156120d5575060408051601f3d908101601f191682019092526120d2918101906129d4565b60015b612182576120e1612ece565b806308c379a0141561211b57506120f6612ee6565b80612101575061211d565b8060405162461bcd60e51b81526004016105c09190612c79565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016105c0565b6001600160e01b0319811663bc197c8160e01b14611f285760405162461bcd60e51b81526004016105c090612c8c565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106121fa57634e487b7160e01b600052603260045260246000fd5b602090810291909101015292915050565b6001600160a01b0384163b156115495760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061224f9089908990889088908890600401612bf3565b602060405180830381600087803b15801561226957600080fd5b505af1925050508015612299575060408051601f3d908101601f19168201909252612296918101906129d4565b60015b6122a5576120e1612ece565b6001600160e01b0319811663f23a6e6160e01b14611f285760405162461bcd60e51b81526004016105c090612c8c565b60006122e183836122e9565b159392505050565b815181516000918491849190811115612300575080515b60005b8181101561240c5782818151811061232b57634e487b7160e01b600052603260045260246000fd5b602001015160f81c60f81b6001600160f81b03191684828151811061236057634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b0319161015612383576000199450505050506106d9565b8281815181106123a357634e487b7160e01b600052603260045260246000fd5b602001015160f81c60f81b6001600160f81b0319168482815181106123d857634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191611156123fa5760019450505050506106d9565b8061240481612e87565b915050612303565b508151835110156124245760001993505050506106d9565b81518351111561243a57600193505050506106d9565b600093505050506106d9565b82805461245290612e20565b90600052602060002090601f01602090048101928261247457600085556124ba565b82601f1061248d57805160ff19168380011785556124ba565b828001600101855582156124ba579182015b828111156124ba57825182559160200191906001019061249f565b506124c69291506124ca565b5090565b5b808211156124c657600081556001016124cb565b60008083601f8401126124f0578182fd5b5081356001600160401b03811115612506578182fd5b6020830191508360208260051b850101111561252157600080fd5b9250929050565b600082601f830112612538578081fd5b8135602061254582612de5565b6040516125528282612e5b565b8381528281019150858301600585901b87018401881015612571578586fd5b855b8581101561258f57813584529284019290840190600101612573565b5090979650505050505050565b8035801515811461204257600080fd5b600082601f8301126125bc578081fd5b81356001600160401b038111156125d5576125d5612eb8565b6040516125ec601f8301601f191660200182612e5b565b818152846020838601011115612600578283fd5b816020850160208301379081016020019190915292915050565b60006020828403121561262b578081fd5b8135610f1381612f6f565b60008060408385031215612648578081fd5b823561265381612f6f565b9150602083013561266381612f6f565b809150509250929050565b600080600080600060a08688031215612685578081fd5b853561269081612f6f565b945060208601356126a081612f6f565b935060408601356001600160401b03808211156126bb578283fd5b6126c789838a01612528565b945060608801359150808211156126dc578283fd5b6126e889838a01612528565b935060808801359150808211156126fd578283fd5b5061270a888289016125ac565b9150509295509295909350565b600080600080600060a0868803121561272e578081fd5b853561273981612f6f565b9450602086013561274981612f6f565b9350604086013592506060860135915060808601356001600160401b03811115612771578182fd5b61270a888289016125ac565b6000806040838503121561278f578182fd5b823561279a81612f6f565b91506127a86020840161259c565b90509250929050565b6000806000606084860312156127c5578283fd5b83356127d081612f6f565b92506127de6020850161259c565b9150604084013590509250925092565b60008060408385031215612800578182fd5b823561280b81612f6f565b946020939093013593505050565b600080600080600060608688031215612830578283fd5b85356001600160401b0380821115612846578485fd5b61285289838a016124df565b9097509550602088013591508082111561286a578485fd5b50612877888289016124df565b96999598509660400135949350505050565b60008060006040848603121561289d578081fd5b83356001600160401b038111156128b2578182fd5b6128be868287016124df565b909790965060209590950135949350505050565b600080604083850312156128e4578182fd5b82356001600160401b03808211156128fa578384fd5b818501915085601f83011261290d578384fd5b8135602061291a82612de5565b6040516129278282612e5b565b8381528281019150858301600585901b870184018b1015612946578889fd5b8896505b8487101561297157803561295d81612f6f565b83526001969096019591830191830161294a565b5096505086013592505080821115612987578283fd5b5061299485828601612528565b9150509250929050565b6000602082840312156129af578081fd5b610f138261259c565b6000602082840312156129c9578081fd5b8135610f1381612f84565b6000602082840312156129e5578081fd5b8151610f1381612f84565b600080600060608486031215612a04578081fd5b83356001600160401b03811115612a19578182fd5b612a25868287016125ac565b9350506020840135612a3681612f6f565b929592945050506040919091013590565b600060208284031215612a58578081fd5b5035919050565b600060208284031215612a70578081fd5b5051919050565b60008060408385031215612a89578182fd5b82359150602083013561266381612f6f565b60008060008060808587031215612ab0578182fd5b8435935060208501356001600160401b03811115612acc578283fd5b612ad8878288016125ac565b949794965050505060408301359260600135919050565b60008060408385031215612b01578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b83811015612b3f57815187529582019590820190600101612b23565b509495945050505050565b60008151808452815b81811015612b6f57602081850181015186830182015201612b53565b81811115612b805782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0386811682528516602082015260a060408201819052600090612bc190830186612b10565b8281036060840152612bd38186612b10565b90508281036080840152612be78185612b4a565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612c2d90830184612b4a565b979650505050505050565b602081526000610f136020830184612b10565b604081526000612c5e6040830185612b10565b8281036020840152612c708185612b10565b95945050505050565b602081526000610f136020830184612b4a565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6020808252602d908201527f496e766974653a2063616e6e6f74206f776e206d6f7265207468616e206f6e6560408201526c206f6620616e20496e7669746560981b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006001600160401b03821115612dfe57612dfe612eb8565b5060051b60200190565b60008219821115612e1b57612e1b612ea2565b500190565b600181811c90821680612e3457607f821691505b60208210811415612e5557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f191681016001600160401b0381118282101715612e8057612e80612eb8565b6040525050565b6000600019821415612e9b57612e9b612ea2565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115612ee357600481823e5160e01c5b90565b600060443d1015612ef45790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715612f2357505050505090565b8285019150815181811115612f3b5750505050505090565b843d8701016020828501011115612f555750505050505090565b612f6460208286010187612e5b565b509095945050505050565b6001600160a01b038116811461167057600080fd5b6001600160e01b03198116811461167057600080fdfea26469706673582212208968664aaf97c6a47fb112bb6baf34fa721a2fa7e681cf45e498b2063382c91964736f6c6343000804003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001847616c6c657279204d656d6265727368697020436172647300000000000000000000000000000000000000000000000000000000000000000000000000000003474d430000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061019a5760003560e01c80638a0b0360116100ec578063c9409c921161008a578063e985e9c511610064578063e985e9c5146104ed578063f242432a14610536578063f2fde38b14610556578063f7d975771461057657600080fd5b8063c9409c921461046d578063dd0d65401461048d578063e7572230146104bd57600080fd5b806395d89b41116100c657806395d89b41146103d35780639a57829a146103e8578063a22cb46514610408578063a8234dcb1461042857600080fd5b80638a0b03601461035b5780638da5cb5b1461037b57806392ab723e146103a357600080fd5b80632eb2c2d6116101595780634e1273f4116101335780634e1273f4146102d957806364cf572114610306578063715018a614610326578063813e0a6c1461033b57600080fd5b80632eb2c2d61461028657806340c10f19146102a65780634ae34c33146102b957600080fd5b8062f714ce1461019f578062fdd58e146101c157806301ffc9a7146101f457806306fdde03146102245780630e89341c1461024657806321d8c77714610266575b600080fd5b3480156101ab57600080fd5b506101bf6101ba366004612a77565b610596565b005b3480156101cd57600080fd5b506101e16101dc3660046127ee565b61064a565b6040519081526020015b60405180910390f35b34801561020057600080fd5b5061021461020f3660046129b8565b6106df565b60405190151581526020016101eb565b34801561023057600080fd5b5061023961072f565b6040516101eb9190612c79565b34801561025257600080fd5b50610239610261366004612a47565b6107bd565b34801561027257600080fd5b506101bf6102813660046129f0565b61085f565b34801561029257600080fd5b506101bf6102a136600461266e565b610899565b6101bf6102b43660046127ee565b610930565b3480156102c557600080fd5b506101bf6102d43660046127b1565b610d00565b3480156102e557600080fd5b506102f96102f43660046128d2565b610d61565b6040516101eb9190612c38565b34801561031257600080fd5b506102146103213660046127ee565b610ec2565b34801561033257600080fd5b506101bf610f1a565b34801561034757600080fd5b506101bf610356366004612a9b565b610f50565b34801561036757600080fd5b506101bf610376366004612889565b611113565b34801561038757600080fd5b506003546040516001600160a01b0390911681526020016101eb565b3480156103af57600080fd5b506101e16103be366004612a47565b60009081526006602052604090206003015490565b3480156103df57600080fd5b506102396112cd565b3480156103f457600080fd5b506101bf61040336600461299e565b6112da565b34801561041457600080fd5b506101bf61042336600461277d565b611317565b34801561043457600080fd5b506102146104433660046127ee565b60009081526007602090815260408083206001600160a01b03949094168352929052205460ff1690565b34801561047957600080fd5b506101bf610488366004612819565b6113ee565b34801561049957600080fd5b506101e16104a8366004612a47565b60009081526006602052604090206002015490565b3480156104c957600080fd5b506101e16104d8366004612a47565b60009081526006602052604090206001015490565b3480156104f957600080fd5b50610214610508366004612636565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561054257600080fd5b506101bf610551366004612717565b611551565b34801561056257600080fd5b506101bf61057136600461261a565b6115d8565b34801561058257600080fd5b506101bf610591366004612aef565b611673565b6003546001600160a01b031633146105c95760405162461bcd60e51b81526004016105c090612db0565b60405180910390fd5b814710156106195760405162461bcd60e51b815260206004820152601a60248201527f496e766974653a206e6f7420656e6f7567682062616c616e636500000000000060448201526064016105c0565b81610622574791505b6001600160a01b0381166106335750335b6106466001600160a01b038216836116b2565b5050565b60006001600160a01b0383166106b65760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016105c0565b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b148061071057506001600160e01b031982166303a24d0760e21b145b806106d957506301ffc9a760e01b6001600160e01b03198316146106d9565b600a805461073c90612e20565b80601f016020809104026020016040519081016040528092919081815260200182805461076890612e20565b80156107b55780601f1061078a576101008083540402835291602001916107b5565b820191906000526020600020905b81548152906001019060200180831161079857829003601f168201915b505050505081565b60008181526006602052604090208054606091906107da90612e20565b80601f016020809104026020016040519081016040528092919081815260200182805461080690612e20565b80156108535780601f1061082857610100808354040283529160200191610853565b820191906000526020600020905b81548152906001019060200180831161083657829003601f168201915b50505050509050919050565b6003546001600160a01b031633146108895760405162461bcd60e51b81526004016105c090612db0565b6108948383836117cb565b505050565b6001600160a01b0385163314806108b557506108b58533610508565b61091c5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016105c0565b610929858585858561189b565b5050505050565b600260055414156109835760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016105c0565b600260055560095460ff166109da5760405162461bcd60e51b815260206004820152601b60248201527f496e766974653a206d696e74696e672069732064697361626c6564000000000060448201526064016105c0565b600081815260066020526040902060038101546002909101546109fe906001612e08565b10610a4b5760405162461bcd60e51b815260206004820152601c60248201527f496e766974653a20746f74616c20737570706c7920757365642075700000000060448201526064016105c0565b610a55828261064a565b158015610a8657506001600160a01b038216600090815260086020908152604080832084845290915290205460ff16155b610aa25760405162461bcd60e51b81526004016105c090612cd4565b60008181526006602052604090206001015415610b815760008181526006602052604090206001015434101580610b0a575060008181526007602090815260408083206001600160a01b038616845290915290205460ff1680610b0a5750610b0a8282611a8c565b610b7c5760405162461bcd60e51b815260206004820152603a60248201527f496e766974653a206e6f742077686974656c697374656420616e64206d73672e60448201527f76616c7565206973206e6f7420636f727265637420707269636500000000000060648201526084016105c0565b610c65565b60008181526007602090815260408083206001600160a01b038616845290915290205460ff1680610bb75750610bb78282611a8c565b610c035760405162461bcd60e51b815260206004820152601c60248201527f496e766974653a206e6f7420617070726f76656420746f206d696e740000000060448201526064016105c0565b3415610c655760405162461bcd60e51b815260206004820152602b60248201527f496e766974653a2073656e742076616c756520666f72206e6f6e2d706179616260448201526a1b19481d1bdad95b88125160aa1b60648201526084016105c0565b60008181526007602090815260408083206001600160a01b03861684528252808320805460ff1916905583835260069091528120600201805491610ca883612e87565b90915550506001600160a01b03821660009081526008602090815260408083208484528252808320805460ff191660019081179091558151928301909152918152610cf7918491849190611cb8565b50506001600555565b6003546001600160a01b03163314610d2a5760405162461bcd60e51b81526004016105c090612db0565b60009081526007602090815260408083206001600160a01b0395909516835293905291909120805460ff1916911515919091179055565b60608151835114610dc65760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016105c0565b600083516001600160401b03811115610def57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610e18578160200160208202803683370190505b50905060005b8451811015610eba57610e7f858281518110610e4a57634e487b7160e01b600052603260045260246000fd5b6020026020010151858381518110610e7257634e487b7160e01b600052603260045260246000fd5b602002602001015161064a565b828281518110610e9f57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152610eb381612e87565b9050610e1e565b509392505050565b600081815260066020526040812060010154151580610f03575060008281526007602090815260408083206001600160a01b038716845290915290205460ff165b80610f135750610f138383611a8c565b9392505050565b6003546001600160a01b03163314610f445760405162461bcd60e51b81526004016105c090612db0565b610f4e6000611dc2565b565b6003546001600160a01b03163314610f7a5760405162461bcd60e51b81526004016105c090612db0565b60008481526006602052604090206003015415610fd95760405162461bcd60e51b815260206004820152601c60248201527f496e766974653a207479706520616c726561647920646566696e65640000000060448201526064016105c0565b6000811161103d5760405162461bcd60e51b815260206004820152602b60248201527f496e766974653a206d7573742073657420616e2061626f7665207a65726f207460448201526a6f74616c20737570706c7960a81b60648201526084016105c0565b60008351116110875760405162461bcd60e51b8152602060048201526016602482015275496e766974653a206d7573742073657420612055524960501b60448201526064016105c0565b6110b26040518060800160405280606081526020016000815260200160008152602001600081525090565b838152602080820184905260006040808401829052606084018590528782526006835290208251805184936110eb928492910190612446565b5060208201516001820155604082015160028201556060909101516003909101555050505050565b6003546001600160a01b0316331461113d5760405162461bcd60e51b81526004016105c090612db0565b60008181526006602052604090206003810154600290910154611161908490612e08565b106111ae5760405162461bcd60e51b815260206004820152601c60248201527f496e766974653a20746f74616c20737570706c7920757365642075700000000060448201526064016105c0565b60005b828110156112c75760008484838181106111db57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906111f0919061261a565b6001600160a01b038116600090815260086020908152604080832087845290915290205490915060ff1615801561122e575061122c818461064a565b155b61124a5760405162461bcd60e51b81526004016105c090612cd4565b600083815260066020526040812060020180549161126783612e87565b90915550506001600160a01b03811660009081526008602090815260408083208684528252808320805460ff1916600190811790915581519283019091529181526112b6918391869190611cb8565b506112c081612e87565b90506111b1565b50505050565b600b805461073c90612e20565b6003546001600160a01b031633146113045760405162461bcd60e51b81526004016105c090612db0565b6009805460ff1916911515919091179055565b336001600160a01b03831614156113825760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016105c0565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6003546001600160a01b031633146114185760405162461bcd60e51b81526004016105c090612db0565b83821461148d5760405162461bcd60e51b815260206004820152603a60248201527f496e766974653a207370656e64657220616e6420616d6f756e7473206172726160448201527f7973206d757374206265207468652073616d65206c656e67746800000000000060648201526084016105c0565b60005b84811015611549578383828181106114b857634e487b7160e01b600052603260045260246000fd5b90506020020160208101906114cd919061299e565b6000838152600760205260408120908888858181106114fc57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611511919061261a565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905561154281612e87565b9050611490565b505050505050565b6001600160a01b03851633148061156d575061156d8533610508565b6115cb5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b60648201526084016105c0565b6109298585858585611e14565b6003546001600160a01b031633146116025760405162461bcd60e51b81526004016105c090612db0565b6001600160a01b0381166116675760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105c0565b61167081611dc2565b50565b6003546001600160a01b0316331461169d5760405162461bcd60e51b81526004016105c090612db0565b60009182526006602052604090912060010155565b804710156117025760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016105c0565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461174f576040519150601f19603f3d011682016040523d82523d6000602084013e611754565b606091505b50509050806108945760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016105c0565b6001600160a01b0382163b6118225760405162461bcd60e51b815260206004820181905260248201527f546f6b656e2061646472657373206d757374206265206120636f6e747261637460448201526064016105c0565b61182b83611f31565b6000828152600460205260409020805460ff1916600183600281111561186157634e487b7160e01b600052602160045260246000fd5b0217905550600090815260046020526040902080546001600160a01b0390921661010002610100600160a81b031990921691909117905550565b81518351146118fd5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b60648201526084016105c0565b6001600160a01b0384166119235760405162461bcd60e51b81526004016105c090612d21565b3360005b8451811015611a2657600085828151811061195257634e487b7160e01b600052603260045260246000fd5b60200260200101519050600085838151811061197e57634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156119ce5760405162461bcd60e51b81526004016105c090612d66565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611a0b908490612e08565b9250508190555050505080611a1f90612e87565b9050611927565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611a76929190612c4b565b60405180910390a4611549818787878787612047565b6000600160008381526004602052604090205460ff166002811115611ac157634e487b7160e01b600052602160045260246000fd5b1415611c30576000828152600460208190526040918290205491516370a0823160e01b81526001600160a01b038681169282019290925261010090920416906370a08231906024015b60206040518083038186803b158015611b2257600080fd5b505afa925050508015611b52575060408051601f3d908101601f19168201909252611b4f91810190612a5f565b60015b611b9457611b5e612ece565b806308c379a01415611b885750611b73612ee6565b80611b7e5750611b8a565b60009150506106d9565b505b3d6000803e3d6000fd5b5060008281526004602081905260408083205490516370a0823160e01b81526001600160a01b0387811693820193909352610100909104909116906370a082319060240160206040518083038186803b158015611bf057600080fd5b505afa158015611c04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c289190612a5f565b1190506106d9565b600260008381526004602052604090205460ff166002811115611c6357634e487b7160e01b600052602160045260246000fd5b1415611cb0576000828152600460208190526040918290205491516370a0823160e01b81526001600160a01b038681169282019290925261010090920416906370a0823190602401611b0a565b5060006106d9565b6001600160a01b038416611d185760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016105c0565b33611d3281600087611d29886121b2565b610929886121b2565b6000848152602081815260408083206001600160a01b038916845290915281208054859290611d62908490612e08565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46109298160008787878761220b565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038416611e3a5760405162461bcd60e51b81526004016105c090612d21565b33611e4a818787611d29886121b2565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015611e8b5760405162461bcd60e51b81526004016105c090612d66565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290611ec8908490612e08565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611f2882888888888861220b565b50505050505050565b6000611f646040518060400160405280600681526020016545524337323160d01b815250836122d590919063ffffffff16565b80611f9357506040805180820190915260078152664552432d37323160c81b6020820152611f939083906122d5565b15611fa057506001919050565b604080518082019091526005815264045524332360dc1b6020820152611fc79083906122d5565b80611ff5575060408051808201909152600681526504552432d32360d41b6020820152611ff59083906122d5565b1561200257506002919050565b60405162461bcd60e51b81526020600482015260156024820152742ab735b737bbb71039b832b1b4b334b1b0ba34b7b760591b60448201526064016105c0565b919050565b6001600160a01b0384163b156115495760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061208b9089908990889088908890600401612b95565b602060405180830381600087803b1580156120a557600080fd5b505af19250505080156120d5575060408051601f3d908101601f191682019092526120d2918101906129d4565b60015b612182576120e1612ece565b806308c379a0141561211b57506120f6612ee6565b80612101575061211d565b8060405162461bcd60e51b81526004016105c09190612c79565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016105c0565b6001600160e01b0319811663bc197c8160e01b14611f285760405162461bcd60e51b81526004016105c090612c8c565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106121fa57634e487b7160e01b600052603260045260246000fd5b602090810291909101015292915050565b6001600160a01b0384163b156115495760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061224f9089908990889088908890600401612bf3565b602060405180830381600087803b15801561226957600080fd5b505af1925050508015612299575060408051601f3d908101601f19168201909252612296918101906129d4565b60015b6122a5576120e1612ece565b6001600160e01b0319811663f23a6e6160e01b14611f285760405162461bcd60e51b81526004016105c090612c8c565b60006122e183836122e9565b159392505050565b815181516000918491849190811115612300575080515b60005b8181101561240c5782818151811061232b57634e487b7160e01b600052603260045260246000fd5b602001015160f81c60f81b6001600160f81b03191684828151811061236057634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b0319161015612383576000199450505050506106d9565b8281815181106123a357634e487b7160e01b600052603260045260246000fd5b602001015160f81c60f81b6001600160f81b0319168482815181106123d857634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191611156123fa5760019450505050506106d9565b8061240481612e87565b915050612303565b508151835110156124245760001993505050506106d9565b81518351111561243a57600193505050506106d9565b600093505050506106d9565b82805461245290612e20565b90600052602060002090601f01602090048101928261247457600085556124ba565b82601f1061248d57805160ff19168380011785556124ba565b828001600101855582156124ba579182015b828111156124ba57825182559160200191906001019061249f565b506124c69291506124ca565b5090565b5b808211156124c657600081556001016124cb565b60008083601f8401126124f0578182fd5b5081356001600160401b03811115612506578182fd5b6020830191508360208260051b850101111561252157600080fd5b9250929050565b600082601f830112612538578081fd5b8135602061254582612de5565b6040516125528282612e5b565b8381528281019150858301600585901b87018401881015612571578586fd5b855b8581101561258f57813584529284019290840190600101612573565b5090979650505050505050565b8035801515811461204257600080fd5b600082601f8301126125bc578081fd5b81356001600160401b038111156125d5576125d5612eb8565b6040516125ec601f8301601f191660200182612e5b565b818152846020838601011115612600578283fd5b816020850160208301379081016020019190915292915050565b60006020828403121561262b578081fd5b8135610f1381612f6f565b60008060408385031215612648578081fd5b823561265381612f6f565b9150602083013561266381612f6f565b809150509250929050565b600080600080600060a08688031215612685578081fd5b853561269081612f6f565b945060208601356126a081612f6f565b935060408601356001600160401b03808211156126bb578283fd5b6126c789838a01612528565b945060608801359150808211156126dc578283fd5b6126e889838a01612528565b935060808801359150808211156126fd578283fd5b5061270a888289016125ac565b9150509295509295909350565b600080600080600060a0868803121561272e578081fd5b853561273981612f6f565b9450602086013561274981612f6f565b9350604086013592506060860135915060808601356001600160401b03811115612771578182fd5b61270a888289016125ac565b6000806040838503121561278f578182fd5b823561279a81612f6f565b91506127a86020840161259c565b90509250929050565b6000806000606084860312156127c5578283fd5b83356127d081612f6f565b92506127de6020850161259c565b9150604084013590509250925092565b60008060408385031215612800578182fd5b823561280b81612f6f565b946020939093013593505050565b600080600080600060608688031215612830578283fd5b85356001600160401b0380821115612846578485fd5b61285289838a016124df565b9097509550602088013591508082111561286a578485fd5b50612877888289016124df565b96999598509660400135949350505050565b60008060006040848603121561289d578081fd5b83356001600160401b038111156128b2578182fd5b6128be868287016124df565b909790965060209590950135949350505050565b600080604083850312156128e4578182fd5b82356001600160401b03808211156128fa578384fd5b818501915085601f83011261290d578384fd5b8135602061291a82612de5565b6040516129278282612e5b565b8381528281019150858301600585901b870184018b1015612946578889fd5b8896505b8487101561297157803561295d81612f6f565b83526001969096019591830191830161294a565b5096505086013592505080821115612987578283fd5b5061299485828601612528565b9150509250929050565b6000602082840312156129af578081fd5b610f138261259c565b6000602082840312156129c9578081fd5b8135610f1381612f84565b6000602082840312156129e5578081fd5b8151610f1381612f84565b600080600060608486031215612a04578081fd5b83356001600160401b03811115612a19578182fd5b612a25868287016125ac565b9350506020840135612a3681612f6f565b929592945050506040919091013590565b600060208284031215612a58578081fd5b5035919050565b600060208284031215612a70578081fd5b5051919050565b60008060408385031215612a89578182fd5b82359150602083013561266381612f6f565b60008060008060808587031215612ab0578182fd5b8435935060208501356001600160401b03811115612acc578283fd5b612ad8878288016125ac565b949794965050505060408301359260600135919050565b60008060408385031215612b01578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b83811015612b3f57815187529582019590820190600101612b23565b509495945050505050565b60008151808452815b81811015612b6f57602081850181015186830182015201612b53565b81811115612b805782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0386811682528516602082015260a060408201819052600090612bc190830186612b10565b8281036060840152612bd38186612b10565b90508281036080840152612be78185612b4a565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612c2d90830184612b4a565b979650505050505050565b602081526000610f136020830184612b10565b604081526000612c5e6040830185612b10565b8281036020840152612c708185612b10565b95945050505050565b602081526000610f136020830184612b4a565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6020808252602d908201527f496e766974653a2063616e6e6f74206f776e206d6f7265207468616e206f6e6560408201526c206f6620616e20496e7669746560981b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006001600160401b03821115612dfe57612dfe612eb8565b5060051b60200190565b60008219821115612e1b57612e1b612ea2565b500190565b600181811c90821680612e3457607f821691505b60208210811415612e5557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f191681016001600160401b0381118282101715612e8057612e80612eb8565b6040525050565b6000600019821415612e9b57612e9b612ea2565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115612ee357600481823e5160e01c5b90565b600060443d1015612ef45790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715612f2357505050505090565b8285019150815181811115612f3b5750505050505090565b843d8701016020828501011115612f555750505050505090565b612f6460208286010187612e5b565b509095945050505050565b6001600160a01b038116811461167057600080fd5b6001600160e01b03198116811461167057600080fdfea26469706673582212208968664aaf97c6a47fb112bb6baf34fa721a2fa7e681cf45e498b2063382c91964736f6c63430008040033

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

00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001847616c6c657279204d656d6265727368697020436172647300000000000000000000000000000000000000000000000000000000000000000000000000000003474d430000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Gallery Membership Cards
Arg [1] : _symbol (string): GMC

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000018
Arg [3] : 47616c6c657279204d656d626572736869702043617264730000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : 474d430000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

53591:5707:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58935:360;;;;;;;;;;-1:-1:-1;58935:360:0;;;;;:::i;:::-;;:::i;:::-;;38897:317;;;;;;;;;;-1:-1:-1;38897:317:0;;;;;:::i;:::-;;:::i;:::-;;;26484:25:1;;;26472:2;26457:18;38897:317:0;;;;;;;;37870:360;;;;;;;;;;-1:-1:-1;37870:360:0;;;;;:::i;:::-;;:::i;:::-;;;14719:14:1;;14712:22;14694:41;;14682:2;14667:18;37870:360:0;14649:92:1;54238:18:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;54993:173::-;;;;;;;;;;-1:-1:-1;54993:173:0;;;;;:::i;:::-;;:::i;58692:235::-;;;;;;;;;;-1:-1:-1;58692:235:0;;;;;:::i;:::-;;:::i;41232:442::-;;;;;;;;;;-1:-1:-1;41232:442:0;;;;;:::i;:::-;;:::i;56435:1188::-;;;;;;:::i;:::-;;:::i;57631:173::-;;;;;;;;;;-1:-1:-1;57631:173:0;;;;;:::i;:::-;;:::i;39380:561::-;;;;;;;;;;-1:-1:-1;39380:561:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;58424:260::-;;;;;;;;;;-1:-1:-1;58424:260:0;;;;;:::i;:::-;;:::i;2402:94::-;;;;;;;;;;;;;:::i;54292:693::-;;;;;;;;;;-1:-1:-1;54292:693:0;;;;;:::i;:::-;;:::i;55756:671::-;;;;;;;;;;-1:-1:-1;55756:671:0;;;;;:::i;:::-;;:::i;1751:87::-;;;;;;;;;;-1:-1:-1;1824:6:0;;1751:87;;-1:-1:-1;;;;;1824:6:0;;;12360:51:1;;12348:2;12333:18;1751:87:0;12315:102:1;55514:119:0;;;;;;;;;;-1:-1:-1;55514:119:0;;;;;:::i;:::-;55571:7;55598:15;;;:11;:15;;;;;:27;;;;55514:119;54263:20;;;;;;;;;;;;;:::i;55174:89::-;;;;;;;;;;-1:-1:-1;55174:89:0;;;;;:::i;:::-;;:::i;40014:379::-;;;;;;;;;;-1:-1:-1;40014:379:0;;;;;:::i;:::-;;:::i;58249:167::-;;;;;;;;;;-1:-1:-1;58249:167:0;;;;;:::i;:::-;58352:4;58381:18;;;:14;:18;;;;;;;;-1:-1:-1;;;;;58381:27:0;;;;;;;;;;;;;;58249:167;57812:429;;;;;;;;;;-1:-1:-1;57812:429:0;;;;;:::i;:::-;;:::i;55389:117::-;;;;;;;;;;-1:-1:-1;55389:117:0;;;;;:::i;:::-;55445:7;55472:15;;;:11;:15;;;;;:26;;;;55389:117;55641:107;;;;;;;;;;-1:-1:-1;55641:107:0;;;;;:::i;:::-;55692:7;55719:15;;;:11;:15;;;;;:21;;;;55641:107;40465:217;;;;;;;;;;-1:-1:-1;40465:217:0;;;;;:::i;:::-;-1:-1:-1;;;;;40638:26:0;;;40609:4;40638:26;;;:17;:26;;;;;;;;:36;;;;;;;;;;;;;;;40465:217;40754:401;;;;;;;;;;-1:-1:-1;40754:401:0;;;;;:::i;:::-;;:::i;2651:229::-;;;;;;;;;;-1:-1:-1;2651:229:0;;;;;:::i;:::-;;:::i;55271:110::-;;;;;;;;;;-1:-1:-1;55271:110:0;;;;;:::i;:::-;;:::i;58935:360::-;1824:6;;-1:-1:-1;;;;;1824:6:0;682:10;1971:23;1963:68;;;;-1:-1:-1;;;1963:68:0;;;;;;;:::i;:::-;;;;;;;;;59052:6:::1;59027:21;:31;;59019:70;;;::::0;-1:-1:-1;;;59019:70:0;;16002:2:1;59019:70:0::1;::::0;::::1;15984:21:1::0;16041:2;16021:18;;;16014:30;16080:28;16060:18;;;16053:56;16126:18;;59019:70:0::1;15974:176:1::0;59019:70:0::1;59104:11:::0;59100:74:::1;;59141:21;59132:30;;59100:74;-1:-1:-1::0;;;;;59188:16:0;::::1;59184:73;;-1:-1:-1::0;59234:10:0::1;59184:73;59267:20;-1:-1:-1::0;;;;;59267:12:0;::::1;59280:6:::0;59267:12:::1;:20::i;:::-;58935:360:::0;;:::o;38897:317::-;39028:7;-1:-1:-1;;;;;39075:21:0;;39053:114;;;;-1:-1:-1;;;39053:114:0;;16357:2:1;39053:114:0;;;16339:21:1;16396:2;16376:18;;;16369:30;16435:34;16415:18;;;16408:62;-1:-1:-1;;;16486:18:1;;;16479:41;16537:19;;39053:114:0;16329:233:1;39053:114:0;-1:-1:-1;39185:8:0;:12;;;;;;;;;;;-1:-1:-1;;;;;39185:21:0;;;;;;;;;;38897:317;;;;;:::o;37870:360::-;38017:4;-1:-1:-1;;;;;;38059:41:0;;-1:-1:-1;;;38059:41:0;;:110;;-1:-1:-1;;;;;;;38117:52:0;;-1:-1:-1;;;38117:52:0;38059:110;:163;;;-1:-1:-1;;;;;;;;;;17767:40:0;;;38186:36;17608:207;54238:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54993:173::-;55139:15;;;;:11;:15;;;;;55132:26;;55101:13;;55139:15;55132:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54993:173;;;:::o;58692:235::-;1824:6;;-1:-1:-1;;;;;1824:6:0;682:10;1971:23;1963:68;;;;-1:-1:-1;;;1963:68:0;;;;;;;:::i;:::-;58862:57:::1;58886:13;58901:12;58915:3;58862:23;:57::i;:::-;58692:235:::0;;;:::o;41232:442::-;-1:-1:-1;;;;;41465:20:0;;682:10;41465:20;;:60;;-1:-1:-1;41489:36:0;41506:4;682:10;40465:217;:::i;41489:36::-;41443:160;;;;-1:-1:-1;;;41443:160:0;;21466:2:1;41443:160:0;;;21448:21:1;21505:2;21485:18;;;21478:30;21544:34;21524:18;;;21517:62;-1:-1:-1;;;21595:18:1;;;21588:48;21653:19;;41443:160:0;21438:240:1;41443:160:0;41614:52;41637:4;41643:2;41647:3;41652:7;41661:4;41614:22;:52::i;:::-;41232:442;;;;;:::o;56435:1188::-;15215:1;15811:7;;:19;;15803:63;;;;-1:-1:-1;;;15803:63:0;;26180:2:1;15803:63:0;;;26162:21:1;26219:2;26199:18;;;26192:30;26258:33;26238:18;;;26231:61;26309:18;;15803:63:0;26152:181:1;15803:63:0;15215:1;15944:7;:18;56522:7:::1;::::0;::::1;;56514:47;;;::::0;-1:-1:-1;;;56514:47:0;;23008:2:1;56514:47:0::1;::::0;::::1;22990:21:1::0;23047:2;23027:18;;;23020:30;23086:29;23066:18;;;23059:57;23133:18;;56514:47:0::1;22980:177:1::0;56514:47:0::1;56627:15;::::0;;;:11:::1;:15;::::0;;;;:27:::1;::::0;::::1;::::0;56594:26:::1;::::0;;::::1;::::0;:30:::1;::::0;56623:1:::1;56594:30;:::i;:::-;:60;56572:138;;;::::0;-1:-1:-1;;;56572:138:0;;19211:2:1;56572:138:0::1;::::0;::::1;19193:21:1::0;19250:2;19230:18;;;19223:30;19289;19269:18;;;19262:58;19337:18;;56572:138:0::1;19183:178:1::0;56572:138:0::1;56743:17;56753:2;56757;56743:9;:17::i;:::-;:22:::0;:45;::::1;;;-1:-1:-1::0;;;;;;56770:14:0;::::1;;::::0;;;:10:::1;:14;::::0;;;;;;;:18;;;;;;;;;::::1;;56769:19;56743:45;56721:140;;;;-1:-1:-1::0;;;56721:140:0::1;;;;;;;:::i;:::-;56900:1;56876:15:::0;;;:11:::1;:15;::::0;;;;:21:::1;;::::0;:25;56872:590:::1;;56957:15;::::0;;;:11:::1;:15;::::0;;;;:21:::1;;::::0;56944:9:::1;:34;;::::0;:108:::1;;-1:-1:-1::0;57004:18:0::1;::::0;;;:14:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;57004:22:0;::::1;::::0;;;;;;;;::::1;;::::0;:47:::1;;;57030:21;57044:2;57048;57030:13;:21::i;:::-;56918:228;;;::::0;-1:-1:-1;;;56918:228:0;;17176:2:1;56918:228:0::1;::::0;::::1;17158:21:1::0;17215:2;17195:18;;;17188:30;17254:34;17234:18;;;17227:62;17325:28;17305:18;;;17298:56;17371:19;;56918:228:0::1;17148:248:1::0;56918:228:0::1;56872:590;;;57205:18;::::0;;;:14:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;57205:22:0;::::1;::::0;;;;;;;;::::1;;::::0;:47:::1;;;57231:21;57245:2;57249;57231:13;:21::i;:::-;57179:137;;;::::0;-1:-1:-1;;;57179:137:0;;20353:2:1;57179:137:0::1;::::0;::::1;20335:21:1::0;20392:2;20372:18;;;20365:30;20431;20411:18;;;20404:58;20479:18;;57179:137:0::1;20325:178:1::0;57179:137:0::1;57357:9;:14:::0;57331:119:::1;;;::::0;-1:-1:-1;;;57331:119:0;;24957:2:1;57331:119:0::1;::::0;::::1;24939:21:1::0;24996:2;24976:18;;;24969:30;25035:34;25015:18;;;25008:62;-1:-1:-1;;;25086:18:1;;;25079:41;25137:19;;57331:119:0::1;24929:233:1::0;57331:119:0::1;57497:5;57472:18:::0;;;:14:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;57472:22:0;::::1;::::0;;;;;;;:30;;-1:-1:-1;;57472:30:0::1;::::0;;57513:15;;;:11:::1;:15:::0;;;;;:26:::1;;:28:::0;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;57552:14:0;::::1;;::::0;;;:10:::1;:14;::::0;;;;;;;:18;;;;;;;;:25;;-1:-1:-1;;57552:25:0::1;57573:4;57552:25:::0;;::::1;::::0;;;57605:9;;;;::::1;::::0;;;;;;57588:27:::1;::::0;57563:2;;57567;;57573:4;57588:5:::1;:27::i;:::-;-1:-1:-1::0;;15171:1:0;16123:7;:22;56435:1188::o;57631:173::-;1824:6;;-1:-1:-1;;;;;1824:6:0;682:10;1971:23;1963:68;;;;-1:-1:-1;;;1963:68:0;;;;;;;:::i;:::-;57761:18:::1;::::0;;;:14:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;57761:27:0;;;::::1;::::0;;;;;;;;;:35;;-1:-1:-1;;57761:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;57631:173::o;39380:561::-;39536:16;39611:3;:10;39592:8;:15;:29;39570:120;;;;-1:-1:-1;;;39570:120:0;;24547:2:1;39570:120:0;;;24529:21:1;24586:2;24566:18;;;24559:30;24625:34;24605:18;;;24598:62;-1:-1:-1;;;24676:18:1;;;24669:39;24725:19;;39570:120:0;24519:231:1;39570:120:0;39703:30;39750:8;:15;-1:-1:-1;;;;;39736:30:0;;;;;-1:-1:-1;;;39736:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39736:30:0;;39703:63;;39784:9;39779:122;39803:8;:15;39799:1;:19;39779:122;;;39859:30;39869:8;39878:1;39869:11;;;;;;-1:-1:-1;;;39869:11:0;;;;;;;;;;;;;;;39882:3;39886:1;39882:6;;;;;;-1:-1:-1;;;39882:6:0;;;;;;;;;;;;;;;39859:9;:30::i;:::-;39840:13;39854:1;39840:16;;;;;;-1:-1:-1;;;39840:16:0;;;;;;;;;;;;;;;;;;:49;39820:3;;;:::i;:::-;;;39779:122;;;-1:-1:-1;39920:13:0;39380:561;-1:-1:-1;;;39380:561:0:o;58424:260::-;58524:4;58566:15;;;:11;:15;;;;;:21;;;:25;;;:68;;-1:-1:-1;58608:18:0;;;;:14;:18;;;;;;;;-1:-1:-1;;;;;58608:26:0;;;;;;;;;;;;58566:68;:110;;;;58651:25;58665:6;58673:2;58651:13;:25::i;:::-;58546:130;58424:260;-1:-1:-1;;;58424:260:0:o;2402:94::-;1824:6;;-1:-1:-1;;;;;1824:6:0;682:10;1971:23;1963:68;;;;-1:-1:-1;;;1963:68:0;;;;;;;:::i;:::-;2467:21:::1;2485:1;2467:9;:21::i;:::-;2402:94::o:0;54292:693::-;1824:6;;-1:-1:-1;;;;;1824:6:0;682:10;1971:23;1963:68;;;;-1:-1:-1;;;1963:68:0;;;;;;;:::i;:::-;54476:16:::1;::::0;;;:11:::1;:16;::::0;;;;:28:::1;;::::0;:33;54454:111:::1;;;::::0;-1:-1:-1;;;54454:111:0;;18017:2:1;54454:111:0::1;::::0;::::1;17999:21:1::0;18056:2;18036:18;;;18029:30;18095;18075:18;;;18068:58;18143:18;;54454:111:0::1;17989:178:1::0;54454:111:0::1;54613:1;54598:12;:16;54576:109;;;::::0;-1:-1:-1;;;54576:109:0;;23364:2:1;54576:109:0::1;::::0;::::1;23346:21:1::0;23403:2;23383:18;;;23376:30;23442:34;23422:18;;;23415:62;-1:-1:-1;;;23493:18:1;;;23486:41;23544:19;;54576:109:0::1;23336:233:1::0;54576:109:0::1;54725:1;54710:4;54704:18;:22;54696:57;;;::::0;-1:-1:-1;;;54696:57:0;;22296:2:1;54696:57:0::1;::::0;::::1;22278:21:1::0;22335:2;22315:18;;;22308:30;-1:-1:-1;;;22354:18:1;;;22347:52;22416:18;;54696:57:0::1;22268:172:1::0;54696:57:0::1;54764:26;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54764:26:0::1;54801:20:::0;;;54832:15:::1;::::0;;::::1;:24:::0;;;54801:13:::1;54867:20;::::0;;::::1;:24:::0;;;54902:21:::1;::::0;::::1;:36:::0;;;54949:16;;;:11:::1;:16:::0;;;;:28;;;;54801:9;;54949:28:::1;::::0;:16;;:28;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;54949:28:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;-1:-1:-1;;;;;54292:693:0:o;55756:671::-;1824:6;;-1:-1:-1;;;;;1824:6:0;682:10;1971:23;1963:68;;;;-1:-1:-1;;;1963:68:0;;;;;;;:::i;:::-;55948:16:::1;::::0;;;:11:::1;:16;::::0;;;;:28:::1;::::0;::::1;::::0;55888:27:::1;::::0;;::::1;::::0;:40:::1;::::0;55918:3;;55888:40:::1;:::i;:::-;:88;55866:166;;;::::0;-1:-1:-1;;;55866:166:0;;19211:2:1;55866:166:0::1;::::0;::::1;19193:21:1::0;19250:2;19230:18;;;19223:30;19289;19269:18;;;19262:58;19337:18;;55866:166:0::1;19183:178:1::0;55866:166:0::1;56048:9;56043:377;56063:14:::0;;::::1;56043:377;;;56099:10;56112:3;;56116:1;56112:6;;;;;-1:-1:-1::0;;;56112:6:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;56160:14:0;::::1;;::::0;;;:10:::1;:14;::::0;;;;;;;:19;;;;;;;;;56099;;-1:-1:-1;56160:19:0::1;;56159:20;:47:::0;::::1;;;;56183:18;56193:2;56197:3;56183:9;:18::i;:::-;:23:::0;56159:47:::1;56133:154;;;;-1:-1:-1::0;;;56133:154:0::1;;;;;;;:::i;:::-;56302:16;::::0;;;:11:::1;:16;::::0;;;;:27:::1;;:29:::0;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;56346:14:0;::::1;;::::0;;;:10:::1;:14;::::0;;;;;;;:19;;;;;;;;:26;;-1:-1:-1;;56346:26:0::1;56368:4;56346:26:::0;;::::1;::::0;;;56387:21;;;;::::1;::::0;;;;;;::::1;::::0;56357:2;;56361:3;;56368:4;56387:5:::1;:21::i;:::-;-1:-1:-1::0;56079:3:0::1;::::0;::::1;:::i;:::-;;;56043:377;;;;55756:671:::0;;;:::o;54263:20::-;;;;;;;:::i;55174:89::-;1824:6;;-1:-1:-1;;;;;1824:6:0;682:10;1971:23;1963:68;;;;-1:-1:-1;;;1963:68:0;;;;;;;:::i;:::-;55237:7:::1;:18:::0;;-1:-1:-1;;55237:18:0::1;::::0;::::1;;::::0;;;::::1;::::0;;55174:89::o;40014:379::-;682:10;-1:-1:-1;;;;;40163:24:0;;;;40141:115;;;;-1:-1:-1;;;40141:115:0;;24137:2:1;40141:115:0;;;24119:21:1;24176:2;24156:18;;;24149:30;24215:34;24195:18;;;24188:62;-1:-1:-1;;;24266:18:1;;;24259:39;24315:19;;40141:115:0;24109:231:1;40141:115:0;682:10;40269:31;;;;:17;:31;;;;;;;;-1:-1:-1;;;;;40269:41:0;;;;;;;;;;;;:52;;-1:-1:-1;;40269:52:0;;;;;;;;;;40337:48;;14694:41:1;;;40269::0;;682:10;40337:48;;14667:18:1;40337:48:0;;;;;;;40014:379;;:::o;57812:429::-;1824:6;;-1:-1:-1;;;;;1824:6:0;682:10;1971:23;1963:68;;;;-1:-1:-1;;;1963:68:0;;;;;;;:::i;:::-;57989:32;;::::1;57967:140;;;::::0;-1:-1:-1;;;57967:140:0;;19926:2:1;57967:140:0::1;::::0;::::1;19908:21:1::0;19965:2;19945:18;;;19938:30;20004:34;19984:18;;;19977:62;20075:28;20055:18;;;20048:56;20121:19;;57967:140:0::1;19898:248:1::0;57967:140:0::1;58123:9;58118:116;58138:19:::0;;::::1;58118:116;;;58213:6;;58220:1;58213:9;;;;;-1:-1:-1::0;;;58213:9:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58179:18;::::0;;;:14:::1;:18;::::0;;;;;58198:8;;58207:1;58198:11;;::::1;;;-1:-1:-1::0;;;58198:11:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;58179:31:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;58179:31:0;:43;;-1:-1:-1;;58179:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;58159:3:::1;::::0;::::1;:::i;:::-;;;58118:116;;;;57812:429:::0;;;;;:::o;40754:401::-;-1:-1:-1;;;;;40962:20:0;;682:10;40962:20;;:60;;-1:-1:-1;40986:36:0;41003:4;682:10;40465:217;:::i;40986:36::-;40940:151;;;;-1:-1:-1;;;40940:151:0;;18374:2:1;40940:151:0;;;18356:21:1;18413:2;18393:18;;;18386:30;18452:34;18432:18;;;18425:62;-1:-1:-1;;;18503:18:1;;;18496:39;18552:19;;40940:151:0;18346:231:1;40940:151:0;41102:45;41120:4;41126:2;41130;41134:6;41142:4;41102:17;:45::i;2651:229::-;1824:6;;-1:-1:-1;;;;;1824:6:0;682:10;1971:23;1963:68;;;;-1:-1:-1;;;1963:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2754:22:0;::::1;2732:110;;;::::0;-1:-1:-1;;;2732:110:0;;16769:2:1;2732:110:0::1;::::0;::::1;16751:21:1::0;16808:2;16788:18;;;16781:30;16847:34;16827:18;;;16820:62;-1:-1:-1;;;16898:18:1;;;16891:36;16944:19;;2732:110:0::1;16741:228:1::0;2732:110:0::1;2853:19;2863:8;2853:9;:19::i;:::-;2651:229:::0;:::o;55271:110::-;1824:6;;-1:-1:-1;;;;;1824:6:0;682:10;1971:23;1963:68;;;;-1:-1:-1;;;1963:68:0;;;;;;;:::i;:::-;55344:15:::1;::::0;;;:11:::1;:15;::::0;;;;;:21:::1;;:29:::0;55271:110::o;7088:391::-;7217:6;7192:21;:31;;7170:110;;;;-1:-1:-1;;;7170:110:0;;19568:2:1;7170:110:0;;;19550:21:1;19607:2;19587:18;;;19580:30;19646:31;19626:18;;;19619:59;19695:18;;7170:110:0;19540:179:1;7170:110:0;7294:12;7312:9;-1:-1:-1;;;;;7312:14:0;7334:6;7312:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7293:52;;;7378:7;7356:115;;;;-1:-1:-1;;;7356:115:0;;18784:2:1;7356:115:0;;;18766:21:1;18823:2;18803:18;;;18796:30;18862:34;18842:18;;;18835:62;18933:28;18913:18;;;18906:56;18979:19;;7356:115:0;18756:248:1;35302:359:0;-1:-1:-1;;;;;35461:23:0;;6089:20;35453:70;;;;-1:-1:-1;;;35453:70:0;;23776:2:1;35453:70:0;;;23758:21:1;;;23795:18;;;23788:30;23854:34;23834:18;;;23827:62;23906:18;;35453:70:0;23748:182:1;35453:70:0;35565:35;35586:13;35565:20;:35::i;:::-;35534:14;;;;:9;:14;;;;;:66;;-1:-1:-1;;35534:66:0;;;;;;;;;-1:-1:-1;;;35534:66:0;;;;;;;;;;;;;-1:-1:-1;35611:14:0;;;;:9;:14;;;;;:42;;-1:-1:-1;;;;;35611:42:0;;;;;-1:-1:-1;;;;;;35611:42:0;;;;;;;;;-1:-1:-1;35302:359:0:o;43441:1248::-;43682:7;:14;43668:3;:10;:28;43646:118;;;;-1:-1:-1;;;43646:118:0;;25369:2:1;43646:118:0;;;25351:21:1;25408:2;25388:18;;;25381:30;25447:34;25427:18;;;25420:62;-1:-1:-1;;;25498:18:1;;;25491:38;25546:19;;43646:118:0;25341:230:1;43646:118:0;-1:-1:-1;;;;;43783:16:0;;43775:66;;;;-1:-1:-1;;;43775:66:0;;;;;;;:::i;:::-;682:10;43854:16;43971:469;43995:3;:10;43991:1;:14;43971:469;;;44027:10;44040:3;44044:1;44040:6;;;;;;-1:-1:-1;;;44040:6:0;;;;;;;;;;;;;;;44027:19;;44061:14;44078:7;44086:1;44078:10;;;;;;-1:-1:-1;;;44078:10:0;;;;;;;;;;;;;;;;;;;;44105:19;44127:12;;;;;;;;;;-1:-1:-1;;;;;44127:18:0;;;;;;;;;;;;44078:10;;-1:-1:-1;44186:21:0;;;;44160:125;;;;-1:-1:-1;;;44160:125:0;;;;;;;:::i;:::-;44329:8;:12;;;;;;;;;;;-1:-1:-1;;;;;44329:18:0;;;;;;;;;;44350:20;;;44329:41;;44402:16;;;;;;;:26;;44350:20;;44329:8;44402:26;;44350:20;;44402:26;:::i;:::-;;;;;;;;43971:469;;;44007:3;;;;:::i;:::-;;;43971:469;;;;44487:2;-1:-1:-1;;;;;44457:47:0;44481:4;-1:-1:-1;;;;;44457:47:0;44471:8;-1:-1:-1;;;;;44457:47:0;;44491:3;44496:7;44457:47;;;;;;;:::i;:::-;;;;;;;;44517:164;44567:8;44590:4;44609:2;44626:3;44644:7;44666:4;44517:35;:164::i;35669:857::-;35771:4;35829:20;35797:14;;;;:9;:14;;;;;:28;;;:52;;;;;;-1:-1:-1;;;35797:52:0;;;;;;;;;;35793:726;;;35878:14;;;;:9;:14;;;;;;;;;:27;35870:54;;-1:-1:-1;;;35870:54:0;;-1:-1:-1;;;;;12378:32:1;;;35870:54:0;;;12360:51:1;;;;35878:27:0;;;;;;35870:46;;12333:18:1;;35870:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35870:54:0;;;;;;;;-1:-1:-1;;35870:54:0;;;;;;;;;;;;:::i;:::-;;;35866:255;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;36100:5;36093:12;;;;;35866:255;;;;;;;;;;;-1:-1:-1;36029:1:0;35980:14;;;:9;:14;;;;;;;;:27;35972:54;;-1:-1:-1;;;35972:54:0;;-1:-1:-1;;;;;12378:32:1;;;35972:54:0;;;12360:51:1;;;;35980:27:0;;;;;;;;35972:46;;12333:18:1;;35972:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;35944:86;;;;35793:726;36174:19;36142:14;;;;:9;:14;;;;;:28;;;:51;;;;;;-1:-1:-1;;;36142:51:0;;;;;;;;;;36138:381;;;36221:14;;;;:9;:14;;;;;;;;;:27;36214:53;;-1:-1:-1;;;36214:53:0;;-1:-1:-1;;;;;12378:32:1;;;36214:53:0;;;12360:51:1;;;;36221:27:0;;;;;;36214:45;;12333:18:1;;36214:53:0;12315:102:1;36138:381:0;-1:-1:-1;36502:5:0;36495:12;;46022:776;-1:-1:-1;;;;;46180:21:0;;46172:67;;;;-1:-1:-1;;;46172:67:0;;25778:2:1;46172:67:0;;;25760:21:1;25817:2;25797:18;;;25790:30;25856:34;25836:18;;;25829:62;-1:-1:-1;;;25907:18:1;;;25900:31;25948:19;;46172:67:0;25750:223:1;46172:67:0;682:10;46296:196;682:10;46252:16;46379:7;46401:21;46419:2;46401:17;:21::i;:::-;46437:25;46455:6;46437:17;:25::i;46296:196::-;46505:8;:12;;;;;;;;;;;-1:-1:-1;;;;;46505:21:0;;;;;;;;;:31;;46530:6;;46505:8;:31;;46530:6;;46505:31;:::i;:::-;;;;-1:-1:-1;;46552:57:0;;;26694:25:1;;;26750:2;26735:18;;26728:34;;;-1:-1:-1;;;;;46552:57:0;;;;46585:1;;46552:57;;;;;;26667:18:1;46552:57:0;;;;;;;46622:168;46667:8;46698:1;46715:7;46737:2;46754:6;46775:4;46622:30;:168::i;2888:173::-;2963:6;;;-1:-1:-1;;;;;2980:17:0;;;-1:-1:-1;;;;;;2980:17:0;;;;;;;3013:40;;2963:6;;;2980:17;2963:6;;3013:40;;2944:16;;3013:40;2888:173;;:::o;42138:945::-;-1:-1:-1;;;;;42326:16:0;;42318:66;;;;-1:-1:-1;;;42318:66:0;;;;;;;:::i;:::-;682:10;42441:185;682:10;42499:4;42518:2;42535:21;42553:2;42535:17;:21::i;42441:185::-;42639:19;42661:12;;;;;;;;;;;-1:-1:-1;;;;;42661:18:0;;;;;;;;;;42712:21;;;;42690:113;;;;-1:-1:-1;;;42690:113:0;;;;;;;:::i;:::-;42839:8;:12;;;;;;;;;;;-1:-1:-1;;;;;42839:18:0;;;;;;;;;;42860:20;;;42839:41;;42904:16;;;;;;;:26;;42860:20;;42839:8;42904:26;;42860:20;;42904:26;:::i;:::-;;;;-1:-1:-1;;42948:46:0;;;26694:25:1;;;26750:2;26735:18;;26728:34;;;-1:-1:-1;;;;;42948:46:0;;;;;;;;;;;;;;26667:18:1;42948:46:0;;;;;;;43007:68;43038:8;43048:4;43054:2;43058;43062:6;43070:4;43007:30;:68::i;:::-;42138:945;;;;;;;:::o;36534:419::-;36634:13;36669:21;;;;;;;;;;;;;;-1:-1:-1;;;36669:21:0;;;:5;:11;;:21;;;;:::i;:::-;:47;;;-1:-1:-1;36694:22:0;;;;;;;;;;;;-1:-1:-1;;;36694:22:0;;;;;;:5;;:11;:22::i;:::-;36665:281;;;-1:-1:-1;36740:20:0;;36534:419;-1:-1:-1;36534:419:0:o;36665:281::-;36782:20;;;;;;;;;;;;-1:-1:-1;;;36782:20:0;;;;;;:5;;:11;:20::i;:::-;:45;;;-1:-1:-1;36806:21:0;;;;;;;;;;;;-1:-1:-1;;;36806:21:0;;;;;;:5;;:11;:21::i;:::-;36778:168;;;-1:-1:-1;36851:19:0;;36534:419;-1:-1:-1;36534:419:0:o;36778:168::-;36903:31;;-1:-1:-1;;;36903:31:0;;20710:2:1;36903:31:0;;;20692:21:1;20749:2;20729:18;;;20722:30;-1:-1:-1;;;20768:18:1;;;20761:51;20829:18;;36903:31:0;20682:171:1;36778:168:0;36534:419;;;:::o;52369:976::-;-1:-1:-1;;;;;52610:13:0;;6089:20;6137:8;52606:732;;52663:203;;-1:-1:-1;;;52663:203:0;;-1:-1:-1;;;;;52663:43:0;;;;;:203;;52729:8;;52760:4;;52787:3;;52813:7;;52843:4;;52663:203;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52663:203:0;;;;;;;;-1:-1:-1;;52663:203:0;;;;;;;;;;;;:::i;:::-;;;52642:685;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;53200:6;53193:14;;-1:-1:-1;;;53193:14:0;;;;;;;;:::i;52642:685::-;;;53249:62;;-1:-1:-1;;;53249:62:0;;15172:2:1;53249:62:0;;;15154:21:1;15211:2;15191:18;;;15184:30;15250:34;15230:18;;;15223:62;-1:-1:-1;;;15301:18:1;;;15294:50;15361:19;;53249:62:0;15144:242:1;52642:685:0;-1:-1:-1;;;;;;52951:60:0;;-1:-1:-1;;;52951:60:0;52925:199;;53054:50;;-1:-1:-1;;;53054:50:0;;;;;;;:::i;53353:231::-;53506:16;;;53520:1;53506:16;;;;;;;;;53447;;53481:22;;53506:16;;;;;;;;;;;;-1:-1:-1;53506:16:0;53481:41;;53544:7;53533:5;53539:1;53533:8;;;;;;-1:-1:-1;;;53533:8:0;;;;;;;;;;;;;;;;;;:18;53571:5;53353:231;-1:-1:-1;;53353:231:0:o;51462:899::-;-1:-1:-1;;;;;51678:13:0;;6089:20;6137:8;51674:680;;51731:196;;-1:-1:-1;;;51731:196:0;;-1:-1:-1;;;;;51731:38:0;;;;;:196;;51792:8;;51823:4;;51850:2;;51875:6;;51904:4;;51731:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51731:196:0;;;;;;;;-1:-1:-1;;51731:196:0;;;;;;;;;;;;:::i;:::-;;;51710:633;;;;:::i;:::-;-1:-1:-1;;;;;;51990:55:0;;-1:-1:-1;;;51990:55:0;51986:154;;52070:50;;-1:-1:-1;;;52070:50:0;;;;;;;:::i;33464:158::-;33565:4;33594:15;33602:2;33606;33594:7;:15::i;:::-;:20;;33464:158;-1:-1:-1;;;33464:158:0:o;32750:634::-;32971:8;;32994;;32853:6;;32900:2;;32937;;32971:8;32994:20;-1:-1:-1;32990:46:0;;;-1:-1:-1;33028:8:0;;32990:46;33139:9;33134:124;33158:9;33154:1;:13;33134:124;;;33198:1;33200;33198:4;;;;;;-1:-1:-1;;;33198:4:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33191:11:0;;:1;33193;33191:4;;;;;;-1:-1:-1;;;33191:4:0;;;;;;;;;;;;;-1:-1:-1;;;;;;33191:4:0;:11;33187:71;;;-1:-1:-1;;33204:9:0;;;;;;;;33187:71;33244:1;33246;33244:4;;;;;;-1:-1:-1;;;33244:4:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33237:11:0;;:1;33239;33237:4;;;;;;-1:-1:-1;;;33237:4:0;;;;;;;;;;;;;-1:-1:-1;;;;;;33237:4:0;:11;33233:25;;;33257:1;33250:8;;;;;;;;33233:25;33169:3;;;;:::i;:::-;;;;33134:124;;;;33284:1;:8;33273:1;:8;:19;33269:107;;;-1:-1:-1;;33294:9:0;;;;;;;33269:107;33334:1;:8;33323:1;:8;:19;33319:57;;;33351:1;33344:8;;;;;;;33319:57;33375:1;33368:8;;;;;;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:395:1;77:8;87:6;141:3;134:4;126:6;122:17;118:27;108:2;;166:8;156;149:26;108:2;-1:-1:-1;196:20:1;;-1:-1:-1;;;;;228:30:1;;225:2;;;278:8;268;261:26;225:2;322:4;314:6;310:17;298:29;;382:3;375:4;365:6;362:1;358:14;350:6;346:27;342:38;339:47;336:2;;;399:1;396;389:12;336:2;98:311;;;;;:::o;414:755::-;468:5;521:3;514:4;506:6;502:17;498:27;488:2;;543:5;536;529:20;488:2;583:6;570:20;609:4;632:43;672:2;632:43;:::i;:::-;704:2;698:9;716:31;744:2;736:6;716:31;:::i;:::-;782:18;;;816:15;;;;-1:-1:-1;851:15:1;;;901:1;897:10;;;885:23;;881:32;;878:41;-1:-1:-1;875:2:1;;;936:5;929;922:20;875:2;962:5;976:163;990:2;987:1;984:9;976:163;;;1047:17;;1035:30;;1085:12;;;;1117;;;;1008:1;1001:9;976:163;;;-1:-1:-1;1157:6:1;;478:691;-1:-1:-1;;;;;;;478:691:1:o;1174:160::-;1239:20;;1295:13;;1288:21;1278:32;;1268:2;;1324:1;1321;1314:12;1339:575;1381:5;1434:3;1427:4;1419:6;1415:17;1411:27;1401:2;;1456:5;1449;1442:20;1401:2;1496:6;1483:20;-1:-1:-1;;;;;1518:2:1;1515:26;1512:2;;;1544:18;;:::i;:::-;1593:2;1587:9;1605:67;1660:2;1641:13;;-1:-1:-1;;1637:27:1;1666:4;1633:38;1587:9;1605:67;:::i;:::-;1696:2;1688:6;1681:18;1742:3;1735:4;1730:2;1722:6;1718:15;1714:26;1711:35;1708:2;;;1763:5;1756;1749:20;1708:2;1831;1824:4;1816:6;1812:17;1805:4;1797:6;1793:17;1780:54;1854:15;;;1871:4;1850:26;1843:41;;;;1858:6;1391:523;-1:-1:-1;;1391:523:1:o;1919:257::-;1978:6;2031:2;2019:9;2010:7;2006:23;2002:32;1999:2;;;2052:6;2044;2037:22;1999:2;2096:9;2083:23;2115:31;2140:5;2115:31;:::i;2181:398::-;2249:6;2257;2310:2;2298:9;2289:7;2285:23;2281:32;2278:2;;;2331:6;2323;2316:22;2278:2;2375:9;2362:23;2394:31;2419:5;2394:31;:::i;:::-;2444:5;-1:-1:-1;2501:2:1;2486:18;;2473:32;2514:33;2473:32;2514:33;:::i;:::-;2566:7;2556:17;;;2268:311;;;;;:::o;2584:1111::-;2738:6;2746;2754;2762;2770;2823:3;2811:9;2802:7;2798:23;2794:33;2791:2;;;2845:6;2837;2830:22;2791:2;2889:9;2876:23;2908:31;2933:5;2908:31;:::i;:::-;2958:5;-1:-1:-1;3015:2:1;3000:18;;2987:32;3028:33;2987:32;3028:33;:::i;:::-;3080:7;-1:-1:-1;3138:2:1;3123:18;;3110:32;-1:-1:-1;;;;;3191:14:1;;;3188:2;;;3223:6;3215;3208:22;3188:2;3251:61;3304:7;3295:6;3284:9;3280:22;3251:61;:::i;:::-;3241:71;;3365:2;3354:9;3350:18;3337:32;3321:48;;3394:2;3384:8;3381:16;3378:2;;;3415:6;3407;3400:22;3378:2;3443:63;3498:7;3487:8;3476:9;3472:24;3443:63;:::i;:::-;3433:73;;3559:3;3548:9;3544:19;3531:33;3515:49;;3589:2;3579:8;3576:16;3573:2;;;3610:6;3602;3595:22;3573:2;;3638:51;3681:7;3670:8;3659:9;3655:24;3638:51;:::i;:::-;3628:61;;;2781:914;;;;;;;;:::o;3700:754::-;3804:6;3812;3820;3828;3836;3889:3;3877:9;3868:7;3864:23;3860:33;3857:2;;;3911:6;3903;3896:22;3857:2;3955:9;3942:23;3974:31;3999:5;3974:31;:::i;:::-;4024:5;-1:-1:-1;4081:2:1;4066:18;;4053:32;4094:33;4053:32;4094:33;:::i;:::-;4146:7;-1:-1:-1;4200:2:1;4185:18;;4172:32;;-1:-1:-1;4251:2:1;4236:18;;4223:32;;-1:-1:-1;4306:3:1;4291:19;;4278:33;-1:-1:-1;;;;;4323:30:1;;4320:2;;;4371:6;4363;4356:22;4320:2;4399:49;4440:7;4431:6;4420:9;4416:22;4399:49;:::i;4459:325::-;4524:6;4532;4585:2;4573:9;4564:7;4560:23;4556:32;4553:2;;;4606:6;4598;4591:22;4553:2;4650:9;4637:23;4669:31;4694:5;4669:31;:::i;:::-;4719:5;-1:-1:-1;4743:35:1;4774:2;4759:18;;4743:35;:::i;:::-;4733:45;;4543:241;;;;;:::o;4789:393::-;4863:6;4871;4879;4932:2;4920:9;4911:7;4907:23;4903:32;4900:2;;;4953:6;4945;4938:22;4900:2;4997:9;4984:23;5016:31;5041:5;5016:31;:::i;:::-;5066:5;-1:-1:-1;5090:35:1;5121:2;5106:18;;5090:35;:::i;:::-;5080:45;;5172:2;5161:9;5157:18;5144:32;5134:42;;4890:292;;;;;:::o;5187:325::-;5255:6;5263;5316:2;5304:9;5295:7;5291:23;5287:32;5284:2;;;5337:6;5329;5322:22;5284:2;5381:9;5368:23;5400:31;5425:5;5400:31;:::i;:::-;5450:5;5502:2;5487:18;;;;5474:32;;-1:-1:-1;;;5274:238:1:o;5517:868::-;5645:6;5653;5661;5669;5677;5730:2;5718:9;5709:7;5705:23;5701:32;5698:2;;;5751:6;5743;5736:22;5698:2;5796:9;5783:23;-1:-1:-1;;;;;5866:2:1;5858:6;5855:14;5852:2;;;5887:6;5879;5872:22;5852:2;5931:70;5993:7;5984:6;5973:9;5969:22;5931:70;:::i;:::-;6020:8;;-1:-1:-1;5905:96:1;-1:-1:-1;6108:2:1;6093:18;;6080:32;;-1:-1:-1;6124:16:1;;;6121:2;;;6158:6;6150;6143:22;6121:2;;6202:72;6266:7;6255:8;6244:9;6240:24;6202:72;:::i;:::-;5688:697;;;;-1:-1:-1;6293:8:1;6375:2;6360:18;6347:32;;5688:697;-1:-1:-1;;;;5688:697:1:o;6390:525::-;6485:6;6493;6501;6554:2;6542:9;6533:7;6529:23;6525:32;6522:2;;;6575:6;6567;6560:22;6522:2;6620:9;6607:23;-1:-1:-1;;;;;6645:6:1;6642:30;6639:2;;;6690:6;6682;6675:22;6639:2;6734:70;6796:7;6787:6;6776:9;6772:22;6734:70;:::i;:::-;6823:8;;6708:96;;-1:-1:-1;6905:2:1;6890:18;;;;6877:32;;6512:403;-1:-1:-1;;;;6512:403:1:o;6920:1343::-;7038:6;7046;7099:2;7087:9;7078:7;7074:23;7070:32;7067:2;;;7120:6;7112;7105:22;7067:2;7165:9;7152:23;-1:-1:-1;;;;;7235:2:1;7227:6;7224:14;7221:2;;;7256:6;7248;7241:22;7221:2;7299:6;7288:9;7284:22;7274:32;;7344:7;7337:4;7333:2;7329:13;7325:27;7315:2;;7371:6;7363;7356:22;7315:2;7412;7399:16;7434:4;7457:43;7497:2;7457:43;:::i;:::-;7529:2;7523:9;7541:31;7569:2;7561:6;7541:31;:::i;:::-;7607:18;;;7641:15;;;;-1:-1:-1;7676:11:1;;;7718:1;7714:10;;;7706:19;;7702:28;;7699:41;-1:-1:-1;7696:2:1;;;7758:6;7750;7743:22;7696:2;7785:6;7776:15;;7800:238;7814:2;7811:1;7808:9;7800:238;;;7885:3;7872:17;7902:31;7927:5;7902:31;:::i;:::-;7946:18;;7832:1;7825:9;;;;;7984:12;;;;8016;;7800:238;;;-1:-1:-1;8057:6:1;-1:-1:-1;;8101:18:1;;8088:32;;-1:-1:-1;;8132:16:1;;;8129:2;;;8166:6;8158;8151:22;8129:2;;8194:63;8249:7;8238:8;8227:9;8223:24;8194:63;:::i;:::-;8184:73;;;7057:1206;;;;;:::o;8268:190::-;8324:6;8377:2;8365:9;8356:7;8352:23;8348:32;8345:2;;;8398:6;8390;8383:22;8345:2;8426:26;8442:9;8426:26;:::i;8463:255::-;8521:6;8574:2;8562:9;8553:7;8549:23;8545:32;8542:2;;;8595:6;8587;8580:22;8542:2;8639:9;8626:23;8658:30;8682:5;8658:30;:::i;8723:259::-;8792:6;8845:2;8833:9;8824:7;8820:23;8816:32;8813:2;;;8866:6;8858;8851:22;8813:2;8903:9;8897:16;8922:30;8946:5;8922:30;:::i;8987:544::-;9074:6;9082;9090;9143:2;9131:9;9122:7;9118:23;9114:32;9111:2;;;9164:6;9156;9149:22;9111:2;9209:9;9196:23;-1:-1:-1;;;;;9234:6:1;9231:30;9228:2;;;9279:6;9271;9264:22;9228:2;9307:49;9348:7;9339:6;9328:9;9324:22;9307:49;:::i;:::-;9297:59;;;9406:2;9395:9;9391:18;9378:32;9419:31;9444:5;9419:31;:::i;:::-;9101:430;;9469:5;;-1:-1:-1;;;9521:2:1;9506:18;;;;9493:32;;9101:430::o;9536:190::-;9595:6;9648:2;9636:9;9627:7;9623:23;9619:32;9616:2;;;9669:6;9661;9654:22;9616:2;-1:-1:-1;9697:23:1;;9606:120;-1:-1:-1;9606:120:1:o;9731:194::-;9801:6;9854:2;9842:9;9833:7;9829:23;9825:32;9822:2;;;9875:6;9867;9860:22;9822:2;-1:-1:-1;9903:16:1;;9812:113;-1:-1:-1;9812:113:1:o;9930:333::-;10006:6;10014;10067:2;10055:9;10046:7;10042:23;10038:32;10035:2;;;10088:6;10080;10073:22;10035:2;10129:9;10116:23;10106:33;;10189:2;10178:9;10174:18;10161:32;10202:31;10227:5;10202:31;:::i;10268:546::-;10364:6;10372;10380;10388;10441:3;10429:9;10420:7;10416:23;10412:33;10409:2;;;10463:6;10455;10448:22;10409:2;10504:9;10491:23;10481:33;;10565:2;10554:9;10550:18;10537:32;-1:-1:-1;;;;;10584:6:1;10581:30;10578:2;;;10629:6;10621;10614:22;10578:2;10657:49;10698:7;10689:6;10678:9;10674:22;10657:49;:::i;:::-;10399:415;;10647:59;;-1:-1:-1;;;;10753:2:1;10738:18;;10725:32;;10804:2;10789:18;10776:32;;10399:415;-1:-1:-1;10399:415:1:o;10819:258::-;10887:6;10895;10948:2;10936:9;10927:7;10923:23;10919:32;10916:2;;;10969:6;10961;10954:22;10916:2;-1:-1:-1;;10997:23:1;;;11067:2;11052:18;;;11039:32;;-1:-1:-1;10906:171:1:o;11082:437::-;11135:3;11173:5;11167:12;11200:6;11195:3;11188:19;11226:4;11255:2;11250:3;11246:12;11239:19;;11292:2;11285:5;11281:14;11313:3;11325:169;11339:6;11336:1;11333:13;11325:169;;;11400:13;;11388:26;;11434:12;;;;11469:15;;;;11361:1;11354:9;11325:169;;;-1:-1:-1;11510:3:1;;11143:376;-1:-1:-1;;;;;11143:376:1:o;11524:475::-;11565:3;11603:5;11597:12;11630:6;11625:3;11618:19;11655:3;11667:162;11681:6;11678:1;11675:13;11667:162;;;11743:4;11799:13;;;11795:22;;11789:29;11771:11;;;11767:20;;11760:59;11696:12;11667:162;;;11847:6;11844:1;11841:13;11838:2;;;11913:3;11906:4;11897:6;11892:3;11888:16;11884:27;11877:40;11838:2;-1:-1:-1;11981:2:1;11960:15;-1:-1:-1;;11956:29:1;11947:39;;;;11988:4;11943:50;;11573:426;-1:-1:-1;;11573:426:1:o;12422:826::-;-1:-1:-1;;;;;12819:15:1;;;12801:34;;12871:15;;12866:2;12851:18;;12844:43;12781:3;12918:2;12903:18;;12896:31;;;12744:4;;12950:57;;12987:19;;12979:6;12950:57;:::i;:::-;13055:9;13047:6;13043:22;13038:2;13027:9;13023:18;13016:50;13089:44;13126:6;13118;13089:44;:::i;:::-;13075:58;;13182:9;13174:6;13170:22;13164:3;13153:9;13149:19;13142:51;13210:32;13235:6;13227;13210:32;:::i;:::-;13202:40;12753:495;-1:-1:-1;;;;;;;;12753:495:1:o;13253:560::-;-1:-1:-1;;;;;13550:15:1;;;13532:34;;13602:15;;13597:2;13582:18;;13575:43;13649:2;13634:18;;13627:34;;;13692:2;13677:18;;13670:34;;;13512:3;13735;13720:19;;13713:32;;;13475:4;;13762:45;;13787:19;;13779:6;13762:45;:::i;:::-;13754:53;13484:329;-1:-1:-1;;;;;;;13484:329:1:o;13818:261::-;13997:2;13986:9;13979:21;13960:4;14017:56;14069:2;14058:9;14054:18;14046:6;14017:56;:::i;14084:465::-;14341:2;14330:9;14323:21;14304:4;14367:56;14419:2;14408:9;14404:18;14396:6;14367:56;:::i;:::-;14471:9;14463:6;14459:22;14454:2;14443:9;14439:18;14432:50;14499:44;14536:6;14528;14499:44;:::i;:::-;14491:52;14313:236;-1:-1:-1;;;;;14313:236:1:o;14746:219::-;14895:2;14884:9;14877:21;14858:4;14915:44;14955:2;14944:9;14940:18;14932:6;14915:44;:::i;15391:404::-;15593:2;15575:21;;;15632:2;15612:18;;;15605:30;15671:34;15666:2;15651:18;;15644:62;-1:-1:-1;;;15737:2:1;15722:18;;15715:38;15785:3;15770:19;;15565:230::o;17401:409::-;17603:2;17585:21;;;17642:2;17622:18;;;17615:30;17681:34;17676:2;17661:18;;17654:62;-1:-1:-1;;;17747:2:1;17732:18;;17725:43;17800:3;17785:19;;17575:235::o;20858:401::-;21060:2;21042:21;;;21099:2;21079:18;;;21072:30;21138:34;21133:2;21118:18;;21111:62;-1:-1:-1;;;21204:2:1;21189:18;;21182:35;21249:3;21234:19;;21032:227::o;21683:406::-;21885:2;21867:21;;;21924:2;21904:18;;;21897:30;21963:34;21958:2;21943:18;;21936:62;-1:-1:-1;;;22029:2:1;22014:18;;22007:40;22079:3;22064:19;;21857:232::o;22445:356::-;22647:2;22629:21;;;22666:18;;;22659:30;22725:34;22720:2;22705:18;;22698:62;22792:2;22777:18;;22619:182::o;26773:183::-;26833:4;-1:-1:-1;;;;;26858:6:1;26855:30;26852:2;;;26888:18;;:::i;:::-;-1:-1:-1;26933:1:1;26929:14;26945:4;26925:25;;26842:114::o;26961:128::-;27001:3;27032:1;27028:6;27025:1;27022:13;27019:2;;;27038:18;;:::i;:::-;-1:-1:-1;27074:9:1;;27009:80::o;27094:380::-;27173:1;27169:12;;;;27216;;;27237:2;;27291:4;27283:6;27279:17;27269:27;;27237:2;27344;27336:6;27333:14;27313:18;27310:38;27307:2;;;27390:10;27385:3;27381:20;27378:1;27371:31;27425:4;27422:1;27415:15;27453:4;27450:1;27443:15;27307:2;;27149:325;;;:::o;27479:249::-;27589:2;27570:13;;-1:-1:-1;;27566:27:1;27554:40;;-1:-1:-1;;;;;27609:34:1;;27645:22;;;27606:62;27603:2;;;27671:18;;:::i;:::-;27707:2;27700:22;-1:-1:-1;;27526:202:1:o;27733:135::-;27772:3;-1:-1:-1;;27793:17:1;;27790:2;;;27813:18;;:::i;:::-;-1:-1:-1;27860:1:1;27849:13;;27780:88::o;27873:127::-;27934:10;27929:3;27925:20;27922:1;27915:31;27965:4;27962:1;27955:15;27989:4;27986:1;27979:15;28005:127;28066:10;28061:3;28057:20;28054:1;28047:31;28097:4;28094:1;28087:15;28121:4;28118:1;28111:15;28137:185;28172:3;28214:1;28196:16;28193:23;28190:2;;;28264:1;28259:3;28254;28239:27;28295:10;28290:3;28286:20;28190:2;28180:142;:::o;28327:671::-;28366:3;28408:4;28390:16;28387:26;28384:2;;;28374:624;:::o;28384:2::-;28450;28444:9;-1:-1:-1;;28515:16:1;28511:25;;28508:1;28444:9;28487:50;28566:4;28560:11;28590:16;-1:-1:-1;;;;;28696:2:1;28689:4;28681:6;28677:17;28674:25;28669:2;28661:6;28658:14;28655:45;28652:2;;;28703:5;;;;;28374:624;:::o;28652:2::-;28740:6;28734:4;28730:17;28719:28;;28776:3;28770:10;28803:2;28795:6;28792:14;28789:2;;;28809:5;;;;;;28374:624;:::o;28789:2::-;28893;28874:16;28868:4;28864:27;28860:36;28853:4;28844:6;28839:3;28835:16;28831:27;28828:69;28825:2;;;28900:5;;;;;;28374:624;:::o;28825:2::-;28916:57;28967:4;28958:6;28950;28946:19;28942:30;28936:4;28916:57;:::i;:::-;-1:-1:-1;28989:3:1;;28374:624;-1:-1:-1;;;;;28374:624:1:o;29003:131::-;-1:-1:-1;;;;;29078:31:1;;29068:42;;29058:2;;29124:1;29121;29114:12;29139:131;-1:-1:-1;;;;;;29213:32:1;;29203:43;;29193:2;;29260:1;29257;29250:12

Swarm Source

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