ETH Price: $3,248.67 (+2.45%)
Gas: 2 Gwei

Token

TheChinaNFTs (CN)
 

Overview

Max Total Supply

408 CN

Holders

91

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 CN
0xfcada87998c04ee2b1903f5d7cd5ba6bd3b68c02
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:
thechinanfts

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-02
*/

// SPDX-License-Identifier: MIT

// File @openzeppelin/contracts/utils/introspection/[email protected]


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/utils/[email protected]


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/utils/[email protected]


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

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


// File erc721a/contracts/[email protected]


// Creator: Chiru Labs

pragma solidity ^0.8.4;







error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // 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;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        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 override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

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

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _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 {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex &&
            !_ownerships[tokenId].burned;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}


// File @openzeppelin/contracts/access/[email protected]


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/interfaces/[email protected]


// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol)

pragma solidity ^0.8.0;


// File @openzeppelin/contracts/interfaces/[email protected]


// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be payed in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}


// File @openzeppelin/contracts/token/common/[email protected]


// OpenZeppelin Contracts (last updated v4.5.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice)
        external
        view
        virtual
        override
        returns (address, uint256)
    {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `tokenId` must be already minted.
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}


// File @openzeppelin/contracts/utils/cryptography/[email protected]


// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

/******************************************************************************
   Test
/******************************************************************************/

pragma solidity ^0.8.7;

error SaleInactive();
error SoldOut();
error InvalidPrice();
error WithdrawFailed();
error InvalidQuantity();
error InvalidProof();


