APE Price: $0.50 (+4.01%)

Winter Memories (WNTR)

Overview

TokenID

54

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
WINTERMEMORIES

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
No with 200 runs

Other Settings:
paris EvmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at apescan.io on 2025-03-10
*/

// File: @openzeppelin/[email protected]/interfaces/draft-IERC6093.sol


// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;

/**
 * @dev Standard ERC20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @dev Standard ERC721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC721InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC721InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC721InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC721InvalidOperator(address operator);
}

/**
 * @dev Standard ERC1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC1155InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC1155InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC1155InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC1155InvalidOperator(address operator);

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}

// File: @openzeppelin/[email protected]/utils/math/SignedMath.sol


// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol)

pragma solidity ^0.8.20;

/**
 * @dev Standard signed math utilities missing in the Solidity language.
 */
library SignedMath {
    /**
     * @dev Returns the largest of two signed numbers.
     */
    function max(int256 a, int256 b) internal pure returns (int256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two signed numbers.
     */
    function min(int256 a, int256 b) internal pure returns (int256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two signed numbers without overflow.
     * The result is rounded towards zero.
     */
    function average(int256 a, int256 b) internal pure returns (int256) {
        // Formula from the book "Hacker's Delight"
        int256 x = (a & b) + ((a ^ b) >> 1);
        return x + (int256(uint256(x) >> 255) & (a ^ b));
    }

    /**
     * @dev Returns the absolute unsigned value of a signed value.
     */
    function abs(int256 n) internal pure returns (uint256) {
        unchecked {
            // must be unchecked in order to support `n = type(int256).min`
            return uint256(n >= 0 ? n : -n);
        }
    }
}

// File: @openzeppelin/[email protected]/utils/math/Math.sol


// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol)

pragma solidity ^0.8.20;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Muldiv operation overflow.
     */
    error MathOverflowedMulDiv();

    enum Rounding {
        Floor, // Toward negative infinity
        Ceil, // Toward positive infinity
        Trunc, // Toward zero
        Expand // Away from zero
    }
    /**
     * @dev Return the log in base 10 of a positive value rounded towards zero.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10 ** 64) {
                value /= 10 ** 64;
                result += 64;
            }
            if (value >= 10 ** 32) {
                value /= 10 ** 32;
                result += 32;
            }
            if (value >= 10 ** 16) {
                value /= 10 ** 16;
                result += 16;
            }
            if (value >= 10 ** 8) {
                value /= 10 ** 8;
                result += 8;
            }
            if (value >= 10 ** 4) {
                value /= 10 ** 4;
                result += 4;
            }
            if (value >= 10 ** 2) {
                value /= 10 ** 2;
                result += 2;
            }
            if (value >= 10 ** 1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256 of a positive value rounded towards zero.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);
        }
    }

    /**
     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.
     */
    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {
        return uint8(rounding) % 2 == 1;
    }
}

// File: @openzeppelin/[email protected]/utils/Strings.sol


// OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol)

pragma solidity ^0.8.20;



/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant HEX_DIGITS = "0123456789abcdef";
    uint8 private constant ADDRESS_LENGTH = 20;

    /**
     * @dev The `value` string doesn't fit in the specified `length`.
     */
    error StringsInsufficientHexLength(uint256 value, uint256 length);

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `int256` to its ASCII `string` decimal representation.
     */
    function toStringSigned(int256 value) internal pure returns (string memory) {
        return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value)));
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        uint256 localValue = value;
        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_DIGITS[localValue & 0xf];
            localValue >>= 4;
        }
        if (localValue != 0) {
            revert StringsInsufficientHexLength(value, length);
        }
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal
     * representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);
    }

    /**
     * @dev Returns true if the two strings are equal.
     */
    function equal(string memory a, string memory b) internal pure returns (bool) {
        return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));
    }
}

// File: @openzeppelin/[email protected]/utils/Context.sol


// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

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

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

// File: @openzeppelin/[email protected]/access/Ownable.sol


// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;


/**
 * @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.
 *
 * The initial owner is set to the address provided by the deployer. 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;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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 {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _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);
    }
}

// File: @openzeppelin/[email protected]/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.20;

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

// File: @openzeppelin/[email protected]/utils/introspection/IERC165.sol


// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)

pragma solidity ^0.8.20;

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

// File: @openzeppelin/[email protected]/interfaces/IERC165.sol


// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)

pragma solidity ^0.8.20;


// File: @openzeppelin/[email protected]/utils/introspection/ERC165.sol


// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)

pragma solidity ^0.8.20;


/**
 * @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);
 * }
 * ```
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/[email protected]/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.20;


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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 tokenId) external;

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

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

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

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

// File: @openzeppelin/[email protected]/interfaces/IERC721.sol


// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC721.sol)

pragma solidity ^0.8.20;


// File: @openzeppelin/[email protected]/interfaces/IERC4906.sol


// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC4906.sol)

pragma solidity ^0.8.20;



/// @title EIP-721 Metadata Update Extension
interface IERC4906 is IERC165, IERC721 {
    /// @dev This event emits when the metadata of a token is changed.
    /// So that the third-party platforms such as NFT market could
    /// timely update the images and related attributes of the NFT.
    event MetadataUpdate(uint256 _tokenId);

    /// @dev This event emits when the metadata of a range of tokens is changed.
    /// So that the third-party platforms such as NFT market could
    /// timely update the images and related attributes of the NFTs.
    event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId);
}

// File: @openzeppelin/[email protected]/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.20;


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

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

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

// File: @openzeppelin/[email protected]/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.20;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    mapping(uint256 tokenId => address) private _owners;

    mapping(address owner => uint256) private _balances;

    mapping(uint256 tokenId => address) private _tokenApprovals;

    mapping(address owner => mapping(address operator => bool)) private _operatorApprovals;

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual returns (uint256) {
        if (owner == address(0)) {
            revert ERC721InvalidOwner(address(0));
        }
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual returns (address) {
        return _requireOwned(tokenId);
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual returns (string memory) {
        _requireOwned(tokenId);

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual {
        _approve(to, tokenId, _msgSender());
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual returns (address) {
        _requireOwned(tokenId);

        return _getApproved(tokenId);
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(address from, address to, uint256 tokenId) public virtual {
        if (to == address(0)) {
            revert ERC721InvalidReceiver(address(0));
        }
        // Setting an "auth" arguments enables the `_isAuthorized` check which verifies that the token exists
        // (from != 0). Therefore, it is not needed to verify that the return value is not 0 here.
        address previousOwner = _update(to, tokenId, _msgSender());
        if (previousOwner != from) {
            revert ERC721IncorrectOwner(from, tokenId, previousOwner);
        }
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual {
        transferFrom(from, to, tokenId);
        _checkOnERC721Received(from, to, tokenId, data);
    }

    /**
     * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
     *
     * IMPORTANT: Any overrides to this function that add ownership of tokens not tracked by the
     * core ERC721 logic MUST be matched with the use of {_increaseBalance} to keep balances
     * consistent with ownership. The invariant to preserve is that for any address `a` the value returned by
     * `balanceOf(a)` must be equal to the number of tokens such that `_ownerOf(tokenId)` is `a`.
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

    /**
     * @dev Returns the approved address for `tokenId`. Returns 0 if `tokenId` is not minted.
     */
    function _getApproved(uint256 tokenId) internal view virtual returns (address) {
        return _tokenApprovals[tokenId];
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `owner`'s tokens, or `tokenId` in
     * particular (ignoring whether it is owned by `owner`).
     *
     * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this
     * assumption.
     */
    function _isAuthorized(address owner, address spender, uint256 tokenId) internal view virtual returns (bool) {
        return
            spender != address(0) &&
            (owner == spender || isApprovedForAll(owner, spender) || _getApproved(tokenId) == spender);
    }

    /**
     * @dev Checks if `spender` can operate on `tokenId`, assuming the provided `owner` is the actual owner.
     * Reverts if `spender` does not have approval from the provided `owner` for the given token or for all its assets
     * the `spender` for the specific `tokenId`.
     *
     * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this
     * assumption.
     */
    function _checkAuthorized(address owner, address spender, uint256 tokenId) internal view virtual {
        if (!_isAuthorized(owner, spender, tokenId)) {
            if (owner == address(0)) {
                revert ERC721NonexistentToken(tokenId);
            } else {
                revert ERC721InsufficientApproval(spender, tokenId);
            }
        }
    }

    /**
     * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override.
     *
     * NOTE: the value is limited to type(uint128).max. This protect against _balance overflow. It is unrealistic that
     * a uint256 would ever overflow from increments when these increments are bounded to uint128 values.
     *
     * WARNING: Increasing an account's balance using this function tends to be paired with an override of the
     * {_ownerOf} function to resolve the ownership of the corresponding tokens so that balances and ownership
     * remain consistent with one another.
     */
    function _increaseBalance(address account, uint128 value) internal virtual {
        unchecked {
            _balances[account] += value;
        }
    }

    /**
     * @dev Transfers `tokenId` from its current owner to `to`, or alternatively mints (or burns) if the current owner
     * (or `to`) is the zero address. Returns the owner of the `tokenId` before the update.
     *
     * The `auth` argument is optional. If the value passed is non 0, then this function will check that
     * `auth` is either the owner of the token, or approved to operate on the token (by the owner).
     *
     * Emits a {Transfer} event.
     *
     * NOTE: If overriding this function in a way that tracks balances, see also {_increaseBalance}.
     */
    function _update(address to, uint256 tokenId, address auth) internal virtual returns (address) {
        address from = _ownerOf(tokenId);

        // Perform (optional) operator check
        if (auth != address(0)) {
            _checkAuthorized(from, auth, tokenId);
        }

        // Execute the update
        if (from != address(0)) {
            // Clear approval. No need to re-authorize or emit the Approval event
            _approve(address(0), tokenId, address(0), false);

            unchecked {
                _balances[from] -= 1;
            }
        }

        if (to != address(0)) {
            unchecked {
                _balances[to] += 1;
            }
        }

        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        return from;
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal {
        if (to == address(0)) {
            revert ERC721InvalidReceiver(address(0));
        }
        address previousOwner = _update(to, tokenId, address(0));
        if (previousOwner != address(0)) {
            revert ERC721InvalidSender(address(0));
        }
    }

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

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal {
        address previousOwner = _update(address(0), tokenId, address(0));
        if (previousOwner == address(0)) {
            revert ERC721NonexistentToken(tokenId);
        }
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(address from, address to, uint256 tokenId) internal {
        if (to == address(0)) {
            revert ERC721InvalidReceiver(address(0));
        }
        address previousOwner = _update(to, tokenId, address(0));
        if (previousOwner == address(0)) {
            revert ERC721NonexistentToken(tokenId);
        } else if (previousOwner != from) {
            revert ERC721IncorrectOwner(from, tokenId, previousOwner);
        }
    }

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

    /**
     * @dev Same as {xref-ERC721-_safeTransfer-address-address-uint256-}[`_safeTransfer`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {
        _transfer(from, to, tokenId);
        _checkOnERC721Received(from, to, tokenId, data);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * The `auth` argument is optional. If the value passed is non 0, then this function will check that `auth` is
     * either the owner of the token, or approved to operate on all tokens held by this owner.
     *
     * Emits an {Approval} event.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address to, uint256 tokenId, address auth) internal virtual {
        _approve(to, tokenId, auth, true);
    }

    /**
     * @dev Variant of `_approve` with an optional flag to enable or disable the {Approval} event. The event is not
     * emitted in the context of transfers.
     */
    function _approve(address to, uint256 tokenId, address auth, bool emitEvent) internal virtual {
        // Avoid reading the owner unless necessary
        if (emitEvent || auth != address(0)) {
            address owner = _requireOwned(tokenId);

            // We do not use _isAuthorized because single-token approvals should not be able to call approve
            if (auth != address(0) && owner != auth && !isApprovedForAll(owner, auth)) {
                revert ERC721InvalidApprover(auth);
            }

            if (emitEvent) {
                emit Approval(owner, to, tokenId);
            }
        }

        _tokenApprovals[tokenId] = to;
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Requirements:
     * - operator can't be the address zero.
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {
        if (operator == address(0)) {
            revert ERC721InvalidOperator(operator);
        }
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Reverts if the `tokenId` doesn't have a current owner (it hasn't been minted, or it has been burned).
     * Returns the owner.
     *
     * Overrides to ownership logic should be done to {_ownerOf}.
     */
    function _requireOwned(uint256 tokenId) internal view returns (address) {
        address owner = _ownerOf(tokenId);
        if (owner == address(0)) {
            revert ERC721NonexistentToken(tokenId);
        }
        return owner;
    }

    /**
     * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target address. This will revert if the
     * recipient doesn't accept the token transfer. The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param data bytes optional data to send along with the call
     */
    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private {
        if (to.code.length > 0) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
                if (retval != IERC721Receiver.onERC721Received.selector) {
                    revert ERC721InvalidReceiver(to);
                }
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert ERC721InvalidReceiver(to);
                } else {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        }
    }
}

// File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721URIStorage.sol


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/ERC721URIStorage.sol)

pragma solidity ^0.8.20;





/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is IERC4906, ERC721 {
    using Strings for uint256;

    // Interface ID as defined in ERC-4906. This does not correspond to a traditional interface ID as ERC-4906 only
    // defines events and does not include any external function.
    bytes4 private constant ERC4906_INTERFACE_ID = bytes4(0x49064906);

    // Optional mapping for token URIs
    mapping(uint256 tokenId => string) private _tokenURIs;

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireOwned(tokenId);

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via string.concat).
        if (bytes(_tokenURI).length > 0) {
            return string.concat(base, _tokenURI);
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Emits {MetadataUpdate}.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        _tokenURIs[tokenId] = _tokenURI;
        emit MetadataUpdate(tokenId);
    }
}

