ETH Price: $3,393.15 (-1.25%)
Gas: 2 Gwei

Token

Inventors NFT (INFT)
 

Overview

Max Total Supply

1,219 INFT

Holders

313

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
8 INFT
0xe836F14777b5AAf54dfF92Ead58F52a68041A296
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:
InventorsNFT

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-02-27
*/

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.1;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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





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

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

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

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
    }

    // Compiler will pack the following 
    // _currentIndex and _burnCounter into a single 256bit word.
    
    // The tokenId of the next token to be minted.
    uint128 internal _currentIndex;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex times
        unchecked {
            return _currentIndex - _burnCounter;    
        }
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (!ownership.burned) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }
        revert TokenIndexOutOfBounds();
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        if (index >= balanceOf(owner)) revert OwnerIndexOutOfBounds();
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        // Execution should never reach this point.
        revert();
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    function _numberBurned(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        return uint256(_addressData[owner].numberBurned);
    }

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (!_checkOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

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

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

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

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

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

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

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

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
                updatedIndex++;
            }

            _currentIndex = uint128(updatedIndex);
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            isApprovedForAll(prevOwnership.addr, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

    /**
     * @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 {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

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

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

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

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 TransferToNonERC721ReceiverImplementer();
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

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


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

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

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

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

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

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

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

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


// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}


/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


contract InventorsNFT is ERC721A, ReentrancyGuard, Ownable{
  using SafeMath for uint256;
  using Address for address;
  using Strings for uint256;

  uint256 public constant presalePrice = 0.12 ether;
  uint256 public constant salePrice = 0.14 ether;
  uint256 public constant maxPurchase = 20;
  uint256 public constant maxPrePurchase = 4;

  bool private _saleActive = false;
  bool private _presaleActive = false;
  uint256 private _maxInventors = 7777;
  string private _baseTokenURI; // set later
  

  event InventorMinted(address sender, uint256 quantity);

  constructor(uint256 _totalInventors) ERC721A('Inventors NFT', 'INFT') {
    _maxInventors = _totalInventors;
  }

  // api

  /**
   * @dev Returns the URI to the contract metadata
   */
   
  function contractURI() public pure returns (string memory) {
    return 'ipfs://QmaqkerewNmEBqAesJHRk8yoLzm6HWgbt9L2U1njAb5TEE';
  }

  /**
   * @dev Internal function to return the base uri for all tokens
   */
  function _baseURI() internal view virtual override returns (string memory) {
    return _baseTokenURI;
  }

  /**
   * @dev Returns list of token ids owned by address without the need for IERC721Enumerable
   */
  function verifyOwnership(address _owner)
    external
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory tokenIds = new uint256[](ownerTokenCount);
    uint256 k = 0;
    for (uint256 i = 1; i <= _maxInventors; i++) {
      if (_exists(i) && _owner == ownerOf(i)) {
        tokenIds[k] = i;
        k++;
      }
    }
    delete k;
    return tokenIds;
  }

  modifier onlyValidQuantity(uint256 quantity) {
    require(totalSupply() + quantity <= _maxInventors, 'Exceeds supply');
    require(quantity <= maxPurchase, '20 Max');
    _;
  }

  modifier onlyPreValidQuantity(uint256 quantity) {
    require(totalSupply() + quantity <= _maxInventors, 'Exceeds supply');
    require(quantity <= maxPrePurchase, '4 Max');
    _;
  }

  function mintInventor(uint256 quantity)
    external
    payable
    onlyValidQuantity(quantity)
  {
    require(_saleActive, 'Sale not active');
    require(!_presaleActive, 'Presale active');
    require(salePrice.mul(quantity) == msg.value, 'Wrong amount');
    _safeMint(msg.sender, quantity);
    emit InventorMinted(msg.sender, quantity);
  }

  function preSaleMint(uint256 quantity)
    external
    payable
    onlyPreValidQuantity(quantity)
  {
    require(_presaleActive, 'Presale not active');
    require(!_saleActive, 'Sale active');
    require(presalePrice.mul(quantity) == msg.value, 'Wrong amount');
    _safeMint(msg.sender, quantity);
    emit InventorMinted(msg.sender, quantity);
  }

  // only owner functions

  /**
   *  @dev Setting aside inventors for marketing and other purposes.
  */  

  function reserveInventors(uint quantity) 
    external 
    onlyOwner     
    {
        require(totalSupply() + quantity <= _maxInventors, 'Exceeds supply');
     _safeMint(msg.sender, quantity);
    }

  /**
   * @dev Setter for the Sale State
   */
  function setSaleState(bool _newSaleActive) external onlyOwner {
    _saleActive = _newSaleActive;
  }

  /**
   * @dev Setter for the Presale State
   */
  function setPresaleState(bool _newPresaleActive) external onlyOwner {
    _presaleActive = _newPresaleActive;
  }

  /**
   * @dev Setter for the Base URI
   */
  function setBaseURI(string calldata baseURI) external onlyOwner {
    _baseTokenURI = baseURI;
  }
  

  function disburse() external payable onlyOwner {
    (bool success, ) = payable(msg.sender).call{ value: address(this).balance }(
      ''
    );
    require(success);
  }

  // fallback functions to handle someone sending ETH to contract
  fallback() external payable {}

  receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_totalInventors","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"InventorMinted","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"},{"stateMutability":"payable","type":"fallback"},{"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":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"disburse","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPrePurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintInventor","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"preSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"reserveInventors","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":[],"name":"salePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_newPresaleActive","type":"bool"}],"name":"setPresaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_newSaleActive","type":"bool"}],"name":"setSaleState","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"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"verifyOwnership","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526000600860146101000a81548160ff0219169083151502179055506000600860156101000a81548160ff021916908315150217905550611e616009553480156200004d57600080fd5b5060405162004459380380620044598339818101604052810190620000739190620002de565b6040518060400160405280600d81526020017f496e76656e746f7273204e4654000000000000000000000000000000000000008152506040518060400160405280600481526020017f494e4654000000000000000000000000000000000000000000000000000000008152508160019080519060200190620000f792919062000217565b5080600290805190602001906200011092919062000217565b50505060016007819055506200013b6200012f6200014960201b60201c565b6200015160201b60201c565b80600981905550506200039e565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805462000225906200031a565b90600052602060002090601f01602090048101928262000249576000855562000295565b82601f106200026457805160ff191683800117855562000295565b8280016001018555821562000295579182015b828111156200029457825182559160200191906001019062000277565b5b509050620002a49190620002a8565b5090565b5b80821115620002c3576000816000905550600101620002a9565b5090565b600081519050620002d88162000384565b92915050565b600060208284031215620002f757620002f66200037f565b5b60006200030784828501620002c7565b91505092915050565b6000819050919050565b600060028204905060018216806200033357607f821691505b602082108114156200034a576200034962000350565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6200038f8162000310565b81146200039b57600080fd5b50565b6140ab80620003ae6000396000f3fe6080604052600436106101e65760003560e01c80638da5cb5b11610102578063bce4d6ae11610095578063e8a3d48511610064578063e8a3d485146106ce578063e985e9c5146106f9578063f2fde38b14610736578063f51f96dd1461075f576101ed565b8063bce4d6ae14610614578063c4e370951461063d578063c87b56dd14610666578063ccd98731146106a3576101ed565b8063977b055b116100d1578063977b055b1461058d578063a22cb465146105b8578063abc6fd0b146105e1578063b88d4fde146105eb576101ed565b80638da5cb5b146104f25780638e8a20141461051d57806390ac59411461054657806395d89b4114610562576101ed565b80632f745c591161017a5780636352211e116101495780636352211e1461044557806370a0823114610482578063715018a6146104bf5780637835c635146104d6576101ed565b80632f745c591461037957806342842e0e146103b65780634f6ccce7146103df57806355f804b31461041c576101ed565b8063095ea7b3116101b6578063095ea7b3146102bf57806318160ddd146102e857806323b872dd146103135780632cc9c1511461033c576101ed565b80620e7fa8146101ef57806301ffc9a71461021a57806306fdde0314610257578063081812fc14610282576101ed565b366101ed57005b005b3480156101fb57600080fd5b5061020461078a565b6040516102119190613967565b60405180910390f35b34801561022657600080fd5b50610241600480360381019061023c9190613355565b610796565b60405161024e91906137ea565b60405180910390f35b34801561026357600080fd5b5061026c6108e0565b6040516102799190613805565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a491906133fc565b610972565b6040516102b69190613738565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e191906132e8565b6109ee565b005b3480156102f457600080fd5b506102fd610af9565b60405161030a9190613967565b60405180910390f35b34801561031f57600080fd5b5061033a600480360381019061033591906131d2565b610b4e565b005b34801561034857600080fd5b50610363600480360381019061035e9190613165565b610b5e565b60405161037091906137c8565b60405180910390f35b34801561038557600080fd5b506103a0600480360381019061039b91906132e8565b610c6a565b6040516103ad9190613967565b60405180910390f35b3480156103c257600080fd5b506103dd60048036038101906103d891906131d2565b610e71565b005b3480156103eb57600080fd5b50610406600480360381019061040191906133fc565b610e91565b6040516104139190613967565b60405180910390f35b34801561042857600080fd5b50610443600480360381019061043e91906133af565b611002565b005b34801561045157600080fd5b5061046c600480360381019061046791906133fc565b611094565b6040516104799190613738565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a49190613165565b6110aa565b6040516104b69190613967565b60405180910390f35b3480156104cb57600080fd5b506104d461117a565b005b6104f060048036038101906104eb91906133fc565b611202565b005b3480156104fe57600080fd5b506105076113e0565b6040516105149190613738565b60405180910390f35b34801561052957600080fd5b50610544600480360381019061053f91906133fc565b61140a565b005b610560600480360381019061055b91906133fc565b6114ea565b005b34801561056e57600080fd5b506105776116c8565b6040516105849190613805565b60405180910390f35b34801561059957600080fd5b506105a261175a565b6040516105af9190613967565b60405180910390f35b3480156105c457600080fd5b506105df60048036038101906105da91906132a8565b61175f565b005b6105e96118d7565b005b3480156105f757600080fd5b50610612600480360381019061060d9190613225565b6119cc565b005b34801561062057600080fd5b5061063b60048036038101906106369190613328565b611a1f565b005b34801561064957600080fd5b50610664600480360381019061065f9190613328565b611ab8565b005b34801561067257600080fd5b5061068d600480360381019061068891906133fc565b611b51565b60405161069a9190613805565b60405180910390f35b3480156106af57600080fd5b506106b8611bf0565b6040516106c59190613967565b60405180910390f35b3480156106da57600080fd5b506106e3611bf5565b6040516106f09190613805565b60405180910390f35b34801561070557600080fd5b50610720600480360381019061071b9190613192565b611c15565b60405161072d91906137ea565b60405180910390f35b34801561074257600080fd5b5061075d60048036038101906107589190613165565b611ca9565b005b34801561076b57600080fd5b50610774611da1565b6040516107819190613967565b60405180910390f35b6701aa535d3d0c000081565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061086157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108c957507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108d957506108d882611dad565b5b9050919050565b6060600180546108ef90613c2a565b80601f016020809104026020016040519081016040528092919081815260200182805461091b90613c2a565b80156109685780601f1061093d57610100808354040283529160200191610968565b820191906000526020600020905b81548152906001019060200180831161094b57829003601f168201915b5050505050905090565b600061097d82611e17565b6109b3576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109f982611094565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a61576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a80611e7f565b73ffffffffffffffffffffffffffffffffffffffff1614158015610ab25750610ab081610aab611e7f565b611c15565b155b15610ae9576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610af4838383611e87565b505050565b60008060109054906101000a90046fffffffffffffffffffffffffffffffff1660008054906101000a90046fffffffffffffffffffffffffffffffff16036fffffffffffffffffffffffffffffffff16905090565b610b59838383611f39565b505050565b60606000610b6b836110aa565b905060008167ffffffffffffffff811115610b8957610b88613dc3565b5b604051908082528060200260200182016040528015610bb75781602001602082028036833780820191505090505b509050600080600190505b6009548111610c5a57610bd481611e17565b8015610c135750610be481611094565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b15610c475780838381518110610c2c57610c2b613d94565b5b6020026020010181815250508180610c4390613c8d565b9250505b8080610c5290613c8d565b915050610bc2565b5060009050819350505050919050565b6000610c75836110aa565b8210610cad576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060005b83811015610e65576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115610dc45750610e58565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610e0457806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e565786841415610e4d578195505050505050610e6b565b83806001019450505b505b8080600101915050610ce7565b50600080fd5b92915050565b610e8c838383604051806020016040528060008152506119cc565b505050565b60008060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000805b82811015610fca576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151610fbc5785831415610fb35781945050505050610ffd565b82806001019350505b508080600101915050610ec9565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b61100a611e7f565b73ffffffffffffffffffffffffffffffffffffffff166110286113e0565b73ffffffffffffffffffffffffffffffffffffffff161461107e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107590613927565b60405180910390fd5b8181600a919061108f929190612f50565b505050565b600061109f82612456565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611112576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611182611e7f565b73ffffffffffffffffffffffffffffffffffffffff166111a06113e0565b73ffffffffffffffffffffffffffffffffffffffff16146111f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ed90613927565b60405180910390fd5b61120060006126fe565b565b806009548161120f610af9565b6112199190613a5f565b111561125a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125190613827565b60405180910390fd5b600481111561129e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611295906138c7565b60405180910390fd5b600860159054906101000a900460ff166112ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e490613887565b60405180910390fd5b600860149054906101000a900460ff161561133d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133490613907565b60405180910390fd5b34611359836701aa535d3d0c00006127c490919063ffffffff16565b14611399576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139090613947565b60405180910390fd5b6113a333836127da565b7f7fad22d2966f3b60ec8643dcface93c5d6668f759a86c39839c4cd74e1db355933836040516113d492919061379f565b60405180910390a15050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611412611e7f565b73ffffffffffffffffffffffffffffffffffffffff166114306113e0565b73ffffffffffffffffffffffffffffffffffffffff1614611486576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147d90613927565b60405180910390fd5b60095481611492610af9565b61149c9190613a5f565b11156114dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d490613827565b60405180910390fd5b6114e733826127da565b50565b80600954816114f7610af9565b6115019190613a5f565b1115611542576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153990613827565b60405180910390fd5b6014811115611586576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157d90613847565b60405180910390fd5b600860149054906101000a900460ff166115d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cc906138e7565b60405180910390fd5b600860159054906101000a900460ff1615611625576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161c906138a7565b60405180910390fd5b34611641836701f161421c8e00006127c490919063ffffffff16565b14611681576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167890613947565b60405180910390fd5b61168b33836127da565b7f7fad22d2966f3b60ec8643dcface93c5d6668f759a86c39839c4cd74e1db355933836040516116bc92919061379f565b60405180910390a15050565b6060600280546116d790613c2a565b80601f016020809104026020016040519081016040528092919081815260200182805461170390613c2a565b80156117505780601f1061172557610100808354040283529160200191611750565b820191906000526020600020905b81548152906001019060200180831161173357829003601f168201915b5050505050905090565b601481565b611767611e7f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117cc576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600660006117d9611e7f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611886611e7f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118cb91906137ea565b60405180910390a35050565b6118df611e7f565b73ffffffffffffffffffffffffffffffffffffffff166118fd6113e0565b73ffffffffffffffffffffffffffffffffffffffff1614611953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194a90613927565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161197990613723565b60006040518083038185875af1925050503d80600081146119b6576040519150601f19603f3d011682016040523d82523d6000602084013e6119bb565b606091505b50509050806119c957600080fd5b50565b6119d7848484611f39565b6119e3848484846127f8565b611a19576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b611a27611e7f565b73ffffffffffffffffffffffffffffffffffffffff16611a456113e0565b73ffffffffffffffffffffffffffffffffffffffff1614611a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9290613927565b60405180910390fd5b80600860156101000a81548160ff02191690831515021790555050565b611ac0611e7f565b73ffffffffffffffffffffffffffffffffffffffff16611ade6113e0565b73ffffffffffffffffffffffffffffffffffffffff1614611b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2b90613927565b60405180910390fd5b80600860146101000a81548160ff02191690831515021790555050565b6060611b5c82611e17565b611b92576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611b9c612986565b9050600081511415611bbd5760405180602001604052806000815250611be8565b80611bc784612a18565b604051602001611bd89291906136ff565b6040516020818303038152906040525b915050919050565b600481565b606060405180606001604052806035815260200161404160359139905090565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611cb1611e7f565b73ffffffffffffffffffffffffffffffffffffffff16611ccf6113e0565b73ffffffffffffffffffffffffffffffffffffffff1614611d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1c90613927565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8c90613867565b60405180910390fd5b611d9e816126fe565b50565b6701f161421c8e000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682108015611e78575060036000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611f4482612456565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611f6b611e7f565b73ffffffffffffffffffffffffffffffffffffffff161480611f9e5750611f9d8260000151611f98611e7f565b611c15565b5b80611fe35750611fac611e7f565b73ffffffffffffffffffffffffffffffffffffffff16611fcb84610972565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061201c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612085576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156120ec576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120f98585856001612b79565b6121096000848460000151611e87565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156123e65760008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168110156123e55782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461244f8585856001612b7f565b5050505050565b61245e612fd6565b600082905060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168110156126c7576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516126c557600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146125a95780925050506126f9565b5b6001156126c457818060019003925050600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146126bf5780925050506126f9565b6125aa565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081836127d29190613ae6565b905092915050565b6127f4828260405180602001604052806000815250612b85565b5050565b60006128198473ffffffffffffffffffffffffffffffffffffffff16612b97565b15612979578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612842611e7f565b8786866040518563ffffffff1660e01b81526004016128649493929190613753565b602060405180830381600087803b15801561287e57600080fd5b505af19250505080156128af57506040513d601f19601f820116820180604052508101906128ac9190613382565b60015b612929573d80600081146128df576040519150601f19603f3d011682016040523d82523d6000602084013e6128e4565b606091505b50600081511415612921576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061297e565b600190505b949350505050565b6060600a805461299590613c2a565b80601f01602080910402602001604051908101604052809291908181526020018280546129c190613c2a565b8015612a0e5780601f106129e357610100808354040283529160200191612a0e565b820191906000526020600020905b8154815290600101906020018083116129f157829003601f168201915b5050505050905090565b60606000821415612a60576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b74565b600082905060005b60008214612a92578080612a7b90613c8d565b915050600a82612a8b9190613ab5565b9150612a68565b60008167ffffffffffffffff811115612aae57612aad613dc3565b5b6040519080825280601f01601f191660200182016040528015612ae05781602001600182028036833780820191505090505b5090505b60008514612b6d57600182612af99190613b40565b9150600a85612b089190613cd6565b6030612b149190613a5f565b60f81b818381518110612b2a57612b29613d94565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b669190613ab5565b9450612ae4565b8093505050505b919050565b50505050565b50505050565b612b928383836001612bba565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612c55576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612c90576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c9d6000868387612b79565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015612f0257818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838015612eb65750612eb460008884886127f8565b155b15612eed576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050612e3b565b50806000806101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050612f496000868387612b7f565b5050505050565b828054612f5c90613c2a565b90600052602060002090601f016020900481019282612f7e5760008555612fc5565b82601f10612f9757803560ff1916838001178555612fc5565b82800160010185558215612fc5579182015b82811115612fc4578235825591602001919060010190612fa9565b5b509050612fd29190613019565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561303257600081600090555060010161301a565b5090565b6000613049613044846139a7565b613982565b90508281526020810184848401111561306557613064613e01565b5b613070848285613be8565b509392505050565b60008135905061308781613fe4565b92915050565b60008135905061309c81613ffb565b92915050565b6000813590506130b181614012565b92915050565b6000815190506130c681614012565b92915050565b600082601f8301126130e1576130e0613df7565b5b81356130f1848260208601613036565b91505092915050565b60008083601f8401126131105761310f613df7565b5b8235905067ffffffffffffffff81111561312d5761312c613df2565b5b60208301915083600182028301111561314957613148613dfc565b5b9250929050565b60008135905061315f81614029565b92915050565b60006020828403121561317b5761317a613e0b565b5b600061318984828501613078565b91505092915050565b600080604083850312156131a9576131a8613e0b565b5b60006131b785828601613078565b92505060206131c885828601613078565b9150509250929050565b6000806000606084860312156131eb576131ea613e0b565b5b60006131f986828701613078565b935050602061320a86828701613078565b925050604061321b86828701613150565b9150509250925092565b6000806000806080858703121561323f5761323e613e0b565b5b600061324d87828801613078565b945050602061325e87828801613078565b935050604061326f87828801613150565b925050606085013567ffffffffffffffff8111156132905761328f613e06565b5b61329c878288016130cc565b91505092959194509250565b600080604083850312156132bf576132be613e0b565b5b60006132cd85828601613078565b92505060206132de8582860161308d565b9150509250929050565b600080604083850312156132ff576132fe613e0b565b5b600061330d85828601613078565b925050602061331e85828601613150565b9150509250929050565b60006020828403121561333e5761333d613e0b565b5b600061334c8482850161308d565b91505092915050565b60006020828403121561336b5761336a613e0b565b5b6000613379848285016130a2565b91505092915050565b60006020828403121561339857613397613e0b565b5b60006133a6848285016130b7565b91505092915050565b600080602083850312156133c6576133c5613e0b565b5b600083013567ffffffffffffffff8111156133e4576133e3613e06565b5b6133f0858286016130fa565b92509250509250929050565b60006020828403121561341257613411613e0b565b5b600061342084828501613150565b91505092915050565b600061343583836136e1565b60208301905092915050565b61344a81613b74565b82525050565b600061345b826139e8565b6134658185613a16565b9350613470836139d8565b8060005b838110156134a15781516134888882613429565b975061349383613a09565b925050600181019050613474565b5085935050505092915050565b6134b781613b86565b82525050565b60006134c8826139f3565b6134d28185613a27565b93506134e2818560208601613bf7565b6134eb81613e10565b840191505092915050565b6000613501826139fe565b61350b8185613a43565b935061351b818560208601613bf7565b61352481613e10565b840191505092915050565b600061353a826139fe565b6135448185613a54565b9350613554818560208601613bf7565b80840191505092915050565b600061356d600e83613a43565b915061357882613e21565b602082019050919050565b6000613590600683613a43565b915061359b82613e4a565b602082019050919050565b60006135b3602683613a43565b91506135be82613e73565b604082019050919050565b60006135d6601283613a43565b91506135e182613ec2565b602082019050919050565b60006135f9600e83613a43565b915061360482613eeb565b602082019050919050565b600061361c600583613a43565b915061362782613f14565b602082019050919050565b600061363f600f83613a43565b915061364a82613f3d565b602082019050919050565b6000613662600b83613a43565b915061366d82613f66565b602082019050919050565b6000613685602083613a43565b915061369082613f8f565b602082019050919050565b60006136a8600083613a38565b91506136b382613fb8565b600082019050919050565b60006136cb600c83613a43565b91506136d682613fbb565b602082019050919050565b6136ea81613bde565b82525050565b6136f981613bde565b82525050565b600061370b828561352f565b9150613717828461352f565b91508190509392505050565b600061372e8261369b565b9150819050919050565b600060208201905061374d6000830184613441565b92915050565b60006080820190506137686000830187613441565b6137756020830186613441565b61378260408301856136f0565b818103606083015261379481846134bd565b905095945050505050565b60006040820190506137b46000830185613441565b6137c160208301846136f0565b9392505050565b600060208201905081810360008301526137e28184613450565b905092915050565b60006020820190506137ff60008301846134ae565b92915050565b6000602082019050818103600083015261381f81846134f6565b905092915050565b6000602082019050818103600083015261384081613560565b9050919050565b6000602082019050818103600083015261386081613583565b9050919050565b60006020820190508181036000830152613880816135a6565b9050919050565b600060208201905081810360008301526138a0816135c9565b9050919050565b600060208201905081810360008301526138c0816135ec565b9050919050565b600060208201905081810360008301526138e08161360f565b9050919050565b6000602082019050818103600083015261390081613632565b9050919050565b6000602082019050818103600083015261392081613655565b9050919050565b6000602082019050818103600083015261394081613678565b9050919050565b60006020820190508181036000830152613960816136be565b9050919050565b600060208201905061397c60008301846136f0565b92915050565b600061398c61399d565b90506139988282613c5c565b919050565b6000604051905090565b600067ffffffffffffffff8211156139c2576139c1613dc3565b5b6139cb82613e10565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a6a82613bde565b9150613a7583613bde565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613aaa57613aa9613d07565b5b828201905092915050565b6000613ac082613bde565b9150613acb83613bde565b925082613adb57613ada613d36565b5b828204905092915050565b6000613af182613bde565b9150613afc83613bde565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b3557613b34613d07565b5b828202905092915050565b6000613b4b82613bde565b9150613b5683613bde565b925082821015613b6957613b68613d07565b5b828203905092915050565b6000613b7f82613bbe565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613c15578082015181840152602081019050613bfa565b83811115613c24576000848401525b50505050565b60006002820490506001821680613c4257607f821691505b60208210811415613c5657613c55613d65565b5b50919050565b613c6582613e10565b810181811067ffffffffffffffff82111715613c8457613c83613dc3565b5b80604052505050565b6000613c9882613bde565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ccb57613cca613d07565b5b600182019050919050565b6000613ce182613bde565b9150613cec83613bde565b925082613cfc57613cfb613d36565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4578636565647320737570706c79000000000000000000000000000000000000600082015250565b7f3230204d61780000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f50726573616c65206e6f74206163746976650000000000000000000000000000600082015250565b7f50726573616c6520616374697665000000000000000000000000000000000000600082015250565b7f34204d6178000000000000000000000000000000000000000000000000000000600082015250565b7f53616c65206e6f74206163746976650000000000000000000000000000000000600082015250565b7f53616c6520616374697665000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f57726f6e6720616d6f756e740000000000000000000000000000000000000000600082015250565b613fed81613b74565b8114613ff857600080fd5b50565b61400481613b86565b811461400f57600080fd5b50565b61401b81613b92565b811461402657600080fd5b50565b61403281613bde565b811461403d57600080fd5b5056fe697066733a2f2f516d61716b657265774e6d4542714165734a48526b38796f4c7a6d364857676274394c3255316e6a416235544545a26469706673582212206812b3c4897d90d3219474cbe9ef464a809266c1333321b30fc91f1ea248f35464736f6c634300080700330000000000000000000000000000000000000000000000000000000000001e61

