ETH Price: $3,532.81 (+4.30%)

Aotu 3D NFT (AotuNFT3D)
 

Overview

TokenID

454

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
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
aotunft3d

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-01-29
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}

/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}
contract aotunft3d is Ownable, ERC721Enumerable, DefaultOperatorFilterer {
    using Address for address payable;
    using Strings for uint256;
    using Counters for Counters.Counter;

    constructor() ERC721("Aotu 3D NFT", "AotuNFT3D") {}
    string internal baseURI;
    Counters.Counter private _tokenIdCounter;

    string private _blindTokenURI =
        "ipfs://QmYGdAx7kBe3uqrF1Ut9LYm6DzZJsdNjYTufznvC3tRZTU";

    uint256 constant internal _maxSupply = 888;

    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

    function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) {
        super.approve(operator, tokenId);
    }

    function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }


    /// Get the number of tokens still available for minting
    function availableSupply() public view returns (uint256) {
        return
            _maxSupply -
            totalSupply();
    }

    function reserveOwn() public onlyOwner {
        require(totalSupply() + 111 <= _maxSupply, "Mint would exceed max supply");   
        uint i;
        for (i = 0; i < 111; i++) { 
            _tokenIdCounter.increment();
            _safeMint(msg.sender, _tokenIdCounter.current());
        }
    }

    function setTokenURI(string memory _URI) external onlyOwner {
        baseURI = _URI;
    }

    /// Get the token metadata URI
    function tokenURI(uint256 tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(_exists(tokenId), "Token does not exist");
            return
                bytes(baseURI).length > 0
                ? string(
                    abi.encodePacked(baseURI, tokenId.toString(),".json")
                )
                : _blindTokenURI;
    }


    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        override(ERC721Enumerable)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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":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":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"availableSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"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":[],"name":"reserveOwn","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":"string","name":"_URI","type":"string"}],"name":"setTokenURI","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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"}]