// File: @chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol


pragma solidity ^0.8.0;

interface AggregatorV3Interface {
  function decimals() external view returns (uint8);

  function description() external view returns (string memory);

  function version() external view returns (uint256);

  function getRoundData(
    uint80 _roundId
  ) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);

  function latestRoundData()
    external
    view
    returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);
}


// File: @openzeppelin/contracts/interfaces/IERC2981.sol


// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.20;


/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     *
     * NOTE: ERC-2981 allows setting the royalty to 100% of the price. In that case all the price would be sent to the
     * royalty receiver and 0 tokens to the seller. Contracts dealing with royalty should consider empty transfers.
     */
    function royaltyInfo(
        uint256 tokenId,
        uint256 salePrice
    ) external view returns (address receiver, uint256 royaltyAmount);
}



// Compatible with OpenZeppelin Contracts ^5.0.0
pragma solidity ^0.8.20;

contract WINTERMEMORIES is ERC721, ERC721URIStorage, Ownable, IERC2981 {
    uint256 private _nextTokenId;

    mapping(address=>bool) allowedSaleContract;
    address private aiowAddress = 0x9aC26D5af386f5950D3D94476aFB4060325c6976;
    uint256 private _totalSupply = 72;
    
    bool public isHidden = true;
    string public hiddenUri = "https://dpw988cyzvmfj.cloudfront.net/hidden-images/67af64783bd3fe413f416525";
    
    
    
    address royaltyWallet = 0x2e407a65DC925cb9884CfF588e0EF1814e221466;
    
    uint96 royaltyFraction = 1000;
    uint96 private constant FEE_DENOMINATOR = 10000; // 100% = 10,000 basis points
    

    constructor(address initialOwner)
        ERC721("Winter Memories", "WNTR")
        Ownable(initialOwner)
    {
        allowedSaleContract[0xE66F3E2F2D5aEC2a7Bdc2835BD9aAB853e39799A] = true;
        
    }

    function safeMint(address to, string memory uri) external onlySaleContract {
        uint256 tokenId = _nextTokenId++;
        _safeMint(to, tokenId);
        _setTokenURI(tokenId, uri);
            
    }

    function mint(address to, string memory uri) external onlySaleContract returns (uint256) {
        require(_totalSupply > _nextTokenId, "All token minted");
        uint256 tokenId = _nextTokenId++;
        _mint(to, tokenId);
        _setTokenURI(tokenId, uri);
        
        return tokenId;
    }

    modifier onlySaleContract() {
        require(allowedSaleContract[msg.sender]);
        _;
    }

    modifier onlyAiow() {
        require(msg.sender == aiowAddress);
        _;
    }

    function addSaleContract(address saleContract, bool approved) public onlyAiow {
        allowedSaleContract[saleContract]=approved;
    }

    function changeAiowAddress(address _aiowAddress) public onlyAiow {
        aiowAddress = _aiowAddress;
    }

    
    function changeHiddenImage(string memory uri) public onlyOwner {
        hiddenUri = uri;
    }
    

    

    function setTokenUrl(uint256 tokenId, string memory uri) public onlyOwner {
        _setTokenURI(tokenId, uri);
    }

    
    function unHide() public onlyOwner {
        isHidden = false;
    }
    

    // The following functions are overrides required by Solidity.

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        
        if (isHidden) {
            return hiddenUri;
        }
        
        return super.tokenURI(tokenId);
    }

    function totalSupply() public view returns (uint256) {
        return _nextTokenId;
    }

    
    function supportsInterface(bytes4 interfaceId)
    public
    view
    override(ERC721, ERC721URIStorage, IERC165)
    returns (bool)
    {
        return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
    }

    
    function setRoyalty(address recipient, uint96 royaltyPercentage) external onlyOwner {
        require(royaltyPercentage <= FEE_DENOMINATOR, "Royalty percentage too high");
        royaltyFraction = royaltyPercentage;
        royaltyWallet = recipient;
    }
    

    // EIP-2981 royaltyInfo function
    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view override returns (address, uint256) {
        
        uint256 royaltyAmount = (salePrice * royaltyFraction) / FEE_DENOMINATOR;
        return (royaltyWallet, royaltyAmount);
        
    }
    
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721IncorrectOwner","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721InsufficientApproval","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC721InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"ERC721InvalidOperator","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721InvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC721InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC721InvalidSender","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonexistentToken","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_toTokenId","type":"uint256"}],"name":"BatchMetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"saleContract","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"addSaleContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_aiowAddress","type":"address"}],"name":"changeAiowAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"changeHiddenImage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isHidden","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint96","name":"royaltyPercentage","type":"uint96"}],"name":"setRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"setTokenUrl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unHide","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052739ac26d5af386f5950d3d94476afb4060325c6976600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506048600b556001600c60006101000a81548160ff0219169083151502179055506040518060800160405280604b815260200162003917604b9139600d9081620000a391906200062c565b50732e407a65dc925cb9884cff588e0ef1814e221466600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506103e8600e60146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055503480156200013957600080fd5b50604051620039623803806200396283398181016040528101906200015f91906200077d565b806040518060400160405280600f81526020017f57696e746572204d656d6f7269657300000000000000000000000000000000008152506040518060400160405280600481526020017f574e5452000000000000000000000000000000000000000000000000000000008152508160009081620001dd91906200062c565b508060019081620001ef91906200062c565b505050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620002675760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016200025e9190620007c0565b60405180910390fd5b6200027881620002ec60201b60201c565b5060016009600073e66f3e2f2d5aec2a7bdc2835bd9aab853e39799a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050620007dd565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200043457607f821691505b6020821081036200044a5762000449620003ec565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004b47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000475565b620004c0868362000475565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200050d620005076200050184620004d8565b620004e2565b620004d8565b9050919050565b6000819050919050565b6200052983620004ec565b62000541620005388262000514565b84845462000482565b825550505050565b600090565b6200055862000549565b620005658184846200051e565b505050565b5b818110156200058d57620005816000826200054e565b6001810190506200056b565b5050565b601f821115620005dc57620005a68162000450565b620005b18462000465565b81016020851015620005c1578190505b620005d9620005d08562000465565b8301826200056a565b50505b505050565b600082821c905092915050565b60006200060160001984600802620005e1565b1980831691505092915050565b60006200061c8383620005ee565b9150826002028217905092915050565b6200063782620003b2565b67ffffffffffffffff811115620006535762000652620003bd565b5b6200065f82546200041b565b6200066c82828562000591565b600060209050601f831160018114620006a457600084156200068f578287015190505b6200069b85826200060e565b8655506200070b565b601f198416620006b48662000450565b60005b82811015620006de57848901518255600182019150602085019450602081019050620006b7565b86831015620006fe5784890151620006fa601f891682620005ee565b8355505b6001600288020188555050505b505050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620007458262000718565b9050919050565b620007578162000738565b81146200076357600080fd5b50565b60008151905062000777816200074c565b92915050565b60006020828403121562000796576200079562000713565b5b6000620007a68482850162000766565b91505092915050565b620007ba8162000738565b82525050565b6000602082019050620007d76000830184620007af565b92915050565b61312a80620007ed6000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80638da5cb5b116100f9578063bd0bc04711610097578063d0def52111610071578063d0def521146104ca578063d204c45e146104fa578063e985e9c514610516578063f2fde38b14610546576101c4565b8063bd0bc04714610460578063c5be87501461047c578063c87b56dd1461049a576101c4565b806395d89b41116100d357806395d89b41146103ec578063a22cb4651461040a578063aeca06ab14610426578063b88d4fde14610444576101c4565b80638da5cb5b146103965780638e6fcd32146103b45780638f2fc60b146103d0576101c4565b806334d1c641116101665780636352211e116101405780636352211e1461032257806370a0823114610352578063715018a6146103825780637f8b1e0e1461038c576101c4565b806334d1c641146102ce57806342842e0e146102ea578063524cad9814610306576101c4565b8063095ea7b3116101a2578063095ea7b31461024757806318160ddd1461026357806323b872dd146102815780632a55205a1461029d576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063081812fc14610217575b600080fd5b6101e360048036038101906101de91906122ce565b610562565b6040516101f09190612316565b60405180910390f35b6102016105dc565b60405161020e91906123c1565b60405180910390f35b610231600480360381019061022c9190612419565b61066e565b60405161023e9190612487565b60405180910390f35b610261600480360381019061025c91906124ce565b61068a565b005b61026b6106a0565b604051610278919061251d565b60405180910390f35b61029b60048036038101906102969190612538565b6106aa565b005b6102b760048036038101906102b2919061258b565b6107ac565b6040516102c59291906125cb565b60405180910390f35b6102e860048036038101906102e39190612729565b610832565b005b61030460048036038101906102ff9190612538565b610848565b005b610320600480360381019061031b9190612785565b610868565b005b61033c60048036038101906103379190612419565b610906565b6040516103499190612487565b60405180910390f35b61036c60048036038101906103679190612785565b610918565b604051610379919061251d565b60405180910390f35b61038a6109d2565b005b6103946109e6565b005b61039e610a0b565b6040516103ab9190612487565b60405180910390f35b6103ce60048036038101906103c991906127de565b610a35565b005b6103ea60048036038101906103e59190612862565b610aea565b005b6103f4610bc9565b60405161040191906123c1565b60405180910390f35b610424600480360381019061041f91906127de565b610c5b565b005b61042e610c71565b60405161043b9190612316565b60405180910390f35b61045e60048036038101906104599190612943565b610c84565b005b61047a600480360381019061047591906129c6565b610ca1565b005b610484610cbc565b60405161049191906123c1565b60405180910390f35b6104b460048036038101906104af9190612419565b610d4a565b6040516104c191906123c1565b60405180910390f35b6104e460048036038101906104df9190612a0f565b610e04565b6040516104f1919061251d565b60405180910390f35b610514600480360381019061050f9190612a0f565b610edb565b005b610530600480360381019061052b9190612a6b565b610f65565b60405161053d9190612316565b60405180910390f35b610560600480360381019061055b9190612785565b610ff9565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105d557506105d48261107f565b5b9050919050565b6060600080546105eb90612ada565b80601f016020809104026020016040519081016040528092919081815260200182805461061790612ada565b80156106645780601f1061063957610100808354040283529160200191610664565b820191906000526020600020905b81548152906001019060200180831161064757829003601f168201915b5050505050905090565b6000610679826110e0565b5061068382611168565b9050919050565b61069c82826106976111a5565b6111ad565b5050565b6000600854905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361071c5760006040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016107139190612487565b60405180910390fd5b6000610730838361072b6111a5565b6111bf565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107a6578382826040517f64283d7b00000000000000000000000000000000000000000000000000000000815260040161079d93929190612b0b565b60405180910390fd5b50505050565b60008060006127106bffffffffffffffffffffffff16600e60149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff16856107f69190612b71565b6108009190612be2565b9050600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168192509250509250929050565b61083a6113d9565b6108448282611460565b5050565b61086383838360405180602001604052806000815250610c84565b505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108c257600080fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610911826110e0565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361098b5760006040517f89c62b640000000000000000000000000000000000000000000000000000000081526004016109829190612487565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6109da6113d9565b6109e460006114bc565b565b6109ee6113d9565b6000600c60006101000a81548160ff021916908315150217905550565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a8f57600080fd5b80600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b610af26113d9565b6127106bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115610b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4a90612c5f565b60405180910390fd5b80600e60146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b606060018054610bd890612ada565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0490612ada565b8015610c515780601f10610c2657610100808354040283529160200191610c51565b820191906000526020600020905b815481529060010190602001808311610c3457829003601f168201915b5050505050905090565b610c6d610c666111a5565b8383611582565b5050565b600c60009054906101000a900460ff1681565b610c8f8484846106aa565b610c9b848484846116f1565b50505050565b610ca96113d9565b80600d9081610cb89190612e2b565b5050565b600d8054610cc990612ada565b80601f0160208091040260200160405190810160405280929190818152602001828054610cf590612ada565b8015610d425780601f10610d1757610100808354040283529160200191610d42565b820191906000526020600020905b815481529060010190602001808311610d2557829003601f168201915b505050505081565b6060600c60009054906101000a900460ff1615610df357600d8054610d6e90612ada565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9a90612ada565b8015610de75780601f10610dbc57610100808354040283529160200191610de7565b820191906000526020600020905b815481529060010190602001808311610dca57829003601f168201915b50505050509050610dff565b610dfc826118a8565b90505b919050565b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610e5c57600080fd5b600854600b5411610ea2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9990612f49565b60405180910390fd5b600060086000815480929190610eb790612f69565b919050559050610ec784826119bb565b610ed18184611460565b8091505092915050565b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610f3157600080fd5b600060086000815480929190610f4690612f69565b919050559050610f568382611ab4565b610f608183611460565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6110016113d9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110735760006040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161106a9190612487565b60405180910390fd5b61107c816114bc565b50565b6000634906490660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806110d957506110d882611ad2565b5b9050919050565b6000806110ec83611bb4565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361115f57826040517f7e273289000000000000000000000000000000000000000000000000000000008152600401611156919061251d565b60405180910390fd5b80915050919050565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600033905090565b6111ba8383836001611bf1565b505050565b6000806111cb84611bb4565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461120d5761120c818486611db6565b5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461129e5761124f600085600080611bf1565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614611321576001600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b846002600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b6113e16111a5565b73ffffffffffffffffffffffffffffffffffffffff166113ff610a0b565b73ffffffffffffffffffffffffffffffffffffffff161461145e576114226111a5565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016114559190612487565b60405180910390fd5b565b806006600084815260200190815260200160002090816114809190612e2b565b507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7826040516114b0919061251d565b60405180910390a15050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115f357816040517f5b08ba180000000000000000000000000000000000000000000000000000000081526004016115ea9190612487565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116e49190612316565b60405180910390a3505050565b60008373ffffffffffffffffffffffffffffffffffffffff163b11156118a2578273ffffffffffffffffffffffffffffffffffffffff1663150b7a026117356111a5565b8685856040518563ffffffff1660e01b81526004016117579493929190613006565b6020604051808303816000875af192505050801561179357506040513d601f19601f820116820180604052508101906117909190613067565b60015b611817573d80600081146117c3576040519150601f19603f3d011682016040523d82523d6000602084013e6117c8565b606091505b50600081510361180f57836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016118069190612487565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146118a057836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016118979190612487565b60405180910390fd5b505b50505050565b60606118b3826110e0565b5060006006600084815260200190815260200160002080546118d490612ada565b80601f016020809104026020016040519081016040528092919081815260200182805461190090612ada565b801561194d5780601f106119225761010080835404028352916020019161194d565b820191906000526020600020905b81548152906001019060200180831161193057829003601f168201915b50505050509050600061195e611e7a565b905060008151036119735781925050506119b6565b6000825111156119a85780826040516020016119909291906130d0565b604051602081830303815290604052925050506119b6565b6119b184611e91565b925050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a2d5760006040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401611a249190612487565b60405180910390fd5b6000611a3b838360006111bf565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611aaf5760006040517f73c6ac6e000000000000000000000000000000000000000000000000000000008152600401611aa69190612487565b60405180910390fd5b505050565b611ace828260405180602001604052806000815250611efa565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b9d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611bad5750611bac82611f16565b5b9050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8080611c2a5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15611d5e576000611c3a846110e0565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611ca557508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015611cb85750611cb68184610f65565b155b15611cfa57826040517fa9fbf51f000000000000000000000000000000000000000000000000000000008152600401611cf19190612487565b60405180910390fd5b8115611d5c57838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b836004600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b611dc1838383611f80565b611e7557600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611e3657806040517f7e273289000000000000000000000000000000000000000000000000000000008152600401611e2d919061251d565b60405180910390fd5b81816040517f177e802f000000000000000000000000000000000000000000000000000000008152600401611e6c9291906125cb565b60405180910390fd5b505050565b606060405180602001604052806000815250905090565b6060611e9c826110e0565b506000611ea7611e7a565b90506000815111611ec75760405180602001604052806000815250611ef2565b80611ed184612041565b604051602001611ee29291906130d0565b6040516020818303038152906040525b915050919050565b611f0483836119bb565b611f1160008484846116f1565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561203857508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ff95750611ff88484610f65565b5b8061203757508273ffffffffffffffffffffffffffffffffffffffff1661201f83611168565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b6060600060016120508461210f565b01905060008167ffffffffffffffff81111561206f5761206e6125fe565b5b6040519080825280601f01601f1916602001820160405280156120a15781602001600182028036833780820191505090505b509050600082602001820190505b600115612104578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816120f8576120f7612bb3565b5b049450600085036120af575b819350505050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061216d577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161216357612162612bb3565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106121aa576d04ee2d6d415b85acef810000000083816121a05761219f612bb3565b5b0492506020810190505b662386f26fc1000083106121d957662386f26fc1000083816121cf576121ce612bb3565b5b0492506010810190505b6305f5e1008310612202576305f5e10083816121f8576121f7612bb3565b5b0492506008810190505b612710831061222757612710838161221d5761221c612bb3565b5b0492506004810190505b6064831061224a57606483816122405761223f612bb3565b5b0492506002810190505b600a8310612259576001810190505b80915050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6122ab81612276565b81146122b657600080fd5b50565b6000813590506122c8816122a2565b92915050565b6000602082840312156122e4576122e361226c565b5b60006122f2848285016122b9565b91505092915050565b60008115159050919050565b612310816122fb565b82525050565b600060208201905061232b6000830184612307565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561236b578082015181840152602081019050612350565b60008484015250505050565b6000601f19601f8301169050919050565b600061239382612331565b61239d818561233c565b93506123ad81856020860161234d565b6123b681612377565b840191505092915050565b600060208201905081810360008301526123db8184612388565b905092915050565b6000819050919050565b6123f6816123e3565b811461240157600080fd5b50565b600081359050612413816123ed565b92915050565b60006020828403121561242f5761242e61226c565b5b600061243d84828501612404565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061247182612446565b9050919050565b61248181612466565b82525050565b600060208201905061249c6000830184612478565b92915050565b6124ab81612466565b81146124b657600080fd5b50565b6000813590506124c8816124a2565b92915050565b600080604083850312156124e5576124e461226c565b5b60006124f3858286016124b9565b925050602061250485828601612404565b9150509250929050565b612517816123e3565b82525050565b6000602082019050612532600083018461250e565b92915050565b6000806000606084860312156125515761255061226c565b5b600061255f868287016124b9565b9350506020612570868287016124b9565b925050604061258186828701612404565b9150509250925092565b600080604083850312156125a2576125a161226c565b5b60006125b085828601612404565b92505060206125c185828601612404565b9150509250929050565b60006040820190506125e06000830185612478565b6125ed602083018461250e565b9392505050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61263682612377565b810181811067ffffffffffffffff82111715612655576126546125fe565b5b80604052505050565b6000612668612262565b9050612674828261262d565b919050565b600067ffffffffffffffff821115612694576126936125fe565b5b61269d82612377565b9050602081019050919050565b82818337600083830152505050565b60006126cc6126c784612679565b61265e565b9050828152602081018484840111156126e8576126e76125f9565b5b6126f38482856126aa565b509392505050565b600082601f8301126127105761270f6125f4565b5b81356127208482602086016126b9565b91505092915050565b600080604083850312156127405761273f61226c565b5b600061274e85828601612404565b925050602083013567ffffffffffffffff81111561276f5761276e612271565b5b61277b858286016126fb565b9150509250929050565b60006020828403121561279b5761279a61226c565b5b60006127a9848285016124b9565b91505092915050565b6127bb816122fb565b81146127c657600080fd5b50565b6000813590506127d8816127b2565b92915050565b600080604083850312156127f5576127f461226c565b5b6000612803858286016124b9565b9250506020612814858286016127c9565b9150509250929050565b60006bffffffffffffffffffffffff82169050919050565b61283f8161281e565b811461284a57600080fd5b50565b60008135905061285c81612836565b92915050565b600080604083850312156128795761287861226c565b5b6000612887858286016124b9565b92505060206128988582860161284d565b9150509250929050565b600067ffffffffffffffff8211156128bd576128bc6125fe565b5b6128c682612377565b9050602081019050919050565b60006128e66128e1846128a2565b61265e565b905082815260208101848484011115612902576129016125f9565b5b61290d8482856126aa565b509392505050565b600082601f83011261292a576129296125f4565b5b813561293a8482602086016128d3565b91505092915050565b6000806000806080858703121561295d5761295c61226c565b5b600061296b878288016124b9565b945050602061297c878288016124b9565b935050604061298d87828801612404565b925050606085013567ffffffffffffffff8111156129ae576129ad612271565b5b6129ba87828801612915565b91505092959194509250565b6000602082840312156129dc576129db61226c565b5b600082013567ffffffffffffffff8111156129fa576129f9612271565b5b612a06848285016126fb565b91505092915050565b60008060408385031215612a2657612a2561226c565b5b6000612a34858286016124b9565b925050602083013567ffffffffffffffff811115612a5557612a54612271565b5b612a61858286016126fb565b9150509250929050565b60008060408385031215612a8257612a8161226c565b5b6000612a90858286016124b9565b9250506020612aa1858286016124b9565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612af257607f821691505b602082108103612b0557612b04612aab565b5b50919050565b6000606082019050612b206000830186612478565b612b2d602083018561250e565b612b3a6040830184612478565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612b7c826123e3565b9150612b87836123e3565b9250828202612b95816123e3565b91508282048414831517612bac57612bab612b42565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612bed826123e3565b9150612bf8836123e3565b925082612c0857612c07612bb3565b5b828204905092915050565b7f526f79616c74792070657263656e7461676520746f6f20686967680000000000600082015250565b6000612c49601b8361233c565b9150612c5482612c13565b602082019050919050565b60006020820190508181036000830152612c7881612c3c565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612ce17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612ca4565b612ceb8683612ca4565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612d28612d23612d1e846123e3565b612d03565b6123e3565b9050919050565b6000819050919050565b612d4283612d0d565b612d56612d4e82612d2f565b848454612cb1565b825550505050565b600090565b612d6b612d5e565b612d76818484612d39565b505050565b5b81811015612d9a57612d8f600082612d63565b600181019050612d7c565b5050565b601f821115612ddf57612db081612c7f565b612db984612c94565b81016020851015612dc8578190505b612ddc612dd485612c94565b830182612d7b565b50505b505050565b600082821c905092915050565b6000612e0260001984600802612de4565b1980831691505092915050565b6000612e1b8383612df1565b9150826002028217905092915050565b612e3482612331565b67ffffffffffffffff811115612e4d57612e4c6125fe565b5b612e578254612ada565b612e62828285612d9e565b600060209050601f831160018114612e955760008415612e83578287015190505b612e8d8582612e0f565b865550612ef5565b601f198416612ea386612c7f565b60005b82811015612ecb57848901518255600182019150602085019450602081019050612ea6565b86831015612ee85784890151612ee4601f891682612df1565b8355505b6001600288020188555050505b505050505050565b7f416c6c20746f6b656e206d696e74656400000000000000000000000000000000600082015250565b6000612f3360108361233c565b9150612f3e82612efd565b602082019050919050565b60006020820190508181036000830152612f6281612f26565b9050919050565b6000612f74826123e3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612fa657612fa5612b42565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b6000612fd882612fb1565b612fe28185612fbc565b9350612ff281856020860161234d565b612ffb81612377565b840191505092915050565b600060808201905061301b6000830187612478565b6130286020830186612478565b613035604083018561250e565b81810360608301526130478184612fcd565b905095945050505050565b600081519050613061816122a2565b92915050565b60006020828403121561307d5761307c61226c565b5b600061308b84828501613052565b91505092915050565b600081905092915050565b60006130aa82612331565b6130b48185613094565b93506130c481856020860161234d565b80840191505092915050565b60006130dc828561309f565b91506130e8828461309f565b9150819050939250505056fea26469706673582212203101dad605e0eea3b3ceb2492a47b4f9bc480cf98072d00461c56663d64fa45464736f6c6343000818003368747470733a2f2f64707739383863797a766d666a2e636c6f756466726f6e742e6e65742f68696464656e2d696d616765732f3637616636343738336264336665343133663431363532350000000000000000000000002e407a65dc925cb9884cff588e0ef1814e221466

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101c45760003560e01c80638da5cb5b116100f9578063bd0bc04711610097578063d0def52111610071578063d0def521146104ca578063d204c45e146104fa578063e985e9c514610516578063f2fde38b14610546576101c4565b8063bd0bc04714610460578063c5be87501461047c578063c87b56dd1461049a576101c4565b806395d89b41116100d357806395d89b41146103ec578063a22cb4651461040a578063aeca06ab14610426578063b88d4fde14610444576101c4565b80638da5cb5b146103965780638e6fcd32146103b45780638f2fc60b146103d0576101c4565b806334d1c641116101665780636352211e116101405780636352211e1461032257806370a0823114610352578063715018a6146103825780637f8b1e0e1461038c576101c4565b806334d1c641146102ce57806342842e0e146102ea578063524cad9814610306576101c4565b8063095ea7b3116101a2578063095ea7b31461024757806318160ddd1461026357806323b872dd146102815780632a55205a1461029d576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063081812fc14610217575b600080fd5b6101e360048036038101906101de91906122ce565b610562565b6040516101f09190612316565b60405180910390f35b6102016105dc565b60405161020e91906123c1565b60405180910390f35b610231600480360381019061022c9190612419565b61066e565b60405161023e9190612487565b60405180910390f35b610261600480360381019061025c91906124ce565b61068a565b005b61026b6106a0565b604051610278919061251d565b60405180910390f35b61029b60048036038101906102969190612538565b6106aa565b005b6102b760048036038101906102b2919061258b565b6107ac565b6040516102c59291906125cb565b60405180910390f35b6102e860048036038101906102e39190612729565b610832565b005b61030460048036038101906102ff9190612538565b610848565b005b610320600480360381019061031b9190612785565b610868565b005b61033c60048036038101906103379190612419565b610906565b6040516103499190612487565b60405180910390f35b61036c60048036038101906103679190612785565b610918565b604051610379919061251d565b60405180910390f35b61038a6109d2565b005b6103946109e6565b005b61039e610a0b565b6040516103ab9190612487565b60405180910390f35b6103ce60048036038101906103c991906127de565b610a35565b005b6103ea60048036038101906103e59190612862565b610aea565b005b6103f4610bc9565b60405161040191906123c1565b60405180910390f35b610424600480360381019061041f91906127de565b610c5b565b005b61042e610c71565b60405161043b9190612316565b60405180910390f35b61045e60048036038101906104599190612943565b610c84565b005b61047a600480360381019061047591906129c6565b610ca1565b005b610484610cbc565b60405161049191906123c1565b60405180910390f35b6104b460048036038101906104af9190612419565b610d4a565b6040516104c191906123c1565b60405180910390f35b6104e460048036038101906104df9190612a0f565b610e04565b6040516104f1919061251d565b60405180910390f35b610514600480360381019061050f9190612a0f565b610edb565b005b610530600480360381019061052b9190612a6b565b610f65565b60405161053d9190612316565b60405180910390f35b610560600480360381019061055b9190612785565b610ff9565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105d557506105d48261107f565b5b9050919050565b6060600080546105eb90612ada565b80601f016020809104026020016040519081016040528092919081815260200182805461061790612ada565b80156106645780601f1061063957610100808354040283529160200191610664565b820191906000526020600020905b81548152906001019060200180831161064757829003601f168201915b5050505050905090565b6000610679826110e0565b5061068382611168565b9050919050565b61069c82826106976111a5565b6111ad565b5050565b6000600854905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361071c5760006040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016107139190612487565b60405180910390fd5b6000610730838361072b6111a5565b6111bf565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107a6578382826040517f64283d7b00000000000000000000000000000000000000000000000000000000815260040161079d93929190612b0b565b60405180910390fd5b50505050565b60008060006127106bffffffffffffffffffffffff16600e60149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff16856107f69190612b71565b6108009190612be2565b9050600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168192509250509250929050565b61083a6113d9565b6108448282611460565b5050565b61086383838360405180602001604052806000815250610c84565b505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108c257600080fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610911826110e0565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361098b5760006040517f89c62b640000000000000000000000000000000000000000000000000000000081526004016109829190612487565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6109da6113d9565b6109e460006114bc565b565b6109ee6113d9565b6000600c60006101000a81548160ff021916908315150217905550565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a8f57600080fd5b80600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b610af26113d9565b6127106bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115610b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4a90612c5f565b60405180910390fd5b80600e60146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b606060018054610bd890612ada565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0490612ada565b8015610c515780601f10610c2657610100808354040283529160200191610c51565b820191906000526020600020905b815481529060010190602001808311610c3457829003601f168201915b5050505050905090565b610c6d610c666111a5565b8383611582565b5050565b600c60009054906101000a900460ff1681565b610c8f8484846106aa565b610c9b848484846116f1565b50505050565b610ca96113d9565b80600d9081610cb89190612e2b565b5050565b600d8054610cc990612ada565b80601f0160208091040260200160405190810160405280929190818152602001828054610cf590612ada565b8015610d425780601f10610d1757610100808354040283529160200191610d42565b820191906000526020600020905b815481529060010190602001808311610d2557829003601f168201915b505050505081565b6060600c60009054906101000a900460ff1615610df357600d8054610d6e90612ada565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9a90612ada565b8015610de75780601f10610dbc57610100808354040283529160200191610de7565b820191906000526020600020905b815481529060010190602001808311610dca57829003601f168201915b50505050509050610dff565b610dfc826118a8565b90505b919050565b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610e5c57600080fd5b600854600b5411610ea2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9990612f49565b60405180910390fd5b600060086000815480929190610eb790612f69565b919050559050610ec784826119bb565b610ed18184611460565b8091505092915050565b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610f3157600080fd5b600060086000815480929190610f4690612f69565b919050559050610f568382611ab4565b610f608183611460565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6110016113d9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036110735760006040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161106a9190612487565b60405180910390fd5b61107c816114bc565b50565b6000634906490660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806110d957506110d882611ad2565b5b9050919050565b6000806110ec83611bb4565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361115f57826040517f7e273289000000000000000000000000000000000000000000000000000000008152600401611156919061251d565b60405180910390fd5b80915050919050565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600033905090565b6111ba8383836001611bf1565b505050565b6000806111cb84611bb4565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461120d5761120c818486611db6565b5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461129e5761124f600085600080611bf1565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614611321576001600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b846002600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b6113e16111a5565b73ffffffffffffffffffffffffffffffffffffffff166113ff610a0b565b73ffffffffffffffffffffffffffffffffffffffff161461145e576114226111a5565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016114559190612487565b60405180910390fd5b565b806006600084815260200190815260200160002090816114809190612e2b565b507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7826040516114b0919061251d565b60405180910390a15050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115f357816040517f5b08ba180000000000000000000000000000000000000000000000000000000081526004016115ea9190612487565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116e49190612316565b60405180910390a3505050565b60008373ffffffffffffffffffffffffffffffffffffffff163b11156118a2578273ffffffffffffffffffffffffffffffffffffffff1663150b7a026117356111a5565b8685856040518563ffffffff1660e01b81526004016117579493929190613006565b6020604051808303816000875af192505050801561179357506040513d601f19601f820116820180604052508101906117909190613067565b60015b611817573d80600081146117c3576040519150601f19603f3d011682016040523d82523d6000602084013e6117c8565b606091505b50600081510361180f57836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016118069190612487565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146118a057836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016118979190612487565b60405180910390fd5b505b50505050565b60606118b3826110e0565b5060006006600084815260200190815260200160002080546118d490612ada565b80601f016020809104026020016040519081016040528092919081815260200182805461190090612ada565b801561194d5780601f106119225761010080835404028352916020019161194d565b820191906000526020600020905b81548152906001019060200180831161193057829003601f168201915b50505050509050600061195e611e7a565b905060008151036119735781925050506119b6565b6000825111156119a85780826040516020016119909291906130d0565b604051602081830303815290604052925050506119b6565b6119b184611e91565b925050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a2d5760006040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401611a249190612487565b60405180910390fd5b6000611a3b838360006111bf565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611aaf5760006040517f73c6ac6e000000000000000000000000000000000000000000000000000000008152600401611aa69190612487565b60405180910390fd5b505050565b611ace828260405180602001604052806000815250611efa565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b9d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611bad5750611bac82611f16565b5b9050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8080611c2a5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15611d5e576000611c3a846110e0565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611ca557508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015611cb85750611cb68184610f65565b155b15611cfa57826040517fa9fbf51f000000000000000000000000000000000000000000000000000000008152600401611cf19190612487565b60405180910390fd5b8115611d5c57838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b836004600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b611dc1838383611f80565b611e7557600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611e3657806040517f7e273289000000000000000000000000000000000000000000000000000000008152600401611e2d919061251d565b60405180910390fd5b81816040517f177e802f000000000000000000000000000000000000000000000000000000008152600401611e6c9291906125cb565b60405180910390fd5b505050565b606060405180602001604052806000815250905090565b6060611e9c826110e0565b506000611ea7611e7a565b90506000815111611ec75760405180602001604052806000815250611ef2565b80611ed184612041565b604051602001611ee29291906130d0565b6040516020818303038152906040525b915050919050565b611f0483836119bb565b611f1160008484846116f1565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561203857508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ff95750611ff88484610f65565b5b8061203757508273ffffffffffffffffffffffffffffffffffffffff1661201f83611168565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b6060600060016120508461210f565b01905060008167ffffffffffffffff81111561206f5761206e6125fe565b5b6040519080825280601f01601f1916602001820160405280156120a15781602001600182028036833780820191505090505b509050600082602001820190505b600115612104578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816120f8576120f7612bb3565b5b049450600085036120af575b819350505050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061216d577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161216357612162612bb3565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106121aa576d04ee2d6d415b85acef810000000083816121a05761219f612bb3565b5b0492506020810190505b662386f26fc1000083106121d957662386f26fc1000083816121cf576121ce612bb3565b5b0492506010810190505b6305f5e1008310612202576305f5e10083816121f8576121f7612bb3565b5b0492506008810190505b612710831061222757612710838161221d5761221c612bb3565b5b0492506004810190505b6064831061224a57606483816122405761223f612bb3565b5b0492506002810190505b600a8310612259576001810190505b80915050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6122ab81612276565b81146122b657600080fd5b50565b6000813590506122c8816122a2565b92915050565b6000602082840312156122e4576122e361226c565b5b60006122f2848285016122b9565b91505092915050565b60008115159050919050565b612310816122fb565b82525050565b600060208201905061232b6000830184612307565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561236b578082015181840152602081019050612350565b60008484015250505050565b6000601f19601f8301169050919050565b600061239382612331565b61239d818561233c565b93506123ad81856020860161234d565b6123b681612377565b840191505092915050565b600060208201905081810360008301526123db8184612388565b905092915050565b6000819050919050565b6123f6816123e3565b811461240157600080fd5b50565b600081359050612413816123ed565b92915050565b60006020828403121561242f5761242e61226c565b5b600061243d84828501612404565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061247182612446565b9050919050565b61248181612466565b82525050565b600060208201905061249c6000830184612478565b92915050565b6124ab81612466565b81146124b657600080fd5b50565b6000813590506124c8816124a2565b92915050565b600080604083850312156124e5576124e461226c565b5b60006124f3858286016124b9565b925050602061250485828601612404565b9150509250929050565b612517816123e3565b82525050565b6000602082019050612532600083018461250e565b92915050565b6000806000606084860312156125515761255061226c565b5b600061255f868287016124b9565b9350506020612570868287016124b9565b925050604061258186828701612404565b9150509250925092565b600080604083850312156125a2576125a161226c565b5b60006125b085828601612404565b92505060206125c185828601612404565b9150509250929050565b60006040820190506125e06000830185612478565b6125ed602083018461250e565b9392505050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61263682612377565b810181811067ffffffffffffffff82111715612655576126546125fe565b5b80604052505050565b6000612668612262565b9050612674828261262d565b919050565b600067ffffffffffffffff821115612694576126936125fe565b5b61269d82612377565b9050602081019050919050565b82818337600083830152505050565b60006126cc6126c784612679565b61265e565b9050828152602081018484840111156126e8576126e76125f9565b5b6126f38482856126aa565b509392505050565b600082601f8301126127105761270f6125f4565b5b81356127208482602086016126b9565b91505092915050565b600080604083850312156127405761273f61226c565b5b600061274e85828601612404565b925050602083013567ffffffffffffffff81111561276f5761276e612271565b5b61277b858286016126fb565b9150509250929050565b60006020828403121561279b5761279a61226c565b5b60006127a9848285016124b9565b91505092915050565b6127bb816122fb565b81146127c657600080fd5b50565b6000813590506127d8816127b2565b92915050565b600080604083850312156127f5576127f461226c565b5b6000612803858286016124b9565b9250506020612814858286016127c9565b9150509250929050565b60006bffffffffffffffffffffffff82169050919050565b61283f8161281e565b811461284a57600080fd5b50565b60008135905061285c81612836565b92915050565b600080604083850312156128795761287861226c565b5b6000612887858286016124b9565b92505060206128988582860161284d565b9150509250929050565b600067ffffffffffffffff8211156128bd576128bc6125fe565b5b6128c682612377565b9050602081019050919050565b60006128e66128e1846128a2565b61265e565b905082815260208101848484011115612902576129016125f9565b5b61290d8482856126aa565b509392505050565b600082601f83011261292a576129296125f4565b5b813561293a8482602086016128d3565b91505092915050565b6000806000806080858703121561295d5761295c61226c565b5b600061296b878288016124b9565b945050602061297c878288016124b9565b935050604061298d87828801612404565b925050606085013567ffffffffffffffff8111156129ae576129ad612271565b5b6129ba87828801612915565b91505092959194509250565b6000602082840312156129dc576129db61226c565b5b600082013567ffffffffffffffff8111156129fa576129f9612271565b5b612a06848285016126fb565b91505092915050565b60008060408385031215612a2657612a2561226c565b5b6000612a34858286016124b9565b925050602083013567ffffffffffffffff811115612a5557612a54612271565b5b612a61858286016126fb565b9150509250929050565b60008060408385031215612a8257612a8161226c565b5b6000612a90858286016124b9565b9250506020612aa1858286016124b9565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612af257607f821691505b602082108103612b0557612b04612aab565b5b50919050565b6000606082019050612b206000830186612478565b612b2d602083018561250e565b612b3a6040830184612478565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612b7c826123e3565b9150612b87836123e3565b9250828202612b95816123e3565b91508282048414831517612bac57612bab612b42565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612bed826123e3565b9150612bf8836123e3565b925082612c0857612c07612bb3565b5b828204905092915050565b7f526f79616c74792070657263656e7461676520746f6f20686967680000000000600082015250565b6000612c49601b8361233c565b9150612c5482612c13565b602082019050919050565b60006020820190508181036000830152612c7881612c3c565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612ce17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612ca4565b612ceb8683612ca4565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612d28612d23612d1e846123e3565b612d03565b6123e3565b9050919050565b6000819050919050565b612d4283612d0d565b612d56612d4e82612d2f565b848454612cb1565b825550505050565b600090565b612d6b612d5e565b612d76818484612d39565b505050565b5b81811015612d9a57612d8f600082612d63565b600181019050612d7c565b5050565b601f821115612ddf57612db081612c7f565b612db984612c94565b81016020851015612dc8578190505b612ddc612dd485612c94565b830182612d7b565b50505b505050565b600082821c905092915050565b6000612e0260001984600802612de4565b1980831691505092915050565b6000612e1b8383612df1565b9150826002028217905092915050565b612e3482612331565b67ffffffffffffffff811115612e4d57612e4c6125fe565b5b612e578254612ada565b612e62828285612d9e565b600060209050601f831160018114612e955760008415612e83578287015190505b612e8d8582612e0f565b865550612ef5565b601f198416612ea386612c7f565b60005b82811015612ecb57848901518255600182019150602085019450602081019050612ea6565b86831015612ee85784890151612ee4601f891682612df1565b8355505b6001600288020188555050505b505050505050565b7f416c6c20746f6b656e206d696e74656400000000000000000000000000000000600082015250565b6000612f3360108361233c565b9150612f3e82612efd565b602082019050919050565b60006020820190508181036000830152612f6281612f26565b9050919050565b6000612f74826123e3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612fa657612fa5612b42565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b6000612fd882612fb1565b612fe28185612fbc565b9350612ff281856020860161234d565b612ffb81612377565b840191505092915050565b600060808201905061301b6000830187612478565b6130286020830186612478565b613035604083018561250e565b81810360608301526130478184612fcd565b905095945050505050565b600081519050613061816122a2565b92915050565b60006020828403121561307d5761307c61226c565b5b600061308b84828501613052565b91505092915050565b600081905092915050565b60006130aa82612331565b6130b48185613094565b93506130c481856020860161234d565b80840191505092915050565b60006130dc828561309f565b91506130e8828461309f565b9150819050939250505056fea26469706673582212203101dad605e0eea3b3ceb2492a47b4f9bc480cf98072d00461c56663d64fa45464736f6c63430008180033

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