Deployed Bytecode

0x6080604052600436106101e65760003560e01c80638da5cb5b11610102578063bce4d6ae11610095578063e8a3d48511610064578063e8a3d485146106ce578063e985e9c5146106f9578063f2fde38b14610736578063f51f96dd1461075f576101ed565b8063bce4d6ae14610614578063c4e370951461063d578063c87b56dd14610666578063ccd98731146106a3576101ed565b8063977b055b116100d1578063977b055b1461058d578063a22cb465146105b8578063abc6fd0b146105e1578063b88d4fde146105eb576101ed565b80638da5cb5b146104f25780638e8a20141461051d57806390ac59411461054657806395d89b4114610562576101ed565b80632f745c591161017a5780636352211e116101495780636352211e1461044557806370a0823114610482578063715018a6146104bf5780637835c635146104d6576101ed565b80632f745c591461037957806342842e0e146103b65780634f6ccce7146103df57806355f804b31461041c576101ed565b8063095ea7b3116101b6578063095ea7b3146102bf57806318160ddd146102e857806323b872dd146103135780632cc9c1511461033c576101ed565b80620e7fa8146101ef57806301ffc9a71461021a57806306fdde0314610257578063081812fc14610282576101ed565b366101ed57005b005b3480156101fb57600080fd5b5061020461078a565b6040516102119190613967565b60405180910390f35b34801561022657600080fd5b50610241600480360381019061023c9190613355565b610796565b60405161024e91906137ea565b60405180910390f35b34801561026357600080fd5b5061026c6108e0565b6040516102799190613805565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a491906133fc565b610972565b6040516102b69190613738565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e191906132e8565b6109ee565b005b3480156102f457600080fd5b506102fd610af9565b60405161030a9190613967565b60405180910390f35b34801561031f57600080fd5b5061033a600480360381019061033591906131d2565b610b4e565b005b34801561034857600080fd5b50610363600480360381019061035e9190613165565b610b5e565b60405161037091906137c8565b60405180910390f35b34801561038557600080fd5b506103a0600480360381019061039b91906132e8565b610c6a565b6040516103ad9190613967565b60405180910390f35b3480156103c257600080fd5b506103dd60048036038101906103d891906131d2565b610e71565b005b3480156103eb57600080fd5b50610406600480360381019061040191906133fc565b610e91565b6040516104139190613967565b60405180910390f35b34801561042857600080fd5b50610443600480360381019061043e91906133af565b611002565b005b34801561045157600080fd5b5061046c600480360381019061046791906133fc565b611094565b6040516104799190613738565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a49190613165565b6110aa565b6040516104b69190613967565b60405180910390f35b3480156104cb57600080fd5b506104d461117a565b005b6104f060048036038101906104eb91906133fc565b611202565b005b3480156104fe57600080fd5b506105076113e0565b6040516105149190613738565b60405180910390f35b34801561052957600080fd5b50610544600480360381019061053f91906133fc565b61140a565b005b610560600480360381019061055b91906133fc565b6114ea565b005b34801561056e57600080fd5b506105776116c8565b6040516105849190613805565b60405180910390f35b34801561059957600080fd5b506105a261175a565b6040516105af9190613967565b60405180910390f35b3480156105c457600080fd5b506105df60048036038101906105da91906132a8565b61175f565b005b6105e96118d7565b005b3480156105f757600080fd5b50610612600480360381019061060d9190613225565b6119cc565b005b34801561062057600080fd5b5061063b60048036038101906106369190613328565b611a1f565b005b34801561064957600080fd5b50610664600480360381019061065f9190613328565b611ab8565b005b34801561067257600080fd5b5061068d600480360381019061068891906133fc565b611b51565b60405161069a9190613805565b60405180910390f35b3480156106af57600080fd5b506106b8611bf0565b6040516106c59190613967565b60405180910390f35b3480156106da57600080fd5b506106e3611bf5565b6040516106f09190613805565b60405180910390f35b34801561070557600080fd5b50610720600480360381019061071b9190613192565b611c15565b60405161072d91906137ea565b60405180910390f35b34801561074257600080fd5b5061075d60048036038101906107589190613165565b611ca9565b005b34801561076b57600080fd5b50610774611da1565b6040516107819190613967565b60405180910390f35b6701aa535d3d0c000081565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061086157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108c957507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108d957506108d882611dad565b5b9050919050565b6060600180546108ef90613c2a565b80601f016020809104026020016040519081016040528092919081815260200182805461091b90613c2a565b80156109685780601f1061093d57610100808354040283529160200191610968565b820191906000526020600020905b81548152906001019060200180831161094b57829003601f168201915b5050505050905090565b600061097d82611e17565b6109b3576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109f982611094565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a61576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a80611e7f565b73ffffffffffffffffffffffffffffffffffffffff1614158015610ab25750610ab081610aab611e7f565b611c15565b155b15610ae9576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610af4838383611e87565b505050565b60008060109054906101000a90046fffffffffffffffffffffffffffffffff1660008054906101000a90046fffffffffffffffffffffffffffffffff16036fffffffffffffffffffffffffffffffff16905090565b610b59838383611f39565b505050565b60606000610b6b836110aa565b905060008167ffffffffffffffff811115610b8957610b88613dc3565b5b604051908082528060200260200182016040528015610bb75781602001602082028036833780820191505090505b509050600080600190505b6009548111610c5a57610bd481611e17565b8015610c135750610be481611094565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b15610c475780838381518110610c2c57610c2b613d94565b5b6020026020010181815250508180610c4390613c8d565b9250505b8080610c5290613c8d565b915050610bc2565b5060009050819350505050919050565b6000610c75836110aa565b8210610cad576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060005b83811015610e65576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115610dc45750610e58565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610e0457806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e565786841415610e4d578195505050505050610e6b565b83806001019450505b505b8080600101915050610ce7565b50600080fd5b92915050565b610e8c838383604051806020016040528060008152506119cc565b505050565b60008060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000805b82811015610fca576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151610fbc5785831415610fb35781945050505050610ffd565b82806001019350505b508080600101915050610ec9565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b61100a611e7f565b73ffffffffffffffffffffffffffffffffffffffff166110286113e0565b73ffffffffffffffffffffffffffffffffffffffff161461107e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107590613927565b60405180910390fd5b8181600a919061108f929190612f50565b505050565b600061109f82612456565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611112576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611182611e7f565b73ffffffffffffffffffffffffffffffffffffffff166111a06113e0565b73ffffffffffffffffffffffffffffffffffffffff16146111f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ed90613927565b60405180910390fd5b61120060006126fe565b565b806009548161120f610af9565b6112199190613a5f565b111561125a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125190613827565b60405180910390fd5b600481111561129e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611295906138c7565b60405180910390fd5b600860159054906101000a900460ff166112ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e490613887565b60405180910390fd5b600860149054906101000a900460ff161561133d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133490613907565b60405180910390fd5b34611359836701aa535d3d0c00006127c490919063ffffffff16565b14611399576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139090613947565b60405180910390fd5b6113a333836127da565b7f7fad22d2966f3b60ec8643dcface93c5d6668f759a86c39839c4cd74e1db355933836040516113d492919061379f565b60405180910390a15050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611412611e7f565b73ffffffffffffffffffffffffffffffffffffffff166114306113e0565b73ffffffffffffffffffffffffffffffffffffffff1614611486576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147d90613927565b60405180910390fd5b60095481611492610af9565b61149c9190613a5f565b11156114dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d490613827565b60405180910390fd5b6114e733826127da565b50565b80600954816114f7610af9565b6115019190613a5f565b1115611542576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153990613827565b60405180910390fd5b6014811115611586576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157d90613847565b60405180910390fd5b600860149054906101000a900460ff166115d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cc906138e7565b60405180910390fd5b600860159054906101000a900460ff1615611625576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161c906138a7565b60405180910390fd5b34611641836701f161421c8e00006127c490919063ffffffff16565b14611681576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167890613947565b60405180910390fd5b61168b33836127da565b7f7fad22d2966f3b60ec8643dcface93c5d6668f759a86c39839c4cd74e1db355933836040516116bc92919061379f565b60405180910390a15050565b6060600280546116d790613c2a565b80601f016020809104026020016040519081016040528092919081815260200182805461170390613c2a565b80156117505780601f1061172557610100808354040283529160200191611750565b820191906000526020600020905b81548152906001019060200180831161173357829003601f168201915b5050505050905090565b601481565b611767611e7f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117cc576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600660006117d9611e7f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611886611e7f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118cb91906137ea565b60405180910390a35050565b6118df611e7f565b73ffffffffffffffffffffffffffffffffffffffff166118fd6113e0565b73ffffffffffffffffffffffffffffffffffffffff1614611953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194a90613927565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161197990613723565b60006040518083038185875af1925050503d80600081146119b6576040519150601f19603f3d011682016040523d82523d6000602084013e6119bb565b606091505b50509050806119c957600080fd5b50565b6119d7848484611f39565b6119e3848484846127f8565b611a19576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b611a27611e7f565b73ffffffffffffffffffffffffffffffffffffffff16611a456113e0565b73ffffffffffffffffffffffffffffffffffffffff1614611a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9290613927565b60405180910390fd5b80600860156101000a81548160ff02191690831515021790555050565b611ac0611e7f565b73ffffffffffffffffffffffffffffffffffffffff16611ade6113e0565b73ffffffffffffffffffffffffffffffffffffffff1614611b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2b90613927565b60405180910390fd5b80600860146101000a81548160ff02191690831515021790555050565b6060611b5c82611e17565b611b92576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611b9c612986565b9050600081511415611bbd5760405180602001604052806000815250611be8565b80611bc784612a18565b604051602001611bd89291906136ff565b6040516020818303038152906040525b915050919050565b600481565b606060405180606001604052806035815260200161404160359139905090565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611cb1611e7f565b73ffffffffffffffffffffffffffffffffffffffff16611ccf6113e0565b73ffffffffffffffffffffffffffffffffffffffff1614611d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1c90613927565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8c90613867565b60405180910390fd5b611d9e816126fe565b50565b6701f161421c8e000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682108015611e78575060036000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611f4482612456565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611f6b611e7f565b73ffffffffffffffffffffffffffffffffffffffff161480611f9e5750611f9d8260000151611f98611e7f565b611c15565b5b80611fe35750611fac611e7f565b73ffffffffffffffffffffffffffffffffffffffff16611fcb84610972565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061201c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612085576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156120ec576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120f98585856001612b79565b6121096000848460000151611e87565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156123e65760008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168110156123e55782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461244f8585856001612b7f565b5050505050565b61245e612fd6565b600082905060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168110156126c7576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516126c557600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146125a95780925050506126f9565b5b6001156126c457818060019003925050600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146126bf5780925050506126f9565b6125aa565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081836127d29190613ae6565b905092915050565b6127f4828260405180602001604052806000815250612b85565b5050565b60006128198473ffffffffffffffffffffffffffffffffffffffff16612b97565b15612979578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612842611e7f565b8786866040518563ffffffff1660e01b81526004016128649493929190613753565b602060405180830381600087803b15801561287e57600080fd5b505af19250505080156128af57506040513d601f19601f820116820180604052508101906128ac9190613382565b60015b612929573d80600081146128df576040519150601f19603f3d011682016040523d82523d6000602084013e6128e4565b606091505b50600081511415612921576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061297e565b600190505b949350505050565b6060600a805461299590613c2a565b80601f01602080910402602001604051908101604052809291908181526020018280546129c190613c2a565b8015612a0e5780601f106129e357610100808354040283529160200191612a0e565b820191906000526020600020905b8154815290600101906020018083116129f157829003601f168201915b5050505050905090565b60606000821415612a60576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b74565b600082905060005b60008214612a92578080612a7b90613c8d565b915050600a82612a8b9190613ab5565b9150612a68565b60008167ffffffffffffffff811115612aae57612aad613dc3565b5b6040519080825280601f01601f191660200182016040528015612ae05781602001600182028036833780820191505090505b5090505b60008514612b6d57600182612af99190613b40565b9150600a85612b089190613cd6565b6030612b149190613a5f565b60f81b818381518110612b2a57612b29613d94565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b669190613ab5565b9450612ae4565b8093505050505b919050565b50505050565b50505050565b612b928383836001612bba565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612c55576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612c90576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c9d6000868387612b79565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015612f0257818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838015612eb65750612eb460008884886127f8565b155b15612eed576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050612e3b565b50806000806101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050612f496000868387612b7f565b5050505050565b828054612f5c90613c2a565b90600052602060002090601f016020900481019282612f7e5760008555612fc5565b82601f10612f9757803560ff1916838001178555612fc5565b82800160010185558215612fc5579182015b82811115612fc4578235825591602001919060010190612fa9565b5b509050612fd29190613019565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561303257600081600090555060010161301a565b5090565b6000613049613044846139a7565b613982565b90508281526020810184848401111561306557613064613e01565b5b613070848285613be8565b509392505050565b60008135905061308781613fe4565b92915050565b60008135905061309c81613ffb565b92915050565b6000813590506130b181614012565b92915050565b6000815190506130c681614012565b92915050565b600082601f8301126130e1576130e0613df7565b5b81356130f1848260208601613036565b91505092915050565b60008083601f8401126131105761310f613df7565b5b8235905067ffffffffffffffff81111561312d5761312c613df2565b5b60208301915083600182028301111561314957613148613dfc565b5b9250929050565b60008135905061315f81614029565b92915050565b60006020828403121561317b5761317a613e0b565b5b600061318984828501613078565b91505092915050565b600080604083850312156131a9576131a8613e0b565b5b60006131b785828601613078565b92505060206131c885828601613078565b9150509250929050565b6000806000606084860312156131eb576131ea613e0b565b5b60006131f986828701613078565b935050602061320a86828701613078565b925050604061321b86828701613150565b9150509250925092565b6000806000806080858703121561323f5761323e613e0b565b5b600061324d87828801613078565b945050602061325e87828801613078565b935050604061326f87828801613150565b925050606085013567ffffffffffffffff8111156132905761328f613e06565b5b61329c878288016130cc565b91505092959194509250565b600080604083850312156132bf576132be613e0b565b5b60006132cd85828601613078565b92505060206132de8582860161308d565b9150509250929050565b600080604083850312156132ff576132fe613e0b565b5b600061330d85828601613078565b925050602061331e85828601613150565b9150509250929050565b60006020828403121561333e5761333d613e0b565b5b600061334c8482850161308d565b91505092915050565b60006020828403121561336b5761336a613e0b565b5b6000613379848285016130a2565b91505092915050565b60006020828403121561339857613397613e0b565b5b60006133a6848285016130b7565b91505092915050565b600080602083850312156133c6576133c5613e0b565b5b600083013567ffffffffffffffff8111156133e4576133e3613e06565b5b6133f0858286016130fa565b92509250509250929050565b60006020828403121561341257613411613e0b565b5b600061342084828501613150565b91505092915050565b600061343583836136e1565b60208301905092915050565b61344a81613b74565b82525050565b600061345b826139e8565b6134658185613a16565b9350613470836139d8565b8060005b838110156134a15781516134888882613429565b975061349383613a09565b925050600181019050613474565b5085935050505092915050565b6134b781613b86565b82525050565b60006134c8826139f3565b6134d28185613a27565b93506134e2818560208601613bf7565b6134eb81613e10565b840191505092915050565b6000613501826139fe565b61350b8185613a43565b935061351b818560208601613bf7565b61352481613e10565b840191505092915050565b600061353a826139fe565b6135448185613a54565b9350613554818560208601613bf7565b80840191505092915050565b600061356d600e83613a43565b915061357882613e21565b602082019050919050565b6000613590600683613a43565b915061359b82613e4a565b602082019050919050565b60006135b3602683613a43565b91506135be82613e73565b604082019050919050565b60006135d6601283613a43565b91506135e182613ec2565b602082019050919050565b60006135f9600e83613a43565b915061360482613eeb565b602082019050919050565b600061361c600583613a43565b915061362782613f14565b602082019050919050565b600061363f600f83613a43565b915061364a82613f3d565b602082019050919050565b6000613662600b83613a43565b915061366d82613f66565b602082019050919050565b6000613685602083613a43565b915061369082613f8f565b602082019050919050565b60006136a8600083613a38565b91506136b382613fb8565b600082019050919050565b60006136cb600c83613a43565b91506136d682613fbb565b602082019050919050565b6136ea81613bde565b82525050565b6136f981613bde565b82525050565b600061370b828561352f565b9150613717828461352f565b91508190509392505050565b600061372e8261369b565b9150819050919050565b600060208201905061374d6000830184613441565b92915050565b60006080820190506137686000830187613441565b6137756020830186613441565b61378260408301856136f0565b818103606083015261379481846134bd565b905095945050505050565b60006040820190506137b46000830185613441565b6137c160208301846136f0565b9392505050565b600060208201905081810360008301526137e28184613450565b905092915050565b60006020820190506137ff60008301846134ae565b92915050565b6000602082019050818103600083015261381f81846134f6565b905092915050565b6000602082019050818103600083015261384081613560565b9050919050565b6000602082019050818103600083015261386081613583565b9050919050565b60006020820190508181036000830152613880816135a6565b9050919050565b600060208201905081810360008301526138a0816135c9565b9050919050565b600060208201905081810360008301526138c0816135ec565b9050919050565b600060208201905081810360008301526138e08161360f565b9050919050565b6000602082019050818103600083015261390081613632565b9050919050565b6000602082019050818103600083015261392081613655565b9050919050565b6000602082019050818103600083015261394081613678565b9050919050565b60006020820190508181036000830152613960816136be565b9050919050565b600060208201905061397c60008301846136f0565b92915050565b600061398c61399d565b90506139988282613c5c565b919050565b6000604051905090565b600067ffffffffffffffff8211156139c2576139c1613dc3565b5b6139cb82613e10565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a6a82613bde565b9150613a7583613bde565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613aaa57613aa9613d07565b5b828201905092915050565b6000613ac082613bde565b9150613acb83613bde565b925082613adb57613ada613d36565b5b828204905092915050565b6000613af182613bde565b9150613afc83613bde565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b3557613b34613d07565b5b828202905092915050565b6000613b4b82613bde565b9150613b5683613bde565b925082821015613b6957613b68613d07565b5b828203905092915050565b6000613b7f82613bbe565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613c15578082015181840152602081019050613bfa565b83811115613c24576000848401525b50505050565b60006002820490506001821680613c4257607f821691505b60208210811415613c5657613c55613d65565b5b50919050565b613c6582613e10565b810181811067ffffffffffffffff82111715613c8457613c83613dc3565b5b80604052505050565b6000613c9882613bde565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ccb57613cca613d07565b5b600182019050919050565b6000613ce182613bde565b9150613cec83613bde565b925082613cfc57613cfb613d36565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4578636565647320737570706c79000000000000000000000000000000000000600082015250565b7f3230204d61780000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f50726573616c65206e6f74206163746976650000000000000000000000000000600082015250565b7f50726573616c6520616374697665000000000000000000000000000000000000600082015250565b7f34204d6178000000000000000000000000000000000000000000000000000000600082015250565b7f53616c65206e6f74206163746976650000000000000000000000000000000000600082015250565b7f53616c6520616374697665000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f57726f6e6720616d6f756e740000000000000000000000000000000000000000600082015250565b613fed81613b74565b8114613ff857600080fd5b50565b61400481613b86565b811461400f57600080fd5b50565b61401b81613b92565b811461402657600080fd5b50565b61403281613bde565b811461403d57600080fd5b5056fe697066733a2f2f516d61716b657265774e6d4542714165734a48526b38796f4c7a6d364857676274394c3255316e6a416235544545a26469706673582212206812b3c4897d90d3219474cbe9ef464a809266c1333321b30fc91f1ea248f35464736f6c63430008070033

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

