ETH Price: $2,474.50 (-1.92%)

Token

 

Overview

Max Total Supply

100

Holders

96

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x4e295de8987ab03110f7155ad2f6cc34d9446f14
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
TreumERC1155

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

pragma solidity ^0.8.0;


// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
/**
 * @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;
    }
}

// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)
/**
 * @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() {
        _transferOwnership(_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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)
/**
 * @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);
}

// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)
/**
 * @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);
            }
        }
    }
}

// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)
/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
/**
 * @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);
}

// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)
/**
 * @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;
}

// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155Receiver.sol)
/**
 * @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);
}

// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)
/**
 * @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);
}

// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
/**
 * @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;
    }
}

// OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol)
/**
 * @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)) private _balances;

    // Mapping from account to operator approvals
    mapping(address => mapping(address => bool)) private _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 {
        _setApprovalForAll(_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 `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

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

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, 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 `from`
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

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

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, 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 from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

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

        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: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @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
    ) private {
        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
    ) private {
        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) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
/**
 * @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);
    }
}

// Abstract, as without permission system
abstract contract AbsERC1155 is ERC1155 {
    string public baseURI;
    mapping(uint256 => uint256) public maxSupply;
    mapping(uint256 => uint256) public currentSupply;

    constructor(string memory baseURIParam) ERC1155("") {
        _setBaseURI(baseURIParam);
    }

    function uri(uint256 tokenId) public view virtual override returns (string memory) {
        require(isCreated(tokenId), "BaseERC1155: URI query for nonexistent token");
        return string(abi.encodePacked(baseURI, Strings.toString(tokenId), ".json"));
    }

    // be careful when overriding as this is used in the _create function
    function isCreated(uint256 tokenId) public view virtual returns (bool) {
        return maxSupply[tokenId] != 0;
    }

    // Internal function to create a token
    function _create(
        uint256 tokenId,
        uint256 initialSupply,
        uint256 maxSupply_
    ) internal {
        require(maxSupply_ != 0, "BaseERC1155: maxSupply cannot be 0");
        require(!isCreated(tokenId), "BaseERC1155: token already created");
        require(initialSupply <= maxSupply_, "BaseERC1155: initial supply cannot exceed max");
        maxSupply[tokenId] = maxSupply_;
        if (initialSupply > 0) {
            _mint(msg.sender, tokenId, initialSupply, hex"");
        }
    }

    // To be overridden with permissioning
    function setBaseURI(string memory baseURIParam) external virtual;

    // Internal function to create a token
    function _setBaseURI(string memory baseURIParam) internal {
        baseURI = baseURIParam;
    }

    function _mint(
        address account,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual override {
        require(amount != 0, "Zero amount");
        require(currentSupply[id] + amount <= maxSupply[id], "Max supply");
        currentSupply[id] += amount;
        super._mint(account, id, amount, data);
    }

    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        require(ids.length == amounts.length, "Array length");
        require(ids.length != 0, "Zero values");

        for (uint256 i = 0; i < ids.length; i++) {
            require(amounts[i] != 0, "Zero amount");
            uint256 tokenId = ids[i];
            require(currentSupply[tokenId] + amounts[i] <= maxSupply[tokenId], "Max supply");
            currentSupply[tokenId] += amounts[i];
        }
        super._mintBatch(to, ids, amounts, data);
    }
}

/**
 * ERC1155 implementation that allows public minting with a max supply, and a fixed price for minting (payable via ERC20 token)
 */