60806040526040518060600160405280603581526020016200408360359139600d908051906020019062000035929190620003e4565b503480156200004357600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600b81526020017f416f7475203344204e46540000000000000000000000000000000000000000008152506040518060400160405280600981526020017f416f74754e465433440000000000000000000000000000000000000000000000815250620000e7620000db6200031860201b60201c565b6200032060201b60201c565b8160019080519060200190620000ff929190620003e4565b50806002908051906020019062000118929190620003e4565b50505060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111562000310578015620001d6576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200019c929190620004c2565b600060405180830381600087803b158015620001b757600080fd5b505af1158015620001cc573d6000803e3d6000fd5b505050506200030f565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000290576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b815260040162000256929190620004c2565b600060405180830381600087803b1580156200027157600080fd5b505af115801562000286573d6000803e3d6000fd5b505050506200030e565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620002d99190620004a5565b600060405180830381600087803b158015620002f457600080fd5b505af115801562000309573d6000803e3d6000fd5b505050505b5b5b505062000588565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620003f29062000523565b90600052602060002090601f01602090048101928262000416576000855562000462565b82601f106200043157805160ff191683800117855562000462565b8280016001018555821562000462579182015b828111156200046157825182559160200191906001019062000444565b5b50905062000471919062000475565b5090565b5b808211156200049057600081600090555060010162000476565b5090565b6200049f81620004ef565b82525050565b6000602082019050620004bc600083018462000494565b92915050565b6000604082019050620004d9600083018562000494565b620004e8602083018462000494565b9392505050565b6000620004fc8262000503565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200053c57607f821691505b6020821081141562000553576200055262000559565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613aeb80620005986000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80636352211e116100c3578063a22cb4651161007c578063a22cb4651461038e578063b88d4fde146103aa578063c87b56dd146103c6578063e0df5b6f146103f6578063e985e9c514610412578063f2fde38b146104425761014d565b80636352211e146102ca57806370a08231146102fa578063715018a61461032a5780637ecc2b56146103345780638da5cb5b1461035257806395d89b41146103705761014d565b806323b872dd1161011557806323b872dd1461020a5780632f745c591461022657806341f434341461025657806342842e0e14610274578063439894e4146102905780634f6ccce71461029a5761014d565b806301ffc9a71461015257806306fdde0314610182578063081812fc146101a0578063095ea7b3146101d057806318160ddd146101ec575b600080fd5b61016c60048036038101906101679190612819565b61045e565b6040516101799190612dc2565b60405180910390f35b61018a610470565b6040516101979190612df8565b60405180910390f35b6101ba60048036038101906101b591906128bc565b610502565b6040516101c79190612d32565b60405180910390f35b6101ea60048036038101906101e591906127ac565b610587565b005b6101f46105a0565b604051610201919061307a565b60405180910390f35b610224600480360381019061021f9190612696565b6105ad565b005b610240600480360381019061023b91906127ac565b6105fc565b60405161024d919061307a565b60405180910390f35b61025e6106a1565b60405161026b9190612ddd565b60405180910390f35b61028e60048036038101906102899190612696565b6106b3565b005b610298610702565b005b6102b460048036038101906102af91906128bc565b610815565b6040516102c1919061307a565b60405180910390f35b6102e460048036038101906102df91906128bc565b610886565b6040516102f19190612d32565b60405180910390f35b610314600480360381019061030f9190612629565b610938565b604051610321919061307a565b60405180910390f35b6103326109f0565b005b61033c610a78565b604051610349919061307a565b60405180910390f35b61035a610a94565b6040516103679190612d32565b60405180910390f35b610378610abd565b6040516103859190612df8565b60405180910390f35b6103a860048036038101906103a3919061276c565b610b4f565b005b6103c460048036038101906103bf91906126e9565b610b68565b005b6103e060048036038101906103db91906128bc565b610bca565b6040516103ed9190612df8565b60405180910390f35b610410600480360381019061040b9190612873565b610ced565b005b61042c60048036038101906104279190612656565b610d83565b6040516104399190612dc2565b60405180910390f35b61045c60048036038101906104579190612629565b610e17565b005b600061046982610f0f565b9050919050565b60606001805461047f9061331b565b80601f01602080910402602001604051908101604052809291908181526020018280546104ab9061331b565b80156104f85780601f106104cd576101008083540402835291602001916104f8565b820191906000526020600020905b8154815290600101906020018083116104db57829003601f168201915b5050505050905090565b600061050d82610f89565b61054c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161054390612fba565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8161059181610ff5565b61059b8383611101565b505050565b6000600980549050905090565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146105eb576105ea33610ff5565b5b6105f6848484611219565b50505050565b600061060783610938565b8210610648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063f90612e3a565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146106f1576106f033610ff5565b5b6106fc848484611279565b50505050565b61070a611299565b73ffffffffffffffffffffffffffffffffffffffff16610728610a94565b73ffffffffffffffffffffffffffffffffffffffff161461077e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077590612fda565b60405180910390fd5b610378606f61078b6105a0565b6107959190613174565b11156107d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107cd90612e1a565b60405180910390fd5b60005b606f811015610812576107ec600c6112a1565b6107ff336107fa600c6112b7565b6112c5565b808061080a9061337e565b9150506107d9565b50565b600061081f6105a0565b8210610860576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108579061305a565b60405180910390fd5b60098281548110610874576108736134b4565b5b90600052602060002001549050919050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561092f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092690612f7a565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156109a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a090612f5a565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6109f8611299565b73ffffffffffffffffffffffffffffffffffffffff16610a16610a94565b73ffffffffffffffffffffffffffffffffffffffff1614610a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6390612fda565b60405180910390fd5b610a7660006112e3565b565b6000610a826105a0565b610378610a8f91906131fb565b905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054610acc9061331b565b80601f0160208091040260200160405190810160405280929190818152602001828054610af89061331b565b8015610b455780601f10610b1a57610100808354040283529160200191610b45565b820191906000526020600020905b815481529060010190602001808311610b2857829003601f168201915b5050505050905090565b81610b5981610ff5565b610b6383836113a7565b505050565b610b79610b73611299565b836113bd565b610bb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610baf9061303a565b60405180910390fd5b610bc48484848461149b565b50505050565b6060610bd582610f89565b610c14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0b90612efa565b60405180910390fd5b6000600b8054610c239061331b565b905011610cba57600d8054610c379061331b565b80601f0160208091040260200160405190810160405280929190818152602001828054610c639061331b565b8015610cb05780601f10610c8557610100808354040283529160200191610cb0565b820191906000526020600020905b815481529060010190602001808311610c9357829003601f168201915b5050505050610ce6565b600b610cc5836114f7565b604051602001610cd6929190612d03565b6040516020818303038152906040525b9050919050565b610cf5611299565b73ffffffffffffffffffffffffffffffffffffffff16610d13610a94565b73ffffffffffffffffffffffffffffffffffffffff1614610d69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6090612fda565b60405180910390fd5b80600b9080519060200190610d7f929190612428565b5050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610e1f611299565b73ffffffffffffffffffffffffffffffffffffffff16610e3d610a94565b73ffffffffffffffffffffffffffffffffffffffff1614610e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8a90612fda565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efa90612e7a565b60405180910390fd5b610f0c816112e3565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610f825750610f8182611658565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156110fe576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b815260040161106c929190612d4d565b60206040518083038186803b15801561108457600080fd5b505afa158015611098573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110bc91906127ec565b6110fd57806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016110f49190612d32565b60405180910390fd5b5b50565b600061110c82610886565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561117d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111749061301a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661119c611299565b73ffffffffffffffffffffffffffffffffffffffff1614806111cb57506111ca816111c5611299565b610d83565b5b61120a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120190612f3a565b60405180910390fd5b611214838361173a565b505050565b61122a611224611299565b826113bd565b611269576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112609061303a565b60405180910390fd5b6112748383836117f3565b505050565b61129483838360405180602001604052806000815250610b68565b505050565b600033905090565b6001816000016000828254019250508190555050565b600081600001549050919050565b6112df828260405180602001604052806000815250611a4f565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6113b96113b2611299565b8383611aaa565b5050565b60006113c882610f89565b611407576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fe90612f1a565b60405180910390fd5b600061141283610886565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061148157508373ffffffffffffffffffffffffffffffffffffffff1661146984610502565b73ffffffffffffffffffffffffffffffffffffffff16145b8061149257506114918185610d83565b5b91505092915050565b6114a68484846117f3565b6114b284848484611c17565b6114f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e890612e5a565b60405180910390fd5b50505050565b6060600082141561153f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611653565b600082905060005b6000821461157157808061155a9061337e565b915050600a8261156a91906131ca565b9150611547565b60008167ffffffffffffffff81111561158d5761158c6134e3565b5b6040519080825280601f01601f1916602001820160405280156115bf5781602001600182028036833780820191505090505b5090505b6000851461164c576001826115d891906131fb565b9150600a856115e791906133c7565b60306115f39190613174565b60f81b818381518110611609576116086134b4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561164591906131ca565b94506115c3565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061172357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611733575061173282611dae565b5b9050919050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166117ad83610886565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b8273ffffffffffffffffffffffffffffffffffffffff1661181382610886565b73ffffffffffffffffffffffffffffffffffffffff1614611869576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186090612ffa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d090612eba565b60405180910390fd5b6118e4838383611e18565b6118ef60008261173a565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461193f91906131fb565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119969190613174565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611a598383611e28565b611a666000848484611c17565b611aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9c90612e5a565b60405180910390fd5b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1090612eda565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c0a9190612dc2565b60405180910390a3505050565b6000611c388473ffffffffffffffffffffffffffffffffffffffff16611ff6565b15611da1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611c61611299565b8786866040518563ffffffff1660e01b8152600401611c839493929190612d76565b602060405180830381600087803b158015611c9d57600080fd5b505af1925050508015611cce57506040513d601f19601f82011682018060405250810190611ccb9190612846565b60015b611d51573d8060008114611cfe576040519150601f19603f3d011682016040523d82523d6000602084013e611d03565b606091505b50600081511415611d49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4090612e5a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611da6565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611e23838383612009565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8f90612f9a565b60405180910390fd5b611ea181610f89565b15611ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed890612e9a565b60405180910390fd5b611eed60008383611e18565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f3d9190613174565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b61201483838361211d565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156120575761205281612122565b612096565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461209557612094838261216b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120d9576120d4816122d8565b612118565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146121175761211682826123a9565b5b5b505050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161217884610938565b61218291906131fb565b9050600060086000848152602001908152602001600020549050818114612267576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506122ec91906131fb565b90506000600a600084815260200190815260200160002054905060006009838154811061231c5761231b6134b4565b5b90600052602060002001549050806009838154811061233e5761233d6134b4565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548061238d5761238c613485565b5b6001900381819060005260206000200160009055905550505050565b60006123b483610938565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b8280546124349061331b565b90600052602060002090601f016020900481019282612456576000855561249d565b82601f1061246f57805160ff191683800117855561249d565b8280016001018555821561249d579182015b8281111561249c578251825591602001919060010190612481565b5b5090506124aa91906124ae565b5090565b5b808211156124c75760008160009055506001016124af565b5090565b60006124de6124d9846130ba565b613095565b9050828152602081018484840111156124fa576124f9613517565b5b6125058482856132d9565b509392505050565b600061252061251b846130eb565b613095565b90508281526020810184848401111561253c5761253b613517565b5b6125478482856132d9565b509392505050565b60008135905061255e81613a59565b92915050565b60008135905061257381613a70565b92915050565b60008151905061258881613a70565b92915050565b60008135905061259d81613a87565b92915050565b6000815190506125b281613a87565b92915050565b600082601f8301126125cd576125cc613512565b5b81356125dd8482602086016124cb565b91505092915050565b600082601f8301126125fb576125fa613512565b5b813561260b84826020860161250d565b91505092915050565b60008135905061262381613a9e565b92915050565b60006020828403121561263f5761263e613521565b5b600061264d8482850161254f565b91505092915050565b6000806040838503121561266d5761266c613521565b5b600061267b8582860161254f565b925050602061268c8582860161254f565b9150509250929050565b6000806000606084860312156126af576126ae613521565b5b60006126bd8682870161254f565b93505060206126ce8682870161254f565b92505060406126df86828701612614565b9150509250925092565b6000806000806080858703121561270357612702613521565b5b60006127118782880161254f565b94505060206127228782880161254f565b935050604061273387828801612614565b925050606085013567ffffffffffffffff8111156127545761275361351c565b5b612760878288016125b8565b91505092959194509250565b6000806040838503121561278357612782613521565b5b60006127918582860161254f565b92505060206127a285828601612564565b9150509250929050565b600080604083850312156127c3576127c2613521565b5b60006127d18582860161254f565b92505060206127e285828601612614565b9150509250929050565b60006020828403121561280257612801613521565b5b600061281084828501612579565b91505092915050565b60006020828403121561282f5761282e613521565b5b600061283d8482850161258e565b91505092915050565b60006020828403121561285c5761285b613521565b5b600061286a848285016125a3565b91505092915050565b60006020828403121561288957612888613521565b5b600082013567ffffffffffffffff8111156128a7576128a661351c565b5b6128b3848285016125e6565b91505092915050565b6000602082840312156128d2576128d1613521565b5b60006128e084828501612614565b91505092915050565b6128f28161322f565b82525050565b61290181613241565b82525050565b600061291282613131565b61291c8185613147565b935061292c8185602086016132e8565b61293581613526565b840191505092915050565b612949816132a3565b82525050565b600061295a8261313c565b6129648185613158565b93506129748185602086016132e8565b61297d81613526565b840191505092915050565b60006129938261313c565b61299d8185613169565b93506129ad8185602086016132e8565b80840191505092915050565b600081546129c68161331b565b6129d08186613169565b945060018216600081146129eb57600181146129fc57612a2f565b60ff19831686528186019350612a2f565b612a058561311c565b60005b83811015612a2757815481890152600182019150602081019050612a08565b838801955050505b50505092915050565b6000612a45601c83613158565b9150612a5082613537565b602082019050919050565b6000612a68602b83613158565b9150612a7382613560565b604082019050919050565b6000612a8b603283613158565b9150612a96826135af565b604082019050919050565b6000612aae602683613158565b9150612ab9826135fe565b604082019050919050565b6000612ad1601c83613158565b9150612adc8261364d565b602082019050919050565b6000612af4602483613158565b9150612aff82613676565b604082019050919050565b6000612b17601983613158565b9150612b22826136c5565b602082019050919050565b6000612b3a601483613158565b9150612b45826136ee565b602082019050919050565b6000612b5d602c83613158565b9150612b6882613717565b604082019050919050565b6000612b80603883613158565b9150612b8b82613766565b604082019050919050565b6000612ba3602a83613158565b9150612bae826137b5565b604082019050919050565b6000612bc6602983613158565b9150612bd182613804565b604082019050919050565b6000612be9602083613158565b9150612bf482613853565b602082019050919050565b6000612c0c602c83613158565b9150612c178261387c565b604082019050919050565b6000612c2f600583613169565b9150612c3a826138cb565b600582019050919050565b6000612c52602083613158565b9150612c5d826138f4565b602082019050919050565b6000612c75602983613158565b9150612c808261391d565b604082019050919050565b6000612c98602183613158565b9150612ca38261396c565b604082019050919050565b6000612cbb603183613158565b9150612cc6826139bb565b604082019050919050565b6000612cde602c83613158565b9150612ce982613a0a565b604082019050919050565b612cfd81613299565b82525050565b6000612d0f82856129b9565b9150612d1b8284612988565b9150612d2682612c22565b91508190509392505050565b6000602082019050612d4760008301846128e9565b92915050565b6000604082019050612d6260008301856128e9565b612d6f60208301846128e9565b9392505050565b6000608082019050612d8b60008301876128e9565b612d9860208301866128e9565b612da56040830185612cf4565b8181036060830152612db78184612907565b905095945050505050565b6000602082019050612dd760008301846128f8565b92915050565b6000602082019050612df26000830184612940565b92915050565b60006020820190508181036000830152612e12818461294f565b905092915050565b60006020820190508181036000830152612e3381612a38565b9050919050565b60006020820190508181036000830152612e5381612a5b565b9050919050565b60006020820190508181036000830152612e7381612a7e565b9050919050565b60006020820190508181036000830152612e9381612aa1565b9050919050565b60006020820190508181036000830152612eb381612ac4565b9050919050565b60006020820190508181036000830152612ed381612ae7565b9050919050565b60006020820190508181036000830152612ef381612b0a565b9050919050565b60006020820190508181036000830152612f1381612b2d565b9050919050565b60006020820190508181036000830152612f3381612b50565b9050919050565b60006020820190508181036000830152612f5381612b73565b9050919050565b60006020820190508181036000830152612f7381612b96565b9050919050565b60006020820190508181036000830152612f9381612bb9565b9050919050565b60006020820190508181036000830152612fb381612bdc565b9050919050565b60006020820190508181036000830152612fd381612bff565b9050919050565b60006020820190508181036000830152612ff381612c45565b9050919050565b6000602082019050818103600083015261301381612c68565b9050919050565b6000602082019050818103600083015261303381612c8b565b9050919050565b6000602082019050818103600083015261305381612cae565b9050919050565b6000602082019050818103600083015261307381612cd1565b9050919050565b600060208201905061308f6000830184612cf4565b92915050565b600061309f6130b0565b90506130ab828261334d565b919050565b6000604051905090565b600067ffffffffffffffff8211156130d5576130d46134e3565b5b6130de82613526565b9050602081019050919050565b600067ffffffffffffffff821115613106576131056134e3565b5b61310f82613526565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061317f82613299565b915061318a83613299565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156131bf576131be6133f8565b5b828201905092915050565b60006131d582613299565b91506131e083613299565b9250826131f0576131ef613427565b5b828204905092915050565b600061320682613299565b915061321183613299565b925082821015613224576132236133f8565b5b828203905092915050565b600061323a82613279565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006132ae826132b5565b9050919050565b60006132c0826132c7565b9050919050565b60006132d282613279565b9050919050565b82818337600083830152505050565b60005b838110156133065780820151818401526020810190506132eb565b83811115613315576000848401525b50505050565b6000600282049050600182168061333357607f821691505b6020821081141561334757613346613456565b5b50919050565b61335682613526565b810181811067ffffffffffffffff82111715613375576133746134e3565b5b80604052505050565b600061338982613299565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156133bc576133bb6133f8565b5b600182019050919050565b60006133d282613299565b91506133dd83613299565b9250826133ed576133ec613427565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d696e7420776f756c6420657863656564206d617820737570706c7900000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b613a628161322f565b8114613a6d57600080fd5b50565b613a7981613241565b8114613a8457600080fd5b50565b613a908161324d565b8114613a9b57600080fd5b50565b613aa781613299565b8114613ab257600080fd5b5056fea2646970667358221220a0bd8fa7b8359c3b90e286987334502db01ff7139c06e058c5a33a9b38ee9d3b64736f6c63430008070033697066733a2f2f516d5947644178376b42653375717246315574394c596d36447a5a4a73644e6a595475667a6e76433374525a5455

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061014d5760003560e01c80636352211e116100c3578063a22cb4651161007c578063a22cb4651461038e578063b88d4fde146103aa578063c87b56dd146103c6578063e0df5b6f146103f6578063e985e9c514610412578063f2fde38b146104425761014d565b80636352211e146102ca57806370a08231146102fa578063715018a61461032a5780637ecc2b56146103345780638da5cb5b1461035257806395d89b41146103705761014d565b806323b872dd1161011557806323b872dd1461020a5780632f745c591461022657806341f434341461025657806342842e0e14610274578063439894e4146102905780634f6ccce71461029a5761014d565b806301ffc9a71461015257806306fdde0314610182578063081812fc146101a0578063095ea7b3146101d057806318160ddd146101ec575b600080fd5b61016c60048036038101906101679190612819565b61045e565b6040516101799190612dc2565b60405180910390f35b61018a610470565b6040516101979190612df8565b60405180910390f35b6101ba60048036038101906101b591906128bc565b610502565b6040516101c79190612d32565b60405180910390f35b6101ea60048036038101906101e591906127ac565b610587565b005b6101f46105a0565b604051610201919061307a565b60405180910390f35b610224600480360381019061021f9190612696565b6105ad565b005b610240600480360381019061023b91906127ac565b6105fc565b60405161024d919061307a565b60405180910390f35b61025e6106a1565b60405161026b9190612ddd565b60405180910390f35b61028e60048036038101906102899190612696565b6106b3565b005b610298610702565b005b6102b460048036038101906102af91906128bc565b610815565b6040516102c1919061307a565b60405180910390f35b6102e460048036038101906102df91906128bc565b610886565b6040516102f19190612d32565b60405180910390f35b610314600480360381019061030f9190612629565b610938565b604051610321919061307a565b60405180910390f35b6103326109f0565b005b61033c610a78565b604051610349919061307a565b60405180910390f35b61035a610a94565b6040516103679190612d32565b60405180910390f35b610378610abd565b6040516103859190612df8565b60405180910390f35b6103a860048036038101906103a3919061276c565b610b4f565b005b6103c460048036038101906103bf91906126e9565b610b68565b005b6103e060048036038101906103db91906128bc565b610bca565b6040516103ed9190612df8565b60405180910390f35b610410600480360381019061040b9190612873565b610ced565b005b61042c60048036038101906104279190612656565b610d83565b6040516104399190612dc2565b60405180910390f35b61045c60048036038101906104579190612629565b610e17565b005b600061046982610f0f565b9050919050565b60606001805461047f9061331b565b80601f01602080910402602001604051908101604052809291908181526020018280546104ab9061331b565b80156104f85780601f106104cd576101008083540402835291602001916104f8565b820191906000526020600020905b8154815290600101906020018083116104db57829003601f168201915b5050505050905090565b600061050d82610f89565b61054c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161054390612fba565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8161059181610ff5565b61059b8383611101565b505050565b6000600980549050905090565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146105eb576105ea33610ff5565b5b6105f6848484611219565b50505050565b600061060783610938565b8210610648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063f90612e3a565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146106f1576106f033610ff5565b5b6106fc848484611279565b50505050565b61070a611299565b73ffffffffffffffffffffffffffffffffffffffff16610728610a94565b73ffffffffffffffffffffffffffffffffffffffff161461077e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077590612fda565b60405180910390fd5b610378606f61078b6105a0565b6107959190613174565b11156107d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107cd90612e1a565b60405180910390fd5b60005b606f811015610812576107ec600c6112a1565b6107ff336107fa600c6112b7565b6112c5565b808061080a9061337e565b9150506107d9565b50565b600061081f6105a0565b8210610860576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108579061305a565b60405180910390fd5b60098281548110610874576108736134b4565b5b90600052602060002001549050919050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561092f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092690612f7a565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156109a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a090612f5a565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6109f8611299565b73ffffffffffffffffffffffffffffffffffffffff16610a16610a94565b73ffffffffffffffffffffffffffffffffffffffff1614610a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6390612fda565b60405180910390fd5b610a7660006112e3565b565b6000610a826105a0565b610378610a8f91906131fb565b905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054610acc9061331b565b80601f0160208091040260200160405190810160405280929190818152602001828054610af89061331b565b8015610b455780601f10610b1a57610100808354040283529160200191610b45565b820191906000526020600020905b815481529060010190602001808311610b2857829003601f168201915b5050505050905090565b81610b5981610ff5565b610b6383836113a7565b505050565b610b79610b73611299565b836113bd565b610bb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610baf9061303a565b60405180910390fd5b610bc48484848461149b565b50505050565b6060610bd582610f89565b610c14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0b90612efa565b60405180910390fd5b6000600b8054610c239061331b565b905011610cba57600d8054610c379061331b565b80601f0160208091040260200160405190810160405280929190818152602001828054610c639061331b565b8015610cb05780601f10610c8557610100808354040283529160200191610cb0565b820191906000526020600020905b815481529060010190602001808311610c9357829003601f168201915b5050505050610ce6565b600b610cc5836114f7565b604051602001610cd6929190612d03565b6040516020818303038152906040525b9050919050565b610cf5611299565b73ffffffffffffffffffffffffffffffffffffffff16610d13610a94565b73ffffffffffffffffffffffffffffffffffffffff1614610d69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6090612fda565b60405180910390fd5b80600b9080519060200190610d7f929190612428565b5050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610e1f611299565b73ffffffffffffffffffffffffffffffffffffffff16610e3d610a94565b73ffffffffffffffffffffffffffffffffffffffff1614610e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8a90612fda565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efa90612e7a565b60405180910390fd5b610f0c816112e3565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610f825750610f8182611658565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156110fe576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b815260040161106c929190612d4d565b60206040518083038186803b15801561108457600080fd5b505afa158015611098573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110bc91906127ec565b6110fd57806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016110f49190612d32565b60405180910390fd5b5b50565b600061110c82610886565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561117d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111749061301a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661119c611299565b73ffffffffffffffffffffffffffffffffffffffff1614806111cb57506111ca816111c5611299565b610d83565b5b61120a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120190612f3a565b60405180910390fd5b611214838361173a565b505050565b61122a611224611299565b826113bd565b611269576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112609061303a565b60405180910390fd5b6112748383836117f3565b505050565b61129483838360405180602001604052806000815250610b68565b505050565b600033905090565b6001816000016000828254019250508190555050565b600081600001549050919050565b6112df828260405180602001604052806000815250611a4f565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6113b96113b2611299565b8383611aaa565b5050565b60006113c882610f89565b611407576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fe90612f1a565b60405180910390fd5b600061141283610886565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061148157508373ffffffffffffffffffffffffffffffffffffffff1661146984610502565b73ffffffffffffffffffffffffffffffffffffffff16145b8061149257506114918185610d83565b5b91505092915050565b6114a68484846117f3565b6114b284848484611c17565b6114f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e890612e5a565b60405180910390fd5b50505050565b6060600082141561153f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611653565b600082905060005b6000821461157157808061155a9061337e565b915050600a8261156a91906131ca565b9150611547565b60008167ffffffffffffffff81111561158d5761158c6134e3565b5b6040519080825280601f01601f1916602001820160405280156115bf5781602001600182028036833780820191505090505b5090505b6000851461164c576001826115d891906131fb565b9150600a856115e791906133c7565b60306115f39190613174565b60f81b818381518110611609576116086134b4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561164591906131ca565b94506115c3565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061172357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611733575061173282611dae565b5b9050919050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166117ad83610886565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b8273ffffffffffffffffffffffffffffffffffffffff1661181382610886565b73ffffffffffffffffffffffffffffffffffffffff1614611869576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186090612ffa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d090612eba565b60405180910390fd5b6118e4838383611e18565b6118ef60008261173a565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461193f91906131fb565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119969190613174565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611a598383611e28565b611a666000848484611c17565b611aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9c90612e5a565b60405180910390fd5b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1090612eda565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c0a9190612dc2565b60405180910390a3505050565b6000611c388473ffffffffffffffffffffffffffffffffffffffff16611ff6565b15611da1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611c61611299565b8786866040518563ffffffff1660e01b8152600401611c839493929190612d76565b602060405180830381600087803b158015611c9d57600080fd5b505af1925050508015611cce57506040513d601f19601f82011682018060405250810190611ccb9190612846565b60015b611d51573d8060008114611cfe576040519150601f19603f3d011682016040523d82523d6000602084013e611d03565b606091505b50600081511415611d49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4090612e5a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611da6565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611e23838383612009565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8f90612f9a565b60405180910390fd5b611ea181610f89565b15611ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed890612e9a565b60405180910390fd5b611eed60008383611e18565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f3d9190613174565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b61201483838361211d565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156120575761205281612122565b612096565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461209557612094838261216b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120d9576120d4816122d8565b612118565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146121175761211682826123a9565b5b5b505050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161217884610938565b61218291906131fb565b9050600060086000848152602001908152602001600020549050818114612267576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506122ec91906131fb565b90506000600a600084815260200190815260200160002054905060006009838154811061231c5761231b6134b4565b5b90600052602060002001549050806009838154811061233e5761233d6134b4565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548061238d5761238c613485565b5b6001900381819060005260206000200160009055905550505050565b60006123b483610938565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b8280546124349061331b565b90600052602060002090601f016020900481019282612456576000855561249d565b82601f1061246f57805160ff191683800117855561249d565b8280016001018555821561249d579182015b8281111561249c578251825591602001919060010190612481565b5b5090506124aa91906124ae565b5090565b5b808211156124c75760008160009055506001016124af565b5090565b60006124de6124d9846130ba565b613095565b9050828152602081018484840111156124fa576124f9613517565b5b6125058482856132d9565b509392505050565b600061252061251b846130eb565b613095565b90508281526020810184848401111561253c5761253b613517565b5b6125478482856132d9565b509392505050565b60008135905061255e81613a59565b92915050565b60008135905061257381613a70565b92915050565b60008151905061258881613a70565b92915050565b60008135905061259d81613a87565b92915050565b6000815190506125b281613a87565b92915050565b600082601f8301126125cd576125cc613512565b5b81356125dd8482602086016124cb565b91505092915050565b600082601f8301126125fb576125fa613512565b5b813561260b84826020860161250d565b91505092915050565b60008135905061262381613a9e565b92915050565b60006020828403121561263f5761263e613521565b5b600061264d8482850161254f565b91505092915050565b6000806040838503121561266d5761266c613521565b5b600061267b8582860161254f565b925050602061268c8582860161254f565b9150509250929050565b6000806000606084860312156126af576126ae613521565b5b60006126bd8682870161254f565b93505060206126ce8682870161254f565b92505060406126df86828701612614565b9150509250925092565b6000806000806080858703121561270357612702613521565b5b60006127118782880161254f565b94505060206127228782880161254f565b935050604061273387828801612614565b925050606085013567ffffffffffffffff8111156127545761275361351c565b5b612760878288016125b8565b91505092959194509250565b6000806040838503121561278357612782613521565b5b60006127918582860161254f565b92505060206127a285828601612564565b9150509250929050565b600080604083850312156127c3576127c2613521565b5b60006127d18582860161254f565b92505060206127e285828601612614565b9150509250929050565b60006020828403121561280257612801613521565b5b600061281084828501612579565b91505092915050565b60006020828403121561282f5761282e613521565b5b600061283d8482850161258e565b91505092915050565b60006020828403121561285c5761285b613521565b5b600061286a848285016125a3565b91505092915050565b60006020828403121561288957612888613521565b5b600082013567ffffffffffffffff8111156128a7576128a661351c565b5b6128b3848285016125e6565b91505092915050565b6000602082840312156128d2576128d1613521565b5b60006128e084828501612614565b91505092915050565b6128f28161322f565b82525050565b61290181613241565b82525050565b600061291282613131565b61291c8185613147565b935061292c8185602086016132e8565b61293581613526565b840191505092915050565b612949816132a3565b82525050565b600061295a8261313c565b6129648185613158565b93506129748185602086016132e8565b61297d81613526565b840191505092915050565b60006129938261313c565b61299d8185613169565b93506129ad8185602086016132e8565b80840191505092915050565b600081546129c68161331b565b6129d08186613169565b945060018216600081146129eb57600181146129fc57612a2f565b60ff19831686528186019350612a2f565b612a058561311c565b60005b83811015612a2757815481890152600182019150602081019050612a08565b838801955050505b50505092915050565b6000612a45601c83613158565b9150612a5082613537565b602082019050919050565b6000612a68602b83613158565b9150612a7382613560565b604082019050919050565b6000612a8b603283613158565b9150612a96826135af565b604082019050919050565b6000612aae602683613158565b9150612ab9826135fe565b604082019050919050565b6000612ad1601c83613158565b9150612adc8261364d565b602082019050919050565b6000612af4602483613158565b9150612aff82613676565b604082019050919050565b6000612b17601983613158565b9150612b22826136c5565b602082019050919050565b6000612b3a601483613158565b9150612b45826136ee565b602082019050919050565b6000612b5d602c83613158565b9150612b6882613717565b604082019050919050565b6000612b80603883613158565b9150612b8b82613766565b604082019050919050565b6000612ba3602a83613158565b9150612bae826137b5565b604082019050919050565b6000612bc6602983613158565b9150612bd182613804565b604082019050919050565b6000612be9602083613158565b9150612bf482613853565b602082019050919050565b6000612c0c602c83613158565b9150612c178261387c565b604082019050919050565b6000612c2f600583613169565b9150612c3a826138cb565b600582019050919050565b6000612c52602083613158565b9150612c5d826138f4565b602082019050919050565b6000612c75602983613158565b9150612c808261391d565b604082019050919050565b6000612c98602183613158565b9150612ca38261396c565b604082019050919050565b6000612cbb603183613158565b9150612cc6826139bb565b604082019050919050565b6000612cde602c83613158565b9150612ce982613a0a565b604082019050919050565b612cfd81613299565b82525050565b6000612d0f82856129b9565b9150612d1b8284612988565b9150612d2682612c22565b91508190509392505050565b6000602082019050612d4760008301846128e9565b92915050565b6000604082019050612d6260008301856128e9565b612d6f60208301846128e9565b9392505050565b6000608082019050612d8b60008301876128e9565b612d9860208301866128e9565b612da56040830185612cf4565b8181036060830152612db78184612907565b905095945050505050565b6000602082019050612dd760008301846128f8565b92915050565b6000602082019050612df26000830184612940565b92915050565b60006020820190508181036000830152612e12818461294f565b905092915050565b60006020820190508181036000830152612e3381612a38565b9050919050565b60006020820190508181036000830152612e5381612a5b565b9050919050565b60006020820190508181036000830152612e7381612a7e565b9050919050565b60006020820190508181036000830152612e9381612aa1565b9050919050565b60006020820190508181036000830152612eb381612ac4565b9050919050565b60006020820190508181036000830152612ed381612ae7565b9050919050565b60006020820190508181036000830152612ef381612b0a565b9050919050565b60006020820190508181036000830152612f1381612b2d565b9050919050565b60006020820190508181036000830152612f3381612b50565b9050919050565b60006020820190508181036000830152612f5381612b73565b9050919050565b60006020820190508181036000830152612f7381612b96565b9050919050565b60006020820190508181036000830152612f9381612bb9565b9050919050565b60006020820190508181036000830152612fb381612bdc565b9050919050565b60006020820190508181036000830152612fd381612bff565b9050919050565b60006020820190508181036000830152612ff381612c45565b9050919050565b6000602082019050818103600083015261301381612c68565b9050919050565b6000602082019050818103600083015261303381612c8b565b9050919050565b6000602082019050818103600083015261305381612cae565b9050919050565b6000602082019050818103600083015261307381612cd1565b9050919050565b600060208201905061308f6000830184612cf4565b92915050565b600061309f6130b0565b90506130ab828261334d565b919050565b6000604051905090565b600067ffffffffffffffff8211156130d5576130d46134e3565b5b6130de82613526565b9050602081019050919050565b600067ffffffffffffffff821115613106576131056134e3565b5b61310f82613526565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061317f82613299565b915061318a83613299565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156131bf576131be6133f8565b5b828201905092915050565b60006131d582613299565b91506131e083613299565b9250826131f0576131ef613427565b5b828204905092915050565b600061320682613299565b915061321183613299565b925082821015613224576132236133f8565b5b828203905092915050565b600061323a82613279565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006132ae826132b5565b9050919050565b60006132c0826132c7565b9050919050565b60006132d282613279565b9050919050565b82818337600083830152505050565b60005b838110156133065780820151818401526020810190506132eb565b83811115613315576000848401525b50505050565b6000600282049050600182168061333357607f821691505b6020821081141561334757613346613456565b5b50919050565b61335682613526565b810181811067ffffffffffffffff82111715613375576133746134e3565b5b80604052505050565b600061338982613299565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156133bc576133bb6133f8565b5b600182019050919050565b60006133d282613299565b91506133dd83613299565b9250826133ed576133ec613427565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d696e7420776f756c6420657863656564206d617820737570706c7900000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b613a628161322f565b8114613a6d57600080fd5b50565b613a7981613241565b8114613a8457600080fd5b50565b613a908161324d565b8114613a9b57600080fd5b50565b613aa781613299565b8114613ab257600080fd5b5056fea2646970667358221220a0bd8fa7b8359c3b90e286987334502db01ff7139c06e058c5a33a9b38ee9d3b64736f6c63430008070033

