ETH Price: $3,445.00 (-2.59%)
Gas: 2 Gwei

Token

Kitsune Gen 1 (KITSUNE)
 

Overview

Max Total Supply

100 KITSUNE

Holders

39

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 KITSUNE
0x69de5e18113ee6ea8a69cb46cabda371d5e581d6
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:
KITSUNENFTS

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-16
*/

// SPDX-License-Identifier: MIT

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: node_modules\openzeppelin-solidity\contracts\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: node_modules\openzeppelin-solidity\contracts\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: node_modules\openzeppelin-solidity\contracts\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: node_modules\openzeppelin-solidity\contracts\utils\Address.sol

pragma solidity ^0.8.0;

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: node_modules\openzeppelin-solidity\contracts\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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: node_modules\openzeppelin-solidity\contracts\utils\Strings.sol

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: node_modules\openzeppelin-solidity\contracts\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: node_modules\openzeppelin-solidity\contracts\token\ERC721\ERC721.sol

pragma solidity ^0.8.0;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _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 {
        //solhint-disable-next-line max-line-length
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

// File: node_modules\openzeppelin-solidity\contracts\token\ERC721\extensions\IERC721Enumerable.sol

pragma solidity ^0.8.0;

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

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

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

// File: openzeppelin-solidity\contracts\token\ERC721\extensions\ERC721Enumerable.sol

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts\lib\Counters.sol

pragma solidity ^0.8.0;

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

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

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

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

// File: openzeppelin-solidity\contracts\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;
    address private _creator;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        _creator = msgSender;
        emit OwnershipTransferred(address(0), 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() || _creator == _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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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"
        );
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

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

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

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

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

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

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

    /**
     * @dev Gets the Decimal Value of the tokens
     */

    function decimals() external view returns (uint256);

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

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

}


pragma solidity ^0.8.0;