0000000000000000000000002e407a65dc925cb9884cff588e0ef1814e221466

-----Decoded View---------------
Arg [0] : initialOwner (address): 0x2e407a65DC925cb9884CfF588e0EF1814e221466

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000002e407a65dc925cb9884cff588e0ef1814e221466


Deployed Bytecode Sourcemap

50769:3536:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53454:250;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31149:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32321:158;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32140:115;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53349:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32990:588;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54031:265;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;52771:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33649:134;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52528:110;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30962:120;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30687:213;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18258:103;;;:::i;:::-;;52904:70;;;:::i;:::-;;17583:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52381:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53718:261;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31309:95;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32551:146;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51058:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33854:211;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52652:97;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51092:103;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53058:283;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51865:308;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51647:210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32768:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18516:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53454:250;53586:4;53630:26;53615:41;;;:11;:41;;;;:81;;;;53660:36;53684:11;53660:23;:36::i;:::-;53615:81;53608:88;;53454:250;;;:::o;31149:91::-;31194:13;31227:5;31220:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31149:91;:::o;32321:158::-;32388:7;32408:22;32422:7;32408:13;:22::i;:::-;;32450:21;32463:7;32450:12;:21::i;:::-;32443:28;;32321:158;;;:::o;32140:115::-;32212:35;32221:2;32225:7;32234:12;:10;:12::i;:::-;32212:8;:35::i;:::-;32140:115;;:::o;53349:91::-;53393:7;53420:12;;53413:19;;53349:91;:::o;32990:588::-;33099:1;33085:16;;:2;:16;;;33081:89;;33155:1;33125:33;;;;;;;;;;;:::i;:::-;;;;;;;;33081:89;33391:21;33415:34;33423:2;33427:7;33436:12;:10;:12::i;:::-;33415:7;:34::i;:::-;33391:58;;33481:4;33464:21;;:13;:21;;;33460:111;;33530:4;33536:7;33545:13;33509:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;33460:111;33070:508;32990:588;;;:::o;54031:265::-;54120:7;54129;54159:21;51377:5;54183:47;;54196:15;;;;;;;;;;;54184:27;;:9;:27;;;;:::i;:::-;54183:47;;;;:::i;:::-;54159:71;;54249:13;;;;;;;;;;;54264;54241:37;;;;;54031:265;;;;;:::o;52771:119::-;17469:13;:11;:13::i;:::-;52856:26:::1;52869:7;52878:3;52856:12;:26::i;:::-;52771:119:::0;;:::o;33649:134::-;33736:39;33753:4;33759:2;33763:7;33736:39;;;;;;;;;;;;:16;:39::i;:::-;33649:134;;;:::o;52528:110::-;52341:11;;;;;;;;;;;52327:25;;:10;:25;;;52319:34;;;;;;52618:12:::1;52604:11;;:26;;;;;;;;;;;;;;;;;;52528:110:::0;:::o;30962:120::-;31025:7;31052:22;31066:7;31052:13;:22::i;:::-;31045:29;;30962:120;;;:::o;30687:213::-;30750:7;30791:1;30774:19;;:5;:19;;;30770:89;;30844:1;30817:30;;;;;;;;;;;:::i;:::-;;;;;;;;30770:89;30876:9;:16;30886:5;30876:16;;;;;;;;;;;;;;;;30869:23;;30687:213;;;:::o;18258:103::-;17469:13;:11;:13::i;:::-;18323:30:::1;18350:1;18323:18;:30::i;:::-;18258:103::o:0;52904:70::-;17469:13;:11;:13::i;:::-;52961:5:::1;52950:8;;:16;;;;;;;;;;;;;;;;;;52904:70::o:0;17583:87::-;17629:7;17656:6;;;;;;;;;;;17649:13;;17583:87;:::o;52381:139::-;52341:11;;;;;;;;;;;52327:25;;:10;:25;;;52319:34;;;;;;52504:8:::1;52470:19;:33;52490:12;52470:33;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;52381:139:::0;;:::o;53718:261::-;17469:13;:11;:13::i;:::-;51377:5:::1;53821:36;;:17;:36;;;;53813:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;53918:17;53900:15;;:35;;;;;;;;;;;;;;;;;;53962:9;53946:13;;:25;;;;;;;;;;;;;;;;;;53718:261:::0;;:::o;31309:95::-;31356:13;31389:7;31382:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31309:95;:::o;32551:146::-;32637:52;32656:12;:10;:12::i;:::-;32670:8;32680;32637:18;:52::i;:::-;32551:146;;:::o;51058:27::-;;;;;;;;;;;;;:::o;33854:211::-;33968:31;33981:4;33987:2;33991:7;33968:12;:31::i;:::-;34010:47;34033:4;34039:2;34043:7;34052:4;34010:22;:47::i;:::-;33854:211;;;;:::o;52652:97::-;17469:13;:11;:13::i;:::-;52738:3:::1;52726:9;:15;;;;;;:::i;:::-;;52652:97:::0;:::o;51092:103::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53058:283::-;53185:13;53230:8;;;;;;;;;;;53226:57;;;53262:9;53255:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53226:57;53310:23;53325:7;53310:14;:23::i;:::-;53303:30;;53058:283;;;;:::o;51865:308::-;51945:7;52228:19;:31;52248:10;52228:31;;;;;;;;;;;;;;;;;;;;;;;;;52220:40;;;;;;51988:12:::1;;51973;;:27;51965:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;52032:15;52050:12;;:14;;;;;;;;;:::i;:::-;;;;;52032:32;;52075:18;52081:2;52085:7;52075:5;:18::i;:::-;52104:26;52117:7;52126:3;52104:12;:26::i;:::-;52158:7;52151:14;;;51865:308:::0;;;;:::o;51647:210::-;52228:19;:31;52248:10;52228:31;;;;;;;;;;;;;;;;;;;;;;;;;52220:40;;;;;;51733:15:::1;51751:12;;:14;;;;;;;;;:::i;:::-;;;;;51733:32;;51776:22;51786:2;51790:7;51776:9;:22::i;:::-;51809:26;51822:7;51831:3;51809:12;:26::i;:::-;51722:135;51647:210:::0;;:::o;32768:155::-;32856:4;32880:18;:25;32899:5;32880:25;;;;;;;;;;;;;;;:35;32906:8;32880:35;;;;;;;;;;;;;;;;;;;;;;;;;32873:42;;32768:155;;;;:::o;18516:220::-;17469:13;:11;:13::i;:::-;18621:1:::1;18601:22;;:8;:22;;::::0;18597:93:::1;;18675:1;18647:31;;;;;;;;;;;:::i;:::-;;;;;;;;18597:93;18700:28;18719:8;18700:18;:28::i;:::-;18516:220:::0;:::o;47722:209::-;47824:4;47537:10;47530:18;;47848:35;;;:11;:35;;;;:75;;;;47887:36;47911:11;47887:23;:36::i;:::-;47848:75;47841:82;;47722:209;;;:::o;45304:247::-;45367:7;45387:13;45403:17;45412:7;45403:8;:17::i;:::-;45387:33;;45452:1;45435:19;;:5;:19;;;45431:90;;45501:7;45478:31;;;;;;;;;;;:::i;:::-;;;;;;;;45431:90;45538:5;45531:12;;;45304:247;;;:::o;34827:129::-;34897:7;34924:15;:24;34940:7;34924:24;;;;;;;;;;;;;;;;;;;;;34917:31;;34827:129;;;:::o;15586:98::-;15639:7;15666:10;15659:17;;15586:98;:::o;43528:130::-;43617:33;43626:2;43630:7;43639:4;43645;43617:8;:33::i;:::-;43528:130;;;:::o;37789:824::-;37875:7;37895:12;37910:17;37919:7;37910:8;:17::i;:::-;37895:32;;38006:1;37990:18;;:4;:18;;;37986:88;;38025:37;38042:4;38048;38054:7;38025:16;:37::i;:::-;37986:88;38137:1;38121:18;;:4;:18;;;38117:263;;38239:48;38256:1;38260:7;38277:1;38281:5;38239:8;:48::i;:::-;38352:1;38333:9;:15;38343:4;38333:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;38117:263;38410:1;38396:16;;:2;:16;;;38392:111;;38475:1;38458:9;:13;38468:2;38458:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;38392:111;38534:2;38515:7;:16;38523:7;38515:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38573:7;38569:2;38554:27;;38563:4;38554:27;;;;;;;;;;;;38601:4;38594:11;;;37789:824;;;;;:::o;17748:166::-;17819:12;:10;:12::i;:::-;17808:23;;:7;:5;:7::i;:::-;:23;;;17804:103;;17882:12;:10;:12::i;:::-;17855:40;;;;;;;;;;;:::i;:::-;;;;;;;;17804:103;17748:166::o;48737:170::-;48851:9;48829:10;:19;48840:7;48829:19;;;;;;;;;;;:31;;;;;;:::i;:::-;;48876:23;48891:7;48876:23;;;;;;:::i;:::-;;;;;;;;48737:170;;:::o;18896:191::-;18970:16;18989:6;;;;;;;;;;;18970:25;;19015:8;19006:6;;:17;;;;;;;;;;;;;;;;;;19070:8;19039:40;;19060:8;19039:40;;;;;;;;;;;;18959:128;18896:191;:::o;44743:318::-;44871:1;44851:22;;:8;:22;;;44847:93;;44919:8;44897:31;;;;;;;;;;;:::i;:::-;;;;;;;;44847:93;44988:8;44950:18;:25;44969:5;44950:25;;;;;;;;;;;;;;;:35;44976:8;44950:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;45034:8;45012:41;;45027:5;45012:41;;;45044:8;45012:41;;;;;;:::i;:::-;;;;;;;;44743:318;;;:::o;46101:799::-;46235:1;46218:2;:14;;;:18;46214:679;;;46273:2;46257:36;;;46294:12;:10;:12::i;:::-;46308:4;46314:7;46323:4;46257:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46253:629;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46588:1;46571:6;:13;:18;46567:300;;46643:2;46621:25;;;;;;;;;;;:::i;:::-;;;;;;;;46567:300;46817:6;46811:13;46802:6;46798:2;46794:15;46787:38;46253:629;46386:41;;;46376:51;;;:6;:51;;;;46372:132;;46481:2;46459:25;;;;;;;;;;;:::i;:::-;;;;;;;;46372:132;46329:190;46214:679;46101:799;;;;:::o;48002:609::-;48075:13;48101:22;48115:7;48101:13;:22::i;:::-;;48136:23;48162:10;:19;48173:7;48162:19;;;;;;;;;;;48136:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48192:18;48213:10;:8;:10::i;:::-;48192:31;;48321:1;48305:4;48299:18;:23;48295:72;;48346:9;48339:16;;;;;;48295:72;48494:1;48474:9;48468:23;:27;48464:97;;;48533:4;48539:9;48519:30;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48512:37;;;;;;48464:97;48580:23;48595:7;48580:14;:23::i;:::-;48573:30;;;;48002:609;;;;:::o;38949:335::-;39031:1;39017:16;;:2;:16;;;39013:89;;39087:1;39057:33;;;;;;;;;;;:::i;:::-;;;;;;;;39013:89;39112:21;39136:32;39144:2;39148:7;39165:1;39136:7;:32::i;:::-;39112:56;;39208:1;39183:27;;:13;:27;;;39179:98;;39262:1;39234:31;;;;;;;;;;;:::i;:::-;;;;;;;;39179:98;39002:282;38949:335;;:::o;39647:102::-;39715:26;39725:2;39729:7;39715:26;;;;;;;;;;;;:9;:26::i;:::-;39647:102;;:::o;30318:305::-;30420:4;30472:25;30457:40;;;:11;:40;;;;:105;;;;30529:33;30514:48;;;:11;:48;;;;30457:105;:158;;;;30579:36;30603:11;30579:23;:36::i;:::-;30457:158;30437:178;;30318:305;;;:::o;34589:117::-;34655:7;34682;:16;34690:7;34682:16;;;;;;;;;;;;;;;;;;;;;34675:23;;34589:117;;;:::o;43846:678::-;44008:9;:31;;;;44037:1;44021:18;;:4;:18;;;;44008:31;44004:471;;;44056:13;44072:22;44086:7;44072:13;:22::i;:::-;44056:38;;44241:1;44225:18;;:4;:18;;;;:35;;;;;44256:4;44247:13;;:5;:13;;;;44225:35;:69;;;;;44265:29;44282:5;44289:4;44265:16;:29::i;:::-;44264:30;44225:69;44221:144;;;44344:4;44322:27;;;;;;;;;;;:::i;:::-;;;;;;;;44221:144;44385:9;44381:83;;;44440:7;44436:2;44420:28;;44429:5;44420:28;;;;;;;;;;;;44381:83;44041:434;44004:471;44514:2;44487:15;:24;44503:7;44487:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;43846:678;;;;:::o;35996:376::-;36109:38;36123:5;36130:7;36139;36109:13;:38::i;:::-;36104:261;;36185:1;36168:19;;:5;:19;;;36164:190;;36238:7;36215:31;;;;;;;;;;;:::i;:::-;;;;;;;;36164:190;36321:7;36330;36294:44;;;;;;;;;;;;:::i;:::-;;;;;;;;36104:261;35996:376;;;:::o;31984:94::-;32035:13;32061:9;;;;;;;;;;;;;;31984:94;:::o;31475:260::-;31539:13;31565:22;31579:7;31565:13;:22::i;:::-;;31600:21;31624:10;:8;:10::i;:::-;31600:34;;31676:1;31658:7;31652:21;:25;:75;;;;;;;;;;;;;;;;;31694:7;31703:18;:7;:16;:18::i;:::-;31680:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31652:75;31645:82;;;31475:260;;;:::o;39976:185::-;40071:18;40077:2;40081:7;40071:5;:18::i;:::-;40100:53;40131:1;40135:2;40139:7;40148:4;40100:22;:53::i;:::-;39976:185;;;:::o;22062:148::-;22138:4;22177:25;22162:40;;;:11;:40;;;;22155:47;;22062:148;;;:::o;35276:276::-;35379:4;35435:1;35416:21;;:7;:21;;;;:128;;;;;35464:7;35455:16;;:5;:16;;;:52;;;;35475:32;35492:5;35499:7;35475:16;:32::i;:::-;35455:52;:88;;;;35536:7;35511:32;;:21;35524:7;35511:12;:21::i;:::-;:32;;;35455:88;35416:128;35396:148;;35276:276;;;;;:::o;12350:718::-;12406:13;12457:14;12494:1;12474:17;12485:5;12474:10;:17::i;:::-;:21;12457:38;;12510:20;12544:6;12533:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12510:41;;12566:11;12695:6;12691:2;12687:15;12679:6;12675:28;12668:35;;12732:290;12739:4;12732:290;;;12764:5;;;;;;;;12906:10;12901:2;12894:5;12890:14;12885:32;12880:3;12872:46;12964:2;12955:11;;;;;;:::i;:::-;;;;;12998:1;12989:5;:10;12732:290;12985:21;12732:290;13043:6;13036:13;;;;;12350:718;;;:::o;8748:948::-;8801:7;8821:14;8838:1;8821:18;;8888:8;8879:5;:17;8875:106;;8926:8;8917:17;;;;;;:::i;:::-;;;;;8963:2;8953:12;;;;8875:106;9008:8;8999:5;:17;8995:106;;9046:8;9037:17;;;;;;:::i;:::-;;;;;9083:2;9073:12;;;;8995:106;9128:8;9119:5;:17;9115:106;;9166:8;9157:17;;;;;;:::i;:::-;;;;;9203:2;9193:12;;;;9115:106;9248:7;9239:5;:16;9235:103;;9285:7;9276:16;;;;;;:::i;:::-;;;;;9321:1;9311:11;;;;9235:103;9365:7;9356:5;:16;9352:103;;9402:7;9393:16;;;;;;:::i;:::-;;;;;9438:1;9428:11;;;;9352:103;9482:7;9473:5;:16;9469:103;;9519:7;9510:16;;;;;;:::i;:::-;;;;;9555:1;9545:11;;;;9469:103;9599:7;9590:5;:16;9586:68;;9637:1;9627:11;;;;9586:68;9682:6;9675:13;;;8748:948;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:474::-;5935:6;5943;5992:2;5980:9;5971:7;5967:23;5963:32;5960:119;;;5998:79;;:::i;:::-;5960:119;6118:1;6143:53;6188:7;6179:6;6168:9;6164:22;6143:53;:::i;:::-;6133:63;;6089:117;6245:2;6271:53;6316:7;6307:6;6296:9;6292:22;6271:53;:::i;:::-;6261:63;;6216:118;5867:474;;;;;:::o;6347:332::-;6468:4;6506:2;6495:9;6491:18;6483:26;;6519:71;6587:1;6576:9;6572:17;6563:6;6519:71;:::i;:::-;6600:72;6668:2;6657:9;6653:18;6644:6;6600:72;:::i;:::-;6347:332;;;;;:::o;6685:117::-;6794:1;6791;6784:12;6808:117;6917:1;6914;6907:12;6931:180;6979:77;6976:1;6969:88;7076:4;7073:1;7066:15;7100:4;7097:1;7090:15;7117:281;7200:27;7222:4;7200:27;:::i;:::-;7192:6;7188:40;7330:6;7318:10;7315:22;7294:18;7282:10;7279:34;7276:62;7273:88;;;7341:18;;:::i;:::-;7273:88;7381:10;7377:2;7370:22;7160:238;7117:281;;:::o;7404:129::-;7438:6;7465:20;;:::i;:::-;7455:30;;7494:33;7522:4;7514:6;7494:33;:::i;:::-;7404:129;;;:::o;7539:308::-;7601:4;7691:18;7683:6;7680:30;7677:56;;;7713:18;;:::i;:::-;7677:56;7751:29;7773:6;7751:29;:::i;:::-;7743:37;;7835:4;7829;7825:15;7817:23;;7539:308;;;:::o;7853:146::-;7950:6;7945:3;7940;7927:30;7991:1;7982:6;7977:3;7973:16;7966:27;7853:146;;;:::o;8005:425::-;8083:5;8108:66;8124:49;8166:6;8124:49;:::i;:::-;8108:66;:::i;:::-;8099:75;;8197:6;8190:5;8183:21;8235:4;8228:5;8224:16;8273:3;8264:6;8259:3;8255:16;8252:25;8249:112;;;8280:79;;:::i;:::-;8249:112;8370:54;8417:6;8412:3;8407;8370:54;:::i;:::-;8089:341;8005:425;;;;;:::o;8450:340::-;8506:5;8555:3;8548:4;8540:6;8536:17;8532:27;8522:122;;8563:79;;:::i;:::-;8522:122;8680:6;8667:20;8705:79;8780:3;8772:6;8765:4;8757:6;8753:17;8705:79;:::i;:::-;8696:88;;8512:278;8450:340;;;;:::o;8796:654::-;8874:6;8882;8931:2;8919:9;8910:7;8906:23;8902:32;8899:119;;;8937:79;;:::i;:::-;8899:119;9057:1;9082:53;9127:7;9118:6;9107:9;9103:22;9082:53;:::i;:::-;9072:63;;9028:117;9212:2;9201:9;9197:18;9184:32;9243:18;9235:6;9232:30;9229:117;;;9265:79;;:::i;:::-;9229:117;9370:63;9425:7;9416:6;9405:9;9401:22;9370:63;:::i;:::-;9360:73;;9155:288;8796:654;;;;;:::o;9456:329::-;9515:6;9564:2;9552:9;9543:7;9539:23;9535:32;9532:119;;;9570:79;;:::i;:::-;9532:119;9690:1;9715:53;9760:7;9751:6;9740:9;9736:22;9715:53;:::i;:::-;9705:63;;9661:117;9456:329;;;;:::o;9791:116::-;9861:21;9876:5;9861:21;:::i;:::-;9854:5;9851:32;9841:60;;9897:1;9894;9887:12;9841:60;9791:116;:::o;9913:133::-;9956:5;9994:6;9981:20;9972:29;;10010:30;10034:5;10010:30;:::i;:::-;9913:133;;;;:::o;10052:468::-;10117:6;10125;10174:2;10162:9;10153:7;10149:23;10145:32;10142:119;;;10180:79;;:::i;:::-;10142:119;10300:1;10325:53;10370:7;10361:6;10350:9;10346:22;10325:53;:::i;:::-;10315:63;;10271:117;10427:2;10453:50;10495:7;10486:6;10475:9;10471:22;10453:50;:::i;:::-;10443:60;;10398:115;10052:468;;;;;:::o;10526:109::-;10562:7;10602:26;10595:5;10591:38;10580:49;;10526:109;;;:::o;10641:120::-;10713:23;10730:5;10713:23;:::i;:::-;10706:5;10703:34;10693:62;;10751:1;10748;10741:12;10693:62;10641:120;:::o;10767:137::-;10812:5;10850:6;10837:20;10828:29;;10866:32;10892:5;10866:32;:::i;:::-;10767:137;;;;:::o;10910:472::-;10977:6;10985;11034:2;11022:9;11013:7;11009:23;11005:32;11002:119;;;11040:79;;:::i;:::-;11002:119;11160:1;11185:53;11230:7;11221:6;11210:9;11206:22;11185:53;:::i;:::-;11175:63;;11131:117;11287:2;11313:52;11357:7;11348:6;11337:9;11333:22;11313:52;:::i;:::-;11303:62;;11258:117;10910:472;;;;;:::o;11388:307::-;11449:4;11539:18;11531:6;11528:30;11525:56;;;11561:18;;:::i;:::-;11525:56;11599:29;11621:6;11599:29;:::i;:::-;11591:37;;11683:4;11677;11673:15;11665:23;;11388:307;;;:::o;11701:423::-;11778:5;11803:65;11819:48;11860:6;11819:48;:::i;:::-;11803:65;:::i;:::-;11794:74;;11891:6;11884:5;11877:21;11929:4;11922:5;11918:16;11967:3;11958:6;11953:3;11949:16;11946:25;11943:112;;;11974:79;;:::i;:::-;11943:112;12064:54;12111:6;12106:3;12101;12064:54;:::i;:::-;11784:340;11701:423;;;;;:::o;12143:338::-;12198:5;12247:3;12240:4;12232:6;12228:17;12224:27;12214:122;;12255:79;;:::i;:::-;12214:122;12372:6;12359:20;12397:78;12471:3;12463:6;12456:4;12448:6;12444:17;12397:78;:::i;:::-;12388:87;;12204:277;12143:338;;;;:::o;12487:943::-;12582:6;12590;12598;12606;12655:3;12643:9;12634:7;12630:23;12626:33;12623:120;;;12662:79;;:::i;:::-;12623:120;12782:1;12807:53;12852:7;12843:6;12832:9;12828:22;12807:53;:::i;:::-;12797:63;;12753:117;12909:2;12935:53;12980:7;12971:6;12960:9;12956:22;12935:53;:::i;:::-;12925:63;;12880:118;13037:2;13063:53;13108:7;13099:6;13088:9;13084:22;13063:53;:::i;:::-;13053:63;;13008:118;13193:2;13182:9;13178:18;13165:32;13224:18;13216:6;13213:30;13210:117;;;13246:79;;:::i;:::-;13210:117;13351:62;13405:7;13396:6;13385:9;13381:22;13351:62;:::i;:::-;13341:72;;13136:287;12487:943;;;;;;;:::o;13436:509::-;13505:6;13554:2;13542:9;13533:7;13529:23;13525:32;13522:119;;;13560:79;;:::i;:::-;13522:119;13708:1;13697:9;13693:17;13680:31;13738:18;13730:6;13727:30;13724:117;;;13760:79;;:::i;:::-;13724:117;13865:63;13920:7;13911:6;13900:9;13896:22;13865:63;:::i;:::-;13855:73;;13651:287;13436:509;;;;:::o;13951:654::-;14029:6;14037;14086:2;14074:9;14065:7;14061:23;14057:32;14054:119;;;14092:79;;:::i;:::-;14054:119;14212:1;14237:53;14282:7;14273:6;14262:9;14258:22;14237:53;:::i;:::-;14227:63;;14183:117;14367:2;14356:9;14352:18;14339:32;14398:18;14390:6;14387:30;14384:117;;;14420:79;;:::i;:::-;14384:117;14525:63;14580:7;14571:6;14560:9;14556:22;14525:63;:::i;:::-;14515:73;;14310:288;13951:654;;;;;:::o;14611:474::-;14679:6;14687;14736:2;14724:9;14715:7;14711:23;14707:32;14704:119;;;14742:79;;:::i;:::-;14704:119;14862:1;14887:53;14932:7;14923:6;14912:9;14908:22;14887:53;:::i;:::-;14877:63;;14833:117;14989:2;15015:53;15060:7;15051:6;15040:9;15036:22;15015:53;:::i;:::-;15005:63;;14960:118;14611:474;;;;;:::o;15091:180::-;15139:77;15136:1;15129:88;15236:4;15233:1;15226:15;15260:4;15257:1;15250:15;15277:320;15321:6;15358:1;15352:4;15348:12;15338:22;;15405:1;15399:4;15395:12;15426:18;15416:81;;15482:4;15474:6;15470:17;15460:27;;15416:81;15544:2;15536:6;15533:14;15513:18;15510:38;15507:84;;15563:18;;:::i;:::-;15507:84;15328:269;15277:320;;;:::o;15603:442::-;15752:4;15790:2;15779:9;15775:18;15767:26;;15803:71;15871:1;15860:9;15856:17;15847:6;15803:71;:::i;:::-;15884:72;15952:2;15941:9;15937:18;15928:6;15884:72;:::i;:::-;15966;16034:2;16023:9;16019:18;16010:6;15966:72;:::i;:::-;15603:442;;;;;;:::o;16051:180::-;16099:77;16096:1;16089:88;16196:4;16193:1;16186:15;16220:4;16217:1;16210:15;16237:410;16277:7;16300:20;16318:1;16300:20;:::i;:::-;16295:25;;16334:20;16352:1;16334:20;:::i;:::-;16329:25;;16389:1;16386;16382:9;16411:30;16429:11;16411:30;:::i;:::-;16400:41;;16590:1;16581:7;16577:15;16574:1;16571:22;16551:1;16544:9;16524:83;16501:139;;16620:18;;:::i;:::-;16501:139;16285:362;16237:410;;;;:::o;16653:180::-;16701:77;16698:1;16691:88;16798:4;16795:1;16788:15;16822:4;16819:1;16812:15;16839:185;16879:1;16896:20;16914:1;16896:20;:::i;:::-;16891:25;;16930:20;16948:1;16930:20;:::i;:::-;16925:25;;16969:1;16959:35;;16974:18;;:::i;:::-;16959:35;17016:1;17013;17009:9;17004:14;;16839:185;;;;:::o;17030:177::-;17170:29;17166:1;17158:6;17154:14;17147:53;17030:177;:::o;17213:366::-;17355:3;17376:67;17440:2;17435:3;17376:67;:::i;:::-;17369:74;;17452:93;17541:3;17452:93;:::i;:::-;17570:2;17565:3;17561:12;17554:19;;17213:366;;;:::o;17585:419::-;17751:4;17789:2;17778:9;17774:18;17766:26;;17838:9;17832:4;17828:20;17824:1;17813:9;17809:17;17802:47;17866:131;17992:4;17866:131;:::i;:::-;17858:139;;17585:419;;;:::o;18010:141::-;18059:4;18082:3;18074:11;;18105:3;18102:1;18095:14;18139:4;18136:1;18126:18;18118:26;;18010:141;;;:::o;18157:93::-;18194:6;18241:2;18236;18229:5;18225:14;18221:23;18211:33;;18157:93;;;:::o;18256:107::-;18300:8;18350:5;18344:4;18340:16;18319:37;;18256:107;;;;:::o;18369:393::-;18438:6;18488:1;18476:10;18472:18;18511:97;18541:66;18530:9;18511:97;:::i;:::-;18629:39;18659:8;18648:9;18629:39;:::i;:::-;18617:51;;18701:4;18697:9;18690:5;18686:21;18677:30;;18750:4;18740:8;18736:19;18729:5;18726:30;18716:40;;18445:317;;18369:393;;;;;:::o;18768:60::-;18796:3;18817:5;18810:12;;18768:60;;;:::o;18834:142::-;18884:9;18917:53;18935:34;18944:24;18962:5;18944:24;:::i;:::-;18935:34;:::i;:::-;18917:53;:::i;:::-;18904:66;;18834:142;;;:::o;18982:75::-;19025:3;19046:5;19039:12;;18982:75;;;:::o;19063:269::-;19173:39;19204:7;19173:39;:::i;:::-;19234:91;19283:41;19307:16;19283:41;:::i;:::-;19275:6;19268:4;19262:11;19234:91;:::i;:::-;19228:4;19221:105;19139:193;19063:269;;;:::o;19338:73::-;19383:3;19338:73;:::o;19417:189::-;19494:32;;:::i;:::-;19535:65;19593:6;19585;19579:4;19535:65;:::i;:::-;19470:136;19417:189;;:::o;19612:186::-;19672:120;19689:3;19682:5;19679:14;19672:120;;;19743:39;19780:1;19773:5;19743:39;:::i;:::-;19716:1;19709:5;19705:13;19696:22;;19672:120;;;19612:186;;:::o;19804:543::-;19905:2;19900:3;19897:11;19894:446;;;19939:38;19971:5;19939:38;:::i;:::-;20023:29;20041:10;20023:29;:::i;:::-;20013:8;20009:44;20206:2;20194:10;20191:18;20188:49;;;20227:8;20212:23;;20188:49;20250:80;20306:22;20324:3;20306:22;:::i;:::-;20296:8;20292:37;20279:11;20250:80;:::i;:::-;19909:431;;19894:446;19804:543;;;:::o;20353:117::-;20407:8;20457:5;20451:4;20447:16;20426:37;;20353:117;;;;:::o;20476:169::-;20520:6;20553:51;20601:1;20597:6;20589:5;20586:1;20582:13;20553:51;:::i;:::-;20549:56;20634:4;20628;20624:15;20614:25;;20527:118;20476:169;;;;:::o;20650:295::-;20726:4;20872:29;20897:3;20891:4;20872:29;:::i;:::-;20864:37;;20934:3;20931:1;20927:11;20921:4;20918:21;20910:29;;20650:295;;;;:::o;20950:1395::-;21067:37;21100:3;21067:37;:::i;:::-;21169:18;21161:6;21158:30;21155:56;;;21191:18;;:::i;:::-;21155:56;21235:38;21267:4;21261:11;21235:38;:::i;:::-;21320:67;21380:6;21372;21366:4;21320:67;:::i;:::-;21414:1;21438:4;21425:17;;21470:2;21462:6;21459:14;21487:1;21482:618;;;;22144:1;22161:6;22158:77;;;22210:9;22205:3;22201:19;22195:26;22186:35;;22158:77;22261:67;22321:6;22314:5;22261:67;:::i;:::-;22255:4;22248:81;22117:222;21452:887;;21482:618;21534:4;21530:9;21522:6;21518:22;21568:37;21600:4;21568:37;:::i;:::-;21627:1;21641:208;21655:7;21652:1;21649:14;21641:208;;;21734:9;21729:3;21725:19;21719:26;21711:6;21704:42;21785:1;21777:6;21773:14;21763:24;;21832:2;21821:9;21817:18;21804:31;;21678:4;21675:1;21671:12;21666:17;;21641:208;;;21877:6;21868:7;21865:19;21862:179;;;21935:9;21930:3;21926:19;21920:26;21978:48;22020:4;22012:6;22008:17;21997:9;21978:48;:::i;:::-;21970:6;21963:64;21885:156;21862:179;22087:1;22083;22075:6;22071:14;22067:22;22061:4;22054:36;21489:611;;;21452:887;;21042:1303;;;20950:1395;;:::o;22351:166::-;22491:18;22487:1;22479:6;22475:14;22468:42;22351:166;:::o;22523:366::-;22665:3;22686:67;22750:2;22745:3;22686:67;:::i;:::-;22679:74;;22762:93;22851:3;22762:93;:::i;:::-;22880:2;22875:3;22871:12;22864:19;;22523:366;;;:::o;22895:419::-;23061:4;23099:2;23088:9;23084:18;23076:26;;23148:9;23142:4;23138:20;23134:1;23123:9;23119:17;23112:47;23176:131;23302:4;23176:131;:::i;:::-;23168:139;;22895:419;;;:::o;23320:233::-;23359:3;23382:24;23400:5;23382:24;:::i;:::-;23373:33;;23428:66;23421:5;23418:77;23415:103;;23498:18;;:::i;:::-;23415:103;23545:1;23538:5;23534:13;23527:20;;23320:233;;;:::o;23559:98::-;23610:6;23644:5;23638:12;23628:22;;23559:98;;;:::o;23663:168::-;23746:11;23780:6;23775:3;23768:19;23820:4;23815:3;23811:14;23796:29;;23663:168;;;;:::o;23837:373::-;23923:3;23951:38;23983:5;23951:38;:::i;:::-;24005:70;24068:6;24063:3;24005:70;:::i;:::-;23998:77;;24084:65;24142:6;24137:3;24130:4;24123:5;24119:16;24084:65;:::i;:::-;24174:29;24196:6;24174:29;:::i;:::-;24169:3;24165:39;24158:46;;23927:283;23837:373;;;;:::o;24216:640::-;24411:4;24449:3;24438:9;24434:19;24426:27;;24463:71;24531:1;24520:9;24516:17;24507:6;24463:71;:::i;:::-;24544:72;24612:2;24601:9;24597:18;24588:6;24544:72;:::i;:::-;24626;24694:2;24683:9;24679:18;24670:6;24626:72;:::i;:::-;24745:9;24739:4;24735:20;24730:2;24719:9;24715:18;24708:48;24773:76;24844:4;24835:6;24773:76;:::i;:::-;24765:84;;24216:640;;;;;;;:::o;24862:141::-;24918:5;24949:6;24943:13;24934:22;;24965:32;24991:5;24965:32;:::i;:::-;24862:141;;;;:::o;25009:349::-;25078:6;25127:2;25115:9;25106:7;25102:23;25098:32;25095:119;;;25133:79;;:::i;:::-;25095:119;25253:1;25278:63;25333:7;25324:6;25313:9;25309:22;25278:63;:::i;:::-;25268:73;;25224:127;25009:349;;;;:::o;25364:148::-;25466:11;25503:3;25488:18;;25364:148;;;;:::o;25518:390::-;25624:3;25652:39;25685:5;25652:39;:::i;:::-;25707:89;25789:6;25784:3;25707:89;:::i;:::-;25700:96;;25805:65;25863:6;25858:3;25851:4;25844:5;25840:16;25805:65;:::i;:::-;25895:6;25890:3;25886:16;25879:23;;25628:280;25518:390;;;;:::o;25914:435::-;26094:3;26116:95;26207:3;26198:6;26116:95;:::i;:::-;26109:102;;26228:95;26319:3;26310:6;26228:95;:::i;:::-;26221:102;;26340:3;26333:10;;25914:435;;;;;:::o

Swarm Source

ipfs://3101dad605e0eea3b3ceb2492a47b4f9bc480cf98072d00461c56663d64fa454
[ 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.