contract TreumERC1155 is AbsERC1155, Ownable {
    using SafeERC20 for IERC20;

    struct PublicMintData {
        address erc20Address;
        uint256 mintPrice;
        bool enabled;
    }

    mapping(uint256 => PublicMintData) public tokenMintPrices;
    mapping(uint256 => string) private tokenURIs;

    constructor() AbsERC1155("") {}

    function setBaseURI(string memory baseURI) external virtual override onlyOwner {
        _setBaseURI(baseURI);
    }

    /**
     * @dev Creates an ERC1155 token, optionally setting a fixed price (erc20) for minting the ERC1155
     * @dev Can also be used to premint the full supply of an ERC1155 to the contract owner
     */
    function createWithFixedPrice(
        uint256 tokenId,
        uint256 initialSupply,
        uint256 maxSupply,
        uint256 mintPrice,
        address mintPriceTokenAddress,
        string memory uri
    ) external onlyOwner {
        if (initialSupply < maxSupply) {
            require(mintPrice > 0, "Invalid Mint Price");
        }

        tokenMintPrices[tokenId] = PublicMintData({
            erc20Address: mintPriceTokenAddress,
            mintPrice: mintPrice,
            enabled: true
        });
        tokenURIs[tokenId] = uri;

        // Create ERC1155 token with specified supplies
        _create(tokenId, initialSupply, maxSupply);
    }

    /**
     * @dev Mints a single ERC1155 to msg.sender
     */
    function publicMint(uint256 tokenId) external {
        // Get the address & price for minting via ERC20
        PublicMintData storage publicMintData = tokenMintPrices[tokenId];
        require(publicMintData.enabled, "Public Minting Not Enabled");

        if (publicMintData.mintPrice > 0) {
            // Receive ERC20 mintPrice amount
            IERC20(publicMintData.erc20Address).safeTransferFrom(msg.sender, address(this), publicMintData.mintPrice);
        }

        // Mint ERC1155
        _mint(msg.sender, tokenId, 1, hex"");
    }

    /**
     * @dev Create an ERC1155 token, with a max supply, public minting not enabled
     * @dev For backwards compatibility, it can also be used to premint the full supply
     * @dev to the contract owner
     */
    function createForAdminMint(
        uint256 tokenId,
        uint256 initialSupply,
        uint256 maxSupply,
        string memory uri
    ) external onlyOwner {
        tokenURIs[tokenId] = uri;

        // Create ERC1155 token with specified supplies
        _create(tokenId, initialSupply, maxSupply);
    }

    /**
     * @dev Mints an amount of ERC1155 tokens to an address
     */
    function adminMint(
        uint256 tokenId,
        uint256 amount,
        address to
    ) external onlyOwner {
        _mint(to, tokenId, amount, hex"");
    }

    function uri(uint256 tokenId) public view override returns (string memory) {
        // we could revert for non existant ones
        return tokenURIs[tokenId];
    }

    function withdrawTokensTo(address erc20Address, address recipient) external onlyOwner {
        uint256 tokenBalance = IERC20(erc20Address).balanceOf(address(this));
        require(tokenBalance > 0, "No tokens");

        IERC20(erc20Address).safeTransfer(recipient, tokenBalance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"initialSupply","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"createForAdminMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"initialSupply","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"mintPrice","type":"uint256"},{"internalType":"address","name":"mintPriceTokenAddress","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"name":"createWithFixedPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"currentSupply","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":"uint256","name":"tokenId","type":"uint256"}],"name":"isCreated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"nonpayable","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":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenMintPrices","outputs":[{"internalType":"address","name":"erc20Address","type":"address"},{"internalType":"uint256","name":"mintPrice","type":"uint256"},{"internalType":"bool","name":"enabled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Address","type":"address"},{"internalType":"address","name":"recipient","type":"address"}],"name":"withdrawTokensTo","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060408051602080820183526000808352835191820190935291825290620000398162000057565b50620000458162000070565b50620000513362000085565b620001ba565b80516200006c906002906020840190620000d7565b5050565b80516200006c906003906020840190620000d7565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620000e5906200017d565b90600052602060002090601f01602090048101928262000109576000855562000154565b82601f106200012457805160ff191683800117855562000154565b8280016001018555821562000154579182015b828111156200015457825182559160200191906001019062000137565b506200016292915062000166565b5090565b5b8082111562000162576000815560010162000167565b600181811c908216806200019257607f821691505b60208210811415620001b457634e487b7160e01b600052602260045260246000fd5b50919050565b6123d380620001ca6000396000f3fe608060405234801561001057600080fd5b50600436106101415760003560e01c806355f804b3116100b85780638da5cb5b1161007c5780638da5cb5b14610318578063a22cb46514610333578063e3f6d88414610346578063e985e9c514610359578063f242432a14610395578063f2fde38b146103a857600080fd5b806355f804b3146102b55780635b746077146102c85780636c0360eb146102e8578063715018a6146102f0578063869f7594146102f857600080fd5b80632da636081161010a5780632da63608146101e65780632db11544146101f95780632eb2c2d61461020c57806340fa09bc1461021f5780634b74e667146102825780634e1273f41461029557600080fd5b8062fdd58e1461014657806301ffc9a71461016c5780630c63bded1461018f5780630e89341c146101a457806329a8791a146101c4575b600080fd5b6101596101543660046119f5565b6103bb565b6040519081526020015b60405180910390f35b61017f61017a366004611a35565b610452565b6040519015158152602001610163565b6101a261019d366004611b09565b6104a4565b005b6101b76101b2366004611b63565b6104ff565b6040516101639190611bd4565b61017f6101d2366004611b63565b600090815260046020526040902054151590565b6101a26101f4366004611be7565b6105a1565b6101a2610207366004611b63565b6105eb565b6101a261021a366004611cb1565b610697565b61025b61022d366004611b63565b6007602052600090815260409020805460018201546002909201546001600160a01b03909116919060ff1683565b604080516001600160a01b0390941684526020840192909252151590820152606001610163565b6101a2610290366004611d5b565b61072e565b6102a86102a3366004611dce565b610834565b6040516101639190611ed4565b6101a26102c3366004611ee7565b61095e565b6101596102d6366004611b63565b60056020526000908152604090205481565b6101b7610994565b6101a2610a22565b610159610306366004611b63565b60046020526000908152604090205481565b6006546040516001600160a01b039091168152602001610163565b6101a2610341366004611f32565b610a58565b6101a2610354366004611f69565b610a63565b61017f610367366004611f69565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6101a26103a3366004611f9c565b610b59565b6101a26103b6366004612001565b610be0565b60006001600160a01b03831661042c5760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061048357506001600160e01b031982166303a24d0760e21b145b8061049e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6006546001600160a01b031633146104ce5760405162461bcd60e51b81526004016104239061201c565b600084815260086020908152604090912082516104ed92840190611940565b506104f9848484610c78565b50505050565b600081815260086020526040902080546060919061051c90612051565b80601f016020809104026020016040519081016040528092919081815260200182805461054890612051565b80156105955780601f1061056a57610100808354040283529160200191610595565b820191906000526020600020905b81548152906001019060200180831161057857829003601f168201915b50505050509050919050565b6006546001600160a01b031633146105cb5760405162461bcd60e51b81526004016104239061201c565b6105e681848460405180602001604052806000815250610dcb565b505050565b6000818152600760205260409020600281015460ff1661064d5760405162461bcd60e51b815260206004820152601a60248201527f5075626c6963204d696e74696e67204e6f7420456e61626c65640000000000006044820152606401610423565b6001810154156106775760018101548154610677916001600160a01b039091169033903090610e97565b6106933383600160405180602001604052806000815250610dcb565b5050565b6001600160a01b0385163314806106b357506106b38533610367565b61071a5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610423565b6107278585858585610f02565b5050505050565b6006546001600160a01b031633146107585760405162461bcd60e51b81526004016104239061201c565b838510156107a557600083116107a55760405162461bcd60e51b8152602060048201526012602482015271496e76616c6964204d696e7420507269636560701b6044820152606401610423565b604080516060810182526001600160a01b0384811682526020808301878152600184860181815260008d815260078552878120965187546001600160a01b0319169616959095178655915190850155516002909301805460ff1916931515939093179092556008825291909120825161082092840190611940565b5061082c868686610c78565b505050505050565b606081518351146108995760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610423565b6000835167ffffffffffffffff8111156108b5576108b5611a52565b6040519080825280602002602001820160405280156108de578160200160208202803683370190505b50905060005b8451811015610956576109298582815181106109025761090261208c565b602002602001015185838151811061091c5761091c61208c565b60200260200101516103bb565b82828151811061093b5761093b61208c565b602090810291909101015261094f816120b8565b90506108e4565b509392505050565b6006546001600160a01b031633146109885760405162461bcd60e51b81526004016104239061201c565b610991816110d7565b50565b600380546109a190612051565b80601f01602080910402602001604051908101604052809291908181526020018280546109cd90612051565b8015610a1a5780601f106109ef57610100808354040283529160200191610a1a565b820191906000526020600020905b8154815290600101906020018083116109fd57829003601f168201915b505050505081565b6006546001600160a01b03163314610a4c5760405162461bcd60e51b81526004016104239061201c565b610a5660006110ea565b565b61069333838361113c565b6006546001600160a01b03163314610a8d5760405162461bcd60e51b81526004016104239061201c565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a082319060240160206040518083038186803b158015610acf57600080fd5b505afa158015610ae3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0791906120d3565b905060008111610b455760405162461bcd60e51b81526020600482015260096024820152684e6f20746f6b656e7360b81b6044820152606401610423565b6105e66001600160a01b038416838361121d565b6001600160a01b038516331480610b755750610b758533610367565b610bd35760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b6064820152608401610423565b610727858585858561124d565b6006546001600160a01b03163314610c0a5760405162461bcd60e51b81526004016104239061201c565b6001600160a01b038116610c6f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610423565b610991816110ea565b80610cd05760405162461bcd60e51b815260206004820152602260248201527f42617365455243313135353a206d6178537570706c792063616e6e6f74206265604482015261020360f41b6064820152608401610423565b60008381526004602052604090205415610d375760405162461bcd60e51b815260206004820152602260248201527f42617365455243313135353a20746f6b656e20616c7265616479206372656174604482015261195960f21b6064820152608401610423565b80821115610d9d5760405162461bcd60e51b815260206004820152602d60248201527f42617365455243313135353a20696e697469616c20737570706c792063616e6e60448201526c0dee840caf0c6cacac840dac2f609b1b6064820152608401610423565b600083815260046020526040902081905581156105e6576105e6338484604051806020016040528060008152505b81610e065760405162461bcd60e51b815260206004820152600b60248201526a16995c9bc8185b5bdd5b9d60aa1b6044820152606401610423565b600083815260046020908152604080832054600590925290912054610e2c9084906120ec565b1115610e675760405162461bcd60e51b815260206004820152600a6024820152694d617820737570706c7960b01b6044820152606401610423565b60008381526005602052604081208054849290610e859084906120ec565b909155506104f9905084848484611373565b6040516001600160a01b03808516602483015283166044820152606481018290526104f99085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611474565b8151835114610f645760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610423565b6001600160a01b038416610f8a5760405162461bcd60e51b815260040161042390612104565b3360005b8451811015611071576000858281518110610fab57610fab61208c565b602002602001015190506000858381518110610fc957610fc961208c565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156110195760405162461bcd60e51b815260040161042390612149565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906110569084906120ec565b925050819055505050508061106a906120b8565b9050610f8e565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516110c1929190612193565b60405180910390a461082c818787878787611546565b8051610693906003906020840190611940565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156111b05760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610423565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6040516001600160a01b0383166024820152604481018290526105e690849063a9059cbb60e01b90606401610ecb565b6001600160a01b0384166112735760405162461bcd60e51b815260040161042390612104565b3361128c818787611283886116b1565b610727886116b1565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156112cd5760405162461bcd60e51b815260040161042390612149565b6000858152602081815260408083206001600160a01b038b811685529252808320878503905590881682528120805486929061130a9084906120ec565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461136a8288888888886116fc565b50505050505050565b6001600160a01b0384166113d35760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610423565b336113e481600087611283886116b1565b6000848152602081815260408083206001600160a01b0389168452909152812080548592906114149084906120ec565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610727816000878787876116fc565b60006114c9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166117c69092919063ffffffff16565b8051909150156105e657808060200190518101906114e791906121c1565b6105e65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610423565b6001600160a01b0384163b1561082c5760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061158a90899089908890889088906004016121de565b602060405180830381600087803b1580156115a457600080fd5b505af19250505080156115d4575060408051601f3d908101601f191682019092526115d19181019061223c565b60015b611681576115e0612259565b806308c379a0141561161a57506115f5612275565b80611600575061161c565b8060405162461bcd60e51b81526004016104239190611bd4565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610423565b6001600160e01b0319811663bc197c8160e01b1461136a5760405162461bcd60e51b8152600401610423906122ff565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106116eb576116eb61208c565b602090810291909101015292915050565b6001600160a01b0384163b1561082c5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906117409089908990889088908890600401612347565b602060405180830381600087803b15801561175a57600080fd5b505af192505050801561178a575060408051601f3d908101601f191682019092526117879181019061223c565b60015b611796576115e0612259565b6001600160e01b0319811663f23a6e6160e01b1461136a5760405162461bcd60e51b8152600401610423906122ff565b60606117d584846000856117df565b90505b9392505050565b6060824710156118405760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610423565b843b61188e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610423565b600080866001600160a01b031685876040516118aa9190612381565b60006040518083038185875af1925050503d80600081146118e7576040519150601f19603f3d011682016040523d82523d6000602084013e6118ec565b606091505b50915091506118fc828286611907565b979650505050505050565b606083156119165750816117d8565b8251156119265782518084602001fd5b8160405162461bcd60e51b81526004016104239190611bd4565b82805461194c90612051565b90600052602060002090601f01602090048101928261196e57600085556119b4565b82601f1061198757805160ff19168380011785556119b4565b828001600101855582156119b4579182015b828111156119b4578251825591602001919060010190611999565b506119c09291506119c4565b5090565b5b808211156119c057600081556001016119c5565b80356001600160a01b03811681146119f057600080fd5b919050565b60008060408385031215611a0857600080fd5b611a11836119d9565b946020939093013593505050565b6001600160e01b03198116811461099157600080fd5b600060208284031215611a4757600080fd5b81356117d881611a1f565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff81118282101715611a8e57611a8e611a52565b6040525050565b600082601f830112611aa657600080fd5b813567ffffffffffffffff811115611ac057611ac0611a52565b604051611ad7601f8301601f191660200182611a68565b818152846020838601011115611aec57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611b1f57600080fd5b843593506020850135925060408501359150606085013567ffffffffffffffff811115611b4b57600080fd5b611b5787828801611a95565b91505092959194509250565b600060208284031215611b7557600080fd5b5035919050565b60005b83811015611b97578181015183820152602001611b7f565b838111156104f95750506000910152565b60008151808452611bc0816020860160208601611b7c565b601f01601f19169290920160200192915050565b6020815260006117d86020830184611ba8565b600080600060608486031215611bfc57600080fd5b8335925060208401359150611c13604085016119d9565b90509250925092565b600067ffffffffffffffff821115611c3657611c36611a52565b5060051b60200190565b600082601f830112611c5157600080fd5b81356020611c5e82611c1c565b604051611c6b8282611a68565b83815260059390931b8501820192828101915086841115611c8b57600080fd5b8286015b84811015611ca65780358352918301918301611c8f565b509695505050505050565b600080600080600060a08688031215611cc957600080fd5b611cd2866119d9565b9450611ce0602087016119d9565b9350604086013567ffffffffffffffff80821115611cfd57600080fd5b611d0989838a01611c40565b94506060880135915080821115611d1f57600080fd5b611d2b89838a01611c40565b93506080880135915080821115611d4157600080fd5b50611d4e88828901611a95565b9150509295509295909350565b60008060008060008060c08789031215611d7457600080fd5b86359550602087013594506040870135935060608701359250611d99608088016119d9565b915060a087013567ffffffffffffffff811115611db557600080fd5b611dc189828a01611a95565b9150509295509295509295565b60008060408385031215611de157600080fd5b823567ffffffffffffffff80821115611df957600080fd5b818501915085601f830112611e0d57600080fd5b81356020611e1a82611c1c565b604051611e278282611a68565b83815260059390931b8501820192828101915089841115611e4757600080fd5b948201945b83861015611e6c57611e5d866119d9565b82529482019490820190611e4c565b96505086013592505080821115611e8257600080fd5b50611e8f85828601611c40565b9150509250929050565b600081518084526020808501945080840160005b83811015611ec957815187529582019590820190600101611ead565b509495945050505050565b6020815260006117d86020830184611e99565b600060208284031215611ef957600080fd5b813567ffffffffffffffff811115611f1057600080fd5b611f1c84828501611a95565b949350505050565b801515811461099157600080fd5b60008060408385031215611f4557600080fd5b611f4e836119d9565b91506020830135611f5e81611f24565b809150509250929050565b60008060408385031215611f7c57600080fd5b611f85836119d9565b9150611f93602084016119d9565b90509250929050565b600080600080600060a08688031215611fb457600080fd5b611fbd866119d9565b9450611fcb602087016119d9565b93506040860135925060608601359150608086013567ffffffffffffffff811115611ff557600080fd5b611d4e88828901611a95565b60006020828403121561201357600080fd5b6117d8826119d9565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061206557607f821691505b6020821081141561208657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156120cc576120cc6120a2565b5060010190565b6000602082840312156120e557600080fd5b5051919050565b600082198211156120ff576120ff6120a2565b500190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6040815260006121a66040830185611e99565b82810360208401526121b88185611e99565b95945050505050565b6000602082840312156121d357600080fd5b81516117d881611f24565b6001600160a01b0386811682528516602082015260a06040820181905260009061220a90830186611e99565b828103606084015261221c8186611e99565b905082810360808401526122308185611ba8565b98975050505050505050565b60006020828403121561224e57600080fd5b81516117d881611a1f565b600060033d11156122725760046000803e5060005160e01c5b90565b600060443d10156122835790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156122b357505050505090565b82850191508151818111156122cb5750505050505090565b843d87010160208285010111156122e55750505050505090565b6122f460208286010187611a68565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906118fc90830184611ba8565b60008251612393818460208701611b7c565b919091019291505056fea2646970667358221220f296455478ac2ff9f2a7d4bd41969f5cdb5fbff8d182fb798f13f56a48d57ddf64736f6c63430008090033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101415760003560e01c806355f804b3116100b85780638da5cb5b1161007c5780638da5cb5b14610318578063a22cb46514610333578063e3f6d88414610346578063e985e9c514610359578063f242432a14610395578063f2fde38b146103a857600080fd5b806355f804b3146102b55780635b746077146102c85780636c0360eb146102e8578063715018a6146102f0578063869f7594146102f857600080fd5b80632da636081161010a5780632da63608146101e65780632db11544146101f95780632eb2c2d61461020c57806340fa09bc1461021f5780634b74e667146102825780634e1273f41461029557600080fd5b8062fdd58e1461014657806301ffc9a71461016c5780630c63bded1461018f5780630e89341c146101a457806329a8791a146101c4575b600080fd5b6101596101543660046119f5565b6103bb565b6040519081526020015b60405180910390f35b61017f61017a366004611a35565b610452565b6040519015158152602001610163565b6101a261019d366004611b09565b6104a4565b005b6101b76101b2366004611b63565b6104ff565b6040516101639190611bd4565b61017f6101d2366004611b63565b600090815260046020526040902054151590565b6101a26101f4366004611be7565b6105a1565b6101a2610207366004611b63565b6105eb565b6101a261021a366004611cb1565b610697565b61025b61022d366004611b63565b6007602052600090815260409020805460018201546002909201546001600160a01b03909116919060ff1683565b604080516001600160a01b0390941684526020840192909252151590820152606001610163565b6101a2610290366004611d5b565b61072e565b6102a86102a3366004611dce565b610834565b6040516101639190611ed4565b6101a26102c3366004611ee7565b61095e565b6101596102d6366004611b63565b60056020526000908152604090205481565b6101b7610994565b6101a2610a22565b610159610306366004611b63565b60046020526000908152604090205481565b6006546040516001600160a01b039091168152602001610163565b6101a2610341366004611f32565b610a58565b6101a2610354366004611f69565b610a63565b61017f610367366004611f69565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6101a26103a3366004611f9c565b610b59565b6101a26103b6366004612001565b610be0565b60006001600160a01b03831661042c5760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061048357506001600160e01b031982166303a24d0760e21b145b8061049e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6006546001600160a01b031633146104ce5760405162461bcd60e51b81526004016104239061201c565b600084815260086020908152604090912082516104ed92840190611940565b506104f9848484610c78565b50505050565b600081815260086020526040902080546060919061051c90612051565b80601f016020809104026020016040519081016040528092919081815260200182805461054890612051565b80156105955780601f1061056a57610100808354040283529160200191610595565b820191906000526020600020905b81548152906001019060200180831161057857829003601f168201915b50505050509050919050565b6006546001600160a01b031633146105cb5760405162461bcd60e51b81526004016104239061201c565b6105e681848460405180602001604052806000815250610dcb565b505050565b6000818152600760205260409020600281015460ff1661064d5760405162461bcd60e51b815260206004820152601a60248201527f5075626c6963204d696e74696e67204e6f7420456e61626c65640000000000006044820152606401610423565b6001810154156106775760018101548154610677916001600160a01b039091169033903090610e97565b6106933383600160405180602001604052806000815250610dcb565b5050565b6001600160a01b0385163314806106b357506106b38533610367565b61071a5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610423565b6107278585858585610f02565b5050505050565b6006546001600160a01b031633146107585760405162461bcd60e51b81526004016104239061201c565b838510156107a557600083116107a55760405162461bcd60e51b8152602060048201526012602482015271496e76616c6964204d696e7420507269636560701b6044820152606401610423565b604080516060810182526001600160a01b0384811682526020808301878152600184860181815260008d815260078552878120965187546001600160a01b0319169616959095178655915190850155516002909301805460ff1916931515939093179092556008825291909120825161082092840190611940565b5061082c868686610c78565b505050505050565b606081518351146108995760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610423565b6000835167ffffffffffffffff8111156108b5576108b5611a52565b6040519080825280602002602001820160405280156108de578160200160208202803683370190505b50905060005b8451811015610956576109298582815181106109025761090261208c565b602002602001015185838151811061091c5761091c61208c565b60200260200101516103bb565b82828151811061093b5761093b61208c565b602090810291909101015261094f816120b8565b90506108e4565b509392505050565b6006546001600160a01b031633146109885760405162461bcd60e51b81526004016104239061201c565b610991816110d7565b50565b600380546109a190612051565b80601f01602080910402602001604051908101604052809291908181526020018280546109cd90612051565b8015610a1a5780601f106109ef57610100808354040283529160200191610a1a565b820191906000526020600020905b8154815290600101906020018083116109fd57829003601f168201915b505050505081565b6006546001600160a01b03163314610a4c5760405162461bcd60e51b81526004016104239061201c565b610a5660006110ea565b565b61069333838361113c565b6006546001600160a01b03163314610a8d5760405162461bcd60e51b81526004016104239061201c565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a082319060240160206040518083038186803b158015610acf57600080fd5b505afa158015610ae3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0791906120d3565b905060008111610b455760405162461bcd60e51b81526020600482015260096024820152684e6f20746f6b656e7360b81b6044820152606401610423565b6105e66001600160a01b038416838361121d565b6001600160a01b038516331480610b755750610b758533610367565b610bd35760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b6064820152608401610423565b610727858585858561124d565b6006546001600160a01b03163314610c0a5760405162461bcd60e51b81526004016104239061201c565b6001600160a01b038116610c6f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610423565b610991816110ea565b80610cd05760405162461bcd60e51b815260206004820152602260248201527f42617365455243313135353a206d6178537570706c792063616e6e6f74206265604482015261020360f41b6064820152608401610423565b60008381526004602052604090205415610d375760405162461bcd60e51b815260206004820152602260248201527f42617365455243313135353a20746f6b656e20616c7265616479206372656174604482015261195960f21b6064820152608401610423565b80821115610d9d5760405162461bcd60e51b815260206004820152602d60248201527f42617365455243313135353a20696e697469616c20737570706c792063616e6e60448201526c0dee840caf0c6cacac840dac2f609b1b6064820152608401610423565b600083815260046020526040902081905581156105e6576105e6338484604051806020016040528060008152505b81610e065760405162461bcd60e51b815260206004820152600b60248201526a16995c9bc8185b5bdd5b9d60aa1b6044820152606401610423565b600083815260046020908152604080832054600590925290912054610e2c9084906120ec565b1115610e675760405162461bcd60e51b815260206004820152600a6024820152694d617820737570706c7960b01b6044820152606401610423565b60008381526005602052604081208054849290610e859084906120ec565b909155506104f9905084848484611373565b6040516001600160a01b03808516602483015283166044820152606481018290526104f99085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611474565b8151835114610f645760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610423565b6001600160a01b038416610f8a5760405162461bcd60e51b815260040161042390612104565b3360005b8451811015611071576000858281518110610fab57610fab61208c565b602002602001015190506000858381518110610fc957610fc961208c565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156110195760405162461bcd60e51b815260040161042390612149565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906110569084906120ec565b925050819055505050508061106a906120b8565b9050610f8e565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516110c1929190612193565b60405180910390a461082c818787878787611546565b8051610693906003906020840190611940565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156111b05760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610423565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6040516001600160a01b0383166024820152604481018290526105e690849063a9059cbb60e01b90606401610ecb565b6001600160a01b0384166112735760405162461bcd60e51b815260040161042390612104565b3361128c818787611283886116b1565b610727886116b1565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156112cd5760405162461bcd60e51b815260040161042390612149565b6000858152602081815260408083206001600160a01b038b811685529252808320878503905590881682528120805486929061130a9084906120ec565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461136a8288888888886116fc565b50505050505050565b6001600160a01b0384166113d35760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610423565b336113e481600087611283886116b1565b6000848152602081815260408083206001600160a01b0389168452909152812080548592906114149084906120ec565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610727816000878787876116fc565b60006114c9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166117c69092919063ffffffff16565b8051909150156105e657808060200190518101906114e791906121c1565b6105e65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610423565b6001600160a01b0384163b1561082c5760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061158a90899089908890889088906004016121de565b602060405180830381600087803b1580156115a457600080fd5b505af19250505080156115d4575060408051601f3d908101601f191682019092526115d19181019061223c565b60015b611681576115e0612259565b806308c379a0141561161a57506115f5612275565b80611600575061161c565b8060405162461bcd60e51b81526004016104239190611bd4565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610423565b6001600160e01b0319811663bc197c8160e01b1461136a5760405162461bcd60e51b8152600401610423906122ff565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106116eb576116eb61208c565b602090810291909101015292915050565b6001600160a01b0384163b1561082c5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906117409089908990889088908890600401612347565b602060405180830381600087803b15801561175a57600080fd5b505af192505050801561178a575060408051601f3d908101601f191682019092526117879181019061223c565b60015b611796576115e0612259565b6001600160e01b0319811663f23a6e6160e01b1461136a5760405162461bcd60e51b8152600401610423906122ff565b60606117d584846000856117df565b90505b9392505050565b6060824710156118405760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610423565b843b61188e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610423565b600080866001600160a01b031685876040516118aa9190612381565b60006040518083038185875af1925050503d80600081146118e7576040519150601f19603f3d011682016040523d82523d6000602084013e6118ec565b606091505b50915091506118fc828286611907565b979650505050505050565b606083156119165750816117d8565b8251156119265782518084602001fd5b8160405162461bcd60e51b81526004016104239190611bd4565b82805461194c90612051565b90600052602060002090601f01602090048101928261196e57600085556119b4565b82601f1061198757805160ff19168380011785556119b4565b828001600101855582156119b4579182015b828111156119b4578251825591602001919060010190611999565b506119c09291506119c4565b5090565b5b808211156119c057600081556001016119c5565b80356001600160a01b03811681146119f057600080fd5b919050565b60008060408385031215611a0857600080fd5b611a11836119d9565b946020939093013593505050565b6001600160e01b03198116811461099157600080fd5b600060208284031215611a4757600080fd5b81356117d881611a1f565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff81118282101715611a8e57611a8e611a52565b6040525050565b600082601f830112611aa657600080fd5b813567ffffffffffffffff811115611ac057611ac0611a52565b604051611ad7601f8301601f191660200182611a68565b818152846020838601011115611aec57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611b1f57600080fd5b843593506020850135925060408501359150606085013567ffffffffffffffff811115611b4b57600080fd5b611b5787828801611a95565b91505092959194509250565b600060208284031215611b7557600080fd5b5035919050565b60005b83811015611b97578181015183820152602001611b7f565b838111156104f95750506000910152565b60008151808452611bc0816020860160208601611b7c565b601f01601f19169290920160200192915050565b6020815260006117d86020830184611ba8565b600080600060608486031215611bfc57600080fd5b8335925060208401359150611c13604085016119d9565b90509250925092565b600067ffffffffffffffff821115611c3657611c36611a52565b5060051b60200190565b600082601f830112611c5157600080fd5b81356020611c5e82611c1c565b604051611c6b8282611a68565b83815260059390931b8501820192828101915086841115611c8b57600080fd5b8286015b84811015611ca65780358352918301918301611c8f565b509695505050505050565b600080600080600060a08688031215611cc957600080fd5b611cd2866119d9565b9450611ce0602087016119d9565b9350604086013567ffffffffffffffff80821115611cfd57600080fd5b611d0989838a01611c40565b94506060880135915080821115611d1f57600080fd5b611d2b89838a01611c40565b93506080880135915080821115611d4157600080fd5b50611d4e88828901611a95565b9150509295509295909350565b60008060008060008060c08789031215611d7457600080fd5b86359550602087013594506040870135935060608701359250611d99608088016119d9565b915060a087013567ffffffffffffffff811115611db557600080fd5b611dc189828a01611a95565b9150509295509295509295565b60008060408385031215611de157600080fd5b823567ffffffffffffffff80821115611df957600080fd5b818501915085601f830112611e0d57600080fd5b81356020611e1a82611c1c565b604051611e278282611a68565b83815260059390931b8501820192828101915089841115611e4757600080fd5b948201945b83861015611e6c57611e5d866119d9565b82529482019490820190611e4c565b96505086013592505080821115611e8257600080fd5b50611e8f85828601611c40565b9150509250929050565b600081518084526020808501945080840160005b83811015611ec957815187529582019590820190600101611ead565b509495945050505050565b6020815260006117d86020830184611e99565b600060208284031215611ef957600080fd5b813567ffffffffffffffff811115611f1057600080fd5b611f1c84828501611a95565b949350505050565b801515811461099157600080fd5b60008060408385031215611f4557600080fd5b611f4e836119d9565b91506020830135611f5e81611f24565b809150509250929050565b60008060408385031215611f7c57600080fd5b611f85836119d9565b9150611f93602084016119d9565b90509250929050565b600080600080600060a08688031215611fb457600080fd5b611fbd866119d9565b9450611fcb602087016119d9565b93506040860135925060608601359150608086013567ffffffffffffffff811115611ff557600080fd5b611d4e88828901611a95565b60006020828403121561201357600080fd5b6117d8826119d9565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061206557607f821691505b6020821081141561208657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156120cc576120cc6120a2565b5060010190565b6000602082840312156120e557600080fd5b5051919050565b600082198211156120ff576120ff6120a2565b500190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6040815260006121a66040830185611e99565b82810360208401526121b88185611e99565b95945050505050565b6000602082840312156121d357600080fd5b81516117d881611f24565b6001600160a01b0386811682528516602082015260a06040820181905260009061220a90830186611e99565b828103606084015261221c8186611e99565b905082810360808401526122308185611ba8565b98975050505050505050565b60006020828403121561224e57600080fd5b81516117d881611a1f565b600060033d11156122725760046000803e5060005160e01c5b90565b600060443d10156122835790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156122b357505050505090565b82850191508151818111156122cb5750505050505090565b843d87010160208285010111156122e55750505050505090565b6122f460208286010187611a68565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906118fc90830184611ba8565b60008251612393818460208701611b7c565b919091019291505056fea2646970667358221220f296455478ac2ff9f2a7d4bd41969f5cdb5fbff8d182fb798f13f56a48d57ddf64736f6c63430008090033

Deployed Bytecode Sourcemap

47212:3317:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28856:231;;;;;;:::i;:::-;;:::i;:::-;;;597:25:1;;;585:2;570:18;28856:231:0;;;;;;;;27879:310;;;;;;:::i;:::-;;:::i;:::-;;;1184:14:1;;1177:22;1159:41;;1147:2;1132:18;27879:310:0;1019:187:1;49469:323:0;;;;;;:::i;:::-;;:::i;:::-;;50056:169;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;45075:120::-;;;;;;:::i;:::-;45140:4;45164:18;;;:9;:18;;;;;;:23;;;45075:120;49879:169;;;;;;:::i;:::-;;:::i;48677:558::-;;;;;;:::i;:::-;;:::i;30795:442::-;;;;;;:::i;:::-;;:::i;47419:57::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47419:57:0;;;;;;;;;;;;;-1:-1:-1;;;;;6033:32:1;;;6015:51;;6097:2;6082:18;;6075:34;;;;6152:14;6145:22;6125:18;;;6118:50;6003:2;5988:18;47419:57:0;5819:355:1;47916:685:0;;;;;;:::i;:::-;;:::i;29253:524::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;47575:118::-;;;;;;:::i;:::-;;:::i;44567:48::-;;;;;;:::i;:::-;;;;;;;;;;;;;;44488:21;;;:::i;2495:103::-;;;:::i;44516:44::-;;;;;;:::i;:::-;;;;;;;;;;;;;;1844:87;1917:6;;1844:87;;-1:-1:-1;;;;;1917:6:0;;;9247:51:1;;9235:2;9220:18;1844:87:0;9101:203:1;29850:155:0;;;;;;:::i;:::-;;:::i;50233:293::-;;;;;;:::i;:::-;;:::i;30077:168::-;;;;;;:::i;:::-;-1:-1:-1;;;;;30200:27:0;;;30176:4;30200:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;30077:168;30317:401;;;;;;:::i;:::-;;:::i;2753:201::-;;;;;;:::i;:::-;;:::i;28856:231::-;28942:7;-1:-1:-1;;;;;28970:21:0;;28962:77;;;;-1:-1:-1;;;28962:77:0;;11022:2:1;28962:77:0;;;11004:21:1;11061:2;11041:18;;;11034:30;11100:34;11080:18;;;11073:62;-1:-1:-1;;;11151:18:1;;;11144:41;11202:19;;28962:77:0;;;;;;;;;-1:-1:-1;29057:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;29057:22:0;;;;;;;;;;;;28856:231::o;27879:310::-;27981:4;-1:-1:-1;;;;;;28018:41:0;;-1:-1:-1;;;28018:41:0;;:110;;-1:-1:-1;;;;;;;28076:52:0;;-1:-1:-1;;;28076:52:0;28018:110;:163;;;-1:-1:-1;;;;;;;;;;26852:40:0;;;28145:36;27998:183;27879:310;-1:-1:-1;;27879:310:0:o;49469:323::-;1917:6;;-1:-1:-1;;;;;1917:6:0;736:10;2064:23;2056:68;;;;-1:-1:-1;;;2056:68:0;;;;;;;:::i;:::-;49648:18:::1;::::0;;;:9:::1;:18;::::0;;;;;;;:24;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;49742:42;49750:7;49759:13;49774:9;49742:7;:42::i;:::-;49469:323:::0;;;;:::o;50056:169::-;50199:18;;;;:9;:18;;;;;50192:25;;50116:13;;50199:18;50192:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50056:169;;;:::o;49879:::-;1917:6;;-1:-1:-1;;;;;1917:6:0;736:10;2064:23;2056:68;;;;-1:-1:-1;;;2056:68:0;;;;;;;:::i;:::-;50007:33:::1;50013:2;50017:7;50026:6;50007:33;;;;;;;;;;;::::0;:5:::1;:33::i;:::-;49879:169:::0;;;:::o;48677:558::-;48792:37;48832:24;;;:15;:24;;;;;48875:22;;;;;;48867:61;;;;-1:-1:-1;;;48867:61:0;;12180:2:1;48867:61:0;;;12162:21:1;12219:2;12199:18;;;12192:30;12258:28;12238:18;;;12231:56;12304:18;;48867:61:0;11978:350:1;48867:61:0;48945:24;;;;:28;48941:213;;49117:24;;;;49044:27;;49037:105;;-1:-1:-1;;;;;49044:27:0;;;;49090:10;;49110:4;;49037:52;:105::i;:::-;49191:36;49197:10;49209:7;49218:1;49191:36;;;;;;;;;;;;:5;:36::i;:::-;48723:512;48677:558;:::o;30795:442::-;-1:-1:-1;;;;;31028:20:0;;736:10;31028:20;;:60;;-1:-1:-1;31052:36:0;31069:4;736:10;30077:168;:::i;31052:36::-;31006:160;;;;-1:-1:-1;;;31006:160:0;;12535:2:1;31006:160:0;;;12517:21:1;12574:2;12554:18;;;12547:30;12613:34;12593:18;;;12586:62;-1:-1:-1;;;12664:18:1;;;12657:48;12722:19;;31006:160:0;12333:414:1;31006:160:0;31177:52;31200:4;31206:2;31210:3;31215:7;31224:4;31177:22;:52::i;:::-;30795:442;;;;;:::o;47916:685::-;1917:6;;-1:-1:-1;;;;;1917:6:0;736:10;2064:23;2056:68;;;;-1:-1:-1;;;2056:68:0;;;;;;;:::i;:::-;48185:9:::1;48169:13;:25;48165:102;;;48231:1;48219:9;:13;48211:44;;;::::0;-1:-1:-1;;;48211:44:0;;12954:2:1;48211:44:0::1;::::0;::::1;12936:21:1::0;12993:2;12973:18;;;12966:30;-1:-1:-1;;;13012:18:1;;;13005:48;13070:18;;48211:44:0::1;12752:342:1::0;48211:44:0::1;48306:140;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;48306:140:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;48430:4:::1;48306:140:::0;;;;;;-1:-1:-1;48279:24:0;;;:15:::1;:24:::0;;;;;:167;;;;-1:-1:-1;;;;;;48279:167:0::1;::::0;::::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;48279:167:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;48457:9:::1;:18:::0;;;;;;:24;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;48551:42;48559:7;48568:13;48583:9;48551:7;:42::i;:::-;47916:685:::0;;;;;;:::o;29253:524::-;29409:16;29470:3;:10;29451:8;:15;:29;29443:83;;;;-1:-1:-1;;;29443:83:0;;13301:2:1;29443:83:0;;;13283:21:1;13340:2;13320:18;;;13313:30;13379:34;13359:18;;;13352:62;-1:-1:-1;;;13430:18:1;;;13423:39;13479:19;;29443:83:0;13099:405:1;29443:83:0;29539:30;29586:8;:15;29572:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29572:30:0;;29539:63;;29620:9;29615:122;29639:8;:15;29635:1;:19;29615:122;;;29695:30;29705:8;29714:1;29705:11;;;;;;;;:::i;:::-;;;;;;;29718:3;29722:1;29718:6;;;;;;;;:::i;:::-;;;;;;;29695:9;:30::i;:::-;29676:13;29690:1;29676:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;29656:3;;;:::i;:::-;;;29615:122;;;-1:-1:-1;29756:13:0;29253:524;-1:-1:-1;;;29253:524:0:o;47575:118::-;1917:6;;-1:-1:-1;;;;;1917:6:0;736:10;2064:23;2056:68;;;;-1:-1:-1;;;2056:68:0;;;;;;;:::i;:::-;47665:20:::1;47677:7;47665:11;:20::i;:::-;47575:118:::0;:::o;44488:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2495:103::-;1917:6;;-1:-1:-1;;;;;1917:6:0;736:10;2064:23;2056:68;;;;-1:-1:-1;;;2056:68:0;;;;;;;:::i;:::-;2560:30:::1;2587:1;2560:18;:30::i;:::-;2495:103::o:0;29850:155::-;29945:52;736:10;29978:8;29988;29945:18;:52::i;50233:293::-;1917:6;;-1:-1:-1;;;;;1917:6:0;736:10;2064:23;2056:68;;;;-1:-1:-1;;;2056:68:0;;;;;;;:::i;:::-;50353:45:::1;::::0;-1:-1:-1;;;50353:45:0;;50392:4:::1;50353:45;::::0;::::1;9247:51:1::0;50330:20:0::1;::::0;-1:-1:-1;;;;;50353:30:0;::::1;::::0;::::1;::::0;9220:18:1;;50353:45:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50330:68;;50432:1;50417:12;:16;50409:38;;;::::0;-1:-1:-1;;;50409:38:0;;14304:2:1;50409:38:0::1;::::0;::::1;14286:21:1::0;14343:1;14323:18;;;14316:29;-1:-1:-1;;;14361:18:1;;;14354:39;14410:18;;50409:38:0::1;14102:332:1::0;50409:38:0::1;50460:58;-1:-1:-1::0;;;;;50460:33:0;::::1;50494:9:::0;50505:12;50460:33:::1;:58::i;30317:401::-:0;-1:-1:-1;;;;;30525:20:0;;736:10;30525:20;;:60;;-1:-1:-1;30549:36:0;30566:4;736:10;30077:168;:::i;30549:36::-;30503:151;;;;-1:-1:-1;;;30503:151:0;;14641:2:1;30503:151:0;;;14623:21:1;14680:2;14660:18;;;14653:30;14719:34;14699:18;;;14692:62;-1:-1:-1;;;14770:18:1;;;14763:39;14819:19;;30503:151:0;14439:405:1;30503:151:0;30665:45;30683:4;30689:2;30693;30697:6;30705:4;30665:17;:45::i;2753:201::-;1917:6;;-1:-1:-1;;;;;1917:6:0;736:10;2064:23;2056:68;;;;-1:-1:-1;;;2056:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2842:22:0;::::1;2834:73;;;::::0;-1:-1:-1;;;2834:73:0;;15051:2:1;2834:73:0::1;::::0;::::1;15033:21:1::0;15090:2;15070:18;;;15063:30;15129:34;15109:18;;;15102:62;-1:-1:-1;;;15180:18:1;;;15173:36;15226:19;;2834:73:0::1;14849:402:1::0;2834:73:0::1;2918:28;2937:8;2918:18;:28::i;45247:524::-:0;45386:15;45378:62;;;;-1:-1:-1;;;45378:62:0;;15458:2:1;45378:62:0;;;15440:21:1;15497:2;15477:18;;;15470:30;15536:34;15516:18;;;15509:62;-1:-1:-1;;;15587:18:1;;;15580:32;15629:19;;45378:62:0;15256:398:1;45378:62:0;45140:4;45164:18;;;:9;:18;;;;;;:23;45451:66;;;;-1:-1:-1;;;45451:66:0;;15861:2:1;45451:66:0;;;15843:21:1;15900:2;15880:18;;;15873:30;15939:34;15919:18;;;15912:62;-1:-1:-1;;;15990:18:1;;;15983:32;16032:19;;45451:66:0;15659:398:1;45451:66:0;45553:10;45536:13;:27;;45528:85;;;;-1:-1:-1;;;45528:85:0;;16264:2:1;45528:85:0;;;16246:21:1;16303:2;16283:18;;;16276:30;16342:34;16322:18;;;16315:62;-1:-1:-1;;;16393:18:1;;;16386:43;16446:19;;45528:85:0;16062:409:1;45528:85:0;45624:18;;;;:9;:18;;;;;:31;;;45670:17;;45666:98;;45704:48;45710:10;45722:7;45731:13;45704:48;;;;;;;;;;;;46047:366;46214:11;46206:35;;;;-1:-1:-1;;;46206:35:0;;16678:2:1;46206:35:0;;;16660:21:1;16717:2;16697:18;;;16690:30;-1:-1:-1;;;16736:18:1;;;16729:41;16787:18;;46206:35:0;16476:335:1;46206:35:0;46290:13;;;;:9;:13;;;;;;;;;46260;:17;;;;;;;:26;;46280:6;;46260:26;:::i;:::-;:43;;46252:66;;;;-1:-1:-1;;;46252:66:0;;17151:2:1;46252:66:0;;;17133:21:1;17190:2;17170:18;;;17163:30;-1:-1:-1;;;17209:18:1;;;17202:40;17259:18;;46252:66:0;16949:334:1;46252:66:0;46329:17;;;;:13;:17;;;;;:27;;46350:6;;46329:17;:27;;46350:6;;46329:27;:::i;:::-;;;;-1:-1:-1;46367:38:0;;-1:-1:-1;46379:7:0;46388:2;46392:6;46400:4;46367:11;:38::i;14997:248::-;15168:68;;-1:-1:-1;;;;;17546:15:1;;;15168:68:0;;;17528:34:1;17598:15;;17578:18;;;17571:43;17630:18;;;17623:34;;;15141:96:0;;15161:5;;-1:-1:-1;;;15191:27:0;17463:18:1;;15168:68:0;;;;-1:-1:-1;;15168:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;15168:68:0;-1:-1:-1;;;;;;15168:68:0;;;;;;;;;;15141:19;:96::i;32879:1074::-;33106:7;:14;33092:3;:10;:28;33084:81;;;;-1:-1:-1;;;33084:81:0;;17870:2:1;33084:81:0;;;17852:21:1;17909:2;17889:18;;;17882:30;17948:34;17928:18;;;17921:62;-1:-1:-1;;;17999:18:1;;;17992:38;18047:19;;33084:81:0;17668:404:1;33084:81:0;-1:-1:-1;;;;;33184:16:0;;33176:66;;;;-1:-1:-1;;;33176:66:0;;;;;;;:::i;:::-;736:10;33255:16;33372:421;33396:3;:10;33392:1;:14;33372:421;;;33428:10;33441:3;33445:1;33441:6;;;;;;;;:::i;:::-;;;;;;;33428:19;;33462:14;33479:7;33487:1;33479:10;;;;;;;;:::i;:::-;;;;;;;;;;;;33506:19;33528:13;;;;;;;;;;-1:-1:-1;;;;;33528:19:0;;;;;;;;;;;;33479:10;;-1:-1:-1;33570:21:0;;;;33562:76;;;;-1:-1:-1;;;33562:76:0;;;;;;;:::i;:::-;33682:9;:13;;;;;;;;;;;-1:-1:-1;;;;;33682:19:0;;;;;;;;;;33704:20;;;33682:42;;33754:17;;;;;;;:27;;33704:20;;33682:9;33754:27;;33704:20;;33754:27;:::i;:::-;;;;;;;;33413:380;;;33408:3;;;;:::i;:::-;;;33372:421;;;;33840:2;-1:-1:-1;;;;;33810:47:0;33834:4;-1:-1:-1;;;;;33810:47:0;33824:8;-1:-1:-1;;;;;33810:47:0;;33844:3;33849:7;33810:47;;;;;;;:::i;:::-;;;;;;;;33870:75;33906:8;33916:4;33922:2;33926:3;33931:7;33940:4;33870:35;:75::i;45940:99::-;46009:22;;;;:7;;:22;;;;;:::i;3114:191::-;3207:6;;;-1:-1:-1;;;;;3224:17:0;;;-1:-1:-1;;;;;;3224:17:0;;;;;;;3257:40;;3207:6;;;3224:17;3207:6;;3257:40;;3188:16;;3257:40;3177:128;3114:191;:::o;39065:331::-;39220:8;-1:-1:-1;;;;;39211:17:0;:5;-1:-1:-1;;;;;39211:17:0;;;39203:71;;;;-1:-1:-1;;;39203:71:0;;19566:2:1;39203:71:0;;;19548:21:1;19605:2;19585:18;;;19578:30;19644:34;19624:18;;;19617:62;-1:-1:-1;;;19695:18:1;;;19688:39;19744:19;;39203:71:0;19364:405:1;39203:71:0;-1:-1:-1;;;;;39285:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;39285:46:0;;;;;;;;;;39347:41;;1159::1;;;39347::0;;1132:18:1;39347:41:0;;;;;;;39065:331;;;:::o;14778:211::-;14922:58;;-1:-1:-1;;;;;19966:32:1;;14922:58:0;;;19948:51:1;20015:18;;;20008:34;;;14895:86:0;;14915:5;;-1:-1:-1;;;14945:23:0;19921:18:1;;14922:58:0;19774:274:1;31701:820:0;-1:-1:-1;;;;;31889:16:0;;31881:66;;;;-1:-1:-1;;;31881:66:0;;;;;;;:::i;:::-;736:10;32004:96;736:10;32035:4;32041:2;32045:21;32063:2;32045:17;:21::i;:::-;32068:25;32086:6;32068:17;:25::i;32004:96::-;32113:19;32135:13;;;;;;;;;;;-1:-1:-1;;;;;32135:19:0;;;;;;;;;;32173:21;;;;32165:76;;;;-1:-1:-1;;;32165:76:0;;;;;;;:::i;:::-;32277:9;:13;;;;;;;;;;;-1:-1:-1;;;;;32277:19:0;;;;;;;;;;32299:20;;;32277:42;;32341:17;;;;;;;:27;;32299:20;;32277:9;32341:27;;32299:20;;32341:27;:::i;:::-;;;;-1:-1:-1;;32386:46:0;;;20227:25:1;;;20283:2;20268:18;;20261:34;;;-1:-1:-1;;;;;32386:46:0;;;;;;;;;;;;;;20200:18:1;32386:46:0;;;;;;;32445:68;32476:8;32486:4;32492:2;32496;32500:6;32508:4;32445:30;:68::i;:::-;31870:651;;31701:820;;;;;:::o;35271:569::-;-1:-1:-1;;;;;35424:16:0;;35416:62;;;;-1:-1:-1;;;35416:62:0;;20508:2:1;35416:62:0;;;20490:21:1;20547:2;20527:18;;;20520:30;20586:34;20566:18;;;20559:62;-1:-1:-1;;;20637:18:1;;;20630:31;20678:19;;35416:62:0;20306:397:1;35416:62:0;736:10;35535:102;736:10;35491:16;35578:2;35582:21;35600:2;35582:17;:21::i;35535:102::-;35650:9;:13;;;;;;;;;;;-1:-1:-1;;;;;35650:17:0;;;;;;;;;:27;;35671:6;;35650:9;:27;;35671:6;;35650:27;:::i;:::-;;;;-1:-1:-1;;35693:52:0;;;20227:25:1;;;20283:2;20268:18;;20261:34;;;-1:-1:-1;;;;;35693:52:0;;;;35726:1;;35693:52;;;;;;20200:18:1;35693:52:0;;;;;;;35758:74;35789:8;35807:1;35811:2;35815;35819:6;35827:4;35758:30;:74::i;17351:716::-;17775:23;17801:69;17829:4;17801:69;;;;;;;;;;;;;;;;;17809:5;-1:-1:-1;;;;;17801:27:0;;;:69;;;;;:::i;:::-;17885:17;;17775:95;;-1:-1:-1;17885:21:0;17881:179;;17982:10;17971:30;;;;;;;;;;;;:::i;:::-;17963:85;;;;-1:-1:-1;;;17963:85:0;;21160:2:1;17963:85:0;;;21142:21:1;21199:2;21179:18;;;21172:30;21238:34;21218:18;;;21211:62;-1:-1:-1;;;21289:18:1;;;21282:40;21339:19;;17963:85:0;20958:406:1;41333:813:0;-1:-1:-1;;;;;41573:13:0;;7176:20;7224:8;41569:570;;41609:79;;-1:-1:-1;;;41609:79:0;;-1:-1:-1;;;;;41609:43:0;;;;;:79;;41653:8;;41663:4;;41669:3;;41674:7;;41683:4;;41609:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41609:79:0;;;;;;;;-1:-1:-1;;41609:79:0;;;;;;;;;;;;:::i;:::-;;;41605:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;42001:6;41994:14;;-1:-1:-1;;;41994:14:0;;;;;;;;:::i;41605:523::-;;;42050:62;;-1:-1:-1;;;42050:62:0;;23517:2:1;42050:62:0;;;23499:21:1;23556:2;23536:18;;;23529:30;23595:34;23575:18;;;23568:62;-1:-1:-1;;;23646:18:1;;;23639:50;23706:19;;42050:62:0;23315:416:1;41605:523:0;-1:-1:-1;;;;;;41770:60:0;;-1:-1:-1;;;41770:60:0;41766:159;;41855:50;;-1:-1:-1;;;41855:50:0;;;;;;;:::i;42154:198::-;42274:16;;;42288:1;42274:16;;;;;;;;;42220;;42249:22;;42274:16;;;;;;;;;;;;-1:-1:-1;42274:16:0;42249:41;;42312:7;42301:5;42307:1;42301:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;42339:5;42154:198;-1:-1:-1;;42154:198:0:o;40581:744::-;-1:-1:-1;;;;;40796:13:0;;7176:20;7224:8;40792:526;;40832:72;;-1:-1:-1;;;40832:72:0;;-1:-1:-1;;;;;40832:38:0;;;;;:72;;40871:8;;40881:4;;40887:2;;40891:6;;40899:4;;40832:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40832:72:0;;;;;;;;-1:-1:-1;;40832:72:0;;;;;;;;;;;;:::i;:::-;;;40828:479;;;;:::i;:::-;-1:-1:-1;;;;;;40954:55:0;;-1:-1:-1;;;40954:55:0;40950:154;;41034:50;;-1:-1:-1;;;41034:50:0;;;;;;;:::i;9659:229::-;9796:12;9828:52;9850:6;9858:4;9864:1;9867:12;9828:21;:52::i;:::-;9821:59;;9659:229;;;;;;:::o;10779:510::-;10949:12;11007:5;10982:21;:30;;10974:81;;;;-1:-1:-1;;;10974:81:0;;24913:2:1;10974:81:0;;;24895:21:1;24952:2;24932:18;;;24925:30;24991:34;24971:18;;;24964:62;-1:-1:-1;;;25042:18:1;;;25035:36;25088:19;;10974:81:0;24711:402:1;10974:81:0;7176:20;;11066:60;;;;-1:-1:-1;;;11066:60:0;;25320:2:1;11066:60:0;;;25302:21:1;25359:2;25339:18;;;25332:30;25398:31;25378:18;;;25371:59;25447:18;;11066:60:0;25118:353:1;11066:60:0;11140:12;11154:23;11181:6;-1:-1:-1;;;;;11181:11:0;11200:5;11207:4;11181:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11139:73;;;;11230:51;11247:7;11256:10;11268:12;11230:16;:51::i;:::-;11223:58;10779:510;-1:-1:-1;;;;;;;10779:510:0:o;13465:712::-;13615:12;13644:7;13640:530;;;-1:-1:-1;13675:10:0;13668:17;;13640:530;13789:17;;:21;13785:374;;13987:10;13981:17;14048:15;14035:10;14031:2;14027:19;14020:44;13785:374;14130:12;14123:20;;-1:-1:-1;;;14123:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:254::-;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:1:o;633:131::-;-1:-1:-1;;;;;;707:32:1;;697:43;;687:71;;754:1;751;744:12;769:245;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;935:9;922:23;954:30;978:5;954:30;:::i;1211:127::-;1272:10;1267:3;1263:20;1260:1;1253:31;1303:4;1300:1;1293:15;1327:4;1324:1;1317:15;1343:249;1453:2;1434:13;;-1:-1:-1;;1430:27:1;1418:40;;1488:18;1473:34;;1509:22;;;1470:62;1467:88;;;1535:18;;:::i;:::-;1571:2;1564:22;-1:-1:-1;;1343:249:1:o;1597:556::-;1640:5;1693:3;1686:4;1678:6;1674:17;1670:27;1660:55;;1711:1;1708;1701:12;1660:55;1747:6;1734:20;1773:18;1769:2;1766:26;1763:52;;;1795:18;;:::i;:::-;1844:2;1838:9;1856:67;1911:2;1892:13;;-1:-1:-1;;1888:27:1;1917:4;1884:38;1838:9;1856:67;:::i;:::-;1947:2;1939:6;1932:18;1993:3;1986:4;1981:2;1973:6;1969:15;1965:26;1962:35;1959:55;;;2010:1;2007;2000:12;1959:55;2074:2;2067:4;2059:6;2055:17;2048:4;2040:6;2036:17;2023:54;2121:1;2097:15;;;2114:4;2093:26;2086:37;;;;2101:6;1597:556;-1:-1:-1;;;1597:556:1:o;2158:527::-;2254:6;2262;2270;2278;2331:3;2319:9;2310:7;2306:23;2302:33;2299:53;;;2348:1;2345;2338:12;2299:53;2384:9;2371:23;2361:33;;2441:2;2430:9;2426:18;2413:32;2403:42;;2492:2;2481:9;2477:18;2464:32;2454:42;;2547:2;2536:9;2532:18;2519:32;2574:18;2566:6;2563:30;2560:50;;;2606:1;2603;2596:12;2560:50;2629;2671:7;2662:6;2651:9;2647:22;2629:50;:::i;:::-;2619:60;;;2158:527;;;;;;;:::o;2690:180::-;2749:6;2802:2;2790:9;2781:7;2777:23;2773:32;2770:52;;;2818:1;2815;2808:12;2770:52;-1:-1:-1;2841:23:1;;2690:180;-1:-1:-1;2690:180:1:o;2875:258::-;2947:1;2957:113;2971:6;2968:1;2965:13;2957:113;;;3047:11;;;3041:18;3028:11;;;3021:39;2993:2;2986:10;2957:113;;;3088:6;3085:1;3082:13;3079:48;;;-1:-1:-1;;3123:1:1;3105:16;;3098:27;2875:258::o;3138:::-;3180:3;3218:5;3212:12;3245:6;3240:3;3233:19;3261:63;3317:6;3310:4;3305:3;3301:14;3294:4;3287:5;3283:16;3261:63;:::i;:::-;3378:2;3357:15;-1:-1:-1;;3353:29:1;3344:39;;;;3385:4;3340:50;;3138:258;-1:-1:-1;;3138:258:1:o;3401:220::-;3550:2;3539:9;3532:21;3513:4;3570:45;3611:2;3600:9;3596:18;3588:6;3570:45;:::i;3626:322::-;3703:6;3711;3719;3772:2;3760:9;3751:7;3747:23;3743:32;3740:52;;;3788:1;3785;3778:12;3740:52;3824:9;3811:23;3801:33;;3881:2;3870:9;3866:18;3853:32;3843:42;;3904:38;3938:2;3927:9;3923:18;3904:38;:::i;:::-;3894:48;;3626:322;;;;;:::o;3953:183::-;4013:4;4046:18;4038:6;4035:30;4032:56;;;4068:18;;:::i;:::-;-1:-1:-1;4113:1:1;4109:14;4125:4;4105:25;;3953:183::o;4141:724::-;4195:5;4248:3;4241:4;4233:6;4229:17;4225:27;4215:55;;4266:1;4263;4256:12;4215:55;4302:6;4289:20;4328:4;4351:43;4391:2;4351:43;:::i;:::-;4423:2;4417:9;4435:31;4463:2;4455:6;4435:31;:::i;:::-;4501:18;;;4593:1;4589:10;;;;4577:23;;4573:32;;;4535:15;;;;-1:-1:-1;4617:15:1;;;4614:35;;;4645:1;4642;4635:12;4614:35;4681:2;4673:6;4669:15;4693:142;4709:6;4704:3;4701:15;4693:142;;;4775:17;;4763:30;;4813:12;;;;4726;;4693:142;;;-1:-1:-1;4853:6:1;4141:724;-1:-1:-1;;;;;;4141:724:1:o;4870:944::-;5024:6;5032;5040;5048;5056;5109:3;5097:9;5088:7;5084:23;5080:33;5077:53;;;5126:1;5123;5116:12;5077:53;5149:29;5168:9;5149:29;:::i;:::-;5139:39;;5197:38;5231:2;5220:9;5216:18;5197:38;:::i;:::-;5187:48;;5286:2;5275:9;5271:18;5258:32;5309:18;5350:2;5342:6;5339:14;5336:34;;;5366:1;5363;5356:12;5336:34;5389:61;5442:7;5433:6;5422:9;5418:22;5389:61;:::i;:::-;5379:71;;5503:2;5492:9;5488:18;5475:32;5459:48;;5532:2;5522:8;5519:16;5516:36;;;5548:1;5545;5538:12;5516:36;5571:63;5626:7;5615:8;5604:9;5600:24;5571:63;:::i;:::-;5561:73;;5687:3;5676:9;5672:19;5659:33;5643:49;;5717:2;5707:8;5704:16;5701:36;;;5733:1;5730;5723:12;5701:36;;5756:52;5800:7;5789:8;5778:9;5774:24;5756:52;:::i;:::-;5746:62;;;4870:944;;;;;;;;:::o;6179:671::-;6293:6;6301;6309;6317;6325;6333;6386:3;6374:9;6365:7;6361:23;6357:33;6354:53;;;6403:1;6400;6393:12;6354:53;6439:9;6426:23;6416:33;;6496:2;6485:9;6481:18;6468:32;6458:42;;6547:2;6536:9;6532:18;6519:32;6509:42;;6598:2;6587:9;6583:18;6570:32;6560:42;;6621:39;6655:3;6644:9;6640:19;6621:39;:::i;:::-;6611:49;;6711:3;6700:9;6696:19;6683:33;6739:18;6731:6;6728:30;6725:50;;;6771:1;6768;6761:12;6725:50;6794;6836:7;6827:6;6816:9;6812:22;6794:50;:::i;:::-;6784:60;;;6179:671;;;;;;;;:::o;6855:1208::-;6973:6;6981;7034:2;7022:9;7013:7;7009:23;7005:32;7002:52;;;7050:1;7047;7040:12;7002:52;7090:9;7077:23;7119:18;7160:2;7152:6;7149:14;7146:34;;;7176:1;7173;7166:12;7146:34;7214:6;7203:9;7199:22;7189:32;;7259:7;7252:4;7248:2;7244:13;7240:27;7230:55;;7281:1;7278;7271:12;7230:55;7317:2;7304:16;7339:4;7362:43;7402:2;7362:43;:::i;:::-;7434:2;7428:9;7446:31;7474:2;7466:6;7446:31;:::i;:::-;7512:18;;;7600:1;7596:10;;;;7588:19;;7584:28;;;7546:15;;;;-1:-1:-1;7624:19:1;;;7621:39;;;7656:1;7653;7646:12;7621:39;7680:11;;;;7700:148;7716:6;7711:3;7708:15;7700:148;;;7782:23;7801:3;7782:23;:::i;:::-;7770:36;;7733:12;;;;7826;;;;7700:148;;;7867:6;-1:-1:-1;;7911:18:1;;7898:32;;-1:-1:-1;;7942:16:1;;;7939:36;;;7971:1;7968;7961:12;7939:36;;7994:63;8049:7;8038:8;8027:9;8023:24;7994:63;:::i;:::-;7984:73;;;6855:1208;;;;;:::o;8068:435::-;8121:3;8159:5;8153:12;8186:6;8181:3;8174:19;8212:4;8241:2;8236:3;8232:12;8225:19;;8278:2;8271:5;8267:14;8299:1;8309:169;8323:6;8320:1;8317:13;8309:169;;;8384:13;;8372:26;;8418:12;;;;8453:15;;;;8345:1;8338:9;8309:169;;;-1:-1:-1;8494:3:1;;8068:435;-1:-1:-1;;;;;8068:435:1:o;8508:261::-;8687:2;8676:9;8669:21;8650:4;8707:56;8759:2;8748:9;8744:18;8736:6;8707:56;:::i;8774:322::-;8843:6;8896:2;8884:9;8875:7;8871:23;8867:32;8864:52;;;8912:1;8909;8902:12;8864:52;8952:9;8939:23;8985:18;8977:6;8974:30;8971:50;;;9017:1;9014;9007:12;8971:50;9040;9082:7;9073:6;9062:9;9058:22;9040:50;:::i;:::-;9030:60;8774:322;-1:-1:-1;;;;8774:322:1:o;9309:118::-;9395:5;9388:13;9381:21;9374:5;9371:32;9361:60;;9417:1;9414;9407:12;9432:315;9497:6;9505;9558:2;9546:9;9537:7;9533:23;9529:32;9526:52;;;9574:1;9571;9564:12;9526:52;9597:29;9616:9;9597:29;:::i;:::-;9587:39;;9676:2;9665:9;9661:18;9648:32;9689:28;9711:5;9689:28;:::i;:::-;9736:5;9726:15;;;9432:315;;;;;:::o;9752:260::-;9820:6;9828;9881:2;9869:9;9860:7;9856:23;9852:32;9849:52;;;9897:1;9894;9887:12;9849:52;9920:29;9939:9;9920:29;:::i;:::-;9910:39;;9968:38;10002:2;9991:9;9987:18;9968:38;:::i;:::-;9958:48;;9752:260;;;;;:::o;10017:607::-;10121:6;10129;10137;10145;10153;10206:3;10194:9;10185:7;10181:23;10177:33;10174:53;;;10223:1;10220;10213:12;10174:53;10246:29;10265:9;10246:29;:::i;:::-;10236:39;;10294:38;10328:2;10317:9;10313:18;10294:38;:::i;:::-;10284:48;;10379:2;10368:9;10364:18;10351:32;10341:42;;10430:2;10419:9;10415:18;10402:32;10392:42;;10485:3;10474:9;10470:19;10457:33;10513:18;10505:6;10502:30;10499:50;;;10545:1;10542;10535:12;10499:50;10568;10610:7;10601:6;10590:9;10586:22;10568:50;:::i;10629:186::-;10688:6;10741:2;10729:9;10720:7;10716:23;10712:32;10709:52;;;10757:1;10754;10747:12;10709:52;10780:29;10799:9;10780:29;:::i;11232:356::-;11434:2;11416:21;;;11453:18;;;11446:30;11512:34;11507:2;11492:18;;11485:62;11579:2;11564:18;;11232:356::o;11593:380::-;11672:1;11668:12;;;;11715;;;11736:61;;11790:4;11782:6;11778:17;11768:27;;11736:61;11843:2;11835:6;11832:14;11812:18;11809:38;11806:161;;;11889:10;11884:3;11880:20;11877:1;11870:31;11924:4;11921:1;11914:15;11952:4;11949:1;11942:15;11806:161;;11593:380;;;:::o;13509:127::-;13570:10;13565:3;13561:20;13558:1;13551:31;13601:4;13598:1;13591:15;13625:4;13622:1;13615:15;13641:127;13702:10;13697:3;13693:20;13690:1;13683:31;13733:4;13730:1;13723:15;13757:4;13754:1;13747:15;13773:135;13812:3;-1:-1:-1;;13833:17:1;;13830:43;;;13853:18;;:::i;:::-;-1:-1:-1;13900:1:1;13889:13;;13773:135::o;13913:184::-;13983:6;14036:2;14024:9;14015:7;14011:23;14007:32;14004:52;;;14052:1;14049;14042:12;14004:52;-1:-1:-1;14075:16:1;;13913:184;-1:-1:-1;13913:184:1:o;16816:128::-;16856:3;16887:1;16883:6;16880:1;16877:13;16874:39;;;16893:18;;:::i;:::-;-1:-1:-1;16929:9:1;;16816:128::o;18077:401::-;18279:2;18261:21;;;18318:2;18298:18;;;18291:30;18357:34;18352:2;18337:18;;18330:62;-1:-1:-1;;;18423:2:1;18408:18;;18401:35;18468:3;18453:19;;18077:401::o;18483:406::-;18685:2;18667:21;;;18724:2;18704:18;;;18697:30;18763:34;18758:2;18743:18;;18736:62;-1:-1:-1;;;18829:2:1;18814:18;;18807:40;18879:3;18864:19;;18483:406::o;18894:465::-;19151:2;19140:9;19133:21;19114:4;19177:56;19229:2;19218:9;19214:18;19206:6;19177:56;:::i;:::-;19281:9;19273:6;19269:22;19264:2;19253:9;19249:18;19242:50;19309:44;19346:6;19338;19309:44;:::i;:::-;19301:52;18894:465;-1:-1:-1;;;;;18894:465:1:o;20708:245::-;20775:6;20828:2;20816:9;20807:7;20803:23;20799:32;20796:52;;;20844:1;20841;20834:12;20796:52;20876:9;20870:16;20895:28;20917:5;20895:28;:::i;21369:827::-;-1:-1:-1;;;;;21766:15:1;;;21748:34;;21818:15;;21813:2;21798:18;;21791:43;21728:3;21865:2;21850:18;;21843:31;;;21691:4;;21897:57;;21934:19;;21926:6;21897:57;:::i;:::-;22002:9;21994:6;21990:22;21985:2;21974:9;21970:18;21963:50;22036:44;22073:6;22065;22036:44;:::i;:::-;22022:58;;22129:9;22121:6;22117:22;22111:3;22100:9;22096:19;22089:51;22157:33;22183:6;22175;22157:33;:::i;:::-;22149:41;21369:827;-1:-1:-1;;;;;;;;21369:827:1:o;22201:249::-;22270:6;22323:2;22311:9;22302:7;22298:23;22294:32;22291:52;;;22339:1;22336;22329:12;22291:52;22371:9;22365:16;22390:30;22414:5;22390:30;:::i;22455:179::-;22490:3;22532:1;22514:16;22511:23;22508:120;;;22578:1;22575;22572;22557:23;-1:-1:-1;22615:1:1;22609:8;22604:3;22600:18;22508:120;22455:179;:::o;22639:671::-;22678:3;22720:4;22702:16;22699:26;22696:39;;;22639:671;:::o;22696:39::-;22762:2;22756:9;-1:-1:-1;;22827:16:1;22823:25;;22820:1;22756:9;22799:50;22878:4;22872:11;22902:16;22937:18;23008:2;23001:4;22993:6;22989:17;22986:25;22981:2;22973:6;22970:14;22967:45;22964:58;;;23015:5;;;;;22639:671;:::o;22964:58::-;23052:6;23046:4;23042:17;23031:28;;23088:3;23082:10;23115:2;23107:6;23104:14;23101:27;;;23121:5;;;;;;22639:671;:::o;23101:27::-;23205:2;23186:16;23180:4;23176:27;23172:36;23165:4;23156:6;23151:3;23147:16;23143:27;23140:69;23137:82;;;23212:5;;;;;;22639:671;:::o;23137:82::-;23228:57;23279:4;23270:6;23262;23258:19;23254:30;23248:4;23228:57;:::i;:::-;-1:-1:-1;23301:3:1;;22639:671;-1:-1:-1;;;;;22639:671:1:o;23736:404::-;23938:2;23920:21;;;23977:2;23957:18;;;23950:30;24016:34;24011:2;23996:18;;23989:62;-1:-1:-1;;;24082:2:1;24067:18;;24060:38;24130:3;24115:19;;23736:404::o;24145:561::-;-1:-1:-1;;;;;24442:15:1;;;24424:34;;24494:15;;24489:2;24474:18;;24467:43;24541:2;24526:18;;24519:34;;;24584:2;24569:18;;24562:34;;;24404:3;24627;24612:19;;24605:32;;;24367:4;;24654:46;;24680:19;;24672:6;24654:46;:::i;25476:274::-;25605:3;25643:6;25637:13;25659:53;25705:6;25700:3;25693:4;25685:6;25681:17;25659:53;:::i;:::-;25728:16;;;;;25476:274;-1:-1:-1;;25476:274:1:o

Swarm Source

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