0000000000000000000000000000000000000000000000000000000000001e61

-----Decoded View---------------
Arg [0] : _totalInventors (uint256): 7777

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000001e61


Deployed Bytecode Sourcemap

54144:3929:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54300:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25813:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28423:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29926:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29489:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23050:280;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30783:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55375:435;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24636:1105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31024:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23623:713;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57646:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28232:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26249:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43847:103;;;;;;;;;;;;;:::i;:::-;;56563:363;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43196:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57048:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56199:358;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28592:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54405:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30202:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57756:176;;;:::i;:::-;;31280:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57476:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57313:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28767:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54450:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54933:134;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30552:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44105:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54354:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54300:49;54339:10;54300:49;:::o;25813:372::-;25915:4;25967:25;25952:40;;;:11;:40;;;;:105;;;;26024:33;26009:48;;;:11;:48;;;;25952:105;:172;;;;26089:35;26074:50;;;:11;:50;;;;25952:172;:225;;;;26141:36;26165:11;26141:23;:36::i;:::-;25952:225;25932:245;;25813:372;;;:::o;28423:100::-;28477:13;28510:5;28503:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28423:100;:::o;29926:204::-;29994:7;30019:16;30027:7;30019;:16::i;:::-;30014:64;;30044:34;;;;;;;;;;;;;;30014:64;30098:15;:24;30114:7;30098:24;;;;;;;;;;;;;;;;;;;;;30091:31;;29926:204;;;:::o;29489:371::-;29562:13;29578:24;29594:7;29578:15;:24::i;:::-;29562:40;;29623:5;29617:11;;:2;:11;;;29613:48;;;29637:24;;;;;;;;;;;;;;29613:48;29694:5;29678:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;29704:37;29721:5;29728:12;:10;:12::i;:::-;29704:16;:37::i;:::-;29703:38;29678:63;29674:138;;;29765:35;;;;;;;;;;;;;;29674:138;29824:28;29833:2;29837:7;29846:5;29824:8;:28::i;:::-;29551:309;29489:371;;:::o;23050:280::-;23103:7;23295:12;;;;;;;;;;;23279:13;;;;;;;;;;:28;23272:35;;;;23050:280;:::o;30783:170::-;30917:28;30927:4;30933:2;30937:7;30917:9;:28::i;:::-;30783:170;;;:::o;55375:435::-;55454:16;55482:23;55508:17;55518:6;55508:9;:17::i;:::-;55482:43;;55532:25;55574:15;55560:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55532:58;;55597:9;55622;55634:1;55622:13;;55617:151;55642:13;;55637:1;:18;55617:151;;55675:10;55683:1;55675:7;:10::i;:::-;:34;;;;;55699:10;55707:1;55699:7;:10::i;:::-;55689:20;;:6;:20;;;55675:34;55671:90;;;55736:1;55722:8;55731:1;55722:11;;;;;;;;:::i;:::-;;;;;;;:15;;;;;55748:3;;;;;:::i;:::-;;;;55671:90;55657:3;;;;;:::i;:::-;;;;55617:151;;;;55774:8;;;55796;55789:15;;;;;55375:435;;;:::o;24636:1105::-;24725:7;24758:16;24768:5;24758:9;:16::i;:::-;24749:5;:25;24745:61;;24783:23;;;;;;;;;;;;;;24745:61;24817:22;24842:13;;;;;;;;;;;24817:38;;;;24866:19;24896:25;25097:9;25092:557;25112:14;25108:1;:18;25092:557;;;25152:31;25186:11;:14;25198:1;25186:14;;;;;;;;;;;25152:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25223:9;:16;;;25219:73;;;25264:8;;;25219:73;25340:1;25314:28;;:9;:14;;;:28;;;25310:111;;25387:9;:14;;;25367:34;;25310:111;25464:5;25443:26;;:17;:26;;;25439:195;;;25513:5;25498:11;:20;25494:85;;;25554:1;25547:8;;;;;;;;;25494:85;25601:13;;;;;;;25439:195;25133:516;25092:557;25128:3;;;;;;;25092:557;;;;25725:8;;;24636:1105;;;;;:::o;31024:185::-;31162:39;31179:4;31185:2;31189:7;31162:39;;;;;;;;;;;;:16;:39::i;:::-;31024:185;;;:::o;23623:713::-;23690:7;23710:22;23735:13;;;;;;;;;;23710:38;;;;23759:19;23954:9;23949:328;23969:14;23965:1;:18;23949:328;;;24009:31;24043:11;:14;24055:1;24043:14;;;;;;;;;;;24009:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24081:9;:16;;;24076:186;;24141:5;24126:11;:20;24122:85;;;24182:1;24175:8;;;;;;;;24122:85;24229:13;;;;;;;24076:186;23990:287;23985:3;;;;;;;23949:328;;;;24305:23;;;;;;;;;;;;;;23623:713;;;;:::o;57646:100::-;43427:12;:10;:12::i;:::-;43416:23;;:7;:5;:7::i;:::-;:23;;;43408:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57733:7:::1;;57717:13;:23;;;;;;;:::i;:::-;;57646:100:::0;;:::o;28232:124::-;28296:7;28323:20;28335:7;28323:11;:20::i;:::-;:25;;;28316:32;;28232:124;;;:::o;26249:206::-;26313:7;26354:1;26337:19;;:5;:19;;;26333:60;;;26365:28;;;;;;;;;;;;;;26333:60;26419:12;:19;26432:5;26419:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;26411:36;;26404:43;;26249:206;;;:::o;43847:103::-;43427:12;:10;:12::i;:::-;43416:23;;:7;:5;:7::i;:::-;:23;;;43408:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43912:30:::1;43939:1;43912:18;:30::i;:::-;43847:103::o:0;56563:363::-;56655:8;56096:13;;56084:8;56068:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:41;;56060:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54491:1;56143:8;:26;;56135:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;56683:14:::1;;;;;;;;;;;56675:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;56736:11;;;;;;;;;;;56735:12;56727:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;56808:9;56778:26;56795:8;54339:10;56778:16;;:26;;;;:::i;:::-;:39;56770:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;56841:31;56851:10;56863:8;56841:9;:31::i;:::-;56884:36;56899:10;56911:8;56884:36;;;;;;;:::i;:::-;;;;;;;;56563:363:::0;;:::o;43196:87::-;43242:7;43269:6;;;;;;;;;;;43262:13;;43196:87;:::o;57048:208::-;43427:12;:10;:12::i;:::-;43416:23;;:7;:5;:7::i;:::-;:23;;;43408:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57177:13:::1;;57165:8;57149:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:41;;57141:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57217:31;57227:10;57239:8;57217:9;:31::i;:::-;57048:208:::0;:::o;56199:358::-;56289:8;55904:13;;55892:8;55876:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:41;;55868:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54443:2;55951:8;:23;;55943:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;56317:11:::1;;;;;;;;;;;56309:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;56364:14;;;;;;;;;;;56363:15;56355:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;56439:9;56412:23;56426:8;54390:10;56412:13;;:23;;;;:::i;:::-;:36;56404:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;56472:31;56482:10;56494:8;56472:9;:31::i;:::-;56515:36;56530:10;56542:8;56515:36;;;;;;;:::i;:::-;;;;;;;;56199:358:::0;;:::o;28592:104::-;28648:13;28681:7;28674:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28592:104;:::o;54405:40::-;54443:2;54405:40;:::o;30202:279::-;30305:12;:10;:12::i;:::-;30293:24;;:8;:24;;;30289:54;;;30326:17;;;;;;;;;;;;;;30289:54;30401:8;30356:18;:32;30375:12;:10;:12::i;:::-;30356:32;;;;;;;;;;;;;;;:42;30389:8;30356:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;30454:8;30425:48;;30440:12;:10;:12::i;:::-;30425:48;;;30464:8;30425:48;;;;;;:::i;:::-;;;;;;;;30202:279;;:::o;57756:176::-;43427:12;:10;:12::i;:::-;43416:23;;:7;:5;:7::i;:::-;:23;;;43408:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57811:12:::1;57837:10;57829:24;;57862:21;57829:74;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57810:93;;;57918:7;57910:16;;;::::0;::::1;;57803:129;57756:176::o:0;31280:342::-;31447:28;31457:4;31463:2;31467:7;31447:9;:28::i;:::-;31491:48;31514:4;31520:2;31524:7;31533:5;31491:22;:48::i;:::-;31486:129;;31563:40;;;;;;;;;;;;;;31486:129;31280:342;;;;:::o;57476:115::-;43427:12;:10;:12::i;:::-;43416:23;;:7;:5;:7::i;:::-;:23;;;43408:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57568:17:::1;57551:14;;:34;;;;;;;;;;;;;;;;;;57476:115:::0;:::o;57313:103::-;43427:12;:10;:12::i;:::-;43416:23;;:7;:5;:7::i;:::-;:23;;;43408:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57396:14:::1;57382:11;;:28;;;;;;;;;;;;;;;;;;57313:103:::0;:::o;28767:318::-;28840:13;28871:16;28879:7;28871;:16::i;:::-;28866:59;;28896:29;;;;;;;;;;;;;;28866:59;28938:21;28962:10;:8;:10::i;:::-;28938:34;;29015:1;28996:7;28990:21;:26;;:87;;;;;;;;;;;;;;;;;29043:7;29052:18;:7;:16;:18::i;:::-;29026:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28990:87;28983:94;;;28767:318;;;:::o;54450:42::-;54491:1;54450:42;:::o;54933:134::-;54977:13;54999:62;;;;;;;;;;;;;;;;;;;54933:134;:::o;30552:164::-;30649:4;30673:18;:25;30692:5;30673:25;;;;;;;;;;;;;;;:35;30699:8;30673:35;;;;;;;;;;;;;;;;;;;;;;;;;30666:42;;30552:164;;;;:::o;44105:201::-;43427:12;:10;:12::i;:::-;43416:23;;:7;:5;:7::i;:::-;:23;;;43408:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44214:1:::1;44194:22;;:8;:22;;;;44186:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44270:28;44289:8;44270:18;:28::i;:::-;44105:201:::0;:::o;54354:46::-;54390:10;54354:46;:::o;19727:157::-;19812:4;19851:25;19836:40;;;:11;:40;;;;19829:47;;19727:157;;;:::o;31877:144::-;31934:4;31968:13;;;;;;;;;;;31958:23;;:7;:23;:55;;;;;31986:11;:20;31998:7;31986:20;;;;;;;;;;;:27;;;;;;;;;;;;31985:28;31958:55;31951:62;;31877:144;;;:::o;16830:98::-;16883:7;16910:10;16903:17;;16830:98;:::o;39093:196::-;39235:2;39208:15;:24;39224:7;39208:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39273:7;39269:2;39253:28;;39262:5;39253:28;;;;;;;;;;;;39093:196;;;:::o;34594:2112::-;34709:35;34747:20;34759:7;34747:11;:20::i;:::-;34709:58;;34780:22;34822:13;:18;;;34806:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;34857:50;34874:13;:18;;;34894:12;:10;:12::i;:::-;34857:16;:50::i;:::-;34806:101;:154;;;;34948:12;:10;:12::i;:::-;34924:36;;:20;34936:7;34924:11;:20::i;:::-;:36;;;34806:154;34780:181;;34979:17;34974:66;;35005:35;;;;;;;;;;;;;;34974:66;35077:4;35055:26;;:13;:18;;;:26;;;35051:67;;35090:28;;;;;;;;;;;;;;35051:67;35147:1;35133:16;;:2;:16;;;35129:52;;;35158:23;;;;;;;;;;;;;;35129:52;35194:43;35216:4;35222:2;35226:7;35235:1;35194:21;:43::i;:::-;35302:49;35319:1;35323:7;35332:13;:18;;;35302:8;:49::i;:::-;35677:1;35647:12;:18;35660:4;35647:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35721:1;35693:12;:16;35706:2;35693:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35767:2;35739:11;:20;35751:7;35739:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;35829:15;35784:11;:20;35796:7;35784:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;36097:19;36129:1;36119:7;:11;36097:33;;36190:1;36149:43;;:11;:24;36161:11;36149:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;36145:445;;;36374:13;;;;;;;;;;36360:27;;:11;:27;36356:219;;;36444:13;:18;;;36412:11;:24;36424:11;36412:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;36527:13;:28;;;36485:11;:24;36497:11;36485:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;36356:219;36145:445;35622:979;36637:7;36633:2;36618:27;;36627:4;36618:27;;;;;;;;;;;;36656:42;36677:4;36683:2;36687:7;36696:1;36656:20;:42::i;:::-;34698:2008;;34594:2112;;;:::o;27087:1083::-;27148:21;;:::i;:::-;27182:12;27197:7;27182:22;;27253:13;;;;;;;;;;27246:20;;:4;:20;27242:861;;;27287:31;27321:11;:17;27333:4;27321:17;;;;;;;;;;;27287:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27362:9;:16;;;27357:731;;27433:1;27407:28;;:9;:14;;;:28;;;27403:101;;27471:9;27464:16;;;;;;27403:101;27808:261;27815:4;27808:261;;;27848:6;;;;;;;;27893:11;:17;27905:4;27893:17;;;;;;;;;;;27881:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27967:1;27941:28;;:9;:14;;;:28;;;27937:109;;28009:9;28002:16;;;;;;27937:109;27808:261;;;27357:731;27268:835;27242:861;28131:31;;;;;;;;;;;;;;27087:1083;;;;:::o;44466:191::-;44540:16;44559:6;;;;;;;;;;;44540:25;;44585:8;44576:6;;:17;;;;;;;;;;;;;;;;;;44640:8;44609:40;;44630:8;44609:40;;;;;;;;;;;;44529:128;44466:191;:::o;48115:98::-;48173:7;48204:1;48200;:5;;;;:::i;:::-;48193:12;;48115:98;;;;:::o;32029:104::-;32098:27;32108:2;32112:8;32098:27;;;;;;;;;;;;:9;:27::i;:::-;32029:104;;:::o;39854:790::-;40009:4;40030:15;:2;:13;;;:15::i;:::-;40026:611;;;40082:2;40066:36;;;40103:12;:10;:12::i;:::-;40117:4;40123:7;40132:5;40066:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40062:520;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40329:1;40312:6;:13;:18;40308:259;;;40362:40;;;;;;;;;;;;;;40308:259;40517:6;40511:13;40502:6;40498:2;40494:15;40487:38;40062:520;40199:45;;;40189:55;;;:6;:55;;;;40182:62;;;;;40026:611;40621:4;40614:11;;39854:790;;;;;;;:::o;55154:108::-;55214:13;55243;55236:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55154:108;:::o;17270:723::-;17326:13;17556:1;17547:5;:10;17543:53;;;17574:10;;;;;;;;;;;;;;;;;;;;;17543:53;17606:12;17621:5;17606:20;;17637:14;17662:78;17677:1;17669:4;:9;17662:78;;17695:8;;;;;:::i;:::-;;;;17726:2;17718:10;;;;;:::i;:::-;;;17662:78;;;17750:19;17782:6;17772:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17750:39;;17800:154;17816:1;17807:5;:10;17800:154;;17844:1;17834:11;;;;;:::i;:::-;;;17911:2;17903:5;:10;;;;:::i;:::-;17890:2;:24;;;;:::i;:::-;17877:39;;17860:6;17867;17860:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17940:2;17931:11;;;;;:::i;:::-;;;17800:154;;;17978:6;17964:21;;;;;17270:723;;;;:::o;41292:159::-;;;;;:::o;42110:158::-;;;;;:::o;32496:163::-;32619:32;32625:2;32629:8;32639:5;32646:4;32619:5;:32::i;:::-;32496:163;;;:::o;9018:326::-;9078:4;9335:1;9313:7;:19;;;:23;9306:30;;9018:326;;;:::o;32918:1422::-;33057:20;33080:13;;;;;;;;;;;33057:36;;;;33122:1;33108:16;;:2;:16;;;33104:48;;;33133:19;;;;;;;;;;;;;;33104:48;33179:1;33167:8;:13;33163:44;;;33189:18;;;;;;;;;;;;;;33163:44;33220:61;33250:1;33254:2;33258:12;33272:8;33220:21;:61::i;:::-;33594:8;33559:12;:16;33572:2;33559:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33658:8;33618:12;:16;33631:2;33618:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33717:2;33684:11;:25;33696:12;33684:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;33784:15;33734:11;:25;33746:12;33734:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;33817:20;33840:12;33817:35;;33874:9;33869:328;33889:8;33885:1;:12;33869:328;;;33953:12;33949:2;33928:38;;33945:1;33928:38;;;;;;;;;;;;33989:4;:68;;;;;33998:59;34029:1;34033:2;34037:12;34051:5;33998:22;:59::i;:::-;33997:60;33989:68;33985:164;;;34089:40;;;;;;;;;;;;;;33985:164;34167:14;;;;;;;33899:3;;;;;;;33869:328;;;;34237:12;34213:13;;:37;;;;;;;;;;;;;;;;;;33534:728;34272:60;34301:1;34305:2;34309:12;34323:8;34272:20;:60::i;:::-;33046:1294;32918:1422;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1368:553::-;1426:8;1436:6;1486:3;1479:4;1471:6;1467:17;1463:27;1453:122;;1494:79;;:::i;:::-;1453:122;1607:6;1594:20;1584:30;;1637:18;1629:6;1626:30;1623:117;;;1659:79;;:::i;:::-;1623:117;1773:4;1765:6;1761:17;1749:29;;1827:3;1819:4;1811:6;1807:17;1797:8;1793:32;1790:41;1787:128;;;1834:79;;:::i;:::-;1787:128;1368:553;;;;;:::o;1927:139::-;1973:5;2011:6;1998:20;1989:29;;2027:33;2054:5;2027:33;:::i;:::-;1927:139;;;;:::o;2072:329::-;2131:6;2180:2;2168:9;2159:7;2155:23;2151:32;2148:119;;;2186:79;;:::i;:::-;2148:119;2306:1;2331:53;2376:7;2367:6;2356:9;2352:22;2331:53;:::i;:::-;2321:63;;2277:117;2072:329;;;;:::o;2407:474::-;2475:6;2483;2532:2;2520:9;2511:7;2507:23;2503:32;2500:119;;;2538:79;;:::i;:::-;2500:119;2658:1;2683:53;2728:7;2719:6;2708:9;2704:22;2683:53;:::i;:::-;2673:63;;2629:117;2785:2;2811:53;2856:7;2847:6;2836:9;2832:22;2811:53;:::i;:::-;2801:63;;2756:118;2407:474;;;;;:::o;2887:619::-;2964:6;2972;2980;3029:2;3017:9;3008:7;3004:23;3000:32;2997:119;;;3035:79;;:::i;:::-;2997:119;3155:1;3180:53;3225:7;3216:6;3205:9;3201:22;3180:53;:::i;:::-;3170:63;;3126:117;3282:2;3308:53;3353:7;3344:6;3333:9;3329:22;3308:53;:::i;:::-;3298:63;;3253:118;3410:2;3436:53;3481:7;3472:6;3461:9;3457:22;3436:53;:::i;:::-;3426:63;;3381:118;2887:619;;;;;:::o;3512:943::-;3607:6;3615;3623;3631;3680:3;3668:9;3659:7;3655:23;3651:33;3648:120;;;3687:79;;:::i;:::-;3648:120;3807:1;3832:53;3877:7;3868:6;3857:9;3853:22;3832:53;:::i;:::-;3822:63;;3778:117;3934:2;3960:53;4005:7;3996:6;3985:9;3981:22;3960:53;:::i;:::-;3950:63;;3905:118;4062:2;4088:53;4133:7;4124:6;4113:9;4109:22;4088:53;:::i;:::-;4078:63;;4033:118;4218:2;4207:9;4203:18;4190:32;4249:18;4241:6;4238:30;4235:117;;;4271:79;;:::i;:::-;4235:117;4376:62;4430:7;4421:6;4410:9;4406:22;4376:62;:::i;:::-;4366:72;;4161:287;3512:943;;;;;;;:::o;4461:468::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:50;4904:7;4895:6;4884:9;4880:22;4862:50;:::i;:::-;4852:60;;4807:115;4461:468;;;;;:::o;4935:474::-;5003:6;5011;5060:2;5048:9;5039:7;5035:23;5031:32;5028:119;;;5066:79;;:::i;:::-;5028:119;5186:1;5211:53;5256:7;5247:6;5236:9;5232:22;5211:53;:::i;:::-;5201:63;;5157:117;5313:2;5339:53;5384:7;5375:6;5364:9;5360:22;5339:53;:::i;:::-;5329:63;;5284:118;4935:474;;;;;:::o;5415:323::-;5471:6;5520:2;5508:9;5499:7;5495:23;5491:32;5488:119;;;5526:79;;:::i;:::-;5488:119;5646:1;5671:50;5713:7;5704:6;5693:9;5689:22;5671:50;:::i;:::-;5661:60;;5617:114;5415:323;;;;:::o;5744:327::-;5802:6;5851:2;5839:9;5830:7;5826:23;5822:32;5819:119;;;5857:79;;:::i;:::-;5819:119;5977:1;6002:52;6046:7;6037:6;6026:9;6022:22;6002:52;:::i;:::-;5992:62;;5948:116;5744:327;;;;:::o;6077:349::-;6146:6;6195:2;6183:9;6174:7;6170:23;6166:32;6163:119;;;6201:79;;:::i;:::-;6163:119;6321:1;6346:63;6401:7;6392:6;6381:9;6377:22;6346:63;:::i;:::-;6336:73;;6292:127;6077:349;;;;:::o;6432:529::-;6503:6;6511;6560:2;6548:9;6539:7;6535:23;6531:32;6528:119;;;6566:79;;:::i;:::-;6528:119;6714:1;6703:9;6699:17;6686:31;6744:18;6736:6;6733:30;6730:117;;;6766:79;;:::i;:::-;6730:117;6879:65;6936:7;6927:6;6916:9;6912:22;6879:65;:::i;:::-;6861:83;;;;6657:297;6432:529;;;;;:::o;6967:329::-;7026:6;7075:2;7063:9;7054:7;7050:23;7046:32;7043:119;;;7081:79;;:::i;:::-;7043:119;7201:1;7226:53;7271:7;7262:6;7251:9;7247:22;7226:53;:::i;:::-;7216:63;;7172:117;6967:329;;;;:::o;7302:179::-;7371:10;7392:46;7434:3;7426:6;7392:46;:::i;:::-;7470:4;7465:3;7461:14;7447:28;;7302:179;;;;:::o;7487:118::-;7574:24;7592:5;7574:24;:::i;:::-;7569:3;7562:37;7487:118;;:::o;7641:732::-;7760:3;7789:54;7837:5;7789:54;:::i;:::-;7859:86;7938:6;7933:3;7859:86;:::i;:::-;7852:93;;7969:56;8019:5;7969:56;:::i;:::-;8048:7;8079:1;8064:284;8089:6;8086:1;8083:13;8064:284;;;8165:6;8159:13;8192:63;8251:3;8236:13;8192:63;:::i;:::-;8185:70;;8278:60;8331:6;8278:60;:::i;:::-;8268:70;;8124:224;8111:1;8108;8104:9;8099:14;;8064:284;;;8068:14;8364:3;8357:10;;7765:608;;;7641:732;;;;:::o;8379:109::-;8460:21;8475:5;8460:21;:::i;:::-;8455:3;8448:34;8379:109;;:::o;8494:360::-;8580:3;8608:38;8640:5;8608:38;:::i;:::-;8662:70;8725:6;8720:3;8662:70;:::i;:::-;8655:77;;8741:52;8786:6;8781:3;8774:4;8767:5;8763:16;8741:52;:::i;:::-;8818:29;8840:6;8818:29;:::i;:::-;8813:3;8809:39;8802:46;;8584:270;8494:360;;;;:::o;8860:364::-;8948:3;8976:39;9009:5;8976:39;:::i;:::-;9031:71;9095:6;9090:3;9031:71;:::i;:::-;9024:78;;9111:52;9156:6;9151:3;9144:4;9137:5;9133:16;9111:52;:::i;:::-;9188:29;9210:6;9188:29;:::i;:::-;9183:3;9179:39;9172:46;;8952:272;8860:364;;;;:::o;9230:377::-;9336:3;9364:39;9397:5;9364:39;:::i;:::-;9419:89;9501:6;9496:3;9419:89;:::i;:::-;9412:96;;9517:52;9562:6;9557:3;9550:4;9543:5;9539:16;9517:52;:::i;:::-;9594:6;9589:3;9585:16;9578:23;;9340:267;9230:377;;;;:::o;9613:366::-;9755:3;9776:67;9840:2;9835:3;9776:67;:::i;:::-;9769:74;;9852:93;9941:3;9852:93;:::i;:::-;9970:2;9965:3;9961:12;9954:19;;9613:366;;;:::o;9985:365::-;10127:3;10148:66;10212:1;10207:3;10148:66;:::i;:::-;10141:73;;10223:93;10312:3;10223:93;:::i;:::-;10341:2;10336:3;10332:12;10325:19;;9985:365;;;:::o;10356:366::-;10498:3;10519:67;10583:2;10578:3;10519:67;:::i;:::-;10512:74;;10595:93;10684:3;10595:93;:::i;:::-;10713:2;10708:3;10704:12;10697:19;;10356:366;;;:::o;10728:::-;10870:3;10891:67;10955:2;10950:3;10891:67;:::i;:::-;10884:74;;10967:93;11056:3;10967:93;:::i;:::-;11085:2;11080:3;11076:12;11069:19;;10728:366;;;:::o;11100:::-;11242:3;11263:67;11327:2;11322:3;11263:67;:::i;:::-;11256:74;;11339:93;11428:3;11339:93;:::i;:::-;11457:2;11452:3;11448:12;11441:19;;11100:366;;;:::o;11472:365::-;11614:3;11635:66;11699:1;11694:3;11635:66;:::i;:::-;11628:73;;11710:93;11799:3;11710:93;:::i;:::-;11828:2;11823:3;11819:12;11812:19;;11472:365;;;:::o;11843:366::-;11985:3;12006:67;12070:2;12065:3;12006:67;:::i;:::-;11999:74;;12082:93;12171:3;12082:93;:::i;:::-;12200:2;12195:3;12191:12;12184:19;;11843:366;;;:::o;12215:::-;12357:3;12378:67;12442:2;12437:3;12378:67;:::i;:::-;12371:74;;12454:93;12543:3;12454:93;:::i;:::-;12572:2;12567:3;12563:12;12556:19;;12215:366;;;:::o;12587:::-;12729:3;12750:67;12814:2;12809:3;12750:67;:::i;:::-;12743:74;;12826:93;12915:3;12826:93;:::i;:::-;12944:2;12939:3;12935:12;12928:19;;12587:366;;;:::o;12959:398::-;13118:3;13139:83;13220:1;13215:3;13139:83;:::i;:::-;13132:90;;13231:93;13320:3;13231:93;:::i;:::-;13349:1;13344:3;13340:11;13333:18;;12959:398;;;:::o;13363:366::-;13505:3;13526:67;13590:2;13585:3;13526:67;:::i;:::-;13519:74;;13602:93;13691:3;13602:93;:::i;:::-;13720:2;13715:3;13711:12;13704:19;;13363:366;;;:::o;13735:108::-;13812:24;13830:5;13812:24;:::i;:::-;13807:3;13800:37;13735:108;;:::o;13849:118::-;13936:24;13954:5;13936:24;:::i;:::-;13931:3;13924:37;13849:118;;:::o;13973:435::-;14153:3;14175:95;14266:3;14257:6;14175:95;:::i;:::-;14168:102;;14287:95;14378:3;14369:6;14287:95;:::i;:::-;14280:102;;14399:3;14392:10;;13973:435;;;;;:::o;14414:379::-;14598:3;14620:147;14763:3;14620:147;:::i;:::-;14613:154;;14784:3;14777:10;;14414:379;;;:::o;14799:222::-;14892:4;14930:2;14919:9;14915:18;14907:26;;14943:71;15011:1;15000:9;14996:17;14987:6;14943:71;:::i;:::-;14799:222;;;;:::o;15027:640::-;15222:4;15260:3;15249:9;15245:19;15237:27;;15274:71;15342:1;15331:9;15327:17;15318:6;15274:71;:::i;:::-;15355:72;15423:2;15412:9;15408:18;15399:6;15355:72;:::i;:::-;15437;15505:2;15494:9;15490:18;15481:6;15437:72;:::i;:::-;15556:9;15550:4;15546:20;15541:2;15530:9;15526:18;15519:48;15584:76;15655:4;15646:6;15584:76;:::i;:::-;15576:84;;15027:640;;;;;;;:::o;15673:332::-;15794:4;15832:2;15821:9;15817:18;15809:26;;15845:71;15913:1;15902:9;15898:17;15889:6;15845:71;:::i;:::-;15926:72;15994:2;15983:9;15979:18;15970:6;15926:72;:::i;:::-;15673:332;;;;;:::o;16011:373::-;16154:4;16192:2;16181:9;16177:18;16169:26;;16241:9;16235:4;16231:20;16227:1;16216:9;16212:17;16205:47;16269:108;16372:4;16363:6;16269:108;:::i;:::-;16261:116;;16011:373;;;;:::o;16390:210::-;16477:4;16515:2;16504:9;16500:18;16492:26;;16528:65;16590:1;16579:9;16575:17;16566:6;16528:65;:::i;:::-;16390:210;;;;:::o;16606:313::-;16719:4;16757:2;16746:9;16742:18;16734:26;;16806:9;16800:4;16796:20;16792:1;16781:9;16777:17;16770:47;16834:78;16907:4;16898:6;16834:78;:::i;:::-;16826:86;;16606:313;;;;:::o;16925:419::-;17091:4;17129:2;17118:9;17114:18;17106:26;;17178:9;17172:4;17168:20;17164:1;17153:9;17149:17;17142:47;17206:131;17332:4;17206:131;:::i;:::-;17198:139;;16925:419;;;:::o;17350:::-;17516:4;17554:2;17543:9;17539:18;17531:26;;17603:9;17597:4;17593:20;17589:1;17578:9;17574:17;17567:47;17631:131;17757:4;17631:131;:::i;:::-;17623:139;;17350:419;;;:::o;17775:::-;17941:4;17979:2;17968:9;17964:18;17956:26;;18028:9;18022:4;18018:20;18014:1;18003:9;17999:17;17992:47;18056:131;18182:4;18056:131;:::i;:::-;18048:139;;17775:419;;;:::o;18200:::-;18366:4;18404:2;18393:9;18389:18;18381:26;;18453:9;18447:4;18443:20;18439:1;18428:9;18424:17;18417:47;18481:131;18607:4;18481:131;:::i;:::-;18473:139;;18200:419;;;:::o;18625:::-;18791:4;18829:2;18818:9;18814:18;18806:26;;18878:9;18872:4;18868:20;18864:1;18853:9;18849:17;18842:47;18906:131;19032:4;18906:131;:::i;:::-;18898:139;;18625:419;;;:::o;19050:::-;19216:4;19254:2;19243:9;19239:18;19231:26;;19303:9;19297:4;19293:20;19289:1;19278:9;19274:17;19267:47;19331:131;19457:4;19331:131;:::i;:::-;19323:139;;19050:419;;;:::o;19475:::-;19641:4;19679:2;19668:9;19664:18;19656:26;;19728:9;19722:4;19718:20;19714:1;19703:9;19699:17;19692:47;19756:131;19882:4;19756:131;:::i;:::-;19748:139;;19475:419;;;:::o;19900:::-;20066:4;20104:2;20093:9;20089:18;20081:26;;20153:9;20147:4;20143:20;20139:1;20128:9;20124:17;20117:47;20181:131;20307:4;20181:131;:::i;:::-;20173:139;;19900:419;;;:::o;20325:::-;20491:4;20529:2;20518:9;20514:18;20506:26;;20578:9;20572:4;20568:20;20564:1;20553:9;20549:17;20542:47;20606:131;20732:4;20606:131;:::i;:::-;20598:139;;20325:419;;;:::o;20750:::-;20916:4;20954:2;20943:9;20939:18;20931:26;;21003:9;20997:4;20993:20;20989:1;20978:9;20974:17;20967:47;21031:131;21157:4;21031:131;:::i;:::-;21023:139;;20750:419;;;:::o;21175:222::-;21268:4;21306:2;21295:9;21291:18;21283:26;;21319:71;21387:1;21376:9;21372:17;21363:6;21319:71;:::i;:::-;21175:222;;;;:::o;21403:129::-;21437:6;21464:20;;:::i;:::-;21454:30;;21493:33;21521:4;21513:6;21493:33;:::i;:::-;21403:129;;;:::o;21538:75::-;21571:6;21604:2;21598:9;21588:19;;21538:75;:::o;21619:307::-;21680:4;21770:18;21762:6;21759:30;21756:56;;;21792:18;;:::i;:::-;21756:56;21830:29;21852:6;21830:29;:::i;:::-;21822:37;;21914:4;21908;21904:15;21896:23;;21619:307;;;:::o;21932:132::-;21999:4;22022:3;22014:11;;22052:4;22047:3;22043:14;22035:22;;21932:132;;;:::o;22070:114::-;22137:6;22171:5;22165:12;22155:22;;22070:114;;;:::o;22190:98::-;22241:6;22275:5;22269:12;22259:22;;22190:98;;;:::o;22294:99::-;22346:6;22380:5;22374:12;22364:22;;22294:99;;;:::o;22399:113::-;22469:4;22501;22496:3;22492:14;22484:22;;22399:113;;;:::o;22518:184::-;22617:11;22651:6;22646:3;22639:19;22691:4;22686:3;22682:14;22667:29;;22518:184;;;;:::o;22708:168::-;22791:11;22825:6;22820:3;22813:19;22865:4;22860:3;22856:14;22841:29;;22708:168;;;;:::o;22882:147::-;22983:11;23020:3;23005:18;;22882:147;;;;:::o;23035:169::-;23119:11;23153:6;23148:3;23141:19;23193:4;23188:3;23184:14;23169:29;;23035:169;;;;:::o;23210:148::-;23312:11;23349:3;23334:18;;23210:148;;;;:::o;23364:305::-;23404:3;23423:20;23441:1;23423:20;:::i;:::-;23418:25;;23457:20;23475:1;23457:20;:::i;:::-;23452:25;;23611:1;23543:66;23539:74;23536:1;23533:81;23530:107;;;23617:18;;:::i;:::-;23530:107;23661:1;23658;23654:9;23647:16;;23364:305;;;;:::o;23675:185::-;23715:1;23732:20;23750:1;23732:20;:::i;:::-;23727:25;;23766:20;23784:1;23766:20;:::i;:::-;23761:25;;23805:1;23795:35;;23810:18;;:::i;:::-;23795:35;23852:1;23849;23845:9;23840:14;;23675:185;;;;:::o;23866:348::-;23906:7;23929:20;23947:1;23929:20;:::i;:::-;23924:25;;23963:20;23981:1;23963:20;:::i;:::-;23958:25;;24151:1;24083:66;24079:74;24076:1;24073:81;24068:1;24061:9;24054:17;24050:105;24047:131;;;24158:18;;:::i;:::-;24047:131;24206:1;24203;24199:9;24188:20;;23866:348;;;;:::o;24220:191::-;24260:4;24280:20;24298:1;24280:20;:::i;:::-;24275:25;;24314:20;24332:1;24314:20;:::i;:::-;24309:25;;24353:1;24350;24347:8;24344:34;;;24358:18;;:::i;:::-;24344:34;24403:1;24400;24396:9;24388:17;;24220:191;;;;:::o;24417:96::-;24454:7;24483:24;24501:5;24483:24;:::i;:::-;24472:35;;24417:96;;;:::o;24519:90::-;24553:7;24596:5;24589:13;24582:21;24571:32;;24519:90;;;:::o;24615:149::-;24651:7;24691:66;24684:5;24680:78;24669:89;;24615:149;;;:::o;24770:126::-;24807:7;24847:42;24840:5;24836:54;24825:65;;24770:126;;;:::o;24902:77::-;24939:7;24968:5;24957:16;;24902:77;;;:::o;24985:154::-;25069:6;25064:3;25059;25046:30;25131:1;25122:6;25117:3;25113:16;25106:27;24985:154;;;:::o;25145:307::-;25213:1;25223:113;25237:6;25234:1;25231:13;25223:113;;;25322:1;25317:3;25313:11;25307:18;25303:1;25298:3;25294:11;25287:39;25259:2;25256:1;25252:10;25247:15;;25223:113;;;25354:6;25351:1;25348:13;25345:101;;;25434:1;25425:6;25420:3;25416:16;25409:27;25345:101;25194:258;25145:307;;;:::o;25458:320::-;25502:6;25539:1;25533:4;25529:12;25519:22;;25586:1;25580:4;25576:12;25607:18;25597:81;;25663:4;25655:6;25651:17;25641:27;;25597:81;25725:2;25717:6;25714:14;25694:18;25691:38;25688:84;;;25744:18;;:::i;:::-;25688:84;25509:269;25458:320;;;:::o;25784:281::-;25867:27;25889:4;25867:27;:::i;:::-;25859:6;25855:40;25997:6;25985:10;25982:22;25961:18;25949:10;25946:34;25943:62;25940:88;;;26008:18;;:::i;:::-;25940:88;26048:10;26044:2;26037:22;25827:238;25784:281;;:::o;26071:233::-;26110:3;26133:24;26151:5;26133:24;:::i;:::-;26124:33;;26179:66;26172:5;26169:77;26166:103;;;26249:18;;:::i;:::-;26166:103;26296:1;26289:5;26285:13;26278:20;;26071:233;;;:::o;26310:176::-;26342:1;26359:20;26377:1;26359:20;:::i;:::-;26354:25;;26393:20;26411:1;26393:20;:::i;:::-;26388:25;;26432:1;26422:35;;26437:18;;:::i;:::-;26422:35;26478:1;26475;26471:9;26466:14;;26310:176;;;;:::o;26492:180::-;26540:77;26537:1;26530:88;26637:4;26634:1;26627:15;26661:4;26658:1;26651:15;26678:180;26726:77;26723:1;26716:88;26823:4;26820:1;26813:15;26847:4;26844:1;26837:15;26864:180;26912:77;26909:1;26902:88;27009:4;27006:1;26999:15;27033:4;27030:1;27023:15;27050:180;27098:77;27095:1;27088:88;27195:4;27192:1;27185:15;27219:4;27216:1;27209:15;27236:180;27284:77;27281:1;27274:88;27381:4;27378:1;27371:15;27405:4;27402:1;27395:15;27422:117;27531:1;27528;27521:12;27545:117;27654:1;27651;27644:12;27668:117;27777:1;27774;27767:12;27791:117;27900:1;27897;27890:12;27914:117;28023:1;28020;28013:12;28037:117;28146:1;28143;28136:12;28160:102;28201:6;28252:2;28248:7;28243:2;28236:5;28232:14;28228:28;28218:38;;28160:102;;;:::o;28268:164::-;28408:16;28404:1;28396:6;28392:14;28385:40;28268:164;:::o;28438:156::-;28578:8;28574:1;28566:6;28562:14;28555:32;28438:156;:::o;28600:225::-;28740:34;28736:1;28728:6;28724:14;28717:58;28809:8;28804:2;28796:6;28792:15;28785:33;28600:225;:::o;28831:168::-;28971:20;28967:1;28959:6;28955:14;28948:44;28831:168;:::o;29005:164::-;29145:16;29141:1;29133:6;29129:14;29122:40;29005:164;:::o;29175:155::-;29315:7;29311:1;29303:6;29299:14;29292:31;29175:155;:::o;29336:165::-;29476:17;29472:1;29464:6;29460:14;29453:41;29336:165;:::o;29507:161::-;29647:13;29643:1;29635:6;29631:14;29624:37;29507:161;:::o;29674:182::-;29814:34;29810:1;29802:6;29798:14;29791:58;29674:182;:::o;29862:114::-;;:::o;29982:162::-;30122:14;30118:1;30110:6;30106:14;30099:38;29982:162;:::o;30150:122::-;30223:24;30241:5;30223:24;:::i;:::-;30216:5;30213:35;30203:63;;30262:1;30259;30252:12;30203:63;30150:122;:::o;30278:116::-;30348:21;30363:5;30348:21;:::i;:::-;30341:5;30338:32;30328:60;;30384:1;30381;30374:12;30328:60;30278:116;:::o;30400:120::-;30472:23;30489:5;30472:23;:::i;:::-;30465:5;30462:34;30452:62;;30510:1;30507;30500:12;30452:62;30400:120;:::o;30526:122::-;30599:24;30617:5;30599:24;:::i;:::-;30592:5;30589:35;30579:63;;30638:1;30635;30628:12;30579:63;30526:122;:::o

Swarm Source

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