contract thechinanfts is ERC721A, Ownable, ERC2981 {
    uint256 public price = 0 ether;
    uint256 public presalePrice = 0 ether;
    uint256 public maxPerWallet = 5;
    uint256 public maxPerTransaction = 5;
    uint256 public presaleMaxPerWallet = 5;
    uint256 public presaleMaxPerTransaction = 5;

    uint256 public immutable presaleSupply = 10000;
    uint256 public immutable supply = 10000;

    enum SaleState {
        CLOSED,
        OPEN,
        PRESALE
    }

    SaleState public saleState = SaleState.CLOSED;

    string public _baseTokenURI;

    mapping(address => uint256) public addressMintBalance;

    address[] public withdrawAddresses = [0x874CB83386f05edfFD7fBf70F5b0548502fab7a3, 0xC01EbCD376F56cC6c1F440D94179893Ca7B132e0];
    uint256[] public withdrawPercentages = [60, 40];

    bytes32 public merkleRoot = 0x8dff350c6626702c6030f839f183fe89aab9be8954c0060c38dc70e1c14aeb13;

    constructor(
        string memory _name,
        string memory _symbol,
        string memory _baseUri,
        uint96 _royaltyAmount
    ) ERC721A(_name, _symbol) {
        _baseTokenURI = _baseUri;
        _setDefaultRoyalty(owner(), _royaltyAmount);
    }

    function mint(uint256 qty) external payable {
        if (saleState != SaleState.OPEN) revert SaleInactive();
        if (_currentIndex + (qty - 1) > supply) revert SoldOut();
        if (msg.value != price * qty) revert InvalidPrice();

        if (addressMintBalance[msg.sender] + qty > maxPerWallet) revert InvalidQuantity();
        if (qty > maxPerTransaction) revert InvalidQuantity();

        _safeMint(msg.sender, qty);

        addressMintBalance[msg.sender] += qty;
    }

    function presale(uint256 qty, bytes32[] calldata merkleProof) external payable {
        if (saleState != SaleState.PRESALE) revert SaleInactive();
        if (_currentIndex + (qty - 1) > presaleSupply) revert SoldOut();
        if (msg.value != presalePrice * qty) revert InvalidPrice();

        if (!MerkleProof.verify(merkleProof, merkleRoot, keccak256(abi.encodePacked(msg.sender)))) { 
          revert InvalidProof();
        }
        if (addressMintBalance[msg.sender] + qty > presaleMaxPerWallet) revert InvalidQuantity();
        if (qty > presaleMaxPerTransaction) revert InvalidQuantity();

        _safeMint(msg.sender, qty);

        addressMintBalance[msg.sender] += qty;
    }

    function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }

    function setBaseURI(string memory baseURI) external onlyOwner {
        _baseTokenURI = baseURI;
    }

    function setPrice(uint256 newPrice) external onlyOwner {
        price = newPrice;
    }

    function setPresalePrice(uint256 newPrice) external onlyOwner {
        presalePrice = newPrice;
    }

    function setSaleState(uint8 _state) external onlyOwner {
        saleState = SaleState(_state);
    }

    function freeMint(uint256 qty, address recipient) external onlyOwner {
        if (_currentIndex + (qty - 1) > supply) revert SoldOut();
        _safeMint(recipient, qty);
    }

    function setPerWalletMax(uint256 _val) external onlyOwner {
        maxPerWallet = _val;
    }

    function setPerTransactionMax(uint256 _val) external onlyOwner {
        maxPerTransaction = _val;
    }

    function setPresalePerWalletMax(uint256 _val) external onlyOwner {
        presaleMaxPerWallet = _val;
    }

    function setPresalePerTransactionMax(uint256 _val) external onlyOwner {
        presaleMaxPerTransaction = _val;
    }

    function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner {
        merkleRoot = _merkleRoot;
    }

    function _withdraw(address _address, uint256 _amount) private {
        (bool success, ) = _address.call{value: _amount}("");
        if (!success) revert WithdrawFailed();
    }

    function withdraw() external onlyOwner {
        uint256 balance = address(this).balance;

        for (uint256 i; i < withdrawAddresses.length; i++) {
            _withdraw(withdrawAddresses[i], (balance * withdrawPercentages[i]) / 100);
        }
    }

    function setRoyaltyInfo(address receiver, uint96 feeBasisPoints)
        external
        onlyOwner
    {
        _setDefaultRoyalty(receiver, feeBasisPoints);
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_baseUri","type":"string"},{"internalType":"uint96","name":"_royaltyAmount","type":"uint96"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidPrice","type":"error"},{"inputs":[],"name":"InvalidProof","type":"error"},{"inputs":[],"name":"InvalidQuantity","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"SaleInactive","type":"error"},{"inputs":[],"name":"SoldOut","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"WithdrawFailed","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":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"maxPerTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":[{"internalType":"uint256","name":"qty","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"presale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleMaxPerTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleMaxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":[],"name":"saleState","outputs":[{"internalType":"enum thechinanfts.SaleState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_val","type":"uint256"}],"name":"setPerTransactionMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_val","type":"uint256"}],"name":"setPerWalletMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_val","type":"uint256"}],"name":"setPresalePerTransactionMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_val","type":"uint256"}],"name":"setPresalePerWalletMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPresalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeBasisPoints","type":"uint96"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_state","type":"uint8"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"withdrawAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"withdrawPercentages","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60c06040526000600b556000600c556005600d556005600e556005600f55600560105561271060809081525061271060a0908152506000601160006101000a81548160ff021916908360028111156200005d576200005c62000688565b5b0217905550604051806040016040528073874cb83386f05edffd7fbf70f5b0548502fab7a373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173c01ebcd376f56cc6c1f440d94179893ca7b132e073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250601490600262000109929190620004f2565b506040518060400160405280603c60ff168152602001602860ff1681525060159060026200013992919062000581565b507f8dff350c6626702c6030f839f183fe89aab9be8954c0060c38dc70e1c14aeb1360001b6016553480156200016e57600080fd5b50604051620055983803806200559883398181016040528101906200019491906200089d565b83838160029080519060200190620001ae929190620005d8565b508060039080519060200190620001c7929190620005d8565b50620001d86200024460201b60201c565b600081905550505062000200620001f46200024d60201b60201c565b6200025560201b60201c565b816012908051906020019062000218929190620005d8565b506200023a6200022d6200031b60201b60201c565b826200034560201b60201c565b5050505062000aeb565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b62000355620004e860201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115620003b6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003ad90620009f3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000428576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200041f9062000a65565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600960008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000612710905090565b8280548282559060005260206000209081019282156200056e579160200282015b828111156200056d5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000513565b5b5090506200057d919062000669565b5090565b828054828255906000526020600020908101928215620005c5579160200282015b82811115620005c4578251829060ff16905591602001919060010190620005a2565b5b509050620005d4919062000669565b5090565b828054620005e69062000ab6565b90600052602060002090601f0160209004810192826200060a576000855562000656565b82601f106200062557805160ff191683800117855562000656565b8280016001018555821562000656579182015b828111156200065557825182559160200191906001019062000638565b5b50905062000665919062000669565b5090565b5b80821115620006845760008160009055506001016200066a565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200072082620006d5565b810181811067ffffffffffffffff82111715620007425762000741620006e6565b5b80604052505050565b600062000757620006b7565b905062000765828262000715565b919050565b600067ffffffffffffffff821115620007885762000787620006e6565b5b6200079382620006d5565b9050602081019050919050565b60005b83811015620007c0578082015181840152602081019050620007a3565b83811115620007d0576000848401525b50505050565b6000620007ed620007e7846200076a565b6200074b565b9050828152602081018484840111156200080c576200080b620006d0565b5b62000819848285620007a0565b509392505050565b600082601f830112620008395762000838620006cb565b5b81516200084b848260208601620007d6565b91505092915050565b60006bffffffffffffffffffffffff82169050919050565b620008778162000854565b81146200088357600080fd5b50565b60008151905062000897816200086c565b92915050565b60008060008060808587031215620008ba57620008b9620006c1565b5b600085015167ffffffffffffffff811115620008db57620008da620006c6565b5b620008e98782880162000821565b945050602085015167ffffffffffffffff8111156200090d576200090c620006c6565b5b6200091b8782880162000821565b935050604085015167ffffffffffffffff8111156200093f576200093e620006c6565b5b6200094d8782880162000821565b9250506060620009608782880162000886565b91505092959194509250565b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000620009db602a836200096c565b9150620009e8826200097d565b604082019050919050565b6000602082019050818103600083015262000a0e81620009cc565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062000a4d6019836200096c565b915062000a5a8262000a15565b602082019050919050565b6000602082019050818103600083015262000a808162000a3e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000acf57607f821691505b60208210810362000ae55762000ae462000a87565b5b50919050565b60805160a051614a7262000b2660003960008181610b2c0152818161109f01526118d1015260008181611c250152611db70152614a726000f3fe60806040526004361061027c5760003560e01c806355f804b31161014f578063a0712d68116100c1578063c87b56dd1161007a578063c87b56dd14610954578063cfc86f7b14610991578063d86bed9b146109bc578063e341f5ca146109f9578063e985e9c514610a22578063f2fde38b14610a5f5761027c565b8063a0712d6814610876578063a22cb46514610892578063b3a196e9146108bb578063b88d4fde146108e6578063bd3b14d31461090f578063c13bd95c146109385761027c565b8063715018a611610113578063715018a61461078c5780637cb64759146107a35780638da5cb5b146107cc57806391b7f5ed146107f757806395d89b4114610820578063a035b1fe1461084b5761027c565b806355f804b3146106955780635a67de07146106be578063603f4d52146106e75780636352211e1461071257806370a082311461074f5761027c565b80632a55205a116101f35780633ccfd60b116101ac5780633ccfd60b1461059757806342842e0e146105ae57806344bb8279146105d7578063453c2310146106145780634b980d671461063f57806350cf22c11461066a5761027c565b80632a55205a146104765780632eb4a7ab146104b45780633406c726146104df57806334861c751461051c5780633549345e14610545578063391176681461056e5761027c565b8063081812fc11610245578063081812fc14610368578063095ea7b3146103a55780630d0ee170146103ce57806312c23bd8146103f757806318160ddd1461042257806323b872dd1461044d5761027c565b80620e7fa81461028157806301ffc9a7146102ac57806302fa7c47146102e9578063047fc9aa1461031257806306fdde031461033d575b600080fd5b34801561028d57600080fd5b50610296610a88565b6040516102a391906139d3565b60405180910390f35b3480156102b857600080fd5b506102d360048036038101906102ce9190613a5a565b610a8e565b6040516102e09190613aa2565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190613b5f565b610aa0565b005b34801561031e57600080fd5b50610327610b2a565b60405161033491906139d3565b60405180910390f35b34801561034957600080fd5b50610352610b4e565b60405161035f9190613c38565b60405180910390f35b34801561037457600080fd5b5061038f600480360381019061038a9190613c86565b610be0565b60405161039c9190613cc2565b60405180910390f35b3480156103b157600080fd5b506103cc60048036038101906103c79190613cdd565b610c5c565b005b3480156103da57600080fd5b506103f560048036038101906103f09190613c86565b610d66565b005b34801561040357600080fd5b5061040c610dec565b60405161041991906139d3565b60405180910390f35b34801561042e57600080fd5b50610437610df2565b60405161044491906139d3565b60405180910390f35b34801561045957600080fd5b50610474600480360381019061046f9190613d1d565b610e09565b005b34801561048257600080fd5b5061049d60048036038101906104989190613d70565b610e19565b6040516104ab929190613db0565b60405180910390f35b3480156104c057600080fd5b506104c9611003565b6040516104d69190613df2565b60405180910390f35b3480156104eb57600080fd5b5061050660048036038101906105019190613e0d565b611009565b60405161051391906139d3565b60405180910390f35b34801561052857600080fd5b50610543600480360381019061053e9190613e3a565b611021565b005b34801561055157600080fd5b5061056c60048036038101906105679190613c86565b61111e565b005b34801561057a57600080fd5b5061059560048036038101906105909190613c86565b6111a4565b005b3480156105a357600080fd5b506105ac61122a565b005b3480156105ba57600080fd5b506105d560048036038101906105d09190613d1d565b61134f565b005b3480156105e357600080fd5b506105fe60048036038101906105f99190613c86565b61136f565b60405161060b9190613cc2565b60405180910390f35b34801561062057600080fd5b506106296113ae565b60405161063691906139d3565b60405180910390f35b34801561064b57600080fd5b506106546113b4565b60405161066191906139d3565b60405180910390f35b34801561067657600080fd5b5061067f6113ba565b60405161068c91906139d3565b60405180910390f35b3480156106a157600080fd5b506106bc60048036038101906106b79190613faf565b6113c0565b005b3480156106ca57600080fd5b506106e560048036038101906106e09190614031565b611456565b005b3480156106f357600080fd5b506106fc611514565b60405161070991906140d5565b60405180910390f35b34801561071e57600080fd5b5061073960048036038101906107349190613c86565b611527565b6040516107469190613cc2565b60405180910390f35b34801561075b57600080fd5b5061077660048036038101906107719190613e0d565b61153d565b60405161078391906139d3565b60405180910390f35b34801561079857600080fd5b506107a161160c565b005b3480156107af57600080fd5b506107ca60048036038101906107c5919061411c565b611694565b005b3480156107d857600080fd5b506107e161171a565b6040516107ee9190613cc2565b60405180910390f35b34801561080357600080fd5b5061081e60048036038101906108199190613c86565b611744565b005b34801561082c57600080fd5b506108356117ca565b6040516108429190613c38565b60405180910390f35b34801561085757600080fd5b5061086061185c565b60405161086d91906139d3565b60405180910390f35b610890600480360381019061088b9190613c86565b611862565b005b34801561089e57600080fd5b506108b960048036038101906108b49190614175565b611aac565b005b3480156108c757600080fd5b506108d0611c23565b6040516108dd91906139d3565b60405180910390f35b3480156108f257600080fd5b5061090d60048036038101906109089190614256565b611c47565b005b34801561091b57600080fd5b5061093660048036038101906109319190613c86565b611cc3565b005b610952600480360381019061094d9190614339565b611d49565b005b34801561096057600080fd5b5061097b60048036038101906109769190613c86565b61203e565b6040516109889190613c38565b60405180910390f35b34801561099d57600080fd5b506109a66120dc565b6040516109b39190613c38565b60405180910390f35b3480156109c857600080fd5b506109e360048036038101906109de9190613c86565b61216a565b6040516109f091906139d3565b60405180910390f35b348015610a0557600080fd5b50610a206004803603810190610a1b9190613c86565b61218e565b005b348015610a2e57600080fd5b50610a496004803603810190610a449190614399565b612214565b604051610a569190613aa2565b60405180910390f35b348015610a6b57600080fd5b50610a866004803603810190610a819190613e0d565b6122a8565b005b600c5481565b6000610a998261239f565b9050919050565b610aa8612419565b73ffffffffffffffffffffffffffffffffffffffff16610ac661171a565b73ffffffffffffffffffffffffffffffffffffffff1614610b1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1390614425565b60405180910390fd5b610b268282612421565b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b606060028054610b5d90614474565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8990614474565b8015610bd65780601f10610bab57610100808354040283529160200191610bd6565b820191906000526020600020905b815481529060010190602001808311610bb957829003601f168201915b5050505050905090565b6000610beb826125b6565b610c21576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c6782611527565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610cce576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ced612419565b73ffffffffffffffffffffffffffffffffffffffff1614158015610d1f5750610d1d81610d18612419565b612214565b155b15610d56576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d61838383612604565b505050565b610d6e612419565b73ffffffffffffffffffffffffffffffffffffffff16610d8c61171a565b73ffffffffffffffffffffffffffffffffffffffff1614610de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd990614425565b60405180910390fd5b8060108190555050565b600f5481565b6000610dfc6126b6565b6001546000540303905090565b610e148383836126bf565b505050565b6000806000600a60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610fae5760096040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610fb8612b73565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610fe491906144d4565b610fee919061455d565b90508160000151819350935050509250929050565b60165481565b60136020528060005260406000206000915090505481565b611029612419565b73ffffffffffffffffffffffffffffffffffffffff1661104761171a565b73ffffffffffffffffffffffffffffffffffffffff161461109d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109490614425565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001836110cb919061458e565b6000546110d891906145c2565b1115611110576040517f52df9fe500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61111a8183612b7d565b5050565b611126612419565b73ffffffffffffffffffffffffffffffffffffffff1661114461171a565b73ffffffffffffffffffffffffffffffffffffffff161461119a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119190614425565b60405180910390fd5b80600c8190555050565b6111ac612419565b73ffffffffffffffffffffffffffffffffffffffff166111ca61171a565b73ffffffffffffffffffffffffffffffffffffffff1614611220576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121790614425565b60405180910390fd5b80600d8190555050565b611232612419565b73ffffffffffffffffffffffffffffffffffffffff1661125061171a565b73ffffffffffffffffffffffffffffffffffffffff16146112a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129d90614425565b60405180910390fd5b600047905060005b60148054905081101561134b57611338601482815481106112d2576112d1614618565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660646015848154811061131357611312614618565b5b90600052602060002001548561132991906144d4565b611333919061455d565b612b9b565b808061134390614647565b9150506112ae565b5050565b61136a83838360405180602001604052806000815250611c47565b505050565b6014818154811061137f57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d5481565b600e5481565b60105481565b6113c8612419565b73ffffffffffffffffffffffffffffffffffffffff166113e661171a565b73ffffffffffffffffffffffffffffffffffffffff161461143c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143390614425565b60405180910390fd5b80601290805190602001906114529291906138d4565b5050565b61145e612419565b73ffffffffffffffffffffffffffffffffffffffff1661147c61171a565b73ffffffffffffffffffffffffffffffffffffffff16146114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c990614425565b60405180910390fd5b8060ff1660028111156114e8576114e761405e565b5b601160006101000a81548160ff0219169083600281111561150c5761150b61405e565b5b021790555050565b601160009054906101000a900460ff1681565b600061153282612c43565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115a4576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611614612419565b73ffffffffffffffffffffffffffffffffffffffff1661163261171a565b73ffffffffffffffffffffffffffffffffffffffff1614611688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167f90614425565b60405180910390fd5b6116926000612ed2565b565b61169c612419565b73ffffffffffffffffffffffffffffffffffffffff166116ba61171a565b73ffffffffffffffffffffffffffffffffffffffff1614611710576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170790614425565b60405180910390fd5b8060168190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61174c612419565b73ffffffffffffffffffffffffffffffffffffffff1661176a61171a565b73ffffffffffffffffffffffffffffffffffffffff16146117c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b790614425565b60405180910390fd5b80600b8190555050565b6060600380546117d990614474565b80601f016020809104026020016040519081016040528092919081815260200182805461180590614474565b80156118525780601f1061182757610100808354040283529160200191611852565b820191906000526020600020905b81548152906001019060200180831161183557829003601f168201915b5050505050905090565b600b5481565b600160028111156118765761187561405e565b5b601160009054906101000a900460ff1660028111156118985761189761405e565b5b146118cf576040517f3f88677400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001826118fd919061458e565b60005461190a91906145c2565b1115611942576040517f52df9fe500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b5461195091906144d4565b3414611987576040517ebfc92100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d5481601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119d591906145c2565b1115611a0d576040517f524f409b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e54811115611a49576040517f524f409b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a533382612b7d565b80601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611aa291906145c2565b9250508190555050565b611ab4612419565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b18576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611b25612419565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611bd2612419565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c179190613aa2565b60405180910390a35050565b7f000000000000000000000000000000000000000000000000000000000000000081565b611c528484846126bf565b611c718373ffffffffffffffffffffffffffffffffffffffff16612f98565b8015611c865750611c8484848484612fbb565b155b15611cbd576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b611ccb612419565b73ffffffffffffffffffffffffffffffffffffffff16611ce961171a565b73ffffffffffffffffffffffffffffffffffffffff1614611d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3690614425565b60405180910390fd5b80600e8190555050565b600280811115611d5c57611d5b61405e565b5b601160009054906101000a900460ff166002811115611d7e57611d7d61405e565b5b14611db5576040517f3f88677400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000600184611de3919061458e565b600054611df091906145c2565b1115611e28576040517f52df9fe500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82600c54611e3691906144d4565b3414611e6d576040517ebfc92100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ee1828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060165433604051602001611ec691906146d7565b6040516020818303038152906040528051906020012061310b565b611f17576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f5483601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f6591906145c2565b1115611f9d576040517f524f409b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601054831115611fd9576040517f524f409b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611fe33384612b7d565b82601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461203291906145c2565b92505081905550505050565b6060612049826125b6565b61207f576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612089613122565b905060008151036120a957604051806020016040528060008152506120d4565b806120b3846131b4565b6040516020016120c492919061472e565b6040516020818303038152906040525b915050919050565b601280546120e990614474565b80601f016020809104026020016040519081016040528092919081815260200182805461211590614474565b80156121625780601f1061213757610100808354040283529160200191612162565b820191906000526020600020905b81548152906001019060200180831161214557829003601f168201915b505050505081565b6015818154811061217a57600080fd5b906000526020600020016000915090505481565b612196612419565b73ffffffffffffffffffffffffffffffffffffffff166121b461171a565b73ffffffffffffffffffffffffffffffffffffffff161461220a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220190614425565b60405180910390fd5b80600f8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122b0612419565b73ffffffffffffffffffffffffffffffffffffffff166122ce61171a565b73ffffffffffffffffffffffffffffffffffffffff1614612324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231b90614425565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238a906147c4565b60405180910390fd5b61239c81612ed2565b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612412575061241182613314565b5b9050919050565b600033905090565b612429612b73565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247e90614856565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036124f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ed906148c2565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600960008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000816125c16126b6565b111580156125d0575060005482105b80156125fd575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b60006126ca82612c43565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612735576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612756612419565b73ffffffffffffffffffffffffffffffffffffffff16148061278557506127848561277f612419565b612214565b5b806127ca5750612793612419565b73ffffffffffffffffffffffffffffffffffffffff166127b284610be0565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612803576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612869576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61287685858560016133f6565b61288260008487612604565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612b01576000548214612b0057878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b6c85858560016133fc565b5050505050565b6000612710905090565b612b97828260405180602001604052806000815250613402565b5050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612bc190614913565b60006040518083038185875af1925050503d8060008114612bfe576040519150601f19603f3d011682016040523d82523d6000602084013e612c03565b606091505b5050905080612c3e576040517f750b219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b612c4b61395a565b600082905080612c596126b6565b11158015612c68575060005481105b15612e9b576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612e9957600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d7d578092505050612ecd565b5b600115612e9857818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e93578092505050612ecd565b612d7e565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612fe1612419565b8786866040518563ffffffff1660e01b8152600401613003949392919061497d565b6020604051808303816000875af192505050801561303f57506040513d601f19601f8201168201806040525081019061303c91906149de565b60015b6130b8573d806000811461306f576040519150601f19603f3d011682016040523d82523d6000602084013e613074565b606091505b5060008151036130b0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6000826131188584613414565b1490509392505050565b60606012805461313190614474565b80601f016020809104026020016040519081016040528092919081815260200182805461315d90614474565b80156131aa5780601f1061317f576101008083540402835291602001916131aa565b820191906000526020600020905b81548152906001019060200180831161318d57829003601f168201915b5050505050905090565b6060600082036131fb576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061330f565b600082905060005b6000821461322d57808061321690614647565b915050600a82613226919061455d565b9150613203565b60008167ffffffffffffffff81111561324957613248613e84565b5b6040519080825280601f01601f19166020018201604052801561327b5781602001600182028036833780820191505090505b5090505b6000851461330857600182613294919061458e565b9150600a856132a39190614a0b565b60306132af91906145c2565b60f81b8183815181106132c5576132c4614618565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613301919061455d565b945061327f565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806133df57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806133ef57506133ee82613489565b5b9050919050565b50505050565b50505050565b61340f83838360016134f3565b505050565b60008082905060005b845181101561347e57600085828151811061343b5761343a614618565b5b6020026020010151905080831161345d5761345683826138bd565b925061346a565b61346781846138bd565b92505b50808061347690614647565b91505061341d565b508091505092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361355f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403613599576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6135a660008683876133f6565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015613770575061376f8773ffffffffffffffffffffffffffffffffffffffff16612f98565b5b15613835575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46137e56000888480600101955088612fbb565b61381b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80820361377657826000541461383057600080fd5b6138a0565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203613836575b8160008190555050506138b660008683876133fc565b5050505050565b600082600052816020526040600020905092915050565b8280546138e090614474565b90600052602060002090601f0160209004810192826139025760008555613949565b82601f1061391b57805160ff1916838001178555613949565b82800160010185558215613949579182015b8281111561394857825182559160200191906001019061392d565b5b509050613956919061399d565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156139b657600081600090555060010161399e565b5090565b6000819050919050565b6139cd816139ba565b82525050565b60006020820190506139e860008301846139c4565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613a3781613a02565b8114613a4257600080fd5b50565b600081359050613a5481613a2e565b92915050565b600060208284031215613a7057613a6f6139f8565b5b6000613a7e84828501613a45565b91505092915050565b60008115159050919050565b613a9c81613a87565b82525050565b6000602082019050613ab76000830184613a93565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613ae882613abd565b9050919050565b613af881613add565b8114613b0357600080fd5b50565b600081359050613b1581613aef565b92915050565b60006bffffffffffffffffffffffff82169050919050565b613b3c81613b1b565b8114613b4757600080fd5b50565b600081359050613b5981613b33565b92915050565b60008060408385031215613b7657613b756139f8565b5b6000613b8485828601613b06565b9250506020613b9585828601613b4a565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613bd9578082015181840152602081019050613bbe565b83811115613be8576000848401525b50505050565b6000601f19601f8301169050919050565b6000613c0a82613b9f565b613c148185613baa565b9350613c24818560208601613bbb565b613c2d81613bee565b840191505092915050565b60006020820190508181036000830152613c528184613bff565b905092915050565b613c63816139ba565b8114613c6e57600080fd5b50565b600081359050613c8081613c5a565b92915050565b600060208284031215613c9c57613c9b6139f8565b5b6000613caa84828501613c71565b91505092915050565b613cbc81613add565b82525050565b6000602082019050613cd76000830184613cb3565b92915050565b60008060408385031215613cf457613cf36139f8565b5b6000613d0285828601613b06565b9250506020613d1385828601613c71565b9150509250929050565b600080600060608486031215613d3657613d356139f8565b5b6000613d4486828701613b06565b9350506020613d5586828701613b06565b9250506040613d6686828701613c71565b9150509250925092565b60008060408385031215613d8757613d866139f8565b5b6000613d9585828601613c71565b9250506020613da685828601613c71565b9150509250929050565b6000604082019050613dc56000830185613cb3565b613dd260208301846139c4565b9392505050565b6000819050919050565b613dec81613dd9565b82525050565b6000602082019050613e076000830184613de3565b92915050565b600060208284031215613e2357613e226139f8565b5b6000613e3184828501613b06565b91505092915050565b60008060408385031215613e5157613e506139f8565b5b6000613e5f85828601613c71565b9250506020613e7085828601613b06565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613ebc82613bee565b810181811067ffffffffffffffff82111715613edb57613eda613e84565b5b80604052505050565b6000613eee6139ee565b9050613efa8282613eb3565b919050565b600067ffffffffffffffff821115613f1a57613f19613e84565b5b613f2382613bee565b9050602081019050919050565b82818337600083830152505050565b6000613f52613f4d84613eff565b613ee4565b905082815260208101848484011115613f6e57613f6d613e7f565b5b613f79848285613f30565b509392505050565b600082601f830112613f9657613f95613e7a565b5b8135613fa6848260208601613f3f565b91505092915050565b600060208284031215613fc557613fc46139f8565b5b600082013567ffffffffffffffff811115613fe357613fe26139fd565b5b613fef84828501613f81565b91505092915050565b600060ff82169050919050565b61400e81613ff8565b811461401957600080fd5b50565b60008135905061402b81614005565b92915050565b600060208284031215614047576140466139f8565b5b60006140558482850161401c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811061409e5761409d61405e565b5b50565b60008190506140af8261408d565b919050565b60006140bf826140a1565b9050919050565b6140cf816140b4565b82525050565b60006020820190506140ea60008301846140c6565b92915050565b6140f981613dd9565b811461410457600080fd5b50565b600081359050614116816140f0565b92915050565b600060208284031215614132576141316139f8565b5b600061414084828501614107565b91505092915050565b61415281613a87565b811461415d57600080fd5b50565b60008135905061416f81614149565b92915050565b6000806040838503121561418c5761418b6139f8565b5b600061419a85828601613b06565b92505060206141ab85828601614160565b9150509250929050565b600067ffffffffffffffff8211156141d0576141cf613e84565b5b6141d982613bee565b9050602081019050919050565b60006141f96141f4846141b5565b613ee4565b90508281526020810184848401111561421557614214613e7f565b5b614220848285613f30565b509392505050565b600082601f83011261423d5761423c613e7a565b5b813561424d8482602086016141e6565b91505092915050565b600080600080608085870312156142705761426f6139f8565b5b600061427e87828801613b06565b945050602061428f87828801613b06565b93505060406142a087828801613c71565b925050606085013567ffffffffffffffff8111156142c1576142c06139fd565b5b6142cd87828801614228565b91505092959194509250565b600080fd5b600080fd5b60008083601f8401126142f9576142f8613e7a565b5b8235905067ffffffffffffffff811115614316576143156142d9565b5b602083019150836020820283011115614332576143316142de565b5b9250929050565b600080600060408486031215614352576143516139f8565b5b600061436086828701613c71565b935050602084013567ffffffffffffffff811115614381576143806139fd565b5b61438d868287016142e3565b92509250509250925092565b600080604083850312156143b0576143af6139f8565b5b60006143be85828601613b06565b92505060206143cf85828601613b06565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061440f602083613baa565b915061441a826143d9565b602082019050919050565b6000602082019050818103600083015261443e81614402565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061448c57607f821691505b60208210810361449f5761449e614445565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006144df826139ba565b91506144ea836139ba565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614523576145226144a5565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614568826139ba565b9150614573836139ba565b9250826145835761458261452e565b5b828204905092915050565b6000614599826139ba565b91506145a4836139ba565b9250828210156145b7576145b66144a5565b5b828203905092915050565b60006145cd826139ba565b91506145d8836139ba565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561460d5761460c6144a5565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614652826139ba565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614684576146836144a5565b5b600182019050919050565b60008160601b9050919050565b60006146a78261468f565b9050919050565b60006146b98261469c565b9050919050565b6146d16146cc82613add565b6146ae565b82525050565b60006146e382846146c0565b60148201915081905092915050565b600081905092915050565b600061470882613b9f565b61471281856146f2565b9350614722818560208601613bbb565b80840191505092915050565b600061473a82856146fd565b915061474682846146fd565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006147ae602683613baa565b91506147b982614752565b604082019050919050565b600060208201905081810360008301526147dd816147a1565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000614840602a83613baa565b915061484b826147e4565b604082019050919050565b6000602082019050818103600083015261486f81614833565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b60006148ac601983613baa565b91506148b782614876565b602082019050919050565b600060208201905081810360008301526148db8161489f565b9050919050565b600081905092915050565b50565b60006148fd6000836148e2565b9150614908826148ed565b600082019050919050565b600061491e826148f0565b9150819050919050565b600081519050919050565b600082825260208201905092915050565b600061494f82614928565b6149598185614933565b9350614969818560208601613bbb565b61497281613bee565b840191505092915050565b60006080820190506149926000830187613cb3565b61499f6020830186613cb3565b6149ac60408301856139c4565b81810360608301526149be8184614944565b905095945050505050565b6000815190506149d881613a2e565b92915050565b6000602082840312156149f4576149f36139f8565b5b6000614a02848285016149c9565b91505092915050565b6000614a16826139ba565b9150614a21836139ba565b925082614a3157614a3061452e565b5b82820690509291505056fea26469706673582212201f60120ac0fb62e0d36010cc650e8437465a430d5b9e50bb0f7378cf4eeacc4364736f6c634300080d0033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c5468654368696e614e46547300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002434e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f68747470733a2f2f6170692e7468656368696e616e6674732e636f6d2f682f00

Deployed Bytecode

0x60806040526004361061027c5760003560e01c806355f804b31161014f578063a0712d68116100c1578063c87b56dd1161007a578063c87b56dd14610954578063cfc86f7b14610991578063d86bed9b146109bc578063e341f5ca146109f9578063e985e9c514610a22578063f2fde38b14610a5f5761027c565b8063a0712d6814610876578063a22cb46514610892578063b3a196e9146108bb578063b88d4fde146108e6578063bd3b14d31461090f578063c13bd95c146109385761027c565b8063715018a611610113578063715018a61461078c5780637cb64759146107a35780638da5cb5b146107cc57806391b7f5ed146107f757806395d89b4114610820578063a035b1fe1461084b5761027c565b806355f804b3146106955780635a67de07146106be578063603f4d52146106e75780636352211e1461071257806370a082311461074f5761027c565b80632a55205a116101f35780633ccfd60b116101ac5780633ccfd60b1461059757806342842e0e146105ae57806344bb8279146105d7578063453c2310146106145780634b980d671461063f57806350cf22c11461066a5761027c565b80632a55205a146104765780632eb4a7ab146104b45780633406c726146104df57806334861c751461051c5780633549345e14610545578063391176681461056e5761027c565b8063081812fc11610245578063081812fc14610368578063095ea7b3146103a55780630d0ee170146103ce57806312c23bd8146103f757806318160ddd1461042257806323b872dd1461044d5761027c565b80620e7fa81461028157806301ffc9a7146102ac57806302fa7c47146102e9578063047fc9aa1461031257806306fdde031461033d575b600080fd5b34801561028d57600080fd5b50610296610a88565b6040516102a391906139d3565b60405180910390f35b3480156102b857600080fd5b506102d360048036038101906102ce9190613a5a565b610a8e565b6040516102e09190613aa2565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190613b5f565b610aa0565b005b34801561031e57600080fd5b50610327610b2a565b60405161033491906139d3565b60405180910390f35b34801561034957600080fd5b50610352610b4e565b60405161035f9190613c38565b60405180910390f35b34801561037457600080fd5b5061038f600480360381019061038a9190613c86565b610be0565b60405161039c9190613cc2565b60405180910390f35b3480156103b157600080fd5b506103cc60048036038101906103c79190613cdd565b610c5c565b005b3480156103da57600080fd5b506103f560048036038101906103f09190613c86565b610d66565b005b34801561040357600080fd5b5061040c610dec565b60405161041991906139d3565b60405180910390f35b34801561042e57600080fd5b50610437610df2565b60405161044491906139d3565b60405180910390f35b34801561045957600080fd5b50610474600480360381019061046f9190613d1d565b610e09565b005b34801561048257600080fd5b5061049d60048036038101906104989190613d70565b610e19565b6040516104ab929190613db0565b60405180910390f35b3480156104c057600080fd5b506104c9611003565b6040516104d69190613df2565b60405180910390f35b3480156104eb57600080fd5b5061050660048036038101906105019190613e0d565b611009565b60405161051391906139d3565b60405180910390f35b34801561052857600080fd5b50610543600480360381019061053e9190613e3a565b611021565b005b34801561055157600080fd5b5061056c60048036038101906105679190613c86565b61111e565b005b34801561057a57600080fd5b5061059560048036038101906105909190613c86565b6111a4565b005b3480156105a357600080fd5b506105ac61122a565b005b3480156105ba57600080fd5b506105d560048036038101906105d09190613d1d565b61134f565b005b3480156105e357600080fd5b506105fe60048036038101906105f99190613c86565b61136f565b60405161060b9190613cc2565b60405180910390f35b34801561062057600080fd5b506106296113ae565b60405161063691906139d3565b60405180910390f35b34801561064b57600080fd5b506106546113b4565b60405161066191906139d3565b60405180910390f35b34801561067657600080fd5b5061067f6113ba565b60405161068c91906139d3565b60405180910390f35b3480156106a157600080fd5b506106bc60048036038101906106b79190613faf565b6113c0565b005b3480156106ca57600080fd5b506106e560048036038101906106e09190614031565b611456565b005b3480156106f357600080fd5b506106fc611514565b60405161070991906140d5565b60405180910390f35b34801561071e57600080fd5b5061073960048036038101906107349190613c86565b611527565b6040516107469190613cc2565b60405180910390f35b34801561075b57600080fd5b5061077660048036038101906107719190613e0d565b61153d565b60405161078391906139d3565b60405180910390f35b34801561079857600080fd5b506107a161160c565b005b3480156107af57600080fd5b506107ca60048036038101906107c5919061411c565b611694565b005b3480156107d857600080fd5b506107e161171a565b6040516107ee9190613cc2565b60405180910390f35b34801561080357600080fd5b5061081e60048036038101906108199190613c86565b611744565b005b34801561082c57600080fd5b506108356117ca565b6040516108429190613c38565b60405180910390f35b34801561085757600080fd5b5061086061185c565b60405161086d91906139d3565b60405180910390f35b610890600480360381019061088b9190613c86565b611862565b005b34801561089e57600080fd5b506108b960048036038101906108b49190614175565b611aac565b005b3480156108c757600080fd5b506108d0611c23565b6040516108dd91906139d3565b60405180910390f35b3480156108f257600080fd5b5061090d60048036038101906109089190614256565b611c47565b005b34801561091b57600080fd5b5061093660048036038101906109319190613c86565b611cc3565b005b610952600480360381019061094d9190614339565b611d49565b005b34801561096057600080fd5b5061097b60048036038101906109769190613c86565b61203e565b6040516109889190613c38565b60405180910390f35b34801561099d57600080fd5b506109a66120dc565b6040516109b39190613c38565b60405180910390f35b3480156109c857600080fd5b506109e360048036038101906109de9190613c86565b61216a565b6040516109f091906139d3565b60405180910390f35b348015610a0557600080fd5b50610a206004803603810190610a1b9190613c86565b61218e565b005b348015610a2e57600080fd5b50610a496004803603810190610a449190614399565b612214565b604051610a569190613aa2565b60405180910390f35b348015610a6b57600080fd5b50610a866004803603810190610a819190613e0d565b6122a8565b005b600c5481565b6000610a998261239f565b9050919050565b610aa8612419565b73ffffffffffffffffffffffffffffffffffffffff16610ac661171a565b73ffffffffffffffffffffffffffffffffffffffff1614610b1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1390614425565b60405180910390fd5b610b268282612421565b5050565b7f000000000000000000000000000000000000000000000000000000000000271081565b606060028054610b5d90614474565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8990614474565b8015610bd65780601f10610bab57610100808354040283529160200191610bd6565b820191906000526020600020905b815481529060010190602001808311610bb957829003601f168201915b5050505050905090565b6000610beb826125b6565b610c21576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c6782611527565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610cce576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ced612419565b73ffffffffffffffffffffffffffffffffffffffff1614158015610d1f5750610d1d81610d18612419565b612214565b155b15610d56576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d61838383612604565b505050565b610d6e612419565b73ffffffffffffffffffffffffffffffffffffffff16610d8c61171a565b73ffffffffffffffffffffffffffffffffffffffff1614610de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd990614425565b60405180910390fd5b8060108190555050565b600f5481565b6000610dfc6126b6565b6001546000540303905090565b610e148383836126bf565b505050565b6000806000600a60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610fae5760096040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610fb8612b73565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610fe491906144d4565b610fee919061455d565b90508160000151819350935050509250929050565b60165481565b60136020528060005260406000206000915090505481565b611029612419565b73ffffffffffffffffffffffffffffffffffffffff1661104761171a565b73ffffffffffffffffffffffffffffffffffffffff161461109d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109490614425565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000027106001836110cb919061458e565b6000546110d891906145c2565b1115611110576040517f52df9fe500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61111a8183612b7d565b5050565b611126612419565b73ffffffffffffffffffffffffffffffffffffffff1661114461171a565b73ffffffffffffffffffffffffffffffffffffffff161461119a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119190614425565b60405180910390fd5b80600c8190555050565b6111ac612419565b73ffffffffffffffffffffffffffffffffffffffff166111ca61171a565b73ffffffffffffffffffffffffffffffffffffffff1614611220576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121790614425565b60405180910390fd5b80600d8190555050565b611232612419565b73ffffffffffffffffffffffffffffffffffffffff1661125061171a565b73ffffffffffffffffffffffffffffffffffffffff16146112a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129d90614425565b60405180910390fd5b600047905060005b60148054905081101561134b57611338601482815481106112d2576112d1614618565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660646015848154811061131357611312614618565b5b90600052602060002001548561132991906144d4565b611333919061455d565b612b9b565b808061134390614647565b9150506112ae565b5050565b61136a83838360405180602001604052806000815250611c47565b505050565b6014818154811061137f57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d5481565b600e5481565b60105481565b6113c8612419565b73ffffffffffffffffffffffffffffffffffffffff166113e661171a565b73ffffffffffffffffffffffffffffffffffffffff161461143c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143390614425565b60405180910390fd5b80601290805190602001906114529291906138d4565b5050565b61145e612419565b73ffffffffffffffffffffffffffffffffffffffff1661147c61171a565b73ffffffffffffffffffffffffffffffffffffffff16146114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c990614425565b60405180910390fd5b8060ff1660028111156114e8576114e761405e565b5b601160006101000a81548160ff0219169083600281111561150c5761150b61405e565b5b021790555050565b601160009054906101000a900460ff1681565b600061153282612c43565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115a4576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611614612419565b73ffffffffffffffffffffffffffffffffffffffff1661163261171a565b73ffffffffffffffffffffffffffffffffffffffff1614611688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167f90614425565b60405180910390fd5b6116926000612ed2565b565b61169c612419565b73ffffffffffffffffffffffffffffffffffffffff166116ba61171a565b73ffffffffffffffffffffffffffffffffffffffff1614611710576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170790614425565b60405180910390fd5b8060168190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61174c612419565b73ffffffffffffffffffffffffffffffffffffffff1661176a61171a565b73ffffffffffffffffffffffffffffffffffffffff16146117c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b790614425565b60405180910390fd5b80600b8190555050565b6060600380546117d990614474565b80601f016020809104026020016040519081016040528092919081815260200182805461180590614474565b80156118525780601f1061182757610100808354040283529160200191611852565b820191906000526020600020905b81548152906001019060200180831161183557829003601f168201915b5050505050905090565b600b5481565b600160028111156118765761187561405e565b5b601160009054906101000a900460ff1660028111156118985761189761405e565b5b146118cf576040517f3f88677400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000027106001826118fd919061458e565b60005461190a91906145c2565b1115611942576040517f52df9fe500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b5461195091906144d4565b3414611987576040517ebfc92100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d5481601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119d591906145c2565b1115611a0d576040517f524f409b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e54811115611a49576040517f524f409b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a533382612b7d565b80601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611aa291906145c2565b9250508190555050565b611ab4612419565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b18576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611b25612419565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611bd2612419565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c179190613aa2565b60405180910390a35050565b7f000000000000000000000000000000000000000000000000000000000000271081565b611c528484846126bf565b611c718373ffffffffffffffffffffffffffffffffffffffff16612f98565b8015611c865750611c8484848484612fbb565b155b15611cbd576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b611ccb612419565b73ffffffffffffffffffffffffffffffffffffffff16611ce961171a565b73ffffffffffffffffffffffffffffffffffffffff1614611d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3690614425565b60405180910390fd5b80600e8190555050565b600280811115611d5c57611d5b61405e565b5b601160009054906101000a900460ff166002811115611d7e57611d7d61405e565b5b14611db5576040517f3f88677400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000002710600184611de3919061458e565b600054611df091906145c2565b1115611e28576040517f52df9fe500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82600c54611e3691906144d4565b3414611e6d576040517ebfc92100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ee1828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060165433604051602001611ec691906146d7565b6040516020818303038152906040528051906020012061310b565b611f17576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f5483601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f6591906145c2565b1115611f9d576040517f524f409b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601054831115611fd9576040517f524f409b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611fe33384612b7d565b82601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461203291906145c2565b92505081905550505050565b6060612049826125b6565b61207f576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612089613122565b905060008151036120a957604051806020016040528060008152506120d4565b806120b3846131b4565b6040516020016120c492919061472e565b6040516020818303038152906040525b915050919050565b601280546120e990614474565b80601f016020809104026020016040519081016040528092919081815260200182805461211590614474565b80156121625780601f1061213757610100808354040283529160200191612162565b820191906000526020600020905b81548152906001019060200180831161214557829003601f168201915b505050505081565b6015818154811061217a57600080fd5b906000526020600020016000915090505481565b612196612419565b73ffffffffffffffffffffffffffffffffffffffff166121b461171a565b73ffffffffffffffffffffffffffffffffffffffff161461220a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220190614425565b60405180910390fd5b80600f8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122b0612419565b73ffffffffffffffffffffffffffffffffffffffff166122ce61171a565b73ffffffffffffffffffffffffffffffffffffffff1614612324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231b90614425565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238a906147c4565b60405180910390fd5b61239c81612ed2565b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612412575061241182613314565b5b9050919050565b600033905090565b612429612b73565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247e90614856565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036124f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ed906148c2565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600960008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000816125c16126b6565b111580156125d0575060005482105b80156125fd575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b60006126ca82612c43565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612735576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612756612419565b73ffffffffffffffffffffffffffffffffffffffff16148061278557506127848561277f612419565b612214565b5b806127ca5750612793612419565b73ffffffffffffffffffffffffffffffffffffffff166127b284610be0565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612803576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612869576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61287685858560016133f6565b61288260008487612604565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612b01576000548214612b0057878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b6c85858560016133fc565b5050505050565b6000612710905090565b612b97828260405180602001604052806000815250613402565b5050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612bc190614913565b60006040518083038185875af1925050503d8060008114612bfe576040519150601f19603f3d011682016040523d82523d6000602084013e612c03565b606091505b5050905080612c3e576040517f750b219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b612c4b61395a565b600082905080612c596126b6565b11158015612c68575060005481105b15612e9b576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612e9957600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d7d578092505050612ecd565b5b600115612e9857818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e93578092505050612ecd565b612d7e565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612fe1612419565b8786866040518563ffffffff1660e01b8152600401613003949392919061497d565b6020604051808303816000875af192505050801561303f57506040513d601f19601f8201168201806040525081019061303c91906149de565b60015b6130b8573d806000811461306f576040519150601f19603f3d011682016040523d82523d6000602084013e613074565b606091505b5060008151036130b0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6000826131188584613414565b1490509392505050565b60606012805461313190614474565b80601f016020809104026020016040519081016040528092919081815260200182805461315d90614474565b80156131aa5780601f1061317f576101008083540402835291602001916131aa565b820191906000526020600020905b81548152906001019060200180831161318d57829003601f168201915b5050505050905090565b6060600082036131fb576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061330f565b600082905060005b6000821461322d57808061321690614647565b915050600a82613226919061455d565b9150613203565b60008167ffffffffffffffff81111561324957613248613e84565b5b6040519080825280601f01601f19166020018201604052801561327b5781602001600182028036833780820191505090505b5090505b6000851461330857600182613294919061458e565b9150600a856132a39190614a0b565b60306132af91906145c2565b60f81b8183815181106132c5576132c4614618565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613301919061455d565b945061327f565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806133df57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806133ef57506133ee82613489565b5b9050919050565b50505050565b50505050565b61340f83838360016134f3565b505050565b60008082905060005b845181101561347e57600085828151811061343b5761343a614618565b5b6020026020010151905080831161345d5761345683826138bd565b925061346a565b61346781846138bd565b92505b50808061347690614647565b91505061341d565b508091505092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361355f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403613599576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6135a660008683876133f6565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015613770575061376f8773ffffffffffffffffffffffffffffffffffffffff16612f98565b5b15613835575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46137e56000888480600101955088612fbb565b61381b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80820361377657826000541461383057600080fd5b6138a0565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203613836575b8160008190555050506138b660008683876133fc565b5050505050565b600082600052816020526040600020905092915050565b8280546138e090614474565b90600052602060002090601f0160209004810192826139025760008555613949565b82601f1061391b57805160ff1916838001178555613949565b82800160010185558215613949579182015b8281111561394857825182559160200191906001019061392d565b5b509050613956919061399d565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156139b657600081600090555060010161399e565b5090565b6000819050919050565b6139cd816139ba565b82525050565b60006020820190506139e860008301846139c4565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613a3781613a02565b8114613a4257600080fd5b50565b600081359050613a5481613a2e565b92915050565b600060208284031215613a7057613a6f6139f8565b5b6000613a7e84828501613a45565b91505092915050565b60008115159050919050565b613a9c81613a87565b82525050565b6000602082019050613ab76000830184613a93565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613ae882613abd565b9050919050565b613af881613add565b8114613b0357600080fd5b50565b600081359050613b1581613aef565b92915050565b60006bffffffffffffffffffffffff82169050919050565b613b3c81613b1b565b8114613b4757600080fd5b50565b600081359050613b5981613b33565b92915050565b60008060408385031215613b7657613b756139f8565b5b6000613b8485828601613b06565b9250506020613b9585828601613b4a565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613bd9578082015181840152602081019050613bbe565b83811115613be8576000848401525b50505050565b6000601f19601f8301169050919050565b6000613c0a82613b9f565b613c148185613baa565b9350613c24818560208601613bbb565b613c2d81613bee565b840191505092915050565b60006020820190508181036000830152613c528184613bff565b905092915050565b613c63816139ba565b8114613c6e57600080fd5b50565b600081359050613c8081613c5a565b92915050565b600060208284031215613c9c57613c9b6139f8565b5b6000613caa84828501613c71565b91505092915050565b613cbc81613add565b82525050565b6000602082019050613cd76000830184613cb3565b92915050565b60008060408385031215613cf457613cf36139f8565b5b6000613d0285828601613b06565b9250506020613d1385828601613c71565b9150509250929050565b600080600060608486031215613d3657613d356139f8565b5b6000613d4486828701613b06565b9350506020613d5586828701613b06565b9250506040613d6686828701613c71565b9150509250925092565b60008060408385031215613d8757613d866139f8565b5b6000613d9585828601613c71565b9250506020613da685828601613c71565b9150509250929050565b6000604082019050613dc56000830185613cb3565b613dd260208301846139c4565b9392505050565b6000819050919050565b613dec81613dd9565b82525050565b6000602082019050613e076000830184613de3565b92915050565b600060208284031215613e2357613e226139f8565b5b6000613e3184828501613b06565b91505092915050565b60008060408385031215613e5157613e506139f8565b5b6000613e5f85828601613c71565b9250506020613e7085828601613b06565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613ebc82613bee565b810181811067ffffffffffffffff82111715613edb57613eda613e84565b5b80604052505050565b6000613eee6139ee565b9050613efa8282613eb3565b919050565b600067ffffffffffffffff821115613f1a57613f19613e84565b5b613f2382613bee565b9050602081019050919050565b82818337600083830152505050565b6000613f52613f4d84613eff565b613ee4565b905082815260208101848484011115613f6e57613f6d613e7f565b5b613f79848285613f30565b509392505050565b600082601f830112613f9657613f95613e7a565b5b8135613fa6848260208601613f3f565b91505092915050565b600060208284031215613fc557613fc46139f8565b5b600082013567ffffffffffffffff811115613fe357613fe26139fd565b5b613fef84828501613f81565b91505092915050565b600060ff82169050919050565b61400e81613ff8565b811461401957600080fd5b50565b60008135905061402b81614005565b92915050565b600060208284031215614047576140466139f8565b5b60006140558482850161401c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811061409e5761409d61405e565b5b50565b60008190506140af8261408d565b919050565b60006140bf826140a1565b9050919050565b6140cf816140b4565b82525050565b60006020820190506140ea60008301846140c6565b92915050565b6140f981613dd9565b811461410457600080fd5b50565b600081359050614116816140f0565b92915050565b600060208284031215614132576141316139f8565b5b600061414084828501614107565b91505092915050565b61415281613a87565b811461415d57600080fd5b50565b60008135905061416f81614149565b92915050565b6000806040838503121561418c5761418b6139f8565b5b600061419a85828601613b06565b92505060206141ab85828601614160565b9150509250929050565b600067ffffffffffffffff8211156141d0576141cf613e84565b5b6141d982613bee565b9050602081019050919050565b60006141f96141f4846141b5565b613ee4565b90508281526020810184848401111561421557614214613e7f565b5b614220848285613f30565b509392505050565b600082601f83011261423d5761423c613e7a565b5b813561424d8482602086016141e6565b91505092915050565b600080600080608085870312156142705761426f6139f8565b5b600061427e87828801613b06565b945050602061428f87828801613b06565b93505060406142a087828801613c71565b925050606085013567ffffffffffffffff8111156142c1576142c06139fd565b5b6142cd87828801614228565b91505092959194509250565b600080fd5b600080fd5b60008083601f8401126142f9576142f8613e7a565b5b8235905067ffffffffffffffff811115614316576143156142d9565b5b602083019150836020820283011115614332576143316142de565b5b9250929050565b600080600060408486031215614352576143516139f8565b5b600061436086828701613c71565b935050602084013567ffffffffffffffff811115614381576143806139fd565b5b61438d868287016142e3565b92509250509250925092565b600080604083850312156143b0576143af6139f8565b5b60006143be85828601613b06565b92505060206143cf85828601613b06565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061440f602083613baa565b915061441a826143d9565b602082019050919050565b6000602082019050818103600083015261443e81614402565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061448c57607f821691505b60208210810361449f5761449e614445565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006144df826139ba565b91506144ea836139ba565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614523576145226144a5565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614568826139ba565b9150614573836139ba565b9250826145835761458261452e565b5b828204905092915050565b6000614599826139ba565b91506145a4836139ba565b9250828210156145b7576145b66144a5565b5b828203905092915050565b60006145cd826139ba565b91506145d8836139ba565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561460d5761460c6144a5565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614652826139ba565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614684576146836144a5565b5b600182019050919050565b60008160601b9050919050565b60006146a78261468f565b9050919050565b60006146b98261469c565b9050919050565b6146d16146cc82613add565b6146ae565b82525050565b60006146e382846146c0565b60148201915081905092915050565b600081905092915050565b600061470882613b9f565b61471281856146f2565b9350614722818560208601613bbb565b80840191505092915050565b600061473a82856146fd565b915061474682846146fd565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006147ae602683613baa565b91506147b982614752565b604082019050919050565b600060208201905081810360008301526147dd816147a1565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000614840602a83613baa565b915061484b826147e4565b604082019050919050565b6000602082019050818103600083015261486f81614833565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b60006148ac601983613baa565b91506148b782614876565b602082019050919050565b600060208201905081810360008301526148db8161489f565b9050919050565b600081905092915050565b50565b60006148fd6000836148e2565b9150614908826148ed565b600082019050919050565b600061491e826148f0565b9150819050919050565b600081519050919050565b600082825260208201905092915050565b600061494f82614928565b6149598185614933565b9350614969818560208601613bbb565b61497281613bee565b840191505092915050565b60006080820190506149926000830187613cb3565b61499f6020830186613cb3565b6149ac60408301856139c4565b81810360608301526149be8184614944565b905095945050505050565b6000815190506149d881613a2e565b92915050565b6000602082840312156149f4576149f36139f8565b5b6000614a02848285016149c9565b91505092915050565b6000614a16826139ba565b9150614a21836139ba565b925082614a3157614a3061452e565b5b82820690509291505056fea26469706673582212201f60120ac0fb62e0d36010cc650e8437465a430d5b9e50bb0f7378cf4eeacc4364736f6c634300080d0033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c5468654368696e614e46547300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002434e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f68747470733a2f2f6170692e7468656368696e616e6674732e636f6d2f682f00

-----Decoded View---------------
Arg [0] : _name (string): TheChinaNFTs
Arg [1] : _symbol (string): CN
Arg [2] : _baseUri (string): https://api.thechinanfts.com/h/
Arg [3] : _royaltyAmount (uint96): 8

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [5] : 5468654368696e614e4654730000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [7] : 434e000000000000000000000000000000000000000000000000000000000000
Arg [8] : 000000000000000000000000000000000000000000000000000000000000001f
Arg [9] : 68747470733a2f2f6170692e7468656368696e616e6674732e636f6d2f682f00


Deployed Bytecode Sourcemap

52890:4702:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52985:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57385:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57207:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53260:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27652:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29155:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28718:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56510:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53110:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23788:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30020:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47557:494;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;53728:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53478:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55986:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55763:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56174:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56939:260;;;;;;;;;;;;;:::i;:::-;;30261:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53540:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53029:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53067:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53155:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55553:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55875:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53388:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27460:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24908:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44016:103;;;;;;;;;;;;;:::i;:::-;;56638:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43365:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55665:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27821:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52948:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54106:493;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29431:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53207:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30517:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56278:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54607:707;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27996:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53442:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53672:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56392:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29789:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44274:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52985:37;;;;:::o;57385:204::-;57516:4;57545:36;57569:11;57545:23;:36::i;:::-;57538:43;;57385:204;;;:::o;57207:170::-;43596:12;:10;:12::i;:::-;43585:23;;:7;:5;:7::i;:::-;:23;;;43577:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57325:44:::1;57344:8;57354:14;57325:18;:44::i;:::-;57207:170:::0;;:::o;53260:39::-;;;:::o;27652:100::-;27706:13;27739:5;27732:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27652:100;:::o;29155:204::-;29223:7;29248:16;29256:7;29248;:16::i;:::-;29243:64;;29273:34;;;;;;;;;;;;;;29243:64;29327:15;:24;29343:7;29327:24;;;;;;;;;;;;;;;;;;;;;29320:31;;29155:204;;;:::o;28718:371::-;28791:13;28807:24;28823:7;28807:15;:24::i;:::-;28791:40;;28852:5;28846:11;;:2;:11;;;28842:48;;28866:24;;;;;;;;;;;;;;28842:48;28923:5;28907:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;28933:37;28950:5;28957:12;:10;:12::i;:::-;28933:16;:37::i;:::-;28932:38;28907:63;28903:138;;;28994:35;;;;;;;;;;;;;;28903:138;29053:28;29062:2;29066:7;29075:5;29053:8;:28::i;:::-;28780:309;28718:371;;:::o;56510:120::-;43596:12;:10;:12::i;:::-;43585:23;;:7;:5;:7::i;:::-;:23;;;43577:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56618:4:::1;56591:24;:31;;;;56510:120:::0;:::o;53110:38::-;;;;:::o;23788:303::-;23832:7;24057:15;:13;:15::i;:::-;24042:12;;24026:13;;:28;:46;24019:53;;23788:303;:::o;30020:170::-;30154:28;30164:4;30170:2;30174:7;30154:9;:28::i;:::-;30020:170;;;:::o;47557:494::-;47701:7;47710;47735:26;47764:17;:27;47782:8;47764:27;;;;;;;;;;;47735:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47836:1;47808:30;;:7;:16;;;:30;;;47804:92;;47865:19;47855:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47804:92;47908:21;47973:17;:15;:17::i;:::-;47932:58;;47946:7;:23;;;47933:36;;:10;:36;;;;:::i;:::-;47932:58;;;;:::i;:::-;47908:82;;48011:7;:16;;;48029:13;48003:40;;;;;;47557:494;;;;;:::o;53728:94::-;;;;:::o;53478:53::-;;;;;;;;;;;;;;;;;:::o;55986:180::-;43596:12;:10;:12::i;:::-;43585:23;;:7;:5;:7::i;:::-;:23;;;43577:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56098:6:::1;56093:1;56087:3;:7;;;;:::i;:::-;56070:13;;:25;;;;:::i;:::-;:34;56066:56;;;56113:9;;;;;;;;;;;;;;56066:56;56133:25;56143:9;56154:3;56133:9;:25::i;:::-;55986:180:::0;;:::o;55763:104::-;43596:12;:10;:12::i;:::-;43585:23;;:7;:5;:7::i;:::-;:23;;;43577:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55851:8:::1;55836:12;:23;;;;55763:104:::0;:::o;56174:96::-;43596:12;:10;:12::i;:::-;43585:23;;:7;:5;:7::i;:::-;:23;;;43577:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56258:4:::1;56243:12;:19;;;;56174:96:::0;:::o;56939:260::-;43596:12;:10;:12::i;:::-;43585:23;;:7;:5;:7::i;:::-;:23;;;43577:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56989:15:::1;57007:21;56989:39;;57046:9;57041:151;57061:17;:24;;;;57057:1;:28;57041:151;;;57107:73;57117:17;57135:1;57117:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;57176:3;57150:19;57170:1;57150:22;;;;;;;;:::i;:::-;;;;;;;;;;57140:7;:32;;;;:::i;:::-;57139:40;;;;:::i;:::-;57107:9;:73::i;:::-;57087:3;;;;;:::i;:::-;;;;57041:151;;;;56978:221;56939:260::o:0;30261:185::-;30399:39;30416:4;30422:2;30426:7;30399:39;;;;;;;;;;;;:16;:39::i;:::-;30261:185;;;:::o;53540:125::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53029:31::-;;;;:::o;53067:36::-;;;;:::o;53155:43::-;;;;:::o;55553:104::-;43596:12;:10;:12::i;:::-;43585:23;;:7;:5;:7::i;:::-;:23;;;43577:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55642:7:::1;55626:13;:23;;;;;;;;;;;;:::i;:::-;;55553:104:::0;:::o;55875:103::-;43596:12;:10;:12::i;:::-;43585:23;;:7;:5;:7::i;:::-;:23;;;43577:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55963:6:::1;55953:17;;;;;;;;;;:::i;:::-;;55941:9;;:29;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;55875:103:::0;:::o;53388:45::-;;;;;;;;;;;;;:::o;27460:125::-;27524:7;27551:21;27564:7;27551:12;:21::i;:::-;:26;;;27544:33;;27460:125;;;:::o;24908:206::-;24972:7;25013:1;24996:19;;:5;:19;;;24992:60;;25024:28;;;;;;;;;;;;;;24992:60;25078:12;:19;25091:5;25078:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;25070:36;;25063:43;;24908:206;;;:::o;44016:103::-;43596:12;:10;:12::i;:::-;43585:23;;:7;:5;:7::i;:::-;:23;;;43577:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44081:30:::1;44108:1;44081:18;:30::i;:::-;44016:103::o:0;56638:104::-;43596:12;:10;:12::i;:::-;43585:23;;:7;:5;:7::i;:::-;:23;;;43577:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56723:11:::1;56710:10;:24;;;;56638:104:::0;:::o;43365:87::-;43411:7;43438:6;;;;;;;;;;;43431:13;;43365:87;:::o;55665:90::-;43596:12;:10;:12::i;:::-;43585:23;;:7;:5;:7::i;:::-;:23;;;43577:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55739:8:::1;55731:5;:16;;;;55665:90:::0;:::o;27821:104::-;27877:13;27910:7;27903:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27821:104;:::o;52948:30::-;;;;:::o;54106:493::-;54178:14;54165:27;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:27;;;;;;;;:::i;:::-;;;54161:54;;54201:14;;;;;;;;;;;;;;54161:54;54258:6;54253:1;54247:3;:7;;;;:::i;:::-;54230:13;;:25;;;;:::i;:::-;:34;54226:56;;;54273:9;;;;;;;;;;;;;;54226:56;54318:3;54310:5;;:11;;;;:::i;:::-;54297:9;:24;54293:51;;54330:14;;;;;;;;;;;;;;54293:51;54400:12;;54394:3;54361:18;:30;54380:10;54361:30;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:51;54357:81;;;54421:17;;;;;;;;;;;;;;54357:81;54459:17;;54453:3;:23;54449:53;;;54485:17;;;;;;;;;;;;;;54449:53;54515:26;54525:10;54537:3;54515:9;:26::i;:::-;54588:3;54554:18;:30;54573:10;54554:30;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;54106:493;:::o;29431:287::-;29542:12;:10;:12::i;:::-;29530:24;;:8;:24;;;29526:54;;29563:17;;;;;;;;;;;;;;29526:54;29638:8;29593:18;:32;29612:12;:10;:12::i;:::-;29593:32;;;;;;;;;;;;;;;:42;29626:8;29593:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29691:8;29662:48;;29677:12;:10;:12::i;:::-;29662:48;;;29701:8;29662:48;;;;;;:::i;:::-;;;;;;;;29431:287;;:::o;53207:46::-;;;:::o;30517:369::-;30684:28;30694:4;30700:2;30704:7;30684:9;:28::i;:::-;30727:15;:2;:13;;;:15::i;:::-;:76;;;;;30747:56;30778:4;30784:2;30788:7;30797:5;30747:30;:56::i;:::-;30746:57;30727:76;30723:156;;;30827:40;;;;;;;;;;;;;;30723:156;30517:369;;;;:::o;56278:106::-;43596:12;:10;:12::i;:::-;43585:23;;:7;:5;:7::i;:::-;:23;;;43577:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56372:4:::1;56352:17;:24;;;;56278:106:::0;:::o;54607:707::-;54714:17;54701:30;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:30;;;;;;;;:::i;:::-;;;54697:57;;54740:14;;;;;;;;;;;;;;54697:57;54797:13;54792:1;54786:3;:7;;;;:::i;:::-;54769:13;;:25;;;;:::i;:::-;:41;54765:63;;;54819:9;;;;;;;;;;;;;;54765:63;54871:3;54856:12;;:18;;;;:::i;:::-;54843:9;:31;54839:58;;54883:14;;;;;;;;;;;;;;54839:58;54915:84;54934:11;;54915:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54947:10;;54986;54969:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;54959:39;;;;;;54915:18;:84::i;:::-;54910:138;;55022:14;;;;;;;;;;;;;;54910:138;55101:19;;55095:3;55062:18;:30;55081:10;55062:30;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:58;55058:88;;;55129:17;;;;;;;;;;;;;;55058:88;55167:24;;55161:3;:30;55157:60;;;55200:17;;;;;;;;;;;;;;55157:60;55230:26;55240:10;55252:3;55230:9;:26::i;:::-;55303:3;55269:18;:30;55288:10;55269:30;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;54607:707;;;:::o;27996:318::-;28069:13;28100:16;28108:7;28100;:16::i;:::-;28095:59;;28125:29;;;;;;;;;;;;;;28095:59;28167:21;28191:10;:8;:10::i;:::-;28167:34;;28244:1;28225:7;28219:21;:26;:87;;;;;;;;;;;;;;;;;28272:7;28281:18;:7;:16;:18::i;:::-;28255:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28219:87;28212:94;;;27996:318;;;:::o;53442:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53672:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56392:110::-;43596:12;:10;:12::i;:::-;43585:23;;:7;:5;:7::i;:::-;:23;;;43577:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56490:4:::1;56468:19;:26;;;;56392:110:::0;:::o;29789:164::-;29886:4;29910:18;:25;29929:5;29910:25;;;;;;;;;;;;;;;:35;29936:8;29910:35;;;;;;;;;;;;;;;;;;;;;;;;;29903:42;;29789:164;;;;:::o;44274:201::-;43596:12;:10;:12::i;:::-;43585:23;;:7;:5;:7::i;:::-;:23;;;43577:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44383:1:::1;44363:22;;:8;:22;;::::0;44355:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;44439:28;44458:8;44439:18;:28::i;:::-;44274:201:::0;:::o;47287:215::-;47389:4;47428:26;47413:41;;;:11;:41;;;;:81;;;;47458:36;47482:11;47458:23;:36::i;:::-;47413:81;47406:88;;47287:215;;;:::o;16882:98::-;16935:7;16962:10;16955:17;;16882:98;:::o;48701:332::-;48820:17;:15;:17::i;:::-;48804:33;;:12;:33;;;;48796:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;48923:1;48903:22;;:8;:22;;;48895:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;48990:35;;;;;;;;49002:8;48990:35;;;;;;49012:12;48990:35;;;;;48968:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48701:332;;:::o;31141:187::-;31198:4;31241:7;31222:15;:13;:15::i;:::-;:26;;:53;;;;;31262:13;;31252:7;:23;31222:53;:98;;;;;31293:11;:20;31305:7;31293:20;;;;;;;;;;;:27;;;;;;;;;;;;31292:28;31222:98;31215:105;;31141:187;;;:::o;39311:196::-;39453:2;39426:15;:24;39442:7;39426:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39491:7;39487:2;39471:28;;39480:5;39471:28;;;;;;;;;;;;39311:196;;;:::o;55322:101::-;55387:7;55414:1;55407:8;;55322:101;:::o;34254:2130::-;34369:35;34407:21;34420:7;34407:12;:21::i;:::-;34369:59;;34467:4;34445:26;;:13;:18;;;:26;;;34441:67;;34480:28;;;;;;;;;;;;;;34441:67;34521:22;34563:4;34547:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;34584:36;34601:4;34607:12;:10;:12::i;:::-;34584:16;:36::i;:::-;34547:73;:126;;;;34661:12;:10;:12::i;:::-;34637:36;;:20;34649:7;34637:11;:20::i;:::-;:36;;;34547:126;34521:153;;34692:17;34687:66;;34718:35;;;;;;;;;;;;;;34687:66;34782:1;34768:16;;:2;:16;;;34764:52;;34793:23;;;;;;;;;;;;;;34764:52;34829:43;34851:4;34857:2;34861:7;34870:1;34829:21;:43::i;:::-;34937:35;34954:1;34958:7;34967:4;34937:8;:35::i;:::-;35298:1;35268:12;:18;35281:4;35268:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35342:1;35314:12;:16;35327:2;35314:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35360:31;35394:11;:20;35406:7;35394:20;;;;;;;;;;;35360:54;;35445:2;35429:8;:13;;;:18;;;;;;;;;;;;;;;;;;35495:15;35462:8;:23;;;:49;;;;;;;;;;;;;;;;;;35763:19;35795:1;35785:7;:11;35763:33;;35811:31;35845:11;:24;35857:11;35845:24;;;;;;;;;;;35811:58;;35913:1;35888:27;;:8;:13;;;;;;;;;;;;:27;;;35884:384;;36098:13;;36083:11;:28;36079:174;;36152:4;36136:8;:13;;;:20;;;;;;;;;;;;;;;;;;36205:13;:28;;;36179:8;:23;;;:54;;;;;;;;;;;;;;;;;;36079:174;35884:384;35243:1036;;;36315:7;36311:2;36296:27;;36305:4;36296:27;;;;;;;;;;;;36334:42;36355:4;36361:2;36365:7;36374:1;36334:20;:42::i;:::-;34358:2026;;34254:2130;;;:::o;48333:97::-;48391:6;48417:5;48410:12;;48333:97;:::o;31336:104::-;31405:27;31415:2;31419:8;31405:27;;;;;;;;;;;;:9;:27::i;:::-;31336:104;;:::o;56750:181::-;56824:12;56842:8;:13;;56863:7;56842:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56823:52;;;56891:7;56886:37;;56907:16;;;;;;;;;;;;;;56886:37;56812:119;56750:181;;:::o;26289:1109::-;26351:21;;:::i;:::-;26385:12;26400:7;26385:22;;26468:4;26449:15;:13;:15::i;:::-;:23;;:47;;;;;26483:13;;26476:4;:20;26449:47;26445:886;;;26517:31;26551:11;:17;26563:4;26551:17;;;;;;;;;;;26517:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26592:9;:16;;;26587:729;;26663:1;26637:28;;:9;:14;;;:28;;;26633:101;;26701:9;26694:16;;;;;;26633:101;27036:261;27043:4;27036:261;;;27076:6;;;;;;;;27121:11;:17;27133:4;27121:17;;;;;;;;;;;27109:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27195:1;27169:28;;:9;:14;;;:28;;;27165:109;;27237:9;27230:16;;;;;;27165:109;27036:261;;;26587:729;26498:833;26445:886;27359:31;;;;;;;;;;;;;;26289:1109;;;;:::o;44635:191::-;44709:16;44728:6;;;;;;;;;;;44709:25;;44754:8;44745:6;;:17;;;;;;;;;;;;;;;;;;44809:8;44778:40;;44799:8;44778:40;;;;;;;;;;;;44698:128;44635:191;:::o;8925:326::-;8985:4;9242:1;9220:7;:19;;;:23;9213:30;;8925:326;;;:::o;39999:667::-;40162:4;40199:2;40183:36;;;40220:12;:10;:12::i;:::-;40234:4;40240:7;40249:5;40183:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40179:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40434:1;40417:6;:13;:18;40413:235;;40463:40;;;;;;;;;;;;;;40413:235;40606:6;40600:13;40591:6;40587:2;40583:15;40576:38;40179:480;40312:45;;;40302:55;;;:6;:55;;;;40295:62;;;39999:667;;;;;;:::o;51081:190::-;51206:4;51259;51230:25;51243:5;51250:4;51230:12;:25::i;:::-;:33;51223:40;;51081:190;;;;;:::o;55431:114::-;55491:13;55524;55517:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55431:114;:::o;17469:723::-;17525:13;17755:1;17746:5;:10;17742:53;;17773:10;;;;;;;;;;;;;;;;;;;;;17742:53;17805:12;17820:5;17805:20;;17836:14;17861:78;17876:1;17868:4;:9;17861:78;;17894:8;;;;;:::i;:::-;;;;17925:2;17917:10;;;;;:::i;:::-;;;17861:78;;;17949:19;17981:6;17971:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17949:39;;17999:154;18015:1;18006:5;:10;17999:154;;18043:1;18033:11;;;;;:::i;:::-;;;18110:2;18102:5;:10;;;;:::i;:::-;18089:2;:24;;;;:::i;:::-;18076:39;;18059:6;18066;18059:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18139:2;18130:11;;;;;:::i;:::-;;;17999:154;;;18177:6;18163:21;;;;;17469:723;;;;:::o;24539:305::-;24641:4;24693:25;24678:40;;;:11;:40;;;;:105;;;;24750:33;24735:48;;;:11;:48;;;;24678:105;:158;;;;24800:36;24824:11;24800:23;:36::i;:::-;24678:158;24658:178;;24539:305;;;:::o;41314:159::-;;;;;:::o;42132:158::-;;;;;:::o;31803:163::-;31926:32;31932:2;31936:8;31946:5;31953:4;31926:5;:32::i;:::-;31803:163;;;:::o;51633:675::-;51716:7;51736:20;51759:4;51736:27;;51779:9;51774:497;51798:5;:12;51794:1;:16;51774:497;;;51832:20;51855:5;51861:1;51855:8;;;;;;;;:::i;:::-;;;;;;;;51832:31;;51898:12;51882;:28;51878:382;;52025:42;52040:12;52054;52025:14;:42::i;:::-;52010:57;;51878:382;;;52202:42;52217:12;52231;52202:14;:42::i;:::-;52187:57;;51878:382;51817:454;51812:3;;;;;:::i;:::-;;;;51774:497;;;;52288:12;52281:19;;;51633:675;;;;:::o;20099:157::-;20184:4;20223:25;20208:40;;;:11;:40;;;;20201:47;;20099:157;;;:::o;32225:1775::-;32364:20;32387:13;;32364:36;;32429:1;32415:16;;:2;:16;;;32411:48;;32440:19;;;;;;;;;;;;;;32411:48;32486:1;32474:8;:13;32470:44;;32496:18;;;;;;;;;;;;;;32470:44;32527:61;32557:1;32561:2;32565:12;32579:8;32527:21;:61::i;:::-;32900:8;32865:12;:16;32878:2;32865:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32964:8;32924:12;:16;32937:2;32924:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33023:2;32990:11;:25;33002:12;32990:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;33090:15;33040:11;:25;33052:12;33040:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;33123:20;33146:12;33123:35;;33173:11;33202:8;33187:12;:23;33173:37;;33231:4;:23;;;;;33239:15;:2;:13;;;:15::i;:::-;33231:23;33227:641;;;33275:314;33331:12;33327:2;33306:38;;33323:1;33306:38;;;;;;;;;;;;33372:69;33411:1;33415:2;33419:14;;;;;;33435:5;33372:30;:69::i;:::-;33367:174;;33477:40;;;;;;;;;;;;;;33367:174;33584:3;33568:12;:19;33275:314;;33670:12;33653:13;;:29;33649:43;;33684:8;;;33649:43;33227:641;;;33733:120;33789:14;;;;;;33785:2;33764:40;;33781:1;33764:40;;;;;;;;;;;;33848:3;33832:12;:19;33733:120;;33227:641;33898:12;33882:13;:28;;;;32840:1082;;33932:60;33961:1;33965:2;33969:12;33983:8;33932:20;:60::i;:::-;32353:1647;32225:1775;;;;:::o;52316:224::-;52384:13;52447:1;52441:4;52434:15;52476:1;52470:4;52463:15;52517:4;52511;52501:21;52492:30;;52316:224;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:75::-;475:6;508:2;502:9;492:19;;442:75;:::o;523:117::-;632:1;629;622:12;646:117;755:1;752;745:12;769:149;805:7;845:66;838:5;834:78;823:89;;769:149;;;:::o;924:120::-;996:23;1013:5;996:23;:::i;:::-;989:5;986:34;976:62;;1034:1;1031;1024:12;976:62;924:120;:::o;1050:137::-;1095:5;1133:6;1120:20;1111:29;;1149:32;1175:5;1149:32;:::i;:::-;1050:137;;;;:::o;1193:327::-;1251:6;1300:2;1288:9;1279:7;1275:23;1271:32;1268:119;;;1306:79;;:::i;:::-;1268:119;1426:1;1451:52;1495:7;1486:6;1475:9;1471:22;1451:52;:::i;:::-;1441:62;;1397:116;1193:327;;;;:::o;1526:90::-;1560:7;1603:5;1596:13;1589:21;1578:32;;1526:90;;;:::o;1622:109::-;1703:21;1718:5;1703:21;:::i;:::-;1698:3;1691:34;1622:109;;:::o;1737:210::-;1824:4;1862:2;1851:9;1847:18;1839:26;;1875:65;1937:1;1926:9;1922:17;1913:6;1875:65;:::i;:::-;1737:210;;;;:::o;1953:126::-;1990:7;2030:42;2023:5;2019:54;2008:65;;1953:126;;;:::o;2085:96::-;2122:7;2151:24;2169:5;2151:24;:::i;:::-;2140:35;;2085:96;;;:::o;2187:122::-;2260:24;2278:5;2260:24;:::i;:::-;2253:5;2250:35;2240:63;;2299:1;2296;2289:12;2240:63;2187:122;:::o;2315:139::-;2361:5;2399:6;2386:20;2377:29;;2415:33;2442:5;2415:33;:::i;:::-;2315:139;;;;:::o;2460:109::-;2496:7;2536:26;2529:5;2525:38;2514:49;;2460:109;;;:::o;2575:120::-;2647:23;2664:5;2647:23;:::i;:::-;2640:5;2637:34;2627:62;;2685:1;2682;2675:12;2627:62;2575:120;:::o;2701:137::-;2746:5;2784:6;2771:20;2762:29;;2800:32;2826:5;2800:32;:::i;:::-;2701:137;;;;:::o;2844:472::-;2911:6;2919;2968:2;2956:9;2947:7;2943:23;2939:32;2936:119;;;2974:79;;:::i;:::-;2936:119;3094:1;3119:53;3164:7;3155:6;3144:9;3140:22;3119:53;:::i;:::-;3109:63;;3065:117;3221:2;3247:52;3291:7;3282:6;3271:9;3267:22;3247:52;:::i;:::-;3237:62;;3192:117;2844:472;;;;;:::o;3322:99::-;3374:6;3408:5;3402:12;3392:22;;3322:99;;;:::o;3427:169::-;3511:11;3545:6;3540:3;3533:19;3585:4;3580:3;3576:14;3561:29;;3427:169;;;;:::o;3602:307::-;3670:1;3680:113;3694:6;3691:1;3688:13;3680:113;;;3779:1;3774:3;3770:11;3764:18;3760:1;3755:3;3751:11;3744:39;3716:2;3713:1;3709:10;3704:15;;3680:113;;;3811:6;3808:1;3805:13;3802:101;;;3891:1;3882:6;3877:3;3873:16;3866:27;3802:101;3651:258;3602:307;;;:::o;3915:102::-;3956:6;4007:2;4003:7;3998:2;3991:5;3987:14;3983:28;3973:38;;3915:102;;;:::o;4023:364::-;4111:3;4139:39;4172:5;4139:39;:::i;:::-;4194:71;4258:6;4253:3;4194:71;:::i;:::-;4187:78;;4274:52;4319:6;4314:3;4307:4;4300:5;4296:16;4274:52;:::i;:::-;4351:29;4373:6;4351:29;:::i;:::-;4346:3;4342:39;4335:46;;4115:272;4023:364;;;;:::o;4393:313::-;4506:4;4544:2;4533:9;4529:18;4521:26;;4593:9;4587:4;4583:20;4579:1;4568:9;4564:17;4557:47;4621:78;4694:4;4685:6;4621:78;:::i;:::-;4613:86;;4393:313;;;;:::o;4712:122::-;4785:24;4803:5;4785:24;:::i;:::-;4778:5;4775:35;4765:63;;4824:1;4821;4814:12;4765:63;4712:122;:::o;4840:139::-;4886:5;4924:6;4911:20;4902:29;;4940:33;4967:5;4940:33;:::i;:::-;4840:139;;;;:::o;4985:329::-;5044:6;5093:2;5081:9;5072:7;5068:23;5064:32;5061:119;;;5099:79;;:::i;:::-;5061:119;5219:1;5244:53;5289:7;5280:6;5269:9;5265:22;5244:53;:::i;:::-;5234:63;;5190:117;4985:329;;;;:::o;5320:118::-;5407:24;5425:5;5407:24;:::i;:::-;5402:3;5395:37;5320:118;;:::o;5444:222::-;5537:4;5575:2;5564:9;5560:18;5552:26;;5588:71;5656:1;5645:9;5641:17;5632:6;5588:71;:::i;:::-;5444:222;;;;:::o;5672:474::-;5740:6;5748;5797:2;5785:9;5776:7;5772:23;5768:32;5765:119;;;5803:79;;:::i;:::-;5765:119;5923:1;5948:53;5993:7;5984:6;5973:9;5969:22;5948:53;:::i;:::-;5938:63;;5894:117;6050:2;6076:53;6121:7;6112:6;6101:9;6097:22;6076:53;:::i;:::-;6066:63;;6021:118;5672:474;;;;;:::o;6152:619::-;6229:6;6237;6245;6294:2;6282:9;6273:7;6269:23;6265:32;6262:119;;;6300:79;;:::i;:::-;6262:119;6420:1;6445:53;6490:7;6481:6;6470:9;6466:22;6445:53;:::i;:::-;6435:63;;6391:117;6547:2;6573:53;6618:7;6609:6;6598:9;6594:22;6573:53;:::i;:::-;6563:63;;6518:118;6675:2;6701:53;6746:7;6737:6;6726:9;6722:22;6701:53;:::i;:::-;6691:63;;6646:118;6152:619;;;;;:::o;6777:474::-;6845:6;6853;6902:2;6890:9;6881:7;6877:23;6873:32;6870:119;;;6908:79;;:::i;:::-;6870:119;7028:1;7053:53;7098:7;7089:6;7078:9;7074:22;7053:53;:::i;:::-;7043:63;;6999:117;7155:2;7181:53;7226:7;7217:6;7206:9;7202:22;7181:53;:::i;:::-;7171:63;;7126:118;6777:474;;;;;:::o;7257:332::-;7378:4;7416:2;7405:9;7401:18;7393:26;;7429:71;7497:1;7486:9;7482:17;7473:6;7429:71;:::i;:::-;7510:72;7578:2;7567:9;7563:18;7554:6;7510:72;:::i;:::-;7257:332;;;;;:::o;7595:77::-;7632:7;7661:5;7650:16;;7595:77;;;:::o;7678:118::-;7765:24;7783:5;7765:24;:::i;:::-;7760:3;7753:37;7678:118;;:::o;7802:222::-;7895:4;7933:2;7922:9;7918:18;7910:26;;7946:71;8014:1;8003:9;7999:17;7990:6;7946:71;:::i;:::-;7802:222;;;;:::o;8030:329::-;8089:6;8138:2;8126:9;8117:7;8113:23;8109:32;8106:119;;;8144:79;;:::i;:::-;8106:119;8264:1;8289:53;8334:7;8325:6;8314:9;8310:22;8289:53;:::i;:::-;8279:63;;8235:117;8030:329;;;;:::o;8365:474::-;8433:6;8441;8490:2;8478:9;8469:7;8465:23;8461:32;8458:119;;;8496:79;;:::i;:::-;8458:119;8616:1;8641:53;8686:7;8677:6;8666:9;8662:22;8641:53;:::i;:::-;8631:63;;8587:117;8743:2;8769:53;8814:7;8805:6;8794:9;8790:22;8769:53;:::i;:::-;8759:63;;8714:118;8365:474;;;;;:::o;8845:117::-;8954:1;8951;8944:12;8968:117;9077:1;9074;9067:12;9091:180;9139:77;9136:1;9129:88;9236:4;9233:1;9226:15;9260:4;9257:1;9250:15;9277:281;9360:27;9382:4;9360:27;:::i;:::-;9352:6;9348:40;9490:6;9478:10;9475:22;9454:18;9442:10;9439:34;9436:62;9433:88;;;9501:18;;:::i;:::-;9433:88;9541:10;9537:2;9530:22;9320:238;9277:281;;:::o;9564:129::-;9598:6;9625:20;;:::i;:::-;9615:30;;9654:33;9682:4;9674:6;9654:33;:::i;:::-;9564:129;;;:::o;9699:308::-;9761:4;9851:18;9843:6;9840:30;9837:56;;;9873:18;;:::i;:::-;9837:56;9911:29;9933:6;9911:29;:::i;:::-;9903:37;;9995:4;9989;9985:15;9977:23;;9699:308;;;:::o;10013:154::-;10097:6;10092:3;10087;10074:30;10159:1;10150:6;10145:3;10141:16;10134:27;10013:154;;;:::o;10173:412::-;10251:5;10276:66;10292:49;10334:6;10292:49;:::i;:::-;10276:66;:::i;:::-;10267:75;;10365:6;10358:5;10351:21;10403:4;10396:5;10392:16;10441:3;10432:6;10427:3;10423:16;10420:25;10417:112;;;10448:79;;:::i;:::-;10417:112;10538:41;10572:6;10567:3;10562;10538:41;:::i;:::-;10257:328;10173:412;;;;;:::o;10605:340::-;10661:5;10710:3;10703:4;10695:6;10691:17;10687:27;10677:122;;10718:79;;:::i;:::-;10677:122;10835:6;10822:20;10860:79;10935:3;10927:6;10920:4;10912:6;10908:17;10860:79;:::i;:::-;10851:88;;10667:278;10605:340;;;;:::o;10951:509::-;11020:6;11069:2;11057:9;11048:7;11044:23;11040:32;11037:119;;;11075:79;;:::i;:::-;11037:119;11223:1;11212:9;11208:17;11195:31;11253:18;11245:6;11242:30;11239:117;;;11275:79;;:::i;:::-;11239:117;11380:63;11435:7;11426:6;11415:9;11411:22;11380:63;:::i;:::-;11370:73;;11166:287;10951:509;;;;:::o;11466:86::-;11501:7;11541:4;11534:5;11530:16;11519:27;;11466:86;;;:::o;11558:118::-;11629:22;11645:5;11629:22;:::i;:::-;11622:5;11619:33;11609:61;;11666:1;11663;11656:12;11609:61;11558:118;:::o;11682:135::-;11726:5;11764:6;11751:20;11742:29;;11780:31;11805:5;11780:31;:::i;:::-;11682:135;;;;:::o;11823:325::-;11880:6;11929:2;11917:9;11908:7;11904:23;11900:32;11897:119;;;11935:79;;:::i;:::-;11897:119;12055:1;12080:51;12123:7;12114:6;12103:9;12099:22;12080:51;:::i;:::-;12070:61;;12026:115;11823:325;;;;:::o;12154:180::-;12202:77;12199:1;12192:88;12299:4;12296:1;12289:15;12323:4;12320:1;12313:15;12340:119;12427:1;12420:5;12417:12;12407:46;;12433:18;;:::i;:::-;12407:46;12340:119;:::o;12465:139::-;12516:7;12545:5;12534:16;;12551:47;12592:5;12551:47;:::i;:::-;12465:139;;;:::o;12610:::-;12672:9;12705:38;12737:5;12705:38;:::i;:::-;12692:51;;12610:139;;;:::o;12755:155::-;12854:49;12897:5;12854:49;:::i;:::-;12849:3;12842:62;12755:155;;:::o;12916:246::-;13021:4;13059:2;13048:9;13044:18;13036:26;;13072:83;13152:1;13141:9;13137:17;13128:6;13072:83;:::i;:::-;12916:246;;;;:::o;13168:122::-;13241:24;13259:5;13241:24;:::i;:::-;13234:5;13231:35;13221:63;;13280:1;13277;13270:12;13221:63;13168:122;:::o;13296:139::-;13342:5;13380:6;13367:20;13358:29;;13396:33;13423:5;13396:33;:::i;:::-;13296:139;;;;:::o;13441:329::-;13500:6;13549:2;13537:9;13528:7;13524:23;13520:32;13517:119;;;13555:79;;:::i;:::-;13517:119;13675:1;13700:53;13745:7;13736:6;13725:9;13721:22;13700:53;:::i;:::-;13690:63;;13646:117;13441:329;;;;:::o;13776:116::-;13846:21;13861:5;13846:21;:::i;:::-;13839:5;13836:32;13826:60;;13882:1;13879;13872:12;13826:60;13776:116;:::o;13898:133::-;13941:5;13979:6;13966:20;13957:29;;13995:30;14019:5;13995:30;:::i;:::-;13898:133;;;;:::o;14037:468::-;14102:6;14110;14159:2;14147:9;14138:7;14134:23;14130:32;14127:119;;;14165:79;;:::i;:::-;14127:119;14285:1;14310:53;14355:7;14346:6;14335:9;14331:22;14310:53;:::i;:::-;14300:63;;14256:117;14412:2;14438:50;14480:7;14471:6;14460:9;14456:22;14438:50;:::i;:::-;14428:60;;14383:115;14037:468;;;;;:::o;14511:307::-;14572:4;14662:18;14654:6;14651:30;14648:56;;;14684:18;;:::i;:::-;14648:56;14722:29;14744:6;14722:29;:::i;:::-;14714:37;;14806:4;14800;14796:15;14788:23;;14511:307;;;:::o;14824:410::-;14901:5;14926:65;14942:48;14983:6;14942:48;:::i;:::-;14926:65;:::i;:::-;14917:74;;15014:6;15007:5;15000:21;15052:4;15045:5;15041:16;15090:3;15081:6;15076:3;15072:16;15069:25;15066:112;;;15097:79;;:::i;:::-;15066:112;15187:41;15221:6;15216:3;15211;15187:41;:::i;:::-;14907:327;14824:410;;;;;:::o;15253:338::-;15308:5;15357:3;15350:4;15342:6;15338:17;15334:27;15324:122;;15365:79;;:::i;:::-;15324:122;15482:6;15469:20;15507:78;15581:3;15573:6;15566:4;15558:6;15554:17;15507:78;:::i;:::-;15498:87;;15314:277;15253:338;;;;:::o;15597:943::-;15692:6;15700;15708;15716;15765:3;15753:9;15744:7;15740:23;15736:33;15733:120;;;15772:79;;:::i;:::-;15733:120;15892:1;15917:53;15962:7;15953:6;15942:9;15938:22;15917:53;:::i;:::-;15907:63;;15863:117;16019:2;16045:53;16090:7;16081:6;16070:9;16066:22;16045:53;:::i;:::-;16035:63;;15990:118;16147:2;16173:53;16218:7;16209:6;16198:9;16194:22;16173:53;:::i;:::-;16163:63;;16118:118;16303:2;16292:9;16288:18;16275:32;16334:18;16326:6;16323:30;16320:117;;;16356:79;;:::i;:::-;16320:117;16461:62;16515:7;16506:6;16495:9;16491:22;16461:62;:::i;:::-;16451:72;;16246:287;15597:943;;;;;;;:::o;16546:117::-;16655:1;16652;16645:12;16669:117;16778:1;16775;16768:12;16809:568;16882:8;16892:6;16942:3;16935:4;16927:6;16923:17;16919:27;16909:122;;16950:79;;:::i;:::-;16909:122;17063:6;17050:20;17040:30;;17093:18;17085:6;17082:30;17079:117;;;17115:79;;:::i;:::-;17079:117;17229:4;17221:6;17217:17;17205:29;;17283:3;17275:4;17267:6;17263:17;17253:8;17249:32;17246:41;17243:128;;;17290:79;;:::i;:::-;17243:128;16809:568;;;;;:::o;17383:704::-;17478:6;17486;17494;17543:2;17531:9;17522:7;17518:23;17514:32;17511:119;;;17549:79;;:::i;:::-;17511:119;17669:1;17694:53;17739:7;17730:6;17719:9;17715:22;17694:53;:::i;:::-;17684:63;;17640:117;17824:2;17813:9;17809:18;17796:32;17855:18;17847:6;17844:30;17841:117;;;17877:79;;:::i;:::-;17841:117;17990:80;18062:7;18053:6;18042:9;18038:22;17990:80;:::i;:::-;17972:98;;;;17767:313;17383:704;;;;;:::o;18093:474::-;18161:6;18169;18218:2;18206:9;18197:7;18193:23;18189:32;18186:119;;;18224:79;;:::i;:::-;18186:119;18344:1;18369:53;18414:7;18405:6;18394:9;18390:22;18369:53;:::i;:::-;18359:63;;18315:117;18471:2;18497:53;18542:7;18533:6;18522:9;18518:22;18497:53;:::i;:::-;18487:63;;18442:118;18093:474;;;;;:::o;18573:182::-;18713:34;18709:1;18701:6;18697:14;18690:58;18573:182;:::o;18761:366::-;18903:3;18924:67;18988:2;18983:3;18924:67;:::i;:::-;18917:74;;19000:93;19089:3;19000:93;:::i;:::-;19118:2;19113:3;19109:12;19102:19;;18761:366;;;:::o;19133:419::-;19299:4;19337:2;19326:9;19322:18;19314:26;;19386:9;19380:4;19376:20;19372:1;19361:9;19357:17;19350:47;19414:131;19540:4;19414:131;:::i;:::-;19406:139;;19133:419;;;:::o;19558:180::-;19606:77;19603:1;19596:88;19703:4;19700:1;19693:15;19727:4;19724:1;19717:15;19744:320;19788:6;19825:1;19819:4;19815:12;19805:22;;19872:1;19866:4;19862:12;19893:18;19883:81;;19949:4;19941:6;19937:17;19927:27;;19883:81;20011:2;20003:6;20000:14;19980:18;19977:38;19974:84;;20030:18;;:::i;:::-;19974:84;19795:269;19744:320;;;:::o;20070:180::-;20118:77;20115:1;20108:88;20215:4;20212:1;20205:15;20239:4;20236:1;20229:15;20256:348;20296:7;20319:20;20337:1;20319:20;:::i;:::-;20314:25;;20353:20;20371:1;20353:20;:::i;:::-;20348:25;;20541:1;20473:66;20469:74;20466:1;20463:81;20458:1;20451:9;20444:17;20440:105;20437:131;;;20548:18;;:::i;:::-;20437:131;20596:1;20593;20589:9;20578:20;;20256:348;;;;:::o;20610:180::-;20658:77;20655:1;20648:88;20755:4;20752:1;20745:15;20779:4;20776:1;20769:15;20796:185;20836:1;20853:20;20871:1;20853:20;:::i;:::-;20848:25;;20887:20;20905:1;20887:20;:::i;:::-;20882:25;;20926:1;20916:35;;20931:18;;:::i;:::-;20916:35;20973:1;20970;20966:9;20961:14;;20796:185;;;;:::o;20987:191::-;21027:4;21047:20;21065:1;21047:20;:::i;:::-;21042:25;;21081:20;21099:1;21081:20;:::i;:::-;21076:25;;21120:1;21117;21114:8;21111:34;;;21125:18;;:::i;:::-;21111:34;21170:1;21167;21163:9;21155:17;;20987:191;;;;:::o;21184:305::-;21224:3;21243:20;21261:1;21243:20;:::i;:::-;21238:25;;21277:20;21295:1;21277:20;:::i;:::-;21272:25;;21431:1;21363:66;21359:74;21356:1;21353:81;21350:107;;;21437:18;;:::i;:::-;21350:107;21481:1;21478;21474:9;21467:16;;21184:305;;;;:::o;21495:180::-;21543:77;21540:1;21533:88;21640:4;21637:1;21630:15;21664:4;21661:1;21654:15;21681:233;21720:3;21743:24;21761:5;21743:24;:::i;:::-;21734:33;;21789:66;21782:5;21779:77;21776:103;;21859:18;;:::i;:::-;21776:103;21906:1;21899:5;21895:13;21888:20;;21681:233;;;:::o;21920:94::-;21953:8;22001:5;21997:2;21993:14;21972:35;;21920:94;;;:::o;22020:::-;22059:7;22088:20;22102:5;22088:20;:::i;:::-;22077:31;;22020:94;;;:::o;22120:100::-;22159:7;22188:26;22208:5;22188:26;:::i;:::-;22177:37;;22120:100;;;:::o;22226:157::-;22331:45;22351:24;22369:5;22351:24;:::i;:::-;22331:45;:::i;:::-;22326:3;22319:58;22226:157;;:::o;22389:256::-;22501:3;22516:75;22587:3;22578:6;22516:75;:::i;:::-;22616:2;22611:3;22607:12;22600:19;;22636:3;22629:10;;22389:256;;;;:::o;22651:148::-;22753:11;22790:3;22775:18;;22651:148;;;;:::o;22805:377::-;22911:3;22939:39;22972:5;22939:39;:::i;:::-;22994:89;23076:6;23071:3;22994:89;:::i;:::-;22987:96;;23092:52;23137:6;23132:3;23125:4;23118:5;23114:16;23092:52;:::i;:::-;23169:6;23164:3;23160:16;23153:23;;22915:267;22805:377;;;;:::o;23188:435::-;23368:3;23390:95;23481:3;23472:6;23390:95;:::i;:::-;23383:102;;23502:95;23593:3;23584:6;23502:95;:::i;:::-;23495:102;;23614:3;23607:10;;23188:435;;;;;:::o;23629:225::-;23769:34;23765:1;23757:6;23753:14;23746:58;23838:8;23833:2;23825:6;23821:15;23814:33;23629:225;:::o;23860:366::-;24002:3;24023:67;24087:2;24082:3;24023:67;:::i;:::-;24016:74;;24099:93;24188:3;24099:93;:::i;:::-;24217:2;24212:3;24208:12;24201:19;;23860:366;;;:::o;24232:419::-;24398:4;24436:2;24425:9;24421:18;24413:26;;24485:9;24479:4;24475:20;24471:1;24460:9;24456:17;24449:47;24513:131;24639:4;24513:131;:::i;:::-;24505:139;;24232:419;;;:::o;24657:229::-;24797:34;24793:1;24785:6;24781:14;24774:58;24866:12;24861:2;24853:6;24849:15;24842:37;24657:229;:::o;24892:366::-;25034:3;25055:67;25119:2;25114:3;25055:67;:::i;:::-;25048:74;;25131:93;25220:3;25131:93;:::i;:::-;25249:2;25244:3;25240:12;25233:19;;24892:366;;;:::o;25264:419::-;25430:4;25468:2;25457:9;25453:18;25445:26;;25517:9;25511:4;25507:20;25503:1;25492:9;25488:17;25481:47;25545:131;25671:4;25545:131;:::i;:::-;25537:139;;25264:419;;;:::o;25689:175::-;25829:27;25825:1;25817:6;25813:14;25806:51;25689:175;:::o;25870:366::-;26012:3;26033:67;26097:2;26092:3;26033:67;:::i;:::-;26026:74;;26109:93;26198:3;26109:93;:::i;:::-;26227:2;26222:3;26218:12;26211:19;;25870:366;;;:::o;26242:419::-;26408:4;26446:2;26435:9;26431:18;26423:26;;26495:9;26489:4;26485:20;26481:1;26470:9;26466:17;26459:47;26523:131;26649:4;26523:131;:::i;:::-;26515:139;;26242:419;;;:::o;26667:147::-;26768:11;26805:3;26790:18;;26667:147;;;;:::o;26820:114::-;;:::o;26940:398::-;27099:3;27120:83;27201:1;27196:3;27120:83;:::i;:::-;27113:90;;27212:93;27301:3;27212:93;:::i;:::-;27330:1;27325:3;27321:11;27314:18;;26940:398;;;:::o;27344:379::-;27528:3;27550:147;27693:3;27550:147;:::i;:::-;27543:154;;27714:3;27707:10;;27344:379;;;:::o;27729:98::-;27780:6;27814:5;27808:12;27798:22;;27729:98;;;:::o;27833:168::-;27916:11;27950:6;27945:3;27938:19;27990:4;27985:3;27981:14;27966:29;;27833:168;;;;:::o;28007:360::-;28093:3;28121:38;28153:5;28121:38;:::i;:::-;28175:70;28238:6;28233:3;28175:70;:::i;:::-;28168:77;;28254:52;28299:6;28294:3;28287:4;28280:5;28276:16;28254:52;:::i;:::-;28331:29;28353:6;28331:29;:::i;:::-;28326:3;28322:39;28315:46;;28097:270;28007:360;;;;:::o;28373:640::-;28568:4;28606:3;28595:9;28591:19;28583:27;;28620:71;28688:1;28677:9;28673:17;28664:6;28620:71;:::i;:::-;28701:72;28769:2;28758:9;28754:18;28745:6;28701:72;:::i;:::-;28783;28851:2;28840:9;28836:18;28827:6;28783:72;:::i;:::-;28902:9;28896:4;28892:20;28887:2;28876:9;28872:18;28865:48;28930:76;29001:4;28992:6;28930:76;:::i;:::-;28922:84;;28373:640;;;;;;;:::o;29019:141::-;29075:5;29106:6;29100:13;29091:22;;29122:32;29148:5;29122:32;:::i;:::-;29019:141;;;;:::o;29166:349::-;29235:6;29284:2;29272:9;29263:7;29259:23;29255:32;29252:119;;;29290:79;;:::i;:::-;29252:119;29410:1;29435:63;29490:7;29481:6;29470:9;29466:22;29435:63;:::i;:::-;29425:73;;29381:127;29166:349;;;;:::o;29521:176::-;29553:1;29570:20;29588:1;29570:20;:::i;:::-;29565:25;;29604:20;29622:1;29604:20;:::i;:::-;29599:25;;29643:1;29633:35;;29648:18;;:::i;:::-;29633:35;29689:1;29686;29682:9;29677:14;;29521:176;;;;:::o

Swarm Source

ipfs://1f60120ac0fb62e0d36010cc650e8437465a430d5b9e50bb0f7378cf4eeacc43
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.