Deployed Bytecode Sourcemap

48961:2674:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51428:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25375:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26934:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49633:157;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38324:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49798:163;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37992:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46566:143;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49969:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50355:306;;;:::i;:::-;;38514:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25069:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24799:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22382:103;;;:::i;:::-;;50212:135;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21731:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25544:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49449:176;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28350:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50806:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50669:93;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27453:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22640:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51428:204;51559:4;51588:36;51612:11;51588:23;:36::i;:::-;51581:43;;51428:204;;;:::o;25375:100::-;25429:13;25462:5;25455:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25375:100;:::o;26934:221::-;27010:7;27038:16;27046:7;27038;:16::i;:::-;27030:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27123:15;:24;27139:7;27123:24;;;;;;;;;;;;;;;;;;;;;27116:31;;26934:221;;;:::o;49633:157::-;49729:8;48087:30;48108:8;48087:20;:30::i;:::-;49750:32:::1;49764:8;49774:7;49750:13;:32::i;:::-;49633:157:::0;;;:::o;38324:113::-;38385:7;38412:10;:17;;;;38405:24;;38324:113;:::o;49798:163::-;49899:4;47915:10;47907:18;;:4;:18;;;47903:83;;47942:32;47963:10;47942:20;:32::i;:::-;47903:83;49916:37:::1;49935:4;49941:2;49945:7;49916:18;:37::i;:::-;49798:163:::0;;;;:::o;37992:256::-;38089:7;38125:23;38142:5;38125:16;:23::i;:::-;38117:5;:31;38109:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38214:12;:19;38227:5;38214:19;;;;;;;;;;;;;;;:26;38234:5;38214:26;;;;;;;;;;;;38207:33;;37992:256;;;;:::o;46566:143::-;46666:42;46566:143;:::o;49969:171::-;50074:4;47915:10;47907:18;;:4;:18;;;47903:83;;47942:32;47963:10;47942:20;:32::i;:::-;47903:83;50091:41:::1;50114:4;50120:2;50124:7;50091:22;:41::i;:::-;49969:171:::0;;;;:::o;50355:306::-;21962:12;:10;:12::i;:::-;21951:23;;:7;:5;:7::i;:::-;:23;;;21943:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49437:3:::1;50429;50413:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:33;;50405:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;50493:6;50510:144;50526:3;50522:1;:7;50510:144;;;50552:27;:15;:25;:27::i;:::-;50594:48;50604:10;50616:25;:15;:23;:25::i;:::-;50594:9;:48::i;:::-;50531:3;;;;;:::i;:::-;;;;50510:144;;;50394:267;50355:306::o:0;38514:233::-;38589:7;38625:30;:28;:30::i;:::-;38617:5;:38;38609:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;38722:10;38733:5;38722:17;;;;;;;;:::i;:::-;;;;;;;;;;38715:24;;38514:233;;;:::o;25069:239::-;25141:7;25161:13;25177:7;:16;25185:7;25177:16;;;;;;;;;;;;;;;;;;;;;25161:32;;25229:1;25212:19;;:5;:19;;;;25204:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25295:5;25288:12;;;25069:239;;;:::o;24799:208::-;24871:7;24916:1;24899:19;;:5;:19;;;;24891:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;24983:9;:16;24993:5;24983:16;;;;;;;;;;;;;;;;24976:23;;24799:208;;;:::o;22382:103::-;21962:12;:10;:12::i;:::-;21951:23;;:7;:5;:7::i;:::-;:23;;;21943:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22447:30:::1;22474:1;22447:18;:30::i;:::-;22382:103::o:0;50212:135::-;50260:7;50326:13;:11;:13::i;:::-;49437:3;50300:39;;;;:::i;:::-;50280:59;;50212:135;:::o;21731:87::-;21777:7;21804:6;;;;;;;;;;;21797:13;;21731:87;:::o;25544:104::-;25600:13;25633:7;25626:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25544:104;:::o;49449:176::-;49553:8;48087:30;48108:8;48087:20;:30::i;:::-;49574:43:::1;49598:8;49608;49574:23;:43::i;:::-;49449:176:::0;;;:::o;28350:328::-;28525:41;28544:12;:10;:12::i;:::-;28558:7;28525:18;:41::i;:::-;28517:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28631:39;28645:4;28651:2;28655:7;28664:5;28631:13;:39::i;:::-;28350:328;;;;:::o;50806:408::-;50907:13;50946:16;50954:7;50946;:16::i;:::-;50938:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;51050:1;51032:7;51026:21;;;;;:::i;:::-;;;:25;:180;;51192:14;51026:180;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51117:7;51126:18;:7;:16;:18::i;:::-;51100:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51026:180;51002:204;;50806:408;;;:::o;50669:93::-;21962:12;:10;:12::i;:::-;21951:23;;:7;:5;:7::i;:::-;:23;;;21943:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50750:4:::1;50740:7;:14;;;;;;;;;;;;:::i;:::-;;50669:93:::0;:::o;27453:164::-;27550:4;27574:18;:25;27593:5;27574:25;;;;;;;;;;;;;;;:35;27600:8;27574:35;;;;;;;;;;;;;;;;;;;;;;;;;27567:42;;27453:164;;;;:::o;22640:201::-;21962:12;:10;:12::i;:::-;21951:23;;:7;:5;:7::i;:::-;:23;;;21943:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22749:1:::1;22729:22;;:8;:22;;;;22721:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22805:28;22824:8;22805:18;:28::i;:::-;22640:201:::0;:::o;37684:224::-;37786:4;37825:35;37810:50;;;:11;:50;;;;:90;;;;37864:36;37888:11;37864:23;:36::i;:::-;37810:90;37803:97;;37684:224;;;:::o;30188:127::-;30253:4;30305:1;30277:30;;:7;:16;30285:7;30277:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30270:37;;30188:127;;;:::o;48145:419::-;48384:1;46666:42;48336:45;;;:49;48332:225;;;46666:42;48407;;;48458:4;48465:8;48407:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48402:144;;48521:8;48502:28;;;;;;;;;;;:::i;:::-;;;;;;;;48402:144;48332:225;48145:419;:::o;26457:411::-;26538:13;26554:23;26569:7;26554:14;:23::i;:::-;26538:39;;26602:5;26596:11;;:2;:11;;;;26588:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26696:5;26680:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26705:37;26722:5;26729:12;:10;:12::i;:::-;26705:16;:37::i;:::-;26680:62;26658:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26839:21;26848:2;26852:7;26839:8;:21::i;:::-;26527:341;26457:411;;:::o;27684:339::-;27879:41;27898:12;:10;:12::i;:::-;27912:7;27879:18;:41::i;:::-;27871:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27987:28;27997:4;28003:2;28007:7;27987:9;:28::i;:::-;27684:339;;;:::o;28094:185::-;28232:39;28249:4;28255:2;28259:7;28232:39;;;;;;;;;;;;:16;:39::i;:::-;28094:185;;;:::o;17289:98::-;17342:7;17369:10;17362:17;;17289:98;:::o;18356:127::-;18463:1;18445:7;:14;;;:19;;;;;;;;;;;18356:127;:::o;18234:114::-;18299:7;18326;:14;;;18319:21;;18234:114;;;:::o;31172:110::-;31248:26;31258:2;31262:7;31248:26;;;;;;;;;;;;:9;:26::i;:::-;31172:110;;:::o;23001:191::-;23075:16;23094:6;;;;;;;;;;;23075:25;;23120:8;23111:6;;:17;;;;;;;;;;;;;;;;;;23175:8;23144:40;;23165:8;23144:40;;;;;;;;;;;;23064:128;23001:191;:::o;27227:155::-;27322:52;27341:12;:10;:12::i;:::-;27355:8;27365;27322:18;:52::i;:::-;27227:155;;:::o;30482:348::-;30575:4;30600:16;30608:7;30600;:16::i;:::-;30592:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30676:13;30692:23;30707:7;30692:14;:23::i;:::-;30676:39;;30745:5;30734:16;;:7;:16;;;:51;;;;30778:7;30754:31;;:20;30766:7;30754:11;:20::i;:::-;:31;;;30734:51;:87;;;;30789:32;30806:5;30813:7;30789:16;:32::i;:::-;30734:87;30726:96;;;30482:348;;;;:::o;29560:315::-;29717:28;29727:4;29733:2;29737:7;29717:9;:28::i;:::-;29764:48;29787:4;29793:2;29797:7;29806:5;29764:22;:48::i;:::-;29756:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29560:315;;;;:::o;19053:723::-;19109:13;19339:1;19330:5;:10;19326:53;;;19357:10;;;;;;;;;;;;;;;;;;;;;19326:53;19389:12;19404:5;19389:20;;19420:14;19445:78;19460:1;19452:4;:9;19445:78;;19478:8;;;;;:::i;:::-;;;;19509:2;19501:10;;;;;:::i;:::-;;;19445:78;;;19533:19;19565:6;19555:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19533:39;;19583:154;19599:1;19590:5;:10;19583:154;;19627:1;19617:11;;;;;:::i;:::-;;;19694:2;19686:5;:10;;;;:::i;:::-;19673:2;:24;;;;:::i;:::-;19660:39;;19643:6;19650;19643:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;19723:2;19714:11;;;;;:::i;:::-;;;19583:154;;;19761:6;19747:21;;;;;19053:723;;;;:::o;24430:305::-;24532:4;24584:25;24569:40;;;:11;:40;;;;:105;;;;24641:33;24626:48;;;:11;:48;;;;24569:105;:158;;;;24691:36;24715:11;24691:23;:36::i;:::-;24569:158;24549:178;;24430:305;;;:::o;34170:174::-;34272:2;34245:15;:24;34261:7;34245:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34328:7;34324:2;34290:46;;34299:23;34314:7;34299:14;:23::i;:::-;34290:46;;;;;;;;;;;;34170:174;;:::o;33474:578::-;33633:4;33606:31;;:23;33621:7;33606:14;:23::i;:::-;:31;;;33598:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33716:1;33702:16;;:2;:16;;;;33694:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33772:39;33793:4;33799:2;33803:7;33772:20;:39::i;:::-;33876:29;33893:1;33897:7;33876:8;:29::i;:::-;33937:1;33918:9;:15;33928:4;33918:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;33966:1;33949:9;:13;33959:2;33949:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33997:2;33978:7;:16;33986:7;33978:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34036:7;34032:2;34017:27;;34026:4;34017:27;;;;;;;;;;;;33474:578;;;:::o;31509:321::-;31639:18;31645:2;31649:7;31639:5;:18::i;:::-;31690:54;31721:1;31725:2;31729:7;31738:5;31690:22;:54::i;:::-;31668:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31509:321;;;:::o;34486:315::-;34641:8;34632:17;;:5;:17;;;;34624:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;34728:8;34690:18;:25;34709:5;34690:25;;;;;;;;;;;;;;;:35;34716:8;34690:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;34774:8;34752:41;;34767:5;34752:41;;;34784:8;34752:41;;;;;;:::i;:::-;;;;;;;;34486:315;;;:::o;35366:799::-;35521:4;35542:15;:2;:13;;;:15::i;:::-;35538:620;;;35594:2;35578:36;;;35615:12;:10;:12::i;:::-;35629:4;35635:7;35644:5;35578:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35574:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35837:1;35820:6;:13;:18;35816:272;;;35863:60;;;;;;;;;;:::i;:::-;;;;;;;;35816:272;36038:6;36032:13;36023:6;36019:2;36015:15;36008:38;35574:529;35711:41;;;35701:51;;;:6;:51;;;;35694:58;;;;;35538:620;36142:4;36135:11;;35366:799;;;;;;;:::o;7091:157::-;7176:4;7215:25;7200:40;;;:11;:40;;;;7193:47;;7091:157;;;:::o;51224:196::-;51367:45;51394:4;51400:2;51404:7;51367:26;:45::i;:::-;51224:196;;;:::o;32166:382::-;32260:1;32246:16;;:2;:16;;;;32238:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32319:16;32327:7;32319;:16::i;:::-;32318:17;32310:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32381:45;32410:1;32414:2;32418:7;32381:20;:45::i;:::-;32456:1;32439:9;:13;32449:2;32439:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32487:2;32468:7;:16;32476:7;32468:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32532:7;32528:2;32507:33;;32524:1;32507:33;;;;;;;;;;;;32166:382;;:::o;9418:387::-;9478:4;9686:12;9753:7;9741:20;9733:28;;9796:1;9789:4;:8;9782:15;;;9418:387;;;:::o;39360:589::-;39504:45;39531:4;39537:2;39541:7;39504:26;:45::i;:::-;39582:1;39566:18;;:4;:18;;;39562:187;;;39601:40;39633:7;39601:31;:40::i;:::-;39562:187;;;39671:2;39663:10;;:4;:10;;;39659:90;;39690:47;39723:4;39729:7;39690:32;:47::i;:::-;39659:90;39562:187;39777:1;39763:16;;:2;:16;;;39759:183;;;39796:45;39833:7;39796:36;:45::i;:::-;39759:183;;;39869:4;39863:10;;:2;:10;;;39859:83;;39890:40;39918:2;39922:7;39890:27;:40::i;:::-;39859:83;39759:183;39360:589;;;:::o;36737:126::-;;;;:::o;40672:164::-;40776:10;:17;;;;40749:15;:24;40765:7;40749:24;;;;;;;;;;;:44;;;;40804:10;40820:7;40804:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40672:164;:::o;41463:988::-;41729:22;41779:1;41754:22;41771:4;41754:16;:22::i;:::-;:26;;;;:::i;:::-;41729:51;;41791:18;41812:17;:26;41830:7;41812:26;;;;;;;;;;;;41791:47;;41959:14;41945:10;:28;41941:328;;41990:19;42012:12;:18;42025:4;42012:18;;;;;;;;;;;;;;;:34;42031:14;42012:34;;;;;;;;;;;;41990:56;;42096:11;42063:12;:18;42076:4;42063:18;;;;;;;;;;;;;;;:30;42082:10;42063:30;;;;;;;;;;;:44;;;;42213:10;42180:17;:30;42198:11;42180:30;;;;;;;;;;;:43;;;;41975:294;41941:328;42365:17;:26;42383:7;42365:26;;;;;;;;;;;42358:33;;;42409:12;:18;42422:4;42409:18;;;;;;;;;;;;;;;:34;42428:14;42409:34;;;;;;;;;;;42402:41;;;41544:907;;41463:988;;:::o;42746:1079::-;42999:22;43044:1;43024:10;:17;;;;:21;;;;:::i;:::-;42999:46;;43056:18;43077:15;:24;43093:7;43077:24;;;;;;;;;;;;43056:45;;43428:19;43450:10;43461:14;43450:26;;;;;;;;:::i;:::-;;;;;;;;;;43428:48;;43514:11;43489:10;43500;43489:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;43625:10;43594:15;:28;43610:11;43594:28;;;;;;;;;;;:41;;;;43766:15;:24;43782:7;43766:24;;;;;;;;;;;43759:31;;;43801:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42817:1008;;;42746:1079;:::o;40250:221::-;40335:14;40352:20;40369:2;40352:16;:20::i;:::-;40335:37;;40410:7;40383:12;:16;40396:2;40383:16;;;;;;;;;;;;;;;:24;40400:6;40383:24;;;;;;;;;;;:34;;;;40457:6;40428:17;:26;40446:7;40428:26;;;;;;;;;;;:35;;;;40324:147;40250:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1179:5;1210:6;1204:13;1195:22;;1226:30;1250:5;1226:30;:::i;:::-;1125:137;;;;:::o;1268:::-;1313:5;1351:6;1338:20;1329:29;;1367:32;1393:5;1367:32;:::i;:::-;1268:137;;;;:::o;1411:141::-;1467:5;1498:6;1492:13;1483:22;;1514:32;1540:5;1514:32;:::i;:::-;1411:141;;;;:::o;1571:338::-;1626:5;1675:3;1668:4;1660:6;1656:17;1652:27;1642:122;;1683:79;;:::i;:::-;1642:122;1800:6;1787:20;1825:78;1899:3;1891:6;1884:4;1876:6;1872:17;1825:78;:::i;:::-;1816:87;;1632:277;1571:338;;;;:::o;1929:340::-;1985:5;2034:3;2027:4;2019:6;2015:17;2011:27;2001:122;;2042:79;;:::i;:::-;2001:122;2159:6;2146:20;2184:79;2259:3;2251:6;2244:4;2236:6;2232:17;2184:79;:::i;:::-;2175:88;;1991:278;1929:340;;;;:::o;2275:139::-;2321:5;2359:6;2346:20;2337:29;;2375:33;2402:5;2375:33;:::i;:::-;2275:139;;;;:::o;2420:329::-;2479:6;2528:2;2516:9;2507:7;2503:23;2499:32;2496:119;;;2534:79;;:::i;:::-;2496:119;2654:1;2679:53;2724:7;2715:6;2704:9;2700:22;2679:53;:::i;:::-;2669:63;;2625:117;2420:329;;;;:::o;2755:474::-;2823:6;2831;2880:2;2868:9;2859:7;2855:23;2851:32;2848:119;;;2886:79;;:::i;:::-;2848:119;3006:1;3031:53;3076:7;3067:6;3056:9;3052:22;3031:53;:::i;:::-;3021:63;;2977:117;3133:2;3159:53;3204:7;3195:6;3184:9;3180:22;3159:53;:::i;:::-;3149:63;;3104:118;2755:474;;;;;:::o;3235:619::-;3312:6;3320;3328;3377:2;3365:9;3356:7;3352:23;3348:32;3345:119;;;3383:79;;:::i;:::-;3345:119;3503:1;3528:53;3573:7;3564:6;3553:9;3549:22;3528:53;:::i;:::-;3518:63;;3474:117;3630:2;3656:53;3701:7;3692:6;3681:9;3677:22;3656:53;:::i;:::-;3646:63;;3601:118;3758:2;3784:53;3829:7;3820:6;3809:9;3805:22;3784:53;:::i;:::-;3774:63;;3729:118;3235:619;;;;;:::o;3860:943::-;3955:6;3963;3971;3979;4028:3;4016:9;4007:7;4003:23;3999:33;3996:120;;;4035:79;;:::i;:::-;3996:120;4155:1;4180:53;4225:7;4216:6;4205:9;4201:22;4180:53;:::i;:::-;4170:63;;4126:117;4282:2;4308:53;4353:7;4344:6;4333:9;4329:22;4308:53;:::i;:::-;4298:63;;4253:118;4410:2;4436:53;4481:7;4472:6;4461:9;4457:22;4436:53;:::i;:::-;4426:63;;4381:118;4566:2;4555:9;4551:18;4538:32;4597:18;4589:6;4586:30;4583:117;;;4619:79;;:::i;:::-;4583:117;4724:62;4778:7;4769:6;4758:9;4754:22;4724:62;:::i;:::-;4714:72;;4509:287;3860:943;;;;;;;:::o;4809:468::-;4874:6;4882;4931:2;4919:9;4910:7;4906:23;4902:32;4899:119;;;4937:79;;:::i;:::-;4899:119;5057:1;5082:53;5127:7;5118:6;5107:9;5103:22;5082:53;:::i;:::-;5072:63;;5028:117;5184:2;5210:50;5252:7;5243:6;5232:9;5228:22;5210:50;:::i;:::-;5200:60;;5155:115;4809:468;;;;;:::o;5283:474::-;5351:6;5359;5408:2;5396:9;5387:7;5383:23;5379:32;5376:119;;;5414:79;;:::i;:::-;5376:119;5534:1;5559:53;5604:7;5595:6;5584:9;5580:22;5559:53;:::i;:::-;5549:63;;5505:117;5661:2;5687:53;5732:7;5723:6;5712:9;5708:22;5687:53;:::i;:::-;5677:63;;5632:118;5283:474;;;;;:::o;5763:345::-;5830:6;5879:2;5867:9;5858:7;5854:23;5850:32;5847:119;;;5885:79;;:::i;:::-;5847:119;6005:1;6030:61;6083:7;6074:6;6063:9;6059:22;6030:61;:::i;:::-;6020:71;;5976:125;5763:345;;;;:::o;6114:327::-;6172:6;6221:2;6209:9;6200:7;6196:23;6192:32;6189:119;;;6227:79;;:::i;:::-;6189:119;6347:1;6372:52;6416:7;6407:6;6396:9;6392:22;6372:52;:::i;:::-;6362:62;;6318:116;6114:327;;;;:::o;6447:349::-;6516:6;6565:2;6553:9;6544:7;6540:23;6536:32;6533:119;;;6571:79;;:::i;:::-;6533:119;6691:1;6716:63;6771:7;6762:6;6751:9;6747:22;6716:63;:::i;:::-;6706:73;;6662:127;6447:349;;;;:::o;6802:509::-;6871:6;6920:2;6908:9;6899:7;6895:23;6891:32;6888:119;;;6926:79;;:::i;:::-;6888:119;7074:1;7063:9;7059:17;7046:31;7104:18;7096:6;7093:30;7090:117;;;7126:79;;:::i;:::-;7090:117;7231:63;7286:7;7277:6;7266:9;7262:22;7231:63;:::i;:::-;7221:73;;7017:287;6802:509;;;;:::o;7317:329::-;7376:6;7425:2;7413:9;7404:7;7400:23;7396:32;7393:119;;;7431:79;;:::i;:::-;7393:119;7551:1;7576:53;7621:7;7612:6;7601:9;7597:22;7576:53;:::i;:::-;7566:63;;7522:117;7317:329;;;;:::o;7652:118::-;7739:24;7757:5;7739:24;:::i;:::-;7734:3;7727:37;7652:118;;:::o;7776:109::-;7857:21;7872:5;7857:21;:::i;:::-;7852:3;7845:34;7776:109;;:::o;7891:360::-;7977:3;8005:38;8037:5;8005:38;:::i;:::-;8059:70;8122:6;8117:3;8059:70;:::i;:::-;8052:77;;8138:52;8183:6;8178:3;8171:4;8164:5;8160:16;8138:52;:::i;:::-;8215:29;8237:6;8215:29;:::i;:::-;8210:3;8206:39;8199:46;;7981:270;7891:360;;;;:::o;8257:195::-;8376:69;8439:5;8376:69;:::i;:::-;8371:3;8364:82;8257:195;;:::o;8458:364::-;8546:3;8574:39;8607:5;8574:39;:::i;:::-;8629:71;8693:6;8688:3;8629:71;:::i;:::-;8622:78;;8709:52;8754:6;8749:3;8742:4;8735:5;8731:16;8709:52;:::i;:::-;8786:29;8808:6;8786:29;:::i;:::-;8781:3;8777:39;8770:46;;8550:272;8458:364;;;;:::o;8828:377::-;8934:3;8962:39;8995:5;8962:39;:::i;:::-;9017:89;9099:6;9094:3;9017:89;:::i;:::-;9010:96;;9115:52;9160:6;9155:3;9148:4;9141:5;9137:16;9115:52;:::i;:::-;9192:6;9187:3;9183:16;9176:23;;8938:267;8828:377;;;;:::o;9235:845::-;9338:3;9375:5;9369:12;9404:36;9430:9;9404:36;:::i;:::-;9456:89;9538:6;9533:3;9456:89;:::i;:::-;9449:96;;9576:1;9565:9;9561:17;9592:1;9587:137;;;;9738:1;9733:341;;;;9554:520;;9587:137;9671:4;9667:9;9656;9652:25;9647:3;9640:38;9707:6;9702:3;9698:16;9691:23;;9587:137;;9733:341;9800:38;9832:5;9800:38;:::i;:::-;9860:1;9874:154;9888:6;9885:1;9882:13;9874:154;;;9962:7;9956:14;9952:1;9947:3;9943:11;9936:35;10012:1;10003:7;9999:15;9988:26;;9910:4;9907:1;9903:12;9898:17;;9874:154;;;10057:6;10052:3;10048:16;10041:23;;9740:334;;9554:520;;9342:738;;9235:845;;;;:::o;10086:366::-;10228:3;10249:67;10313:2;10308:3;10249:67;:::i;:::-;10242:74;;10325:93;10414:3;10325:93;:::i;:::-;10443:2;10438:3;10434:12;10427:19;;10086:366;;;:::o;10458:::-;10600:3;10621:67;10685:2;10680:3;10621:67;:::i;:::-;10614:74;;10697:93;10786:3;10697:93;:::i;:::-;10815:2;10810:3;10806:12;10799:19;;10458:366;;;:::o;10830:::-;10972:3;10993:67;11057:2;11052:3;10993:67;:::i;:::-;10986:74;;11069:93;11158:3;11069:93;:::i;:::-;11187:2;11182:3;11178:12;11171:19;;10830:366;;;:::o;11202:::-;11344:3;11365:67;11429:2;11424:3;11365:67;:::i;:::-;11358:74;;11441:93;11530:3;11441:93;:::i;:::-;11559:2;11554:3;11550:12;11543:19;;11202:366;;;:::o;11574:::-;11716:3;11737:67;11801:2;11796:3;11737:67;:::i;:::-;11730:74;;11813:93;11902:3;11813:93;:::i;:::-;11931:2;11926:3;11922:12;11915:19;;11574:366;;;:::o;11946:::-;12088:3;12109:67;12173:2;12168:3;12109:67;:::i;:::-;12102:74;;12185:93;12274:3;12185:93;:::i;:::-;12303:2;12298:3;12294:12;12287:19;;11946:366;;;:::o;12318:::-;12460:3;12481:67;12545:2;12540:3;12481:67;:::i;:::-;12474:74;;12557:93;12646:3;12557:93;:::i;:::-;12675:2;12670:3;12666:12;12659:19;;12318:366;;;:::o;12690:::-;12832:3;12853:67;12917:2;12912:3;12853:67;:::i;:::-;12846:74;;12929:93;13018:3;12929:93;:::i;:::-;13047:2;13042:3;13038:12;13031:19;;12690:366;;;:::o;13062:::-;13204:3;13225:67;13289:2;13284:3;13225:67;:::i;:::-;13218:74;;13301:93;13390:3;13301:93;:::i;:::-;13419:2;13414:3;13410:12;13403:19;;13062:366;;;:::o;13434:::-;13576:3;13597:67;13661:2;13656:3;13597:67;:::i;:::-;13590:74;;13673:93;13762:3;13673:93;:::i;:::-;13791:2;13786:3;13782:12;13775:19;;13434:366;;;:::o;13806:::-;13948:3;13969:67;14033:2;14028:3;13969:67;:::i;:::-;13962:74;;14045:93;14134:3;14045:93;:::i;:::-;14163:2;14158:3;14154:12;14147:19;;13806:366;;;:::o;14178:::-;14320:3;14341:67;14405:2;14400:3;14341:67;:::i;:::-;14334:74;;14417:93;14506:3;14417:93;:::i;:::-;14535:2;14530:3;14526:12;14519:19;;14178:366;;;:::o;14550:::-;14692:3;14713:67;14777:2;14772:3;14713:67;:::i;:::-;14706:74;;14789:93;14878:3;14789:93;:::i;:::-;14907:2;14902:3;14898:12;14891:19;;14550:366;;;:::o;14922:::-;15064:3;15085:67;15149:2;15144:3;15085:67;:::i;:::-;15078:74;;15161:93;15250:3;15161:93;:::i;:::-;15279:2;15274:3;15270:12;15263:19;;14922:366;;;:::o;15294:400::-;15454:3;15475:84;15557:1;15552:3;15475:84;:::i;:::-;15468:91;;15568:93;15657:3;15568:93;:::i;:::-;15686:1;15681:3;15677:11;15670:18;;15294:400;;;:::o;15700:366::-;15842:3;15863:67;15927:2;15922:3;15863:67;:::i;:::-;15856:74;;15939:93;16028:3;15939:93;:::i;:::-;16057:2;16052:3;16048:12;16041:19;;15700:366;;;:::o;16072:::-;16214:3;16235:67;16299:2;16294:3;16235:67;:::i;:::-;16228:74;;16311:93;16400:3;16311:93;:::i;:::-;16429:2;16424:3;16420:12;16413:19;;16072:366;;;:::o;16444:::-;16586:3;16607:67;16671:2;16666:3;16607:67;:::i;:::-;16600:74;;16683:93;16772:3;16683:93;:::i;:::-;16801:2;16796:3;16792:12;16785:19;;16444:366;;;:::o;16816:::-;16958:3;16979:67;17043:2;17038:3;16979:67;:::i;:::-;16972:74;;17055:93;17144:3;17055:93;:::i;:::-;17173:2;17168:3;17164:12;17157:19;;16816:366;;;:::o;17188:::-;17330:3;17351:67;17415:2;17410:3;17351:67;:::i;:::-;17344:74;;17427:93;17516:3;17427:93;:::i;:::-;17545:2;17540:3;17536:12;17529:19;;17188:366;;;:::o;17560:118::-;17647:24;17665:5;17647:24;:::i;:::-;17642:3;17635:37;17560:118;;:::o;17684:695::-;17962:3;17984:92;18072:3;18063:6;17984:92;:::i;:::-;17977:99;;18093:95;18184:3;18175:6;18093:95;:::i;:::-;18086:102;;18205:148;18349:3;18205:148;:::i;:::-;18198:155;;18370:3;18363:10;;17684:695;;;;;:::o;18385:222::-;18478:4;18516:2;18505:9;18501:18;18493:26;;18529:71;18597:1;18586:9;18582:17;18573:6;18529:71;:::i;:::-;18385:222;;;;:::o;18613:332::-;18734:4;18772:2;18761:9;18757:18;18749:26;;18785:71;18853:1;18842:9;18838:17;18829:6;18785:71;:::i;:::-;18866:72;18934:2;18923:9;18919:18;18910:6;18866:72;:::i;:::-;18613:332;;;;;:::o;18951:640::-;19146:4;19184:3;19173:9;19169:19;19161:27;;19198:71;19266:1;19255:9;19251:17;19242:6;19198:71;:::i;:::-;19279:72;19347:2;19336:9;19332:18;19323:6;19279:72;:::i;:::-;19361;19429:2;19418:9;19414:18;19405:6;19361:72;:::i;:::-;19480:9;19474:4;19470:20;19465:2;19454:9;19450:18;19443:48;19508:76;19579:4;19570:6;19508:76;:::i;:::-;19500:84;;18951:640;;;;;;;:::o;19597:210::-;19684:4;19722:2;19711:9;19707:18;19699:26;;19735:65;19797:1;19786:9;19782:17;19773:6;19735:65;:::i;:::-;19597:210;;;;:::o;19813:286::-;19938:4;19976:2;19965:9;19961:18;19953:26;;19989:103;20089:1;20078:9;20074:17;20065:6;19989:103;:::i;:::-;19813:286;;;;:::o;20105:313::-;20218:4;20256:2;20245:9;20241:18;20233:26;;20305:9;20299:4;20295:20;20291:1;20280:9;20276:17;20269:47;20333:78;20406:4;20397:6;20333:78;:::i;:::-;20325:86;;20105:313;;;;:::o;20424:419::-;20590:4;20628:2;20617:9;20613:18;20605:26;;20677:9;20671:4;20667:20;20663:1;20652:9;20648:17;20641:47;20705:131;20831:4;20705:131;:::i;:::-;20697:139;;20424:419;;;:::o;20849:::-;21015:4;21053:2;21042:9;21038:18;21030:26;;21102:9;21096:4;21092:20;21088:1;21077:9;21073:17;21066:47;21130:131;21256:4;21130:131;:::i;:::-;21122:139;;20849:419;;;:::o;21274:::-;21440:4;21478:2;21467:9;21463:18;21455:26;;21527:9;21521:4;21517:20;21513:1;21502:9;21498:17;21491:47;21555:131;21681:4;21555:131;:::i;:::-;21547:139;;21274:419;;;:::o;21699:::-;21865:4;21903:2;21892:9;21888:18;21880:26;;21952:9;21946:4;21942:20;21938:1;21927:9;21923:17;21916:47;21980:131;22106:4;21980:131;:::i;:::-;21972:139;;21699:419;;;:::o;22124:::-;22290:4;22328:2;22317:9;22313:18;22305:26;;22377:9;22371:4;22367:20;22363:1;22352:9;22348:17;22341:47;22405:131;22531:4;22405:131;:::i;:::-;22397:139;;22124:419;;;:::o;22549:::-;22715:4;22753:2;22742:9;22738:18;22730:26;;22802:9;22796:4;22792:20;22788:1;22777:9;22773:17;22766:47;22830:131;22956:4;22830:131;:::i;:::-;22822:139;;22549:419;;;:::o;22974:::-;23140:4;23178:2;23167:9;23163:18;23155:26;;23227:9;23221:4;23217:20;23213:1;23202:9;23198:17;23191:47;23255:131;23381:4;23255:131;:::i;:::-;23247:139;;22974:419;;;:::o;23399:::-;23565:4;23603:2;23592:9;23588:18;23580:26;;23652:9;23646:4;23642:20;23638:1;23627:9;23623:17;23616:47;23680:131;23806:4;23680:131;:::i;:::-;23672:139;;23399:419;;;:::o;23824:::-;23990:4;24028:2;24017:9;24013:18;24005:26;;24077:9;24071:4;24067:20;24063:1;24052:9;24048:17;24041:47;24105:131;24231:4;24105:131;:::i;:::-;24097:139;;23824:419;;;:::o;24249:::-;24415:4;24453:2;24442:9;24438:18;24430:26;;24502:9;24496:4;24492:20;24488:1;24477:9;24473:17;24466:47;24530:131;24656:4;24530:131;:::i;:::-;24522:139;;24249:419;;;:::o;24674:::-;24840:4;24878:2;24867:9;24863:18;24855:26;;24927:9;24921:4;24917:20;24913:1;24902:9;24898:17;24891:47;24955:131;25081:4;24955:131;:::i;:::-;24947:139;;24674:419;;;:::o;25099:::-;25265:4;25303:2;25292:9;25288:18;25280:26;;25352:9;25346:4;25342:20;25338:1;25327:9;25323:17;25316:47;25380:131;25506:4;25380:131;:::i;:::-;25372:139;;25099:419;;;:::o;25524:::-;25690:4;25728:2;25717:9;25713:18;25705:26;;25777:9;25771:4;25767:20;25763:1;25752:9;25748:17;25741:47;25805:131;25931:4;25805:131;:::i;:::-;25797:139;;25524:419;;;:::o;25949:::-;26115:4;26153:2;26142:9;26138:18;26130:26;;26202:9;26196:4;26192:20;26188:1;26177:9;26173:17;26166:47;26230:131;26356:4;26230:131;:::i;:::-;26222:139;;25949:419;;;:::o;26374:::-;26540:4;26578:2;26567:9;26563:18;26555:26;;26627:9;26621:4;26617:20;26613:1;26602:9;26598:17;26591:47;26655:131;26781:4;26655:131;:::i;:::-;26647:139;;26374:419;;;:::o;26799:::-;26965:4;27003:2;26992:9;26988:18;26980:26;;27052:9;27046:4;27042:20;27038:1;27027:9;27023:17;27016:47;27080:131;27206:4;27080:131;:::i;:::-;27072:139;;26799:419;;;:::o;27224:::-;27390:4;27428:2;27417:9;27413:18;27405:26;;27477:9;27471:4;27467:20;27463:1;27452:9;27448:17;27441:47;27505:131;27631:4;27505:131;:::i;:::-;27497:139;;27224:419;;;:::o;27649:::-;27815:4;27853:2;27842:9;27838:18;27830:26;;27902:9;27896:4;27892:20;27888:1;27877:9;27873:17;27866:47;27930:131;28056:4;27930:131;:::i;:::-;27922:139;;27649:419;;;:::o;28074:::-;28240:4;28278:2;28267:9;28263:18;28255:26;;28327:9;28321:4;28317:20;28313:1;28302:9;28298:17;28291:47;28355:131;28481:4;28355:131;:::i;:::-;28347:139;;28074:419;;;:::o;28499:222::-;28592:4;28630:2;28619:9;28615:18;28607:26;;28643:71;28711:1;28700:9;28696:17;28687:6;28643:71;:::i;:::-;28499:222;;;;:::o;28727:129::-;28761:6;28788:20;;:::i;:::-;28778:30;;28817:33;28845:4;28837:6;28817:33;:::i;:::-;28727:129;;;:::o;28862:75::-;28895:6;28928:2;28922:9;28912:19;;28862:75;:::o;28943:307::-;29004:4;29094:18;29086:6;29083:30;29080:56;;;29116:18;;:::i;:::-;29080:56;29154:29;29176:6;29154:29;:::i;:::-;29146:37;;29238:4;29232;29228:15;29220:23;;28943:307;;;:::o;29256:308::-;29318:4;29408:18;29400:6;29397:30;29394:56;;;29430:18;;:::i;:::-;29394:56;29468:29;29490:6;29468:29;:::i;:::-;29460:37;;29552:4;29546;29542:15;29534:23;;29256:308;;;:::o;29570:141::-;29619:4;29642:3;29634:11;;29665:3;29662:1;29655:14;29699:4;29696:1;29686:18;29678:26;;29570:141;;;:::o;29717:98::-;29768:6;29802:5;29796:12;29786:22;;29717:98;;;:::o;29821:99::-;29873:6;29907:5;29901:12;29891:22;;29821:99;;;:::o;29926:168::-;30009:11;30043:6;30038:3;30031:19;30083:4;30078:3;30074:14;30059:29;;29926:168;;;;:::o;30100:169::-;30184:11;30218:6;30213:3;30206:19;30258:4;30253:3;30249:14;30234:29;;30100:169;;;;:::o;30275:148::-;30377:11;30414:3;30399:18;;30275:148;;;;:::o;30429:305::-;30469:3;30488:20;30506:1;30488:20;:::i;:::-;30483:25;;30522:20;30540:1;30522:20;:::i;:::-;30517:25;;30676:1;30608:66;30604:74;30601:1;30598:81;30595:107;;;30682:18;;:::i;:::-;30595:107;30726:1;30723;30719:9;30712:16;;30429:305;;;;:::o;30740:185::-;30780:1;30797:20;30815:1;30797:20;:::i;:::-;30792:25;;30831:20;30849:1;30831:20;:::i;:::-;30826:25;;30870:1;30860:35;;30875:18;;:::i;:::-;30860:35;30917:1;30914;30910:9;30905:14;;30740:185;;;;:::o;30931:191::-;30971:4;30991:20;31009:1;30991:20;:::i;:::-;30986:25;;31025:20;31043:1;31025:20;:::i;:::-;31020:25;;31064:1;31061;31058:8;31055:34;;;31069:18;;:::i;:::-;31055:34;31114:1;31111;31107:9;31099:17;;30931:191;;;;:::o;31128:96::-;31165:7;31194:24;31212:5;31194:24;:::i;:::-;31183:35;;31128:96;;;:::o;31230:90::-;31264:7;31307:5;31300:13;31293:21;31282:32;;31230:90;;;:::o;31326:149::-;31362:7;31402:66;31395:5;31391:78;31380:89;;31326:149;;;:::o;31481:126::-;31518:7;31558:42;31551:5;31547:54;31536:65;;31481:126;;;:::o;31613:77::-;31650:7;31679:5;31668:16;;31613:77;;;:::o;31696:158::-;31778:9;31811:37;31842:5;31811:37;:::i;:::-;31798:50;;31696:158;;;:::o;31860:126::-;31910:9;31943:37;31974:5;31943:37;:::i;:::-;31930:50;;31860:126;;;:::o;31992:113::-;32042:9;32075:24;32093:5;32075:24;:::i;:::-;32062:37;;31992:113;;;:::o;32111:154::-;32195:6;32190:3;32185;32172:30;32257:1;32248:6;32243:3;32239:16;32232:27;32111:154;;;:::o;32271:307::-;32339:1;32349:113;32363:6;32360:1;32357:13;32349:113;;;32448:1;32443:3;32439:11;32433:18;32429:1;32424:3;32420:11;32413:39;32385:2;32382:1;32378:10;32373:15;;32349:113;;;32480:6;32477:1;32474:13;32471:101;;;32560:1;32551:6;32546:3;32542:16;32535:27;32471:101;32320:258;32271:307;;;:::o;32584:320::-;32628:6;32665:1;32659:4;32655:12;32645:22;;32712:1;32706:4;32702:12;32733:18;32723:81;;32789:4;32781:6;32777:17;32767:27;;32723:81;32851:2;32843:6;32840:14;32820:18;32817:38;32814:84;;;32870:18;;:::i;:::-;32814:84;32635:269;32584:320;;;:::o;32910:281::-;32993:27;33015:4;32993:27;:::i;:::-;32985:6;32981:40;33123:6;33111:10;33108:22;33087:18;33075:10;33072:34;33069:62;33066:88;;;33134:18;;:::i;:::-;33066:88;33174:10;33170:2;33163:22;32953:238;32910:281;;:::o;33197:233::-;33236:3;33259:24;33277:5;33259:24;:::i;:::-;33250:33;;33305:66;33298:5;33295:77;33292:103;;;33375:18;;:::i;:::-;33292:103;33422:1;33415:5;33411:13;33404:20;;33197:233;;;:::o;33436:176::-;33468:1;33485:20;33503:1;33485:20;:::i;:::-;33480:25;;33519:20;33537:1;33519:20;:::i;:::-;33514:25;;33558:1;33548:35;;33563:18;;:::i;:::-;33548:35;33604:1;33601;33597:9;33592:14;;33436:176;;;;:::o;33618:180::-;33666:77;33663:1;33656:88;33763:4;33760:1;33753:15;33787:4;33784:1;33777:15;33804:180;33852:77;33849:1;33842:88;33949:4;33946:1;33939:15;33973:4;33970:1;33963:15;33990:180;34038:77;34035:1;34028:88;34135:4;34132:1;34125:15;34159:4;34156:1;34149:15;34176:180;34224:77;34221:1;34214:88;34321:4;34318:1;34311:15;34345:4;34342:1;34335:15;34362:180;34410:77;34407:1;34400:88;34507:4;34504:1;34497:15;34531:4;34528:1;34521:15;34548:180;34596:77;34593:1;34586:88;34693:4;34690:1;34683:15;34717:4;34714:1;34707:15;34734:117;34843:1;34840;34833:12;34857:117;34966:1;34963;34956:12;34980:117;35089:1;35086;35079:12;35103:117;35212:1;35209;35202:12;35226:102;35267:6;35318:2;35314:7;35309:2;35302:5;35298:14;35294:28;35284:38;;35226:102;;;:::o;35334:178::-;35474:30;35470:1;35462:6;35458:14;35451:54;35334:178;:::o;35518:230::-;35658:34;35654:1;35646:6;35642:14;35635:58;35727:13;35722:2;35714:6;35710:15;35703:38;35518:230;:::o;35754:237::-;35894:34;35890:1;35882:6;35878:14;35871:58;35963:20;35958:2;35950:6;35946:15;35939:45;35754:237;:::o;35997:225::-;36137:34;36133:1;36125:6;36121:14;36114:58;36206:8;36201:2;36193:6;36189:15;36182:33;35997:225;:::o;36228:178::-;36368:30;36364:1;36356:6;36352:14;36345:54;36228:178;:::o;36412:223::-;36552:34;36548:1;36540:6;36536:14;36529:58;36621:6;36616:2;36608:6;36604:15;36597:31;36412:223;:::o;36641:175::-;36781:27;36777:1;36769:6;36765:14;36758:51;36641:175;:::o;36822:170::-;36962:22;36958:1;36950:6;36946:14;36939:46;36822:170;:::o;36998:231::-;37138:34;37134:1;37126:6;37122:14;37115:58;37207:14;37202:2;37194:6;37190:15;37183:39;36998:231;:::o;37235:243::-;37375:34;37371:1;37363:6;37359:14;37352:58;37444:26;37439:2;37431:6;37427:15;37420:51;37235:243;:::o;37484:229::-;37624:34;37620:1;37612:6;37608:14;37601:58;37693:12;37688:2;37680:6;37676:15;37669:37;37484:229;:::o;37719:228::-;37859:34;37855:1;37847:6;37843:14;37836:58;37928:11;37923:2;37915:6;37911:15;37904:36;37719:228;:::o;37953:182::-;38093:34;38089:1;38081:6;38077:14;38070:58;37953:182;:::o;38141:231::-;38281:34;38277:1;38269:6;38265:14;38258:58;38350:14;38345:2;38337:6;38333:15;38326:39;38141:231;:::o;38378:155::-;38518:7;38514:1;38506:6;38502:14;38495:31;38378:155;:::o;38539:182::-;38679:34;38675:1;38667:6;38663:14;38656:58;38539:182;:::o;38727:228::-;38867:34;38863:1;38855:6;38851:14;38844:58;38936:11;38931:2;38923:6;38919:15;38912:36;38727:228;:::o;38961:220::-;39101:34;39097:1;39089:6;39085:14;39078:58;39170:3;39165:2;39157:6;39153:15;39146:28;38961:220;:::o;39187:236::-;39327:34;39323:1;39315:6;39311:14;39304:58;39396:19;39391:2;39383:6;39379:15;39372:44;39187:236;:::o;39429:231::-;39569:34;39565:1;39557:6;39553:14;39546:58;39638:14;39633:2;39625:6;39621:15;39614:39;39429:231;:::o;39666:122::-;39739:24;39757:5;39739:24;:::i;:::-;39732:5;39729:35;39719:63;;39778:1;39775;39768:12;39719:63;39666:122;:::o;39794:116::-;39864:21;39879:5;39864:21;:::i;:::-;39857:5;39854:32;39844:60;;39900:1;39897;39890:12;39844:60;39794:116;:::o;39916:120::-;39988:23;40005:5;39988:23;:::i;:::-;39981:5;39978:34;39968:62;;40026:1;40023;40016:12;39968:62;39916:120;:::o;40042:122::-;40115:24;40133:5;40115:24;:::i;:::-;40108:5;40105:35;40095:63;;40154:1;40151;40144:12;40095:63;40042:122;:::o

Swarm Source

ipfs://a0bd8fa7b8359c3b90e286987334502db01ff7139c06e058c5a33a9b38ee9d3b
Loading...
Loading
Loading...
Loading
[ 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.