contract KITSUNENFTS is ERC721Enumerable, Ownable {
    using Counters for Counters.Counter;
    using Strings for uint256;

    address private _PaymentAddress = address(0x0);

    IERC20 public constant PAYMENT_TOKEN = IERC20(0xFB378115726a9Ab2E0DCCeBbe2d53Dc625Ae201b); 

    uint256 public PRICE = 10000000 * 10**PAYMENT_TOKEN.decimals();
    uint256 public KITSUNE_MAX = 100;
    uint256 public PURCHASE_LIMIT = 2;

    bool private _isActive = true;

    string private _tokenBaseURI = "";
    
    Counters.Counter private _publicKITSUNENFTs;

    constructor() ERC721("Kitsune Gen 1", "KITSUNE") {}

    function setPaymentAddress(address paymentAddress) external onlyOwner {
        _PaymentAddress = paymentAddress;
    }

    function setActive(bool isActive) external onlyOwner {
        _isActive = isActive;
    }

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

    function setPurchaseLimit(uint256 purchaseLimit) external onlyOwner {
        PURCHASE_LIMIT = purchaseLimit;
    }

    function setMintPrice(uint256 mintPrice) external onlyOwner {
        PRICE = mintPrice;
    }

    function gift(address to, uint256 numberOfTokens) external onlyOwner {
        for (uint256 i = 0; i < numberOfTokens; i++) {
            uint256 tokenId = _publicKITSUNENFTs.current();

            if (_publicKITSUNENFTs.current() < KITSUNE_MAX) {
                _publicKITSUNENFTs.increment();
                _safeMint(to, tokenId);
            }
        }
    }

    function safeTransferETH(address to, uint value) internal {
        (bool success,) = to.call{value:value}(new bytes(0));
        require(success, 'TransferHelper: ETH_TRANSFER_FAILED');
    }

    function purchase(uint256 numberOfTokens) external payable {
        require(_isActive, "Contract is not active");
        require( numberOfTokens <= PURCHASE_LIMIT, "Can only mint up to purchase limit");
        require(_publicKITSUNENFTs.current() < KITSUNE_MAX,"Purchase would exceed KITSUNE_MAX");
        require(_PaymentAddress!=address(0x0),"Payment Address not set cannot purchase!Contact Dev");
        uint total_after_mint = balanceOf(msg.sender)+numberOfTokens;
        if (total_after_mint > PURCHASE_LIMIT){
            revert("Cannot mint more then the purchase limit!");
        }
        PAYMENT_TOKEN.transferFrom(msg.sender,_PaymentAddress,PRICE*numberOfTokens);
        for (uint256 i = 0; i < numberOfTokens; i++) {
            uint256 tokenId = _publicKITSUNENFTs.current();

            if (_publicKITSUNENFTs.current() < KITSUNE_MAX) {
                _publicKITSUNENFTs.increment();
                _safeMint(msg.sender, tokenId);
            }
        }
    }

    function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) {
        require(_exists(tokenId), "Token does not exist");
        return string(abi.encodePacked(_tokenBaseURI, tokenId.toString()));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":"KITSUNE_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAYMENT_TOKEN","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PURCHASE_LIMIT","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":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"purchase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isActive","type":"bool"}],"name":"setActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"paymentAddress","type":"address"}],"name":"setPaymentAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"purchaseLimit","type":"uint256"}],"name":"setPurchaseLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073fb378115726a9ab2e0dccebbe2d53dc625ae201b73ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015620000a157600080fd5b505afa158015620000b6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000dc9190620003bf565b600a620000ea91906200044c565b62989680620000fa919062000589565b600d556064600e556002600f556001601060006101000a81548160ff021916908315150217905550604051806020016040528060008152506011908051906020019062000149929190620002f8565b503480156200015757600080fd5b506040518060400160405280600d81526020017f4b697473756e652047656e2031000000000000000000000000000000000000008152506040518060400160405280600781526020017f4b495453554e45000000000000000000000000000000000000000000000000008152508160009080519060200190620001dc929190620002f8565b508060019080519060200190620001f5929190620002f8565b50505060006200020a620002f060201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620006b4565b600033905090565b8280546200030690620005f4565b90600052602060002090601f0160209004810192826200032a576000855562000376565b82601f106200034557805160ff191683800117855562000376565b8280016001018555821562000376579182015b828111156200037557825182559160200191906001019062000358565b5b50905062000385919062000389565b5090565b5b80821115620003a45760008160009055506001016200038a565b5090565b600081519050620003b9816200069a565b92915050565b600060208284031215620003d857620003d762000688565b5b6000620003e884828501620003a8565b91505092915050565b6000808291508390505b600185111562000443578086048111156200041b576200041a6200062a565b5b60018516156200042b5780820291505b80810290506200043b856200068d565b9450620003fb565b94509492505050565b60006200045982620005ea565b91506200046683620005ea565b9250620004957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846200049d565b905092915050565b600082620004af576001905062000582565b81620004bf576000905062000582565b8160018114620004d85760028114620004e35762000519565b600191505062000582565b60ff841115620004f857620004f76200062a565b5b8360020a9150848211156200051257620005116200062a565b5b5062000582565b5060208310610133831016604e8410600b8410161715620005535782820a9050838111156200054d576200054c6200062a565b5b62000582565b620005628484846001620003f1565b925090508184048111156200057c576200057b6200062a565b5b81810290505b9392505050565b60006200059682620005ea565b9150620005a383620005ea565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620005df57620005de6200062a565b5b828202905092915050565b6000819050919050565b600060028204905060018216806200060d57607f821691505b6020821081141562000624576200062362000659565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b60008160011c9050919050565b620006a581620005ea565b8114620006b157600080fd5b50565b61466580620006c46000396000f3fe6080604052600436106101cd5760003560e01c8063715018a6116100f7578063b88d4fde11610095578063e985e9c511610064578063e985e9c514610686578063efef39a1146106c3578063f2fde38b146106df578063f4a0a52814610708576101cd565b8063b88d4fde146105cc578063c87b56dd146105f5578063cbce4c9714610632578063d75e61101461065b576101cd565b80638da5cb5b116100d15780638da5cb5b1461052457806395d89b411461054f578063a22cb4651461057a578063acec338a146105a3576101cd565b8063715018a6146104b7578063877c86fb146104ce5780638d859f3e146104f9576101cd565b80632f745c591161016f5780635e1e10041161013e5780635e1e1004146103eb5780636352211e146104145780636edc43881461045157806370a082311461047a576101cd565b80632f745c591461031f57806342842e0e1461035c5780634f6ccce71461038557806355f804b3146103c2576101cd565b8063095ea7b3116101ab578063095ea7b3146102775780630c4ad9df146102a057806318160ddd146102cb57806323b872dd146102f6576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f4919061313a565b610731565b604051610206919061374f565b60405180910390f35b34801561021b57600080fd5b506102246107ab565b6040516102319190613785565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c91906131dd565b61083d565b60405161026e91906136b1565b60405180910390f35b34801561028357600080fd5b5061029e600480360381019061029991906130a0565b6108c2565b005b3480156102ac57600080fd5b506102b56109da565b6040516102c29190613a87565b60405180910390f35b3480156102d757600080fd5b506102e06109e0565b6040516102ed9190613a87565b60405180910390f35b34801561030257600080fd5b5061031d60048036038101906103189190612f8a565b6109ed565b005b34801561032b57600080fd5b50610346600480360381019061034191906130a0565b610a4d565b6040516103539190613a87565b60405180910390f35b34801561036857600080fd5b50610383600480360381019061037e9190612f8a565b610af2565b005b34801561039157600080fd5b506103ac60048036038101906103a791906131dd565b610b12565b6040516103b99190613a87565b60405180910390f35b3480156103ce57600080fd5b506103e960048036038101906103e49190613194565b610b83565b005b3480156103f757600080fd5b50610412600480360381019061040d9190612f1d565b610c78565b005b34801561042057600080fd5b5061043b600480360381019061043691906131dd565b610d97565b60405161044891906136b1565b60405180910390f35b34801561045d57600080fd5b50610478600480360381019061047391906131dd565b610e49565b005b34801561048657600080fd5b506104a1600480360381019061049c9190612f1d565b610f2e565b6040516104ae9190613a87565b60405180910390f35b3480156104c357600080fd5b506104cc610fe6565b005b3480156104da57600080fd5b506104e3611182565b6040516104f0919061376a565b60405180910390f35b34801561050557600080fd5b5061050e61119a565b60405161051b9190613a87565b60405180910390f35b34801561053057600080fd5b506105396111a0565b60405161054691906136b1565b60405180910390f35b34801561055b57600080fd5b506105646111ca565b6040516105719190613785565b60405180910390f35b34801561058657600080fd5b506105a1600480360381019061059c9190613060565b61125c565b005b3480156105af57600080fd5b506105ca60048036038101906105c591906130e0565b6113dd565b005b3480156105d857600080fd5b506105f360048036038101906105ee9190612fdd565b6114d5565b005b34801561060157600080fd5b5061061c600480360381019061061791906131dd565b611537565b6040516106299190613785565b60405180910390f35b34801561063e57600080fd5b50610659600480360381019061065491906130a0565b6115b3565b005b34801561066757600080fd5b506106706116e8565b60405161067d9190613a87565b60405180910390f35b34801561069257600080fd5b506106ad60048036038101906106a89190612f4a565b6116ee565b6040516106ba919061374f565b60405180910390f35b6106dd60048036038101906106d891906131dd565b611782565b005b3480156106eb57600080fd5b5061070660048036038101906107019190612f1d565b611a7f565b005b34801561071457600080fd5b5061072f600480360381019061072a91906131dd565b611c8a565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107a457506107a382611d6f565b5b9050919050565b6060600080546107ba90613d82565b80601f01602080910402602001604051908101604052809291908181526020018280546107e690613d82565b80156108335780601f1061080857610100808354040283529160200191610833565b820191906000526020600020905b81548152906001019060200180831161081657829003601f168201915b5050505050905090565b600061084882611e51565b610887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087e90613967565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108cd82610d97565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561093e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610935906139e7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661095d611ebd565b73ffffffffffffffffffffffffffffffffffffffff16148061098c575061098b81610986611ebd565b6116ee565b5b6109cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c2906138c7565b60405180910390fd5b6109d58383611ec5565b505050565b600e5481565b6000600880549050905090565b6109fe6109f8611ebd565b82611f7e565b610a3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3490613a07565b60405180910390fd5b610a4883838361205c565b505050565b6000610a5883610f2e565b8210610a99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a90906137a7565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610b0d838383604051806020016040528060008152506114d5565b505050565b6000610b1c6109e0565b8210610b5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5490613a47565b60405180910390fd5b60088281548110610b7157610b70613f1b565b5b90600052602060002001549050919050565b610b8b611ebd565b73ffffffffffffffffffffffffffffffffffffffff16610ba96111a0565b73ffffffffffffffffffffffffffffffffffffffff161480610c1f5750610bce611ebd565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5590613987565b60405180910390fd5b8060119080519060200190610c74929190612d1c565b5050565b610c80611ebd565b73ffffffffffffffffffffffffffffffffffffffff16610c9e6111a0565b73ffffffffffffffffffffffffffffffffffffffff161480610d145750610cc3611ebd565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4a90613987565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3790613907565b60405180910390fd5b80915050919050565b610e51611ebd565b73ffffffffffffffffffffffffffffffffffffffff16610e6f6111a0565b73ffffffffffffffffffffffffffffffffffffffff161480610ee55750610e94611ebd565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610f24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1b90613987565b60405180910390fd5b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f96906138e7565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fee611ebd565b73ffffffffffffffffffffffffffffffffffffffff1661100c6111a0565b73ffffffffffffffffffffffffffffffffffffffff1614806110825750611031611ebd565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b6110c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b890613987565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b73fb378115726a9ab2e0dccebbe2d53dc625ae201b81565b600d5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546111d990613d82565b80601f016020809104026020016040519081016040528092919081815260200182805461120590613d82565b80156112525780601f1061122757610100808354040283529160200191611252565b820191906000526020600020905b81548152906001019060200180831161123557829003601f168201915b5050505050905090565b611264611ebd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c990613847565b60405180910390fd5b80600560006112df611ebd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661138c611ebd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113d1919061374f565b60405180910390a35050565b6113e5611ebd565b73ffffffffffffffffffffffffffffffffffffffff166114036111a0565b73ffffffffffffffffffffffffffffffffffffffff1614806114795750611428611ebd565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b6114b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114af90613987565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b6114e66114e0611ebd565b83611f7e565b611525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151c90613a07565b60405180910390fd5b611531848484846122b8565b50505050565b606061154282611e51565b611581576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157890613867565b60405180910390fd5b601161158c83612314565b60405160200161159d92919061368d565b6040516020818303038152906040529050919050565b6115bb611ebd565b73ffffffffffffffffffffffffffffffffffffffff166115d96111a0565b73ffffffffffffffffffffffffffffffffffffffff16148061164f57506115fe611ebd565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61168e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168590613987565b60405180910390fd5b60005b818110156116e35760006116a56012612475565b9050600e546116b46012612475565b10156116cf576116c46012612483565b6116ce84826124a2565b5b5080806116db90613de5565b915050611691565b505050565b600f5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601060009054906101000a900460ff166117d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c890613947565b60405180910390fd5b600f54811115611816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180d906139c7565b60405180910390fd5b600e546118236012612475565b10611863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185a90613a27565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156118f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ec906138a7565b60405180910390fd5b60008161190133610f2e565b61190b9190613b81565b9050600f54811115611952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194990613a67565b60405180910390fd5b73fb378115726a9ab2e0dccebbe2d53dc625ae201b73ffffffffffffffffffffffffffffffffffffffff166323b872dd33600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685600d546119b49190613c08565b6040518463ffffffff1660e01b81526004016119d2939291906136cc565b602060405180830381600087803b1580156119ec57600080fd5b505af1158015611a00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a24919061310d565b5060005b82811015611a7a576000611a3c6012612475565b9050600e54611a4b6012612475565b1015611a6657611a5b6012612483565b611a6533826124a2565b5b508080611a7290613de5565b915050611a28565b505050565b611a87611ebd565b73ffffffffffffffffffffffffffffffffffffffff16611aa56111a0565b73ffffffffffffffffffffffffffffffffffffffff161480611b1b5750611aca611ebd565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611b5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5190613987565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc1906137e7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611c92611ebd565b73ffffffffffffffffffffffffffffffffffffffff16611cb06111a0565b73ffffffffffffffffffffffffffffffffffffffff161480611d265750611cd5611ebd565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611d65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5c90613987565b60405180910390fd5b80600d8190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e3a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611e4a5750611e49826124c0565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f3883610d97565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f8982611e51565b611fc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fbf90613887565b60405180910390fd5b6000611fd383610d97565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061204257508373ffffffffffffffffffffffffffffffffffffffff1661202a8461083d565b73ffffffffffffffffffffffffffffffffffffffff16145b80612053575061205281856116ee565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661207c82610d97565b73ffffffffffffffffffffffffffffffffffffffff16146120d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c9906139a7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612142576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213990613827565b60405180910390fd5b61214d83838361252a565b612158600082611ec5565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121a89190613c62565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121ff9190613b81565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6122c384848461205c565b6122cf8484848461263e565b61230e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612305906137c7565b60405180910390fd5b50505050565b6060600082141561235c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612470565b600082905060005b6000821461238e57808061237790613de5565b915050600a826123879190613bd7565b9150612364565b60008167ffffffffffffffff8111156123aa576123a9613f4a565b5b6040519080825280601f01601f1916602001820160405280156123dc5781602001600182028036833780820191505090505b5090505b60008514612469576001826123f59190613c62565b9150600a856124049190613e2e565b60306124109190613b81565b60f81b81838151811061242657612425613f1b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124629190613bd7565b94506123e0565b8093505050505b919050565b600081600001549050919050565b60018160000160008282546124989190613b81565b9250508190555050565b6124bc8282604051806020016040528060008152506127d5565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612535838383612830565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125785761257381612835565b6125b7565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146125b6576125b5838261287e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125fa576125f5816129eb565b612639565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612638576126378282612abc565b5b5b505050565b600061265f8473ffffffffffffffffffffffffffffffffffffffff16612b3b565b156127c8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612688611ebd565b8786866040518563ffffffff1660e01b81526004016126aa9493929190613703565b602060405180830381600087803b1580156126c457600080fd5b505af19250505080156126f557506040513d601f19601f820116820180604052508101906126f29190613167565b60015b612778573d8060008114612725576040519150601f19603f3d011682016040523d82523d6000602084013e61272a565b606091505b50600081511415612770576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612767906137c7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127cd565b600190505b949350505050565b6127df8383612b4e565b6127ec600084848461263e565b61282b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612822906137c7565b60405180910390fd5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161288b84610f2e565b6128959190613c62565b905060006007600084815260200190815260200160002054905081811461297a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506129ff9190613c62565b9050600060096000848152602001908152602001600020549050600060088381548110612a2f57612a2e613f1b565b5b906000526020600020015490508060088381548110612a5157612a50613f1b565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612aa057612a9f613eec565b5b6001900381819060005260206000200160009055905550505050565b6000612ac783610f2e565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb590613927565b60405180910390fd5b612bc781611e51565b15612c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfe90613807565b60405180910390fd5b612c136000838361252a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c639190613b81565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612d2890613d82565b90600052602060002090601f016020900481019282612d4a5760008555612d91565b82601f10612d6357805160ff1916838001178555612d91565b82800160010185558215612d91579182015b82811115612d90578251825591602001919060010190612d75565b5b509050612d9e9190612da2565b5090565b5b80821115612dbb576000816000905550600101612da3565b5090565b6000612dd2612dcd84613ac7565b613aa2565b905082815260208101848484011115612dee57612ded613f7e565b5b612df9848285613d40565b509392505050565b6000612e14612e0f84613af8565b613aa2565b905082815260208101848484011115612e3057612e2f613f7e565b5b612e3b848285613d40565b509392505050565b600081359050612e52816145d3565b92915050565b600081359050612e67816145ea565b92915050565b600081519050612e7c816145ea565b92915050565b600081359050612e9181614601565b92915050565b600081519050612ea681614601565b92915050565b600082601f830112612ec157612ec0613f79565b5b8135612ed1848260208601612dbf565b91505092915050565b600082601f830112612eef57612eee613f79565b5b8135612eff848260208601612e01565b91505092915050565b600081359050612f1781614618565b92915050565b600060208284031215612f3357612f32613f88565b5b6000612f4184828501612e43565b91505092915050565b60008060408385031215612f6157612f60613f88565b5b6000612f6f85828601612e43565b9250506020612f8085828601612e43565b9150509250929050565b600080600060608486031215612fa357612fa2613f88565b5b6000612fb186828701612e43565b9350506020612fc286828701612e43565b9250506040612fd386828701612f08565b9150509250925092565b60008060008060808587031215612ff757612ff6613f88565b5b600061300587828801612e43565b945050602061301687828801612e43565b935050604061302787828801612f08565b925050606085013567ffffffffffffffff81111561304857613047613f83565b5b61305487828801612eac565b91505092959194509250565b6000806040838503121561307757613076613f88565b5b600061308585828601612e43565b925050602061309685828601612e58565b9150509250929050565b600080604083850312156130b7576130b6613f88565b5b60006130c585828601612e43565b92505060206130d685828601612f08565b9150509250929050565b6000602082840312156130f6576130f5613f88565b5b600061310484828501612e58565b91505092915050565b60006020828403121561312357613122613f88565b5b600061313184828501612e6d565b91505092915050565b6000602082840312156131505761314f613f88565b5b600061315e84828501612e82565b91505092915050565b60006020828403121561317d5761317c613f88565b5b600061318b84828501612e97565b91505092915050565b6000602082840312156131aa576131a9613f88565b5b600082013567ffffffffffffffff8111156131c8576131c7613f83565b5b6131d484828501612eda565b91505092915050565b6000602082840312156131f3576131f2613f88565b5b600061320184828501612f08565b91505092915050565b61321381613c96565b82525050565b61322281613ca8565b82525050565b600061323382613b3e565b61323d8185613b54565b935061324d818560208601613d4f565b61325681613f8d565b840191505092915050565b61326a81613d0a565b82525050565b600061327b82613b49565b6132858185613b65565b9350613295818560208601613d4f565b61329e81613f8d565b840191505092915050565b60006132b482613b49565b6132be8185613b76565b93506132ce818560208601613d4f565b80840191505092915050565b600081546132e781613d82565b6132f18186613b76565b9450600182166000811461330c576001811461331d57613350565b60ff19831686528186019350613350565b61332685613b29565b60005b8381101561334857815481890152600182019150602081019050613329565b838801955050505b50505092915050565b6000613366602b83613b65565b915061337182613f9e565b604082019050919050565b6000613389603283613b65565b915061339482613fed565b604082019050919050565b60006133ac602683613b65565b91506133b78261403c565b604082019050919050565b60006133cf601c83613b65565b91506133da8261408b565b602082019050919050565b60006133f2602483613b65565b91506133fd826140b4565b604082019050919050565b6000613415601983613b65565b915061342082614103565b602082019050919050565b6000613438601483613b65565b91506134438261412c565b602082019050919050565b600061345b602c83613b65565b915061346682614155565b604082019050919050565b600061347e603383613b65565b9150613489826141a4565b604082019050919050565b60006134a1603883613b65565b91506134ac826141f3565b604082019050919050565b60006134c4602a83613b65565b91506134cf82614242565b604082019050919050565b60006134e7602983613b65565b91506134f282614291565b604082019050919050565b600061350a602083613b65565b9150613515826142e0565b602082019050919050565b600061352d601683613b65565b915061353882614309565b602082019050919050565b6000613550602c83613b65565b915061355b82614332565b604082019050919050565b6000613573602083613b65565b915061357e82614381565b602082019050919050565b6000613596602983613b65565b91506135a1826143aa565b604082019050919050565b60006135b9602283613b65565b91506135c4826143f9565b604082019050919050565b60006135dc602183613b65565b91506135e782614448565b604082019050919050565b60006135ff603183613b65565b915061360a82614497565b604082019050919050565b6000613622602183613b65565b915061362d826144e6565b604082019050919050565b6000613645602c83613b65565b915061365082614535565b604082019050919050565b6000613668602983613b65565b915061367382614584565b604082019050919050565b61368781613d00565b82525050565b600061369982856132da565b91506136a582846132a9565b91508190509392505050565b60006020820190506136c6600083018461320a565b92915050565b60006060820190506136e1600083018661320a565b6136ee602083018561320a565b6136fb604083018461367e565b949350505050565b6000608082019050613718600083018761320a565b613725602083018661320a565b613732604083018561367e565b81810360608301526137448184613228565b905095945050505050565b60006020820190506137646000830184613219565b92915050565b600060208201905061377f6000830184613261565b92915050565b6000602082019050818103600083015261379f8184613270565b905092915050565b600060208201905081810360008301526137c081613359565b9050919050565b600060208201905081810360008301526137e08161337c565b9050919050565b600060208201905081810360008301526138008161339f565b9050919050565b60006020820190508181036000830152613820816133c2565b9050919050565b60006020820190508181036000830152613840816133e5565b9050919050565b6000602082019050818103600083015261386081613408565b9050919050565b600060208201905081810360008301526138808161342b565b9050919050565b600060208201905081810360008301526138a08161344e565b9050919050565b600060208201905081810360008301526138c081613471565b9050919050565b600060208201905081810360008301526138e081613494565b9050919050565b60006020820190508181036000830152613900816134b7565b9050919050565b60006020820190508181036000830152613920816134da565b9050919050565b60006020820190508181036000830152613940816134fd565b9050919050565b6000602082019050818103600083015261396081613520565b9050919050565b6000602082019050818103600083015261398081613543565b9050919050565b600060208201905081810360008301526139a081613566565b9050919050565b600060208201905081810360008301526139c081613589565b9050919050565b600060208201905081810360008301526139e0816135ac565b9050919050565b60006020820190508181036000830152613a00816135cf565b9050919050565b60006020820190508181036000830152613a20816135f2565b9050919050565b60006020820190508181036000830152613a4081613615565b9050919050565b60006020820190508181036000830152613a6081613638565b9050919050565b60006020820190508181036000830152613a808161365b565b9050919050565b6000602082019050613a9c600083018461367e565b92915050565b6000613aac613abd565b9050613ab88282613db4565b919050565b6000604051905090565b600067ffffffffffffffff821115613ae257613ae1613f4a565b5b613aeb82613f8d565b9050602081019050919050565b600067ffffffffffffffff821115613b1357613b12613f4a565b5b613b1c82613f8d565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613b8c82613d00565b9150613b9783613d00565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613bcc57613bcb613e5f565b5b828201905092915050565b6000613be282613d00565b9150613bed83613d00565b925082613bfd57613bfc613e8e565b5b828204905092915050565b6000613c1382613d00565b9150613c1e83613d00565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c5757613c56613e5f565b5b828202905092915050565b6000613c6d82613d00565b9150613c7883613d00565b925082821015613c8b57613c8a613e5f565b5b828203905092915050565b6000613ca182613ce0565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613d1582613d1c565b9050919050565b6000613d2782613d2e565b9050919050565b6000613d3982613ce0565b9050919050565b82818337600083830152505050565b60005b83811015613d6d578082015181840152602081019050613d52565b83811115613d7c576000848401525b50505050565b60006002820490506001821680613d9a57607f821691505b60208210811415613dae57613dad613ebd565b5b50919050565b613dbd82613f8d565b810181811067ffffffffffffffff82111715613ddc57613ddb613f4a565b5b80604052505050565b6000613df082613d00565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e2357613e22613e5f565b5b600182019050919050565b6000613e3982613d00565b9150613e4483613d00565b925082613e5457613e53613e8e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061796d656e742041646472657373206e6f74207365742063616e6e6f74207060008201527f7572636861736521436f6e746163742044657600000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f436f6e7472616374206973206e6f742061637469766500000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f43616e206f6e6c79206d696e7420757020746f207075726368617365206c696d60008201527f6974000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564204b495453554e455f4d4160008201527f5800000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f43616e6e6f74206d696e74206d6f7265207468656e207468652070757263686160008201527f7365206c696d6974210000000000000000000000000000000000000000000000602082015250565b6145dc81613c96565b81146145e757600080fd5b50565b6145f381613ca8565b81146145fe57600080fd5b50565b61460a81613cb4565b811461461557600080fd5b50565b61462181613d00565b811461462c57600080fd5b5056fea2646970667358221220dcdf53484c72f9727223ed3607c7df0dd9d0fccee143472e7ee76250405c631b64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c8063715018a6116100f7578063b88d4fde11610095578063e985e9c511610064578063e985e9c514610686578063efef39a1146106c3578063f2fde38b146106df578063f4a0a52814610708576101cd565b8063b88d4fde146105cc578063c87b56dd146105f5578063cbce4c9714610632578063d75e61101461065b576101cd565b80638da5cb5b116100d15780638da5cb5b1461052457806395d89b411461054f578063a22cb4651461057a578063acec338a146105a3576101cd565b8063715018a6146104b7578063877c86fb146104ce5780638d859f3e146104f9576101cd565b80632f745c591161016f5780635e1e10041161013e5780635e1e1004146103eb5780636352211e146104145780636edc43881461045157806370a082311461047a576101cd565b80632f745c591461031f57806342842e0e1461035c5780634f6ccce71461038557806355f804b3146103c2576101cd565b8063095ea7b3116101ab578063095ea7b3146102775780630c4ad9df146102a057806318160ddd146102cb57806323b872dd146102f6576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f4919061313a565b610731565b604051610206919061374f565b60405180910390f35b34801561021b57600080fd5b506102246107ab565b6040516102319190613785565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c91906131dd565b61083d565b60405161026e91906136b1565b60405180910390f35b34801561028357600080fd5b5061029e600480360381019061029991906130a0565b6108c2565b005b3480156102ac57600080fd5b506102b56109da565b6040516102c29190613a87565b60405180910390f35b3480156102d757600080fd5b506102e06109e0565b6040516102ed9190613a87565b60405180910390f35b34801561030257600080fd5b5061031d60048036038101906103189190612f8a565b6109ed565b005b34801561032b57600080fd5b50610346600480360381019061034191906130a0565b610a4d565b6040516103539190613a87565b60405180910390f35b34801561036857600080fd5b50610383600480360381019061037e9190612f8a565b610af2565b005b34801561039157600080fd5b506103ac60048036038101906103a791906131dd565b610b12565b6040516103b99190613a87565b60405180910390f35b3480156103ce57600080fd5b506103e960048036038101906103e49190613194565b610b83565b005b3480156103f757600080fd5b50610412600480360381019061040d9190612f1d565b610c78565b005b34801561042057600080fd5b5061043b600480360381019061043691906131dd565b610d97565b60405161044891906136b1565b60405180910390f35b34801561045d57600080fd5b50610478600480360381019061047391906131dd565b610e49565b005b34801561048657600080fd5b506104a1600480360381019061049c9190612f1d565b610f2e565b6040516104ae9190613a87565b60405180910390f35b3480156104c357600080fd5b506104cc610fe6565b005b3480156104da57600080fd5b506104e3611182565b6040516104f0919061376a565b60405180910390f35b34801561050557600080fd5b5061050e61119a565b60405161051b9190613a87565b60405180910390f35b34801561053057600080fd5b506105396111a0565b60405161054691906136b1565b60405180910390f35b34801561055b57600080fd5b506105646111ca565b6040516105719190613785565b60405180910390f35b34801561058657600080fd5b506105a1600480360381019061059c9190613060565b61125c565b005b3480156105af57600080fd5b506105ca60048036038101906105c591906130e0565b6113dd565b005b3480156105d857600080fd5b506105f360048036038101906105ee9190612fdd565b6114d5565b005b34801561060157600080fd5b5061061c600480360381019061061791906131dd565b611537565b6040516106299190613785565b60405180910390f35b34801561063e57600080fd5b50610659600480360381019061065491906130a0565b6115b3565b005b34801561066757600080fd5b506106706116e8565b60405161067d9190613a87565b60405180910390f35b34801561069257600080fd5b506106ad60048036038101906106a89190612f4a565b6116ee565b6040516106ba919061374f565b60405180910390f35b6106dd60048036038101906106d891906131dd565b611782565b005b3480156106eb57600080fd5b5061070660048036038101906107019190612f1d565b611a7f565b005b34801561071457600080fd5b5061072f600480360381019061072a91906131dd565b611c8a565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107a457506107a382611d6f565b5b9050919050565b6060600080546107ba90613d82565b80601f01602080910402602001604051908101604052809291908181526020018280546107e690613d82565b80156108335780601f1061080857610100808354040283529160200191610833565b820191906000526020600020905b81548152906001019060200180831161081657829003601f168201915b5050505050905090565b600061084882611e51565b610887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087e90613967565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108cd82610d97565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561093e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610935906139e7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661095d611ebd565b73ffffffffffffffffffffffffffffffffffffffff16148061098c575061098b81610986611ebd565b6116ee565b5b6109cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c2906138c7565b60405180910390fd5b6109d58383611ec5565b505050565b600e5481565b6000600880549050905090565b6109fe6109f8611ebd565b82611f7e565b610a3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3490613a07565b60405180910390fd5b610a4883838361205c565b505050565b6000610a5883610f2e565b8210610a99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a90906137a7565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610b0d838383604051806020016040528060008152506114d5565b505050565b6000610b1c6109e0565b8210610b5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5490613a47565b60405180910390fd5b60088281548110610b7157610b70613f1b565b5b90600052602060002001549050919050565b610b8b611ebd565b73ffffffffffffffffffffffffffffffffffffffff16610ba96111a0565b73ffffffffffffffffffffffffffffffffffffffff161480610c1f5750610bce611ebd565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5590613987565b60405180910390fd5b8060119080519060200190610c74929190612d1c565b5050565b610c80611ebd565b73ffffffffffffffffffffffffffffffffffffffff16610c9e6111a0565b73ffffffffffffffffffffffffffffffffffffffff161480610d145750610cc3611ebd565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4a90613987565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3790613907565b60405180910390fd5b80915050919050565b610e51611ebd565b73ffffffffffffffffffffffffffffffffffffffff16610e6f6111a0565b73ffffffffffffffffffffffffffffffffffffffff161480610ee55750610e94611ebd565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610f24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1b90613987565b60405180910390fd5b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f96906138e7565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fee611ebd565b73ffffffffffffffffffffffffffffffffffffffff1661100c6111a0565b73ffffffffffffffffffffffffffffffffffffffff1614806110825750611031611ebd565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b6110c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b890613987565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b73fb378115726a9ab2e0dccebbe2d53dc625ae201b81565b600d5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546111d990613d82565b80601f016020809104026020016040519081016040528092919081815260200182805461120590613d82565b80156112525780601f1061122757610100808354040283529160200191611252565b820191906000526020600020905b81548152906001019060200180831161123557829003601f168201915b5050505050905090565b611264611ebd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c990613847565b60405180910390fd5b80600560006112df611ebd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661138c611ebd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113d1919061374f565b60405180910390a35050565b6113e5611ebd565b73ffffffffffffffffffffffffffffffffffffffff166114036111a0565b73ffffffffffffffffffffffffffffffffffffffff1614806114795750611428611ebd565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b6114b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114af90613987565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b6114e66114e0611ebd565b83611f7e565b611525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151c90613a07565b60405180910390fd5b611531848484846122b8565b50505050565b606061154282611e51565b611581576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157890613867565b60405180910390fd5b601161158c83612314565b60405160200161159d92919061368d565b6040516020818303038152906040529050919050565b6115bb611ebd565b73ffffffffffffffffffffffffffffffffffffffff166115d96111a0565b73ffffffffffffffffffffffffffffffffffffffff16148061164f57506115fe611ebd565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61168e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168590613987565b60405180910390fd5b60005b818110156116e35760006116a56012612475565b9050600e546116b46012612475565b10156116cf576116c46012612483565b6116ce84826124a2565b5b5080806116db90613de5565b915050611691565b505050565b600f5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601060009054906101000a900460ff166117d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c890613947565b60405180910390fd5b600f54811115611816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180d906139c7565b60405180910390fd5b600e546118236012612475565b10611863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185a90613a27565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156118f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ec906138a7565b60405180910390fd5b60008161190133610f2e565b61190b9190613b81565b9050600f54811115611952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194990613a67565b60405180910390fd5b73fb378115726a9ab2e0dccebbe2d53dc625ae201b73ffffffffffffffffffffffffffffffffffffffff166323b872dd33600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685600d546119b49190613c08565b6040518463ffffffff1660e01b81526004016119d2939291906136cc565b602060405180830381600087803b1580156119ec57600080fd5b505af1158015611a00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a24919061310d565b5060005b82811015611a7a576000611a3c6012612475565b9050600e54611a4b6012612475565b1015611a6657611a5b6012612483565b611a6533826124a2565b5b508080611a7290613de5565b915050611a28565b505050565b611a87611ebd565b73ffffffffffffffffffffffffffffffffffffffff16611aa56111a0565b73ffffffffffffffffffffffffffffffffffffffff161480611b1b5750611aca611ebd565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611b5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5190613987565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc1906137e7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611c92611ebd565b73ffffffffffffffffffffffffffffffffffffffff16611cb06111a0565b73ffffffffffffffffffffffffffffffffffffffff161480611d265750611cd5611ebd565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611d65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5c90613987565b60405180910390fd5b80600d8190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e3a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611e4a5750611e49826124c0565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f3883610d97565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f8982611e51565b611fc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fbf90613887565b60405180910390fd5b6000611fd383610d97565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061204257508373ffffffffffffffffffffffffffffffffffffffff1661202a8461083d565b73ffffffffffffffffffffffffffffffffffffffff16145b80612053575061205281856116ee565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661207c82610d97565b73ffffffffffffffffffffffffffffffffffffffff16146120d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c9906139a7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612142576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213990613827565b60405180910390fd5b61214d83838361252a565b612158600082611ec5565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121a89190613c62565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121ff9190613b81565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6122c384848461205c565b6122cf8484848461263e565b61230e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612305906137c7565b60405180910390fd5b50505050565b6060600082141561235c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612470565b600082905060005b6000821461238e57808061237790613de5565b915050600a826123879190613bd7565b9150612364565b60008167ffffffffffffffff8111156123aa576123a9613f4a565b5b6040519080825280601f01601f1916602001820160405280156123dc5781602001600182028036833780820191505090505b5090505b60008514612469576001826123f59190613c62565b9150600a856124049190613e2e565b60306124109190613b81565b60f81b81838151811061242657612425613f1b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124629190613bd7565b94506123e0565b8093505050505b919050565b600081600001549050919050565b60018160000160008282546124989190613b81565b9250508190555050565b6124bc8282604051806020016040528060008152506127d5565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612535838383612830565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125785761257381612835565b6125b7565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146125b6576125b5838261287e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125fa576125f5816129eb565b612639565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612638576126378282612abc565b5b5b505050565b600061265f8473ffffffffffffffffffffffffffffffffffffffff16612b3b565b156127c8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612688611ebd565b8786866040518563ffffffff1660e01b81526004016126aa9493929190613703565b602060405180830381600087803b1580156126c457600080fd5b505af19250505080156126f557506040513d601f19601f820116820180604052508101906126f29190613167565b60015b612778573d8060008114612725576040519150601f19603f3d011682016040523d82523d6000602084013e61272a565b606091505b50600081511415612770576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612767906137c7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127cd565b600190505b949350505050565b6127df8383612b4e565b6127ec600084848461263e565b61282b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612822906137c7565b60405180910390fd5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161288b84610f2e565b6128959190613c62565b905060006007600084815260200190815260200160002054905081811461297a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506129ff9190613c62565b9050600060096000848152602001908152602001600020549050600060088381548110612a2f57612a2e613f1b565b5b906000526020600020015490508060088381548110612a5157612a50613f1b565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612aa057612a9f613eec565b5b6001900381819060005260206000200160009055905550505050565b6000612ac783610f2e565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb590613927565b60405180910390fd5b612bc781611e51565b15612c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfe90613807565b60405180910390fd5b612c136000838361252a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c639190613b81565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612d2890613d82565b90600052602060002090601f016020900481019282612d4a5760008555612d91565b82601f10612d6357805160ff1916838001178555612d91565b82800160010185558215612d91579182015b82811115612d90578251825591602001919060010190612d75565b5b509050612d9e9190612da2565b5090565b5b80821115612dbb576000816000905550600101612da3565b5090565b6000612dd2612dcd84613ac7565b613aa2565b905082815260208101848484011115612dee57612ded613f7e565b5b612df9848285613d40565b509392505050565b6000612e14612e0f84613af8565b613aa2565b905082815260208101848484011115612e3057612e2f613f7e565b5b612e3b848285613d40565b509392505050565b600081359050612e52816145d3565b92915050565b600081359050612e67816145ea565b92915050565b600081519050612e7c816145ea565b92915050565b600081359050612e9181614601565b92915050565b600081519050612ea681614601565b92915050565b600082601f830112612ec157612ec0613f79565b5b8135612ed1848260208601612dbf565b91505092915050565b600082601f830112612eef57612eee613f79565b5b8135612eff848260208601612e01565b91505092915050565b600081359050612f1781614618565b92915050565b600060208284031215612f3357612f32613f88565b5b6000612f4184828501612e43565b91505092915050565b60008060408385031215612f6157612f60613f88565b5b6000612f6f85828601612e43565b9250506020612f8085828601612e43565b9150509250929050565b600080600060608486031215612fa357612fa2613f88565b5b6000612fb186828701612e43565b9350506020612fc286828701612e43565b9250506040612fd386828701612f08565b9150509250925092565b60008060008060808587031215612ff757612ff6613f88565b5b600061300587828801612e43565b945050602061301687828801612e43565b935050604061302787828801612f08565b925050606085013567ffffffffffffffff81111561304857613047613f83565b5b61305487828801612eac565b91505092959194509250565b6000806040838503121561307757613076613f88565b5b600061308585828601612e43565b925050602061309685828601612e58565b9150509250929050565b600080604083850312156130b7576130b6613f88565b5b60006130c585828601612e43565b92505060206130d685828601612f08565b9150509250929050565b6000602082840312156130f6576130f5613f88565b5b600061310484828501612e58565b91505092915050565b60006020828403121561312357613122613f88565b5b600061313184828501612e6d565b91505092915050565b6000602082840312156131505761314f613f88565b5b600061315e84828501612e82565b91505092915050565b60006020828403121561317d5761317c613f88565b5b600061318b84828501612e97565b91505092915050565b6000602082840312156131aa576131a9613f88565b5b600082013567ffffffffffffffff8111156131c8576131c7613f83565b5b6131d484828501612eda565b91505092915050565b6000602082840312156131f3576131f2613f88565b5b600061320184828501612f08565b91505092915050565b61321381613c96565b82525050565b61322281613ca8565b82525050565b600061323382613b3e565b61323d8185613b54565b935061324d818560208601613d4f565b61325681613f8d565b840191505092915050565b61326a81613d0a565b82525050565b600061327b82613b49565b6132858185613b65565b9350613295818560208601613d4f565b61329e81613f8d565b840191505092915050565b60006132b482613b49565b6132be8185613b76565b93506132ce818560208601613d4f565b80840191505092915050565b600081546132e781613d82565b6132f18186613b76565b9450600182166000811461330c576001811461331d57613350565b60ff19831686528186019350613350565b61332685613b29565b60005b8381101561334857815481890152600182019150602081019050613329565b838801955050505b50505092915050565b6000613366602b83613b65565b915061337182613f9e565b604082019050919050565b6000613389603283613b65565b915061339482613fed565b604082019050919050565b60006133ac602683613b65565b91506133b78261403c565b604082019050919050565b60006133cf601c83613b65565b91506133da8261408b565b602082019050919050565b60006133f2602483613b65565b91506133fd826140b4565b604082019050919050565b6000613415601983613b65565b915061342082614103565b602082019050919050565b6000613438601483613b65565b91506134438261412c565b602082019050919050565b600061345b602c83613b65565b915061346682614155565b604082019050919050565b600061347e603383613b65565b9150613489826141a4565b604082019050919050565b60006134a1603883613b65565b91506134ac826141f3565b604082019050919050565b60006134c4602a83613b65565b91506134cf82614242565b604082019050919050565b60006134e7602983613b65565b91506134f282614291565b604082019050919050565b600061350a602083613b65565b9150613515826142e0565b602082019050919050565b600061352d601683613b65565b915061353882614309565b602082019050919050565b6000613550602c83613b65565b915061355b82614332565b604082019050919050565b6000613573602083613b65565b915061357e82614381565b602082019050919050565b6000613596602983613b65565b91506135a1826143aa565b604082019050919050565b60006135b9602283613b65565b91506135c4826143f9565b604082019050919050565b60006135dc602183613b65565b91506135e782614448565b604082019050919050565b60006135ff603183613b65565b915061360a82614497565b604082019050919050565b6000613622602183613b65565b915061362d826144e6565b604082019050919050565b6000613645602c83613b65565b915061365082614535565b604082019050919050565b6000613668602983613b65565b915061367382614584565b604082019050919050565b61368781613d00565b82525050565b600061369982856132da565b91506136a582846132a9565b91508190509392505050565b60006020820190506136c6600083018461320a565b92915050565b60006060820190506136e1600083018661320a565b6136ee602083018561320a565b6136fb604083018461367e565b949350505050565b6000608082019050613718600083018761320a565b613725602083018661320a565b613732604083018561367e565b81810360608301526137448184613228565b905095945050505050565b60006020820190506137646000830184613219565b92915050565b600060208201905061377f6000830184613261565b92915050565b6000602082019050818103600083015261379f8184613270565b905092915050565b600060208201905081810360008301526137c081613359565b9050919050565b600060208201905081810360008301526137e08161337c565b9050919050565b600060208201905081810360008301526138008161339f565b9050919050565b60006020820190508181036000830152613820816133c2565b9050919050565b60006020820190508181036000830152613840816133e5565b9050919050565b6000602082019050818103600083015261386081613408565b9050919050565b600060208201905081810360008301526138808161342b565b9050919050565b600060208201905081810360008301526138a08161344e565b9050919050565b600060208201905081810360008301526138c081613471565b9050919050565b600060208201905081810360008301526138e081613494565b9050919050565b60006020820190508181036000830152613900816134b7565b9050919050565b60006020820190508181036000830152613920816134da565b9050919050565b60006020820190508181036000830152613940816134fd565b9050919050565b6000602082019050818103600083015261396081613520565b9050919050565b6000602082019050818103600083015261398081613543565b9050919050565b600060208201905081810360008301526139a081613566565b9050919050565b600060208201905081810360008301526139c081613589565b9050919050565b600060208201905081810360008301526139e0816135ac565b9050919050565b60006020820190508181036000830152613a00816135cf565b9050919050565b60006020820190508181036000830152613a20816135f2565b9050919050565b60006020820190508181036000830152613a4081613615565b9050919050565b60006020820190508181036000830152613a6081613638565b9050919050565b60006020820190508181036000830152613a808161365b565b9050919050565b6000602082019050613a9c600083018461367e565b92915050565b6000613aac613abd565b9050613ab88282613db4565b919050565b6000604051905090565b600067ffffffffffffffff821115613ae257613ae1613f4a565b5b613aeb82613f8d565b9050602081019050919050565b600067ffffffffffffffff821115613b1357613b12613f4a565b5b613b1c82613f8d565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613b8c82613d00565b9150613b9783613d00565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613bcc57613bcb613e5f565b5b828201905092915050565b6000613be282613d00565b9150613bed83613d00565b925082613bfd57613bfc613e8e565b5b828204905092915050565b6000613c1382613d00565b9150613c1e83613d00565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c5757613c56613e5f565b5b828202905092915050565b6000613c6d82613d00565b9150613c7883613d00565b925082821015613c8b57613c8a613e5f565b5b828203905092915050565b6000613ca182613ce0565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613d1582613d1c565b9050919050565b6000613d2782613d2e565b9050919050565b6000613d3982613ce0565b9050919050565b82818337600083830152505050565b60005b83811015613d6d578082015181840152602081019050613d52565b83811115613d7c576000848401525b50505050565b60006002820490506001821680613d9a57607f821691505b60208210811415613dae57613dad613ebd565b5b50919050565b613dbd82613f8d565b810181811067ffffffffffffffff82111715613ddc57613ddb613f4a565b5b80604052505050565b6000613df082613d00565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e2357613e22613e5f565b5b600182019050919050565b6000613e3982613d00565b9150613e4483613d00565b925082613e5457613e53613e8e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061796d656e742041646472657373206e6f74207365742063616e6e6f74207060008201527f7572636861736521436f6e746163742044657600000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f436f6e7472616374206973206e6f742061637469766500000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f43616e206f6e6c79206d696e7420757020746f207075726368617365206c696d60008201527f6974000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564204b495453554e455f4d4160008201527f5800000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f43616e6e6f74206d696e74206d6f7265207468656e207468652070757263686160008201527f7365206c696d6974210000000000000000000000000000000000000000000000602082015250565b6145dc81613c96565b81146145e757600080fd5b50565b6145f381613ca8565b81146145fe57600080fd5b50565b61460a81613cb4565b811461461557600080fd5b50565b61462181613d00565b811461462c57600080fd5b5056fea2646970667358221220dcdf53484c72f9727223ed3607c7df0dd9d0fccee143472e7ee76250405c631b64736f6c63430008070033

Deployed Bytecode Sourcemap

49744:3035:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36765:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22885:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24467:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23990:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50100:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37568:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25526:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37149:343;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25973:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37758:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50605:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50376:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22492:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50717:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22135:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46353:148;;;;;;;;;;;;;:::i;:::-;;49932:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50031:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45637:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23054:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24847:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50505:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26229:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52543:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50946:375;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50139:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25245:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51532:1003;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46656:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50842:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36765:300;36912:4;36969:35;36954:50;;;:11;:50;;;;:103;;;;37021:36;37045:11;37021:23;:36::i;:::-;36954:103;36934:123;;36765:300;;;:::o;22885:100::-;22939:13;22972:5;22965:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22885:100;:::o;24467:308::-;24588:7;24635:16;24643:7;24635;:16::i;:::-;24613:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;24743:15;:24;24759:7;24743:24;;;;;;;;;;;;;;;;;;;;;24736:31;;24467:308;;;:::o;23990:411::-;24071:13;24087:23;24102:7;24087:14;:23::i;:::-;24071:39;;24135:5;24129:11;;:2;:11;;;;24121:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24229:5;24213:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24238:37;24255:5;24262:12;:10;:12::i;:::-;24238:16;:37::i;:::-;24213:62;24191:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24372:21;24381:2;24385:7;24372:8;:21::i;:::-;24060:341;23990:411;;:::o;50100:32::-;;;;:::o;37568:113::-;37629:7;37656:10;:17;;;;37649:24;;37568:113;:::o;25526:376::-;25735:41;25754:12;:10;:12::i;:::-;25768:7;25735:18;:41::i;:::-;25713:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;25866:28;25876:4;25882:2;25886:7;25866:9;:28::i;:::-;25526:376;;;:::o;37149:343::-;37291:7;37346:23;37363:5;37346:16;:23::i;:::-;37338:5;:31;37316:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;37458:12;:19;37471:5;37458:19;;;;;;;;;;;;;;;:26;37478:5;37458:26;;;;;;;;;;;;37451:33;;37149:343;;;;:::o;25973:185::-;26111:39;26128:4;26134:2;26138:7;26111:39;;;;;;;;;;;;:16;:39::i;:::-;25973:185;;;:::o;37758:320::-;37878:7;37933:30;:28;:30::i;:::-;37925:5;:38;37903:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;38053:10;38064:5;38053:17;;;;;;;;:::i;:::-;;;;;;;;;;38046:24;;37758:320;;;:::o;50605:104::-;45882:12;:10;:12::i;:::-;45871:23;;:7;:5;:7::i;:::-;:23;;;:51;;;;45910:12;:10;:12::i;:::-;45898:24;;:8;;;;;;;;;;;:24;;;45871:51;45849:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;50694:7:::1;50678:13;:23;;;;;;;;;;;;:::i;:::-;;50605:104:::0;:::o;50376:121::-;45882:12;:10;:12::i;:::-;45871:23;;:7;:5;:7::i;:::-;:23;;;:51;;;;45910:12;:10;:12::i;:::-;45898:24;;:8;;;;;;;;;;;:24;;;45871:51;45849:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;50475:14:::1;50457:15;;:32;;;;;;;;;;;;;;;;;;50376:121:::0;:::o;22492:326::-;22609:7;22634:13;22650:7;:16;22658:7;22650:16;;;;;;;;;;;;;;;;;;;;;22634:32;;22716:1;22699:19;;:5;:19;;;;22677:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;22805:5;22798:12;;;22492:326;;;:::o;50717:117::-;45882:12;:10;:12::i;:::-;45871:23;;:7;:5;:7::i;:::-;:23;;;:51;;;;45910:12;:10;:12::i;:::-;45898:24;;:8;;;;;;;;;;;:24;;;45871:51;45849:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;50813:13:::1;50796:14;:30;;;;50717:117:::0;:::o;22135:295::-;22252:7;22316:1;22299:19;;:5;:19;;;;22277:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;22406:9;:16;22416:5;22406:16;;;;;;;;;;;;;;;;22399:23;;22135:295;;;:::o;46353:148::-;45882:12;:10;:12::i;:::-;45871:23;;:7;:5;:7::i;:::-;:23;;;:51;;;;45910:12;:10;:12::i;:::-;45898:24;;:8;;;;;;;;;;;:24;;;45871:51;45849:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;46460:1:::1;46423:40;;46444:6;;;;;;;;;;;46423:40;;;;;;;;;;;;46491:1;46474:6;;:19;;;;;;;;;;;;;;;;;;46353:148::o:0;49932:89::-;49978:42;49932:89;:::o;50031:62::-;;;;:::o;45637:87::-;45683:7;45710:6;;;;;;;;;;;45703:13;;45637:87;:::o;23054:104::-;23110:13;23143:7;23136:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23054:104;:::o;24847:327::-;24994:12;:10;:12::i;:::-;24982:24;;:8;:24;;;;24974:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;25094:8;25049:18;:32;25068:12;:10;:12::i;:::-;25049:32;;;;;;;;;;;;;;;:42;25082:8;25049:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;25147:8;25118:48;;25133:12;:10;:12::i;:::-;25118:48;;;25157:8;25118:48;;;;;;:::i;:::-;;;;;;;;24847:327;;:::o;50505:92::-;45882:12;:10;:12::i;:::-;45871:23;;:7;:5;:7::i;:::-;:23;;;:51;;;;45910:12;:10;:12::i;:::-;45898:24;;:8;;;;;;;;;;;:24;;;45871:51;45849:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;50581:8:::1;50569:9;;:20;;;;;;;;;;;;;;;;;;50505:92:::0;:::o;26229:365::-;26418:41;26437:12;:10;:12::i;:::-;26451:7;26418:18;:41::i;:::-;26396:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;26547:39;26561:4;26567:2;26571:7;26580:5;26547:13;:39::i;:::-;26229:365;;;;:::o;52543:233::-;52616:13;52650:16;52658:7;52650;:16::i;:::-;52642:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;52733:13;52748:18;:7;:16;:18::i;:::-;52716:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52702:66;;52543:233;;;:::o;50946:375::-;45882:12;:10;:12::i;:::-;45871:23;;:7;:5;:7::i;:::-;:23;;;:51;;;;45910:12;:10;:12::i;:::-;45898:24;;:8;;;;;;;;;;;:24;;;45871:51;45849:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;51031:9:::1;51026:288;51050:14;51046:1;:18;51026:288;;;51086:15;51104:28;:18;:26;:28::i;:::-;51086:46;;51184:11;;51153:28;:18;:26;:28::i;:::-;:42;51149:154;;;51216:30;:18;:28;:30::i;:::-;51265:22;51275:2;51279:7;51265:9;:22::i;:::-;51149:154;51071:243;51066:3;;;;;:::i;:::-;;;;51026:288;;;;50946:375:::0;;:::o;50139:33::-;;;;:::o;25245:214::-;25387:4;25416:18;:25;25435:5;25416:25;;;;;;;;;;;;;;;:35;25442:8;25416:35;;;;;;;;;;;;;;;;;;;;;;;;;25409:42;;25245:214;;;;:::o;51532:1003::-;51610:9;;;;;;;;;;;51602:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;51684:14;;51666;:32;;51657:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;51787:11;;51756:28;:18;:26;:28::i;:::-;:42;51748:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;51879:3;51854:29;;:15;;;;;;;;;;;:29;;;;51846:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;51949:21;51995:14;51973:21;51983:10;51973:9;:21::i;:::-;:36;;;;:::i;:::-;51949:60;;52043:14;;52024:16;:33;52020:116;;;52073:51;;;;;;;;;;:::i;:::-;;;;;;;;52020:116;49978:42;52146:26;;;52173:10;52184:15;;;;;;;;;;;52206:14;52200:5;;:20;;;;:::i;:::-;52146:75;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;52237:9;52232:296;52256:14;52252:1;:18;52232:296;;;52292:15;52310:28;:18;:26;:28::i;:::-;52292:46;;52390:11;;52359:28;:18;:26;:28::i;:::-;:42;52355:162;;;52422:30;:18;:28;:30::i;:::-;52471;52481:10;52493:7;52471:9;:30::i;:::-;52355:162;52277:251;52272:3;;;;;:::i;:::-;;;;52232:296;;;;51591:944;51532:1003;:::o;46656:281::-;45882:12;:10;:12::i;:::-;45871:23;;:7;:5;:7::i;:::-;:23;;;:51;;;;45910:12;:10;:12::i;:::-;45898:24;;:8;;;;;;;;;;;:24;;;45871:51;45849:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;46779:1:::1;46759:22;;:8;:22;;;;46737:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;46892:8;46863:38;;46884:6;;;;;;;;;;;46863:38;;;;;;;;;;;;46921:8;46912:6;;:17;;;;;;;;;;;;;;;;;;46656:281:::0;:::o;50842:96::-;45882:12;:10;:12::i;:::-;45871:23;;:7;:5;:7::i;:::-;:23;;;:51;;;;45910:12;:10;:12::i;:::-;45898:24;;:8;;;;;;;;;;;:24;;;45871:51;45849:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;50921:9:::1;50913:5;:17;;;;50842:96:::0;:::o;21716:355::-;21863:4;21920:25;21905:40;;;:11;:40;;;;:105;;;;21977:33;21962:48;;;:11;:48;;;;21905:105;:158;;;;22027:36;22051:11;22027:23;:36::i;:::-;21905:158;21885:178;;21716:355;;;:::o;28141:127::-;28206:4;28258:1;28230:30;;:7;:16;28238:7;28230:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28223:37;;28141:127;;;:::o;16895:98::-;16948:7;16975:10;16968:17;;16895:98;:::o;32264:174::-;32366:2;32339:15;:24;32355:7;32339:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32422:7;32418:2;32384:46;;32393:23;32408:7;32393:14;:23::i;:::-;32384:46;;;;;;;;;;;;32264:174;;:::o;28435:452::-;28564:4;28608:16;28616:7;28608;:16::i;:::-;28586:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;28707:13;28723:23;28738:7;28723:14;:23::i;:::-;28707:39;;28776:5;28765:16;;:7;:16;;;:64;;;;28822:7;28798:31;;:20;28810:7;28798:11;:20::i;:::-;:31;;;28765:64;:113;;;;28846:32;28863:5;28870:7;28846:16;:32::i;:::-;28765:113;28757:122;;;28435:452;;;;:::o;31531:615::-;31704:4;31677:31;;:23;31692:7;31677:14;:23::i;:::-;:31;;;31655:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;31810:1;31796:16;;:2;:16;;;;31788:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31866:39;31887:4;31893:2;31897:7;31866:20;:39::i;:::-;31970:29;31987:1;31991:7;31970:8;:29::i;:::-;32031:1;32012:9;:15;32022:4;32012:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32060:1;32043:9;:13;32053:2;32043:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32091:2;32072:7;:16;32080:7;32072:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32130:7;32126:2;32111:27;;32120:4;32111:27;;;;;;;;;;;;31531:615;;;:::o;27476:352::-;27633:28;27643:4;27649:2;27653:7;27633:9;:28::i;:::-;27694:48;27717:4;27723:2;27727:7;27736:5;27694:22;:48::i;:::-;27672:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;27476:352;;;;:::o;17567:723::-;17623:13;17853:1;17844:5;:10;17840:53;;;17871:10;;;;;;;;;;;;;;;;;;;;;17840:53;17903:12;17918:5;17903:20;;17934:14;17959:78;17974:1;17966:4;:9;17959:78;;17992:8;;;;;:::i;:::-;;;;18023:2;18015:10;;;;;:::i;:::-;;;17959:78;;;18047:19;18079:6;18069:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18047:39;;18097:154;18113:1;18104:5;:10;18097:154;;18141:1;18131:11;;;;;:::i;:::-;;;18208:2;18200:5;:10;;;;:::i;:::-;18187:2;:24;;;;:::i;:::-;18174:39;;18157:6;18164;18157:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18237:2;18228:11;;;;;:::i;:::-;;;18097:154;;;18275:6;18261:21;;;;;17567:723;;;;:::o;43974:114::-;44039:7;44066;:14;;;44059:21;;43974:114;;;:::o;44096:117::-;44193:1;44175:7;:14;;;:19;;;;;;;:::i;:::-;;;;;;;;44096:117;:::o;29229:110::-;29305:26;29315:2;29319:7;29305:26;;;;;;;;;;;;:9;:26::i;:::-;29229:110;;:::o;20167:207::-;20297:4;20341:25;20326:40;;;:11;:40;;;;20319:47;;20167:207;;;:::o;38691:589::-;38835:45;38862:4;38868:2;38872:7;38835:26;:45::i;:::-;38913:1;38897:18;;:4;:18;;;38893:187;;;38932:40;38964:7;38932:31;:40::i;:::-;38893:187;;;39002:2;38994:10;;:4;:10;;;38990:90;;39021:47;39054:4;39060:7;39021:32;:47::i;:::-;38990:90;38893:187;39108:1;39094:16;;:2;:16;;;39090:183;;;39127:45;39164:7;39127:36;:45::i;:::-;39090:183;;;39200:4;39194:10;;:2;:10;;;39190:83;;39221:40;39249:2;39253:7;39221:27;:40::i;:::-;39190:83;39090:183;38691:589;;;:::o;33003:1053::-;33158:4;33179:15;:2;:13;;;:15::i;:::-;33175:874;;;33248:2;33232:36;;;33291:12;:10;:12::i;:::-;33326:4;33353:7;33383:5;33232:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33211:783;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33611:1;33594:6;:13;:18;33590:389;;;33637:108;;;;;;;;;;:::i;:::-;;;;;;;;33590:389;33929:6;33923:13;33914:6;33910:2;33906:15;33899:38;33211:783;33481:45;;;33471:55;;;:6;:55;;;;33464:62;;;;;33175:874;34033:4;34026:11;;33003:1053;;;;;;;:::o;29566:321::-;29696:18;29702:2;29706:7;29696:5;:18::i;:::-;29747:54;29778:1;29782:2;29786:7;29795:5;29747:22;:54::i;:::-;29725:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;29566:321;;;:::o;34669:126::-;;;;:::o;40003:164::-;40107:10;:17;;;;40080:15;:24;40096:7;40080:24;;;;;;;;;;;:44;;;;40135:10;40151:7;40135:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40003:164;:::o;40794:1002::-;41074:22;41124:1;41099:22;41116:4;41099:16;:22::i;:::-;:26;;;;:::i;:::-;41074:51;;41136:18;41157:17;:26;41175:7;41157:26;;;;;;;;;;;;41136:47;;41304:14;41290:10;:28;41286:328;;41335:19;41357:12;:18;41370:4;41357:18;;;;;;;;;;;;;;;:34;41376:14;41357:34;;;;;;;;;;;;41335:56;;41441:11;41408:12;:18;41421:4;41408:18;;;;;;;;;;;;;;;:30;41427:10;41408:30;;;;;;;;;;;:44;;;;41558:10;41525:17;:30;41543:11;41525:30;;;;;;;;;;;:43;;;;41320:294;41286:328;41710:17;:26;41728:7;41710:26;;;;;;;;;;;41703:33;;;41754:12;:18;41767:4;41754:18;;;;;;;;;;;;;;;:34;41773:14;41754:34;;;;;;;;;;;41747:41;;;40889:907;;40794:1002;;:::o;42091:1079::-;42344:22;42389:1;42369:10;:17;;;;:21;;;;:::i;:::-;42344:46;;42401:18;42422:15;:24;42438:7;42422:24;;;;;;;;;;;;42401:45;;42773:19;42795:10;42806:14;42795:26;;;;;;;;:::i;:::-;;;;;;;;;;42773:48;;42859:11;42834:10;42845;42834:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;42970:10;42939:15;:28;42955:11;42939:28;;;;;;;;;;;:41;;;;43111:15;:24;43127:7;43111:24;;;;;;;;;;;43104:31;;;43146:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42162:1008;;;42091:1079;:::o;39581:221::-;39666:14;39683:20;39700:2;39683:16;:20::i;:::-;39666:37;;39741:7;39714:12;:16;39727:2;39714:16;;;;;;;;;;;;;;;:24;39731:6;39714:24;;;;;;;;;;;:34;;;;39788:6;39759:17;:26;39777:7;39759:26;;;;;;;;;;;:35;;;;39655:147;39581:221;;:::o;8294:444::-;8354:4;8562:12;8686:7;8674:20;8666:28;;8729:1;8722:4;:8;8715:15;;;8294:444;;;:::o;30223:382::-;30317:1;30303:16;;:2;:16;;;;30295:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30376:16;30384:7;30376;:16::i;:::-;30375:17;30367:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30438:45;30467:1;30471:2;30475:7;30438:20;:45::i;:::-;30513:1;30496:9;:13;30506:2;30496:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30544:2;30525:7;:16;30533:7;30525:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30589:7;30585:2;30564:33;;30581:1;30564:33;;;;;;;;;;;;30223:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1179:5;1210:6;1204:13;1195:22;;1226:30;1250:5;1226:30;:::i;:::-;1125:137;;;;:::o;1268:::-;1313:5;1351:6;1338:20;1329:29;;1367:32;1393:5;1367:32;:::i;:::-;1268:137;;;;:::o;1411:141::-;1467:5;1498:6;1492:13;1483:22;;1514:32;1540:5;1514:32;:::i;:::-;1411:141;;;;:::o;1571:338::-;1626:5;1675:3;1668:4;1660:6;1656:17;1652:27;1642:122;;1683:79;;:::i;:::-;1642:122;1800:6;1787:20;1825:78;1899:3;1891:6;1884:4;1876:6;1872:17;1825:78;:::i;:::-;1816:87;;1632:277;1571:338;;;;:::o;1929:340::-;1985:5;2034:3;2027:4;2019:6;2015:17;2011:27;2001:122;;2042:79;;:::i;:::-;2001:122;2159:6;2146:20;2184:79;2259:3;2251:6;2244:4;2236:6;2232:17;2184:79;:::i;:::-;2175:88;;1991:278;1929:340;;;;:::o;2275:139::-;2321:5;2359:6;2346:20;2337:29;;2375:33;2402:5;2375:33;:::i;:::-;2275:139;;;;:::o;2420:329::-;2479:6;2528:2;2516:9;2507:7;2503:23;2499:32;2496:119;;;2534:79;;:::i;:::-;2496:119;2654:1;2679:53;2724:7;2715:6;2704:9;2700:22;2679:53;:::i;:::-;2669:63;;2625:117;2420:329;;;;:::o;2755:474::-;2823:6;2831;2880:2;2868:9;2859:7;2855:23;2851:32;2848:119;;;2886:79;;:::i;:::-;2848:119;3006:1;3031:53;3076:7;3067:6;3056:9;3052:22;3031:53;:::i;:::-;3021:63;;2977:117;3133:2;3159:53;3204:7;3195:6;3184:9;3180:22;3159:53;:::i;:::-;3149:63;;3104:118;2755:474;;;;;:::o;3235:619::-;3312:6;3320;3328;3377:2;3365:9;3356:7;3352:23;3348:32;3345:119;;;3383:79;;:::i;:::-;3345:119;3503:1;3528:53;3573:7;3564:6;3553:9;3549:22;3528:53;:::i;:::-;3518:63;;3474:117;3630:2;3656:53;3701:7;3692:6;3681:9;3677:22;3656:53;:::i;:::-;3646:63;;3601:118;3758:2;3784:53;3829:7;3820:6;3809:9;3805:22;3784:53;:::i;:::-;3774:63;;3729:118;3235:619;;;;;:::o;3860:943::-;3955:6;3963;3971;3979;4028:3;4016:9;4007:7;4003:23;3999:33;3996:120;;;4035:79;;:::i;:::-;3996:120;4155:1;4180:53;4225:7;4216:6;4205:9;4201:22;4180:53;:::i;:::-;4170:63;;4126:117;4282:2;4308:53;4353:7;4344:6;4333:9;4329:22;4308:53;:::i;:::-;4298:63;;4253:118;4410:2;4436:53;4481:7;4472:6;4461:9;4457:22;4436:53;:::i;:::-;4426:63;;4381:118;4566:2;4555:9;4551:18;4538:32;4597:18;4589:6;4586:30;4583:117;;;4619:79;;:::i;:::-;4583:117;4724:62;4778:7;4769:6;4758:9;4754:22;4724:62;:::i;:::-;4714:72;;4509:287;3860:943;;;;;;;:::o;4809:468::-;4874:6;4882;4931:2;4919:9;4910:7;4906:23;4902:32;4899:119;;;4937:79;;:::i;:::-;4899:119;5057:1;5082:53;5127:7;5118:6;5107:9;5103:22;5082:53;:::i;:::-;5072:63;;5028:117;5184:2;5210:50;5252:7;5243:6;5232:9;5228:22;5210:50;:::i;:::-;5200:60;;5155:115;4809:468;;;;;:::o;5283:474::-;5351:6;5359;5408:2;5396:9;5387:7;5383:23;5379:32;5376:119;;;5414:79;;:::i;:::-;5376:119;5534:1;5559:53;5604:7;5595:6;5584:9;5580:22;5559:53;:::i;:::-;5549:63;;5505:117;5661:2;5687:53;5732:7;5723:6;5712:9;5708:22;5687:53;:::i;:::-;5677:63;;5632:118;5283:474;;;;;:::o;5763:323::-;5819:6;5868:2;5856:9;5847:7;5843:23;5839:32;5836:119;;;5874:79;;:::i;:::-;5836:119;5994:1;6019:50;6061:7;6052:6;6041:9;6037:22;6019:50;:::i;:::-;6009:60;;5965:114;5763:323;;;;:::o;6092:345::-;6159:6;6208:2;6196:9;6187:7;6183:23;6179:32;6176:119;;;6214:79;;:::i;:::-;6176:119;6334:1;6359:61;6412:7;6403:6;6392:9;6388:22;6359:61;:::i;:::-;6349:71;;6305:125;6092:345;;;;:::o;6443:327::-;6501:6;6550:2;6538:9;6529:7;6525:23;6521:32;6518:119;;;6556:79;;:::i;:::-;6518:119;6676:1;6701:52;6745:7;6736:6;6725:9;6721:22;6701:52;:::i;:::-;6691:62;;6647:116;6443:327;;;;:::o;6776:349::-;6845:6;6894:2;6882:9;6873:7;6869:23;6865:32;6862:119;;;6900:79;;:::i;:::-;6862:119;7020:1;7045:63;7100:7;7091:6;7080:9;7076:22;7045:63;:::i;:::-;7035:73;;6991:127;6776:349;;;;:::o;7131:509::-;7200:6;7249:2;7237:9;7228:7;7224:23;7220:32;7217:119;;;7255:79;;:::i;:::-;7217:119;7403:1;7392:9;7388:17;7375:31;7433:18;7425:6;7422:30;7419:117;;;7455:79;;:::i;:::-;7419:117;7560:63;7615:7;7606:6;7595:9;7591:22;7560:63;:::i;:::-;7550:73;;7346:287;7131:509;;;;:::o;7646:329::-;7705:6;7754:2;7742:9;7733:7;7729:23;7725:32;7722:119;;;7760:79;;:::i;:::-;7722:119;7880:1;7905:53;7950:7;7941:6;7930:9;7926:22;7905:53;:::i;:::-;7895:63;;7851:117;7646:329;;;;:::o;7981:118::-;8068:24;8086:5;8068:24;:::i;:::-;8063:3;8056:37;7981:118;;:::o;8105:109::-;8186:21;8201:5;8186:21;:::i;:::-;8181:3;8174:34;8105:109;;:::o;8220:360::-;8306:3;8334:38;8366:5;8334:38;:::i;:::-;8388:70;8451:6;8446:3;8388:70;:::i;:::-;8381:77;;8467:52;8512:6;8507:3;8500:4;8493:5;8489:16;8467:52;:::i;:::-;8544:29;8566:6;8544:29;:::i;:::-;8539:3;8535:39;8528:46;;8310:270;8220:360;;;;:::o;8586:161::-;8688:52;8734:5;8688:52;:::i;:::-;8683:3;8676:65;8586:161;;:::o;8753:364::-;8841:3;8869:39;8902:5;8869:39;:::i;:::-;8924:71;8988:6;8983:3;8924:71;:::i;:::-;8917:78;;9004:52;9049:6;9044:3;9037:4;9030:5;9026:16;9004:52;:::i;:::-;9081:29;9103:6;9081:29;:::i;:::-;9076:3;9072:39;9065:46;;8845:272;8753:364;;;;:::o;9123:377::-;9229:3;9257:39;9290:5;9257:39;:::i;:::-;9312:89;9394:6;9389:3;9312:89;:::i;:::-;9305:96;;9410:52;9455:6;9450:3;9443:4;9436:5;9432:16;9410:52;:::i;:::-;9487:6;9482:3;9478:16;9471:23;;9233:267;9123:377;;;;:::o;9530:845::-;9633:3;9670:5;9664:12;9699:36;9725:9;9699:36;:::i;:::-;9751:89;9833:6;9828:3;9751:89;:::i;:::-;9744:96;;9871:1;9860:9;9856:17;9887:1;9882:137;;;;10033:1;10028:341;;;;9849:520;;9882:137;9966:4;9962:9;9951;9947:25;9942:3;9935:38;10002:6;9997:3;9993:16;9986:23;;9882:137;;10028:341;10095:38;10127:5;10095:38;:::i;:::-;10155:1;10169:154;10183:6;10180:1;10177:13;10169:154;;;10257:7;10251:14;10247:1;10242:3;10238:11;10231:35;10307:1;10298:7;10294:15;10283:26;;10205:4;10202:1;10198:12;10193:17;;10169:154;;;10352:6;10347:3;10343:16;10336:23;;10035:334;;9849:520;;9637:738;;9530:845;;;;:::o;10381:366::-;10523:3;10544:67;10608:2;10603:3;10544:67;:::i;:::-;10537:74;;10620:93;10709:3;10620:93;:::i;:::-;10738:2;10733:3;10729:12;10722:19;;10381:366;;;:::o;10753:::-;10895:3;10916:67;10980:2;10975:3;10916:67;:::i;:::-;10909:74;;10992:93;11081:3;10992:93;:::i;:::-;11110:2;11105:3;11101:12;11094:19;;10753:366;;;:::o;11125:::-;11267:3;11288:67;11352:2;11347:3;11288:67;:::i;:::-;11281:74;;11364:93;11453:3;11364:93;:::i;:::-;11482:2;11477:3;11473:12;11466:19;;11125:366;;;:::o;11497:::-;11639:3;11660:67;11724:2;11719:3;11660:67;:::i;:::-;11653:74;;11736:93;11825:3;11736:93;:::i;:::-;11854:2;11849:3;11845:12;11838:19;;11497:366;;;:::o;11869:::-;12011:3;12032:67;12096:2;12091:3;12032:67;:::i;:::-;12025:74;;12108:93;12197:3;12108:93;:::i;:::-;12226:2;12221:3;12217:12;12210:19;;11869:366;;;:::o;12241:::-;12383:3;12404:67;12468:2;12463:3;12404:67;:::i;:::-;12397:74;;12480:93;12569:3;12480:93;:::i;:::-;12598:2;12593:3;12589:12;12582:19;;12241:366;;;:::o;12613:::-;12755:3;12776:67;12840:2;12835:3;12776:67;:::i;:::-;12769:74;;12852:93;12941:3;12852:93;:::i;:::-;12970:2;12965:3;12961:12;12954:19;;12613:366;;;:::o;12985:::-;13127:3;13148:67;13212:2;13207:3;13148:67;:::i;:::-;13141:74;;13224:93;13313:3;13224:93;:::i;:::-;13342:2;13337:3;13333:12;13326:19;;12985:366;;;:::o;13357:::-;13499:3;13520:67;13584:2;13579:3;13520:67;:::i;:::-;13513:74;;13596:93;13685:3;13596:93;:::i;:::-;13714:2;13709:3;13705:12;13698:19;;13357:366;;;:::o;13729:::-;13871:3;13892:67;13956:2;13951:3;13892:67;:::i;:::-;13885:74;;13968:93;14057:3;13968:93;:::i;:::-;14086:2;14081:3;14077:12;14070:19;;13729:366;;;:::o;14101:::-;14243:3;14264:67;14328:2;14323:3;14264:67;:::i;:::-;14257:74;;14340:93;14429:3;14340:93;:::i;:::-;14458:2;14453:3;14449:12;14442:19;;14101:366;;;:::o;14473:::-;14615:3;14636:67;14700:2;14695:3;14636:67;:::i;:::-;14629:74;;14712:93;14801:3;14712:93;:::i;:::-;14830:2;14825:3;14821:12;14814:19;;14473:366;;;:::o;14845:::-;14987:3;15008:67;15072:2;15067:3;15008:67;:::i;:::-;15001:74;;15084:93;15173:3;15084:93;:::i;:::-;15202:2;15197:3;15193:12;15186:19;;14845:366;;;:::o;15217:::-;15359:3;15380:67;15444:2;15439:3;15380:67;:::i;:::-;15373:74;;15456:93;15545:3;15456:93;:::i;:::-;15574:2;15569:3;15565:12;15558:19;;15217:366;;;:::o;15589:::-;15731:3;15752:67;15816:2;15811:3;15752:67;:::i;:::-;15745:74;;15828:93;15917:3;15828:93;:::i;:::-;15946:2;15941:3;15937:12;15930:19;;15589:366;;;:::o;15961:::-;16103:3;16124:67;16188:2;16183:3;16124:67;:::i;:::-;16117:74;;16200:93;16289:3;16200:93;:::i;:::-;16318:2;16313:3;16309:12;16302:19;;15961:366;;;:::o;16333:::-;16475:3;16496:67;16560:2;16555:3;16496:67;:::i;:::-;16489:74;;16572:93;16661:3;16572:93;:::i;:::-;16690:2;16685:3;16681:12;16674:19;;16333:366;;;:::o;16705:::-;16847:3;16868:67;16932:2;16927:3;16868:67;:::i;:::-;16861:74;;16944:93;17033:3;16944:93;:::i;:::-;17062:2;17057:3;17053:12;17046:19;;16705:366;;;:::o;17077:::-;17219:3;17240:67;17304:2;17299:3;17240:67;:::i;:::-;17233:74;;17316:93;17405:3;17316:93;:::i;:::-;17434:2;17429:3;17425:12;17418:19;;17077:366;;;:::o;17449:::-;17591:3;17612:67;17676:2;17671:3;17612:67;:::i;:::-;17605:74;;17688:93;17777:3;17688:93;:::i;:::-;17806:2;17801:3;17797:12;17790:19;;17449:366;;;:::o;17821:::-;17963:3;17984:67;18048:2;18043:3;17984:67;:::i;:::-;17977:74;;18060:93;18149:3;18060:93;:::i;:::-;18178:2;18173:3;18169:12;18162:19;;17821:366;;;:::o;18193:::-;18335:3;18356:67;18420:2;18415:3;18356:67;:::i;:::-;18349:74;;18432:93;18521:3;18432:93;:::i;:::-;18550:2;18545:3;18541:12;18534:19;;18193:366;;;:::o;18565:::-;18707:3;18728:67;18792:2;18787:3;18728:67;:::i;:::-;18721:74;;18804:93;18893:3;18804:93;:::i;:::-;18922:2;18917:3;18913:12;18906:19;;18565:366;;;:::o;18937:118::-;19024:24;19042:5;19024:24;:::i;:::-;19019:3;19012:37;18937:118;;:::o;19061:429::-;19238:3;19260:92;19348:3;19339:6;19260:92;:::i;:::-;19253:99;;19369:95;19460:3;19451:6;19369:95;:::i;:::-;19362:102;;19481:3;19474:10;;19061:429;;;;;:::o;19496:222::-;19589:4;19627:2;19616:9;19612:18;19604:26;;19640:71;19708:1;19697:9;19693:17;19684:6;19640:71;:::i;:::-;19496:222;;;;:::o;19724:442::-;19873:4;19911:2;19900:9;19896:18;19888:26;;19924:71;19992:1;19981:9;19977:17;19968:6;19924:71;:::i;:::-;20005:72;20073:2;20062:9;20058:18;20049:6;20005:72;:::i;:::-;20087;20155:2;20144:9;20140:18;20131:6;20087:72;:::i;:::-;19724:442;;;;;;:::o;20172:640::-;20367:4;20405:3;20394:9;20390:19;20382:27;;20419:71;20487:1;20476:9;20472:17;20463:6;20419:71;:::i;:::-;20500:72;20568:2;20557:9;20553:18;20544:6;20500:72;:::i;:::-;20582;20650:2;20639:9;20635:18;20626:6;20582:72;:::i;:::-;20701:9;20695:4;20691:20;20686:2;20675:9;20671:18;20664:48;20729:76;20800:4;20791:6;20729:76;:::i;:::-;20721:84;;20172:640;;;;;;;:::o;20818:210::-;20905:4;20943:2;20932:9;20928:18;20920:26;;20956:65;21018:1;21007:9;21003:17;20994:6;20956:65;:::i;:::-;20818:210;;;;:::o;21034:252::-;21142:4;21180:2;21169:9;21165:18;21157:26;;21193:86;21276:1;21265:9;21261:17;21252:6;21193:86;:::i;:::-;21034:252;;;;:::o;21292:313::-;21405:4;21443:2;21432:9;21428:18;21420:26;;21492:9;21486:4;21482:20;21478:1;21467:9;21463:17;21456:47;21520:78;21593:4;21584:6;21520:78;:::i;:::-;21512:86;;21292:313;;;;:::o;21611:419::-;21777:4;21815:2;21804:9;21800:18;21792:26;;21864:9;21858:4;21854:20;21850:1;21839:9;21835:17;21828:47;21892:131;22018:4;21892:131;:::i;:::-;21884:139;;21611:419;;;:::o;22036:::-;22202:4;22240:2;22229:9;22225:18;22217:26;;22289:9;22283:4;22279:20;22275:1;22264:9;22260:17;22253:47;22317:131;22443:4;22317:131;:::i;:::-;22309:139;;22036:419;;;:::o;22461:::-;22627:4;22665:2;22654:9;22650:18;22642:26;;22714:9;22708:4;22704:20;22700:1;22689:9;22685:17;22678:47;22742:131;22868:4;22742:131;:::i;:::-;22734:139;;22461:419;;;:::o;22886:::-;23052:4;23090:2;23079:9;23075:18;23067:26;;23139:9;23133:4;23129:20;23125:1;23114:9;23110:17;23103:47;23167:131;23293:4;23167:131;:::i;:::-;23159:139;;22886:419;;;:::o;23311:::-;23477:4;23515:2;23504:9;23500:18;23492:26;;23564:9;23558:4;23554:20;23550:1;23539:9;23535:17;23528:47;23592:131;23718:4;23592:131;:::i;:::-;23584:139;;23311:419;;;:::o;23736:::-;23902:4;23940:2;23929:9;23925:18;23917:26;;23989:9;23983:4;23979:20;23975:1;23964:9;23960:17;23953:47;24017:131;24143:4;24017:131;:::i;:::-;24009:139;;23736:419;;;:::o;24161:::-;24327:4;24365:2;24354:9;24350:18;24342:26;;24414:9;24408:4;24404:20;24400:1;24389:9;24385:17;24378:47;24442:131;24568:4;24442:131;:::i;:::-;24434:139;;24161:419;;;:::o;24586:::-;24752:4;24790:2;24779:9;24775:18;24767:26;;24839:9;24833:4;24829:20;24825:1;24814:9;24810:17;24803:47;24867:131;24993:4;24867:131;:::i;:::-;24859:139;;24586:419;;;:::o;25011:::-;25177:4;25215:2;25204:9;25200:18;25192:26;;25264:9;25258:4;25254:20;25250:1;25239:9;25235:17;25228:47;25292:131;25418:4;25292:131;:::i;:::-;25284:139;;25011:419;;;:::o;25436:::-;25602:4;25640:2;25629:9;25625:18;25617:26;;25689:9;25683:4;25679:20;25675:1;25664:9;25660:17;25653:47;25717:131;25843:4;25717:131;:::i;:::-;25709:139;;25436:419;;;:::o;25861:::-;26027:4;26065:2;26054:9;26050:18;26042:26;;26114:9;26108:4;26104:20;26100:1;26089:9;26085:17;26078:47;26142:131;26268:4;26142:131;:::i;:::-;26134:139;;25861:419;;;:::o;26286:::-;26452:4;26490:2;26479:9;26475:18;26467:26;;26539:9;26533:4;26529:20;26525:1;26514:9;26510:17;26503:47;26567:131;26693:4;26567:131;:::i;:::-;26559:139;;26286:419;;;:::o;26711:::-;26877:4;26915:2;26904:9;26900:18;26892:26;;26964:9;26958:4;26954:20;26950:1;26939:9;26935:17;26928:47;26992:131;27118:4;26992:131;:::i;:::-;26984:139;;26711:419;;;:::o;27136:::-;27302:4;27340:2;27329:9;27325:18;27317:26;;27389:9;27383:4;27379:20;27375:1;27364:9;27360:17;27353:47;27417:131;27543:4;27417:131;:::i;:::-;27409:139;;27136:419;;;:::o;27561:::-;27727:4;27765:2;27754:9;27750:18;27742:26;;27814:9;27808:4;27804:20;27800:1;27789:9;27785:17;27778:47;27842:131;27968:4;27842:131;:::i;:::-;27834:139;;27561:419;;;:::o;27986:::-;28152:4;28190:2;28179:9;28175:18;28167:26;;28239:9;28233:4;28229:20;28225:1;28214:9;28210:17;28203:47;28267:131;28393:4;28267:131;:::i;:::-;28259:139;;27986:419;;;:::o;28411:::-;28577:4;28615:2;28604:9;28600:18;28592:26;;28664:9;28658:4;28654:20;28650:1;28639:9;28635:17;28628:47;28692:131;28818:4;28692:131;:::i;:::-;28684:139;;28411:419;;;:::o;28836:::-;29002:4;29040:2;29029:9;29025:18;29017:26;;29089:9;29083:4;29079:20;29075:1;29064:9;29060:17;29053:47;29117:131;29243:4;29117:131;:::i;:::-;29109:139;;28836:419;;;:::o;29261:::-;29427:4;29465:2;29454:9;29450:18;29442:26;;29514:9;29508:4;29504:20;29500:1;29489:9;29485:17;29478:47;29542:131;29668:4;29542:131;:::i;:::-;29534:139;;29261:419;;;:::o;29686:::-;29852:4;29890:2;29879:9;29875:18;29867:26;;29939:9;29933:4;29929:20;29925:1;29914:9;29910:17;29903:47;29967:131;30093:4;29967:131;:::i;:::-;29959:139;;29686:419;;;:::o;30111:::-;30277:4;30315:2;30304:9;30300:18;30292:26;;30364:9;30358:4;30354:20;30350:1;30339:9;30335:17;30328:47;30392:131;30518:4;30392:131;:::i;:::-;30384:139;;30111:419;;;:::o;30536:::-;30702:4;30740:2;30729:9;30725:18;30717:26;;30789:9;30783:4;30779:20;30775:1;30764:9;30760:17;30753:47;30817:131;30943:4;30817:131;:::i;:::-;30809:139;;30536:419;;;:::o;30961:::-;31127:4;31165:2;31154:9;31150:18;31142:26;;31214:9;31208:4;31204:20;31200:1;31189:9;31185:17;31178:47;31242:131;31368:4;31242:131;:::i;:::-;31234:139;;30961:419;;;:::o;31386:222::-;31479:4;31517:2;31506:9;31502:18;31494:26;;31530:71;31598:1;31587:9;31583:17;31574:6;31530:71;:::i;:::-;31386:222;;;;:::o;31614:129::-;31648:6;31675:20;;:::i;:::-;31665:30;;31704:33;31732:4;31724:6;31704:33;:::i;:::-;31614:129;;;:::o;31749:75::-;31782:6;31815:2;31809:9;31799:19;;31749:75;:::o;31830:307::-;31891:4;31981:18;31973:6;31970:30;31967:56;;;32003:18;;:::i;:::-;31967:56;32041:29;32063:6;32041:29;:::i;:::-;32033:37;;32125:4;32119;32115:15;32107:23;;31830:307;;;:::o;32143:308::-;32205:4;32295:18;32287:6;32284:30;32281:56;;;32317:18;;:::i;:::-;32281:56;32355:29;32377:6;32355:29;:::i;:::-;32347:37;;32439:4;32433;32429:15;32421:23;;32143:308;;;:::o;32457:141::-;32506:4;32529:3;32521:11;;32552:3;32549:1;32542:14;32586:4;32583:1;32573:18;32565:26;;32457:141;;;:::o;32604:98::-;32655:6;32689:5;32683:12;32673:22;;32604:98;;;:::o;32708:99::-;32760:6;32794:5;32788:12;32778:22;;32708:99;;;:::o;32813:168::-;32896:11;32930:6;32925:3;32918:19;32970:4;32965:3;32961:14;32946:29;;32813:168;;;;:::o;32987:169::-;33071:11;33105:6;33100:3;33093:19;33145:4;33140:3;33136:14;33121:29;;32987:169;;;;:::o;33162:148::-;33264:11;33301:3;33286:18;;33162:148;;;;:::o;33316:305::-;33356:3;33375:20;33393:1;33375:20;:::i;:::-;33370:25;;33409:20;33427:1;33409:20;:::i;:::-;33404:25;;33563:1;33495:66;33491:74;33488:1;33485:81;33482:107;;;33569:18;;:::i;:::-;33482:107;33613:1;33610;33606:9;33599:16;;33316:305;;;;:::o;33627:185::-;33667:1;33684:20;33702:1;33684:20;:::i;:::-;33679:25;;33718:20;33736:1;33718:20;:::i;:::-;33713:25;;33757:1;33747:35;;33762:18;;:::i;:::-;33747:35;33804:1;33801;33797:9;33792:14;;33627:185;;;;:::o;33818:348::-;33858:7;33881:20;33899:1;33881:20;:::i;:::-;33876:25;;33915:20;33933:1;33915:20;:::i;:::-;33910:25;;34103:1;34035:66;34031:74;34028:1;34025:81;34020:1;34013:9;34006:17;34002:105;33999:131;;;34110:18;;:::i;:::-;33999:131;34158:1;34155;34151:9;34140:20;;33818:348;;;;:::o;34172:191::-;34212:4;34232:20;34250:1;34232:20;:::i;:::-;34227:25;;34266:20;34284:1;34266:20;:::i;:::-;34261:25;;34305:1;34302;34299:8;34296:34;;;34310:18;;:::i;:::-;34296:34;34355:1;34352;34348:9;34340:17;;34172:191;;;;:::o;34369:96::-;34406:7;34435:24;34453:5;34435:24;:::i;:::-;34424:35;;34369:96;;;:::o;34471:90::-;34505:7;34548:5;34541:13;34534:21;34523:32;;34471:90;;;:::o;34567:149::-;34603:7;34643:66;34636:5;34632:78;34621:89;;34567:149;;;:::o;34722:126::-;34759:7;34799:42;34792:5;34788:54;34777:65;;34722:126;;;:::o;34854:77::-;34891:7;34920:5;34909:16;;34854:77;;;:::o;34937:141::-;35002:9;35035:37;35066:5;35035:37;:::i;:::-;35022:50;;34937:141;;;:::o;35084:126::-;35134:9;35167:37;35198:5;35167:37;:::i;:::-;35154:50;;35084:126;;;:::o;35216:113::-;35266:9;35299:24;35317:5;35299:24;:::i;:::-;35286:37;;35216:113;;;:::o;35335:154::-;35419:6;35414:3;35409;35396:30;35481:1;35472:6;35467:3;35463:16;35456:27;35335:154;;;:::o;35495:307::-;35563:1;35573:113;35587:6;35584:1;35581:13;35573:113;;;35672:1;35667:3;35663:11;35657:18;35653:1;35648:3;35644:11;35637:39;35609:2;35606:1;35602:10;35597:15;;35573:113;;;35704:6;35701:1;35698:13;35695:101;;;35784:1;35775:6;35770:3;35766:16;35759:27;35695:101;35544:258;35495:307;;;:::o;35808:320::-;35852:6;35889:1;35883:4;35879:12;35869:22;;35936:1;35930:4;35926:12;35957:18;35947:81;;36013:4;36005:6;36001:17;35991:27;;35947:81;36075:2;36067:6;36064:14;36044:18;36041:38;36038:84;;;36094:18;;:::i;:::-;36038:84;35859:269;35808:320;;;:::o;36134:281::-;36217:27;36239:4;36217:27;:::i;:::-;36209:6;36205:40;36347:6;36335:10;36332:22;36311:18;36299:10;36296:34;36293:62;36290:88;;;36358:18;;:::i;:::-;36290:88;36398:10;36394:2;36387:22;36177:238;36134:281;;:::o;36421:233::-;36460:3;36483:24;36501:5;36483:24;:::i;:::-;36474:33;;36529:66;36522:5;36519:77;36516:103;;;36599:18;;:::i;:::-;36516:103;36646:1;36639:5;36635:13;36628:20;;36421:233;;;:::o;36660:176::-;36692:1;36709:20;36727:1;36709:20;:::i;:::-;36704:25;;36743:20;36761:1;36743:20;:::i;:::-;36738:25;;36782:1;36772:35;;36787:18;;:::i;:::-;36772:35;36828:1;36825;36821:9;36816:14;;36660:176;;;;:::o;36842:180::-;36890:77;36887:1;36880:88;36987:4;36984:1;36977:15;37011:4;37008:1;37001:15;37028:180;37076:77;37073:1;37066:88;37173:4;37170:1;37163:15;37197:4;37194:1;37187:15;37214:180;37262:77;37259:1;37252:88;37359:4;37356:1;37349:15;37383:4;37380:1;37373:15;37400:180;37448:77;37445:1;37438:88;37545:4;37542:1;37535:15;37569:4;37566:1;37559:15;37586:180;37634:77;37631:1;37624:88;37731:4;37728:1;37721:15;37755:4;37752:1;37745:15;37772:180;37820:77;37817:1;37810:88;37917:4;37914:1;37907:15;37941:4;37938:1;37931:15;37958:117;38067:1;38064;38057:12;38081:117;38190:1;38187;38180:12;38204:117;38313:1;38310;38303:12;38327:117;38436:1;38433;38426:12;38450:102;38491:6;38542:2;38538:7;38533:2;38526:5;38522:14;38518:28;38508:38;;38450:102;;;:::o;38558:230::-;38698:34;38694:1;38686:6;38682:14;38675:58;38767:13;38762:2;38754:6;38750:15;38743:38;38558:230;:::o;38794:237::-;38934:34;38930:1;38922:6;38918:14;38911:58;39003:20;38998:2;38990:6;38986:15;38979:45;38794:237;:::o;39037:225::-;39177:34;39173:1;39165:6;39161:14;39154:58;39246:8;39241:2;39233:6;39229:15;39222:33;39037:225;:::o;39268:178::-;39408:30;39404:1;39396:6;39392:14;39385:54;39268:178;:::o;39452:223::-;39592:34;39588:1;39580:6;39576:14;39569:58;39661:6;39656:2;39648:6;39644:15;39637:31;39452:223;:::o;39681:175::-;39821:27;39817:1;39809:6;39805:14;39798:51;39681:175;:::o;39862:170::-;40002:22;39998:1;39990:6;39986:14;39979:46;39862:170;:::o;40038:231::-;40178:34;40174:1;40166:6;40162:14;40155:58;40247:14;40242:2;40234:6;40230:15;40223:39;40038:231;:::o;40275:238::-;40415:34;40411:1;40403:6;40399:14;40392:58;40484:21;40479:2;40471:6;40467:15;40460:46;40275:238;:::o;40519:243::-;40659:34;40655:1;40647:6;40643:14;40636:58;40728:26;40723:2;40715:6;40711:15;40704:51;40519:243;:::o;40768:229::-;40908:34;40904:1;40896:6;40892:14;40885:58;40977:12;40972:2;40964:6;40960:15;40953:37;40768:229;:::o;41003:228::-;41143:34;41139:1;41131:6;41127:14;41120:58;41212:11;41207:2;41199:6;41195:15;41188:36;41003:228;:::o;41237:182::-;41377:34;41373:1;41365:6;41361:14;41354:58;41237:182;:::o;41425:172::-;41565:24;41561:1;41553:6;41549:14;41542:48;41425:172;:::o;41603:231::-;41743:34;41739:1;41731:6;41727:14;41720:58;41812:14;41807:2;41799:6;41795:15;41788:39;41603:231;:::o;41840:182::-;41980:34;41976:1;41968:6;41964:14;41957:58;41840:182;:::o;42028:228::-;42168:34;42164:1;42156:6;42152:14;42145:58;42237:11;42232:2;42224:6;42220:15;42213:36;42028:228;:::o;42262:221::-;42402:34;42398:1;42390:6;42386:14;42379:58;42471:4;42466:2;42458:6;42454:15;42447:29;42262:221;:::o;42489:220::-;42629:34;42625:1;42617:6;42613:14;42606:58;42698:3;42693:2;42685:6;42681:15;42674:28;42489:220;:::o;42715:236::-;42855:34;42851:1;42843:6;42839:14;42832:58;42924:19;42919:2;42911:6;42907:15;42900:44;42715:236;:::o;42957:220::-;43097:34;43093:1;43085:6;43081:14;43074:58;43166:3;43161:2;43153:6;43149:15;43142:28;42957:220;:::o;43183:231::-;43323:34;43319:1;43311:6;43307:14;43300:58;43392:14;43387:2;43379:6;43375:15;43368:39;43183:231;:::o;43420:228::-;43560:34;43556:1;43548:6;43544:14;43537:58;43629:11;43624:2;43616:6;43612:15;43605:36;43420:228;:::o;43654:122::-;43727:24;43745:5;43727:24;:::i;:::-;43720:5;43717:35;43707:63;;43766:1;43763;43756:12;43707:63;43654:122;:::o;43782:116::-;43852:21;43867:5;43852:21;:::i;:::-;43845:5;43842:32;43832:60;;43888:1;43885;43878:12;43832:60;43782:116;:::o;43904:120::-;43976:23;43993:5;43976:23;:::i;:::-;43969:5;43966:34;43956:62;;44014:1;44011;44004:12;43956:62;43904:120;:::o;44030:122::-;44103:24;44121:5;44103:24;:::i;:::-;44096:5;44093:35;44083:63;;44142:1;44139;44132:12;44083:63;44030:122;:::o

Swarm Source

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