ETH Price: $2,507.55 (-0.12%)

Token

Chips (CHIPS)
 

Overview

Max Total Supply

100 CHIPS

Holders

80

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
03692.eth
Balance
1 CHIPS
0xB0C011234CbF6F9274D1fabd02C39EFe37544A94
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

A collection of 100 completely on-chain Blue Chip NFTs. Free to mint.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Chips

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-26
*/

/**
 *Submitted for verification at Etherscan.io on 2021-08-24
*/

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

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

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

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

// File: @openzeppelin/contracts/utils/Address.sol

pragma solidity ^0.8.0;

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

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

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

// File: @openzeppelin/contracts/utils/Context.sol

pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol



pragma solidity ^0.8.0;

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

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

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

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

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

}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol

pragma solidity ^0.8.0;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/access/Ownable.sol

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

// File: contracts/Chips.sol

pragma solidity ^0.8.0;

contract Chips is ERC721Enumerable, Ownable {
    uint256 public constant MAX_NFT_SUPPLY = 100;

    constructor() ERC721("Chips", "CHIPS") {
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return "ipfs://QmVNPXeFZ8aPFeSRRhMpDvRjvwZarCYuk293MLyPasFs2B/";
    }

    function getTokenURI(uint256 tokenId) public view returns (string memory) {
        return tokenURI(tokenId);
    }

   function mint() public  {
        require(totalSupply() < MAX_NFT_SUPPLY, "All NFTs have been minted.");
        require(totalSupply() + 1 <= MAX_NFT_SUPPLY, "The amount of Chips you are trying to mint exceeds the MAX_NFT_SUPPLY.");

        uint256 mintIndex = totalSupply();
        _safeMint(msg.sender, mintIndex);
   }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_NFT_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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"}]

60806040523480156200001157600080fd5b506040518060400160405280600581526020017f43686970730000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f434849505300000000000000000000000000000000000000000000000000000081525081600090805190602001906200009692919062000171565b508060019080519060200190620000af92919062000171565b5050506000620000c46200016960201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35062000286565b600033905090565b8280546200017f9062000221565b90600052602060002090601f016020900481019282620001a35760008555620001ef565b82601f10620001be57805160ff1916838001178555620001ef565b82800160010185558215620001ef579182015b82811115620001ee578251825591602001919060010190620001d1565b5b509050620001fe919062000202565b5090565b5b808211156200021d57600081600090555060010162000203565b5090565b600060028204905060018216806200023a57607f821691505b6020821081141562000251576200025062000257565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6134f380620002966000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80636352211e116100b8578063a22cb4651161007c578063a22cb46514610377578063b5077f4414610393578063b88d4fde146103b1578063c87b56dd146103cd578063e985e9c5146103fd578063f2fde38b1461042d57610142565b80636352211e146102d157806370a0823114610301578063715018a6146103315780638da5cb5b1461033b57806395d89b411461035957610142565b806318160ddd1161010a57806318160ddd146101eb57806323b872dd146102095780632f745c59146102255780633bb3a24d1461025557806342842e0e146102855780634f6ccce7146102a157610142565b806301ffc9a71461014757806306fdde0314610177578063081812fc14610195578063095ea7b3146101c55780631249c58b146101e1575b600080fd5b610161600480360381019061015c919061248f565b610449565b60405161016e9190612dc5565b60405180910390f35b61017f6104c3565b60405161018c9190612de0565b60405180910390f35b6101af60048036038101906101aa91906124e1565b610555565b6040516101bc9190612d5e565b60405180910390f35b6101df60048036038101906101da9190612453565b6105da565b005b6101e96106f2565b005b6101f36107ac565b6040516102009190613082565b60405180910390f35b610223600480360381019061021e919061234d565b6107b9565b005b61023f600480360381019061023a9190612453565b610819565b60405161024c9190613082565b60405180910390f35b61026f600480360381019061026a91906124e1565b6108be565b60405161027c9190612de0565b60405180910390f35b61029f600480360381019061029a919061234d565b6108d0565b005b6102bb60048036038101906102b691906124e1565b6108f0565b6040516102c89190613082565b60405180910390f35b6102eb60048036038101906102e691906124e1565b610987565b6040516102f89190612d5e565b60405180910390f35b61031b600480360381019061031691906122e8565b610a39565b6040516103289190613082565b60405180910390f35b610339610af1565b005b610343610c2e565b6040516103509190612d5e565b60405180910390f35b610361610c58565b60405161036e9190612de0565b60405180910390f35b610391600480360381019061038c9190612417565b610cea565b005b61039b610e6b565b6040516103a89190613082565b60405180910390f35b6103cb60048036038101906103c6919061239c565b610e70565b005b6103e760048036038101906103e291906124e1565b610ed2565b6040516103f49190612de0565b60405180910390f35b61041760048036038101906104129190612311565b610f79565b6040516104249190612dc5565b60405180910390f35b610447600480360381019061044291906122e8565b61100d565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104bc57506104bb826111b9565b5b9050919050565b6060600080546104d2906132b2565b80601f01602080910402602001604051908101604052809291908181526020018280546104fe906132b2565b801561054b5780601f106105205761010080835404028352916020019161054b565b820191906000526020600020905b81548152906001019060200180831161052e57829003601f168201915b5050505050905090565b60006105608261129b565b61059f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059690612fa2565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006105e582610987565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610656576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064d90613022565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610675611307565b73ffffffffffffffffffffffffffffffffffffffff1614806106a457506106a38161069e611307565b610f79565b5b6106e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106da90612f22565b60405180910390fd5b6106ed838361130f565b505050565b60646106fc6107ac565b1061073c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073390612ec2565b60405180910390fd5b606460016107486107ac565b6107529190613141565b1115610793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078a90612f02565b60405180910390fd5b600061079d6107ac565b90506107a933826113c8565b50565b6000600880549050905090565b6107ca6107c4611307565b826113e6565b610809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080090613042565b60405180910390fd5b6108148383836114c4565b505050565b600061082483610a39565b8210610865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085c90612e02565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60606108c982610ed2565b9050919050565b6108eb83838360405180602001604052806000815250610e70565b505050565b60006108fa6107ac565b821061093b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093290613062565b60405180910390fd5b60088281548110610975577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610a30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2790612f62565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa190612f42565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610af9611307565b73ffffffffffffffffffffffffffffffffffffffff16610b17610c2e565b73ffffffffffffffffffffffffffffffffffffffff1614610b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6490612fc2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610c67906132b2565b80601f0160208091040260200160405190810160405280929190818152602001828054610c93906132b2565b8015610ce05780601f10610cb557610100808354040283529160200191610ce0565b820191906000526020600020905b815481529060010190602001808311610cc357829003601f168201915b5050505050905090565b610cf2611307565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5790612ea2565b60405180910390fd5b8060056000610d6d611307565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610e1a611307565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e5f9190612dc5565b60405180910390a35050565b606481565b610e81610e7b611307565b836113e6565b610ec0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb790613042565b60405180910390fd5b610ecc84848484611720565b50505050565b6060610edd8261129b565b610f1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1390613002565b60405180910390fd5b6000610f2661177c565b90506000815111610f465760405180602001604052806000815250610f71565b80610f508461179c565b604051602001610f61929190612d3a565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611015611307565b73ffffffffffffffffffffffffffffffffffffffff16611033610c2e565b73ffffffffffffffffffffffffffffffffffffffff1614611089576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108090612fc2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f090612e42565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061128457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611294575061129382611949565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661138283610987565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6113e28282604051806020016040528060008152506119b3565b5050565b60006113f18261129b565b611430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142790612ee2565b60405180910390fd5b600061143b83610987565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806114aa57508373ffffffffffffffffffffffffffffffffffffffff1661149284610555565b73ffffffffffffffffffffffffffffffffffffffff16145b806114bb57506114ba8185610f79565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166114e482610987565b73ffffffffffffffffffffffffffffffffffffffff161461153a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153190612fe2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a190612e82565b60405180910390fd5b6115b5838383611a0e565b6115c060008261130f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461161091906131c8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116679190613141565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61172b8484846114c4565b61173784848484611b22565b611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90612e22565b60405180910390fd5b50505050565b606060405180606001604052806036815260200161348860369139905090565b606060008214156117e4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611944565b600082905060005b600082146118165780806117ff906132e4565b915050600a8261180f9190613197565b91506117ec565b60008167ffffffffffffffff811115611858577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561188a5781602001600182028036833780820191505090505b5090505b6000851461193d576001826118a391906131c8565b9150600a856118b2919061332d565b60306118be9190613141565b60f81b8183815181106118fa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856119369190613197565b945061188e565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6119bd8383611cb9565b6119ca6000848484611b22565b611a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0090612e22565b60405180910390fd5b505050565b611a19838383611e87565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611a5c57611a5781611e8c565b611a9b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611a9a57611a998382611ed5565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ade57611ad981612042565b611b1d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611b1c57611b1b8282612185565b5b5b505050565b6000611b438473ffffffffffffffffffffffffffffffffffffffff16612204565b15611cac578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b6c611307565b8786866040518563ffffffff1660e01b8152600401611b8e9493929190612d79565b602060405180830381600087803b158015611ba857600080fd5b505af1925050508015611bd957506040513d601f19601f82011682018060405250810190611bd691906124b8565b60015b611c5c573d8060008114611c09576040519150601f19603f3d011682016040523d82523d6000602084013e611c0e565b606091505b50600081511415611c54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4b90612e22565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611cb1565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2090612f82565b60405180910390fd5b611d328161129b565b15611d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6990612e62565b60405180910390fd5b611d7e60008383611a0e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dce9190613141565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001611ee284610a39565b611eec91906131c8565b9050600060076000848152602001908152602001600020549050818114611fd1576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061205691906131c8565b90506000600960008481526020019081526020016000205490506000600883815481106120ac577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106120f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612169577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061219083610a39565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b600061222a612225846130ce565b61309d565b90508281526020810184848401111561224257600080fd5b61224d848285613270565b509392505050565b6000813590506122648161342b565b92915050565b60008135905061227981613442565b92915050565b60008135905061228e81613459565b92915050565b6000815190506122a381613459565b92915050565b600082601f8301126122ba57600080fd5b81356122ca848260208601612217565b91505092915050565b6000813590506122e281613470565b92915050565b6000602082840312156122fa57600080fd5b600061230884828501612255565b91505092915050565b6000806040838503121561232457600080fd5b600061233285828601612255565b925050602061234385828601612255565b9150509250929050565b60008060006060848603121561236257600080fd5b600061237086828701612255565b935050602061238186828701612255565b9250506040612392868287016122d3565b9150509250925092565b600080600080608085870312156123b257600080fd5b60006123c087828801612255565b94505060206123d187828801612255565b93505060406123e2878288016122d3565b925050606085013567ffffffffffffffff8111156123ff57600080fd5b61240b878288016122a9565b91505092959194509250565b6000806040838503121561242a57600080fd5b600061243885828601612255565b92505060206124498582860161226a565b9150509250929050565b6000806040838503121561246657600080fd5b600061247485828601612255565b9250506020612485858286016122d3565b9150509250929050565b6000602082840312156124a157600080fd5b60006124af8482850161227f565b91505092915050565b6000602082840312156124ca57600080fd5b60006124d884828501612294565b91505092915050565b6000602082840312156124f357600080fd5b6000612501848285016122d3565b91505092915050565b612513816131fc565b82525050565b6125228161320e565b82525050565b6000612533826130fe565b61253d8185613114565b935061254d81856020860161327f565b6125568161341a565b840191505092915050565b600061256c82613109565b6125768185613125565b935061258681856020860161327f565b61258f8161341a565b840191505092915050565b60006125a582613109565b6125af8185613136565b93506125bf81856020860161327f565b80840191505092915050565b60006125d8602b83613125565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061263e603283613125565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006126a4602683613125565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061270a601c83613125565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600061274a602483613125565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006127b0601983613125565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006127f0601a83613125565b91507f416c6c204e4654732068617665206265656e206d696e7465642e0000000000006000830152602082019050919050565b6000612830602c83613125565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000612896604683613125565b91507f54686520616d6f756e74206f6620436869707320796f7520617265207472796960008301527f6e6720746f206d696e74206578636565647320746865204d41585f4e46545f5360208301527f5550504c592e00000000000000000000000000000000000000000000000000006040830152606082019050919050565b6000612922603883613125565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000612988602a83613125565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006129ee602983613125565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000612a54602083613125565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000612a94602c83613125565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000612afa602083613125565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000612b3a602983613125565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000612ba0602f83613125565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000612c06602183613125565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612c6c603183613125565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000612cd2602c83613125565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b612d3481613266565b82525050565b6000612d46828561259a565b9150612d52828461259a565b91508190509392505050565b6000602082019050612d73600083018461250a565b92915050565b6000608082019050612d8e600083018761250a565b612d9b602083018661250a565b612da86040830185612d2b565b8181036060830152612dba8184612528565b905095945050505050565b6000602082019050612dda6000830184612519565b92915050565b60006020820190508181036000830152612dfa8184612561565b905092915050565b60006020820190508181036000830152612e1b816125cb565b9050919050565b60006020820190508181036000830152612e3b81612631565b9050919050565b60006020820190508181036000830152612e5b81612697565b9050919050565b60006020820190508181036000830152612e7b816126fd565b9050919050565b60006020820190508181036000830152612e9b8161273d565b9050919050565b60006020820190508181036000830152612ebb816127a3565b9050919050565b60006020820190508181036000830152612edb816127e3565b9050919050565b60006020820190508181036000830152612efb81612823565b9050919050565b60006020820190508181036000830152612f1b81612889565b9050919050565b60006020820190508181036000830152612f3b81612915565b9050919050565b60006020820190508181036000830152612f5b8161297b565b9050919050565b60006020820190508181036000830152612f7b816129e1565b9050919050565b60006020820190508181036000830152612f9b81612a47565b9050919050565b60006020820190508181036000830152612fbb81612a87565b9050919050565b60006020820190508181036000830152612fdb81612aed565b9050919050565b60006020820190508181036000830152612ffb81612b2d565b9050919050565b6000602082019050818103600083015261301b81612b93565b9050919050565b6000602082019050818103600083015261303b81612bf9565b9050919050565b6000602082019050818103600083015261305b81612c5f565b9050919050565b6000602082019050818103600083015261307b81612cc5565b9050919050565b60006020820190506130976000830184612d2b565b92915050565b6000604051905081810181811067ffffffffffffffff821117156130c4576130c36133eb565b5b8060405250919050565b600067ffffffffffffffff8211156130e9576130e86133eb565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061314c82613266565b915061315783613266565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561318c5761318b61335e565b5b828201905092915050565b60006131a282613266565b91506131ad83613266565b9250826131bd576131bc61338d565b5b828204905092915050565b60006131d382613266565b91506131de83613266565b9250828210156131f1576131f061335e565b5b828203905092915050565b600061320782613246565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561329d578082015181840152602081019050613282565b838111156132ac576000848401525b50505050565b600060028204905060018216806132ca57607f821691505b602082108114156132de576132dd6133bc565b5b50919050565b60006132ef82613266565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156133225761332161335e565b5b600182019050919050565b600061333882613266565b915061334383613266565b9250826133535761335261338d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613434816131fc565b811461343f57600080fd5b50565b61344b8161320e565b811461345657600080fd5b50565b6134628161321a565b811461346d57600080fd5b50565b61347981613266565b811461348457600080fd5b5056fe697066733a2f2f516d564e505865465a3861504665535252684d704476526a76775a61724359756b3239334d4c79506173467332422fa26469706673582212208dd39751e0fb244521b04f2807902e1074a0af538098f4d4395b7e29b3cd4c4764736f6c63430008000033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101425760003560e01c80636352211e116100b8578063a22cb4651161007c578063a22cb46514610377578063b5077f4414610393578063b88d4fde146103b1578063c87b56dd146103cd578063e985e9c5146103fd578063f2fde38b1461042d57610142565b80636352211e146102d157806370a0823114610301578063715018a6146103315780638da5cb5b1461033b57806395d89b411461035957610142565b806318160ddd1161010a57806318160ddd146101eb57806323b872dd146102095780632f745c59146102255780633bb3a24d1461025557806342842e0e146102855780634f6ccce7146102a157610142565b806301ffc9a71461014757806306fdde0314610177578063081812fc14610195578063095ea7b3146101c55780631249c58b146101e1575b600080fd5b610161600480360381019061015c919061248f565b610449565b60405161016e9190612dc5565b60405180910390f35b61017f6104c3565b60405161018c9190612de0565b60405180910390f35b6101af60048036038101906101aa91906124e1565b610555565b6040516101bc9190612d5e565b60405180910390f35b6101df60048036038101906101da9190612453565b6105da565b005b6101e96106f2565b005b6101f36107ac565b6040516102009190613082565b60405180910390f35b610223600480360381019061021e919061234d565b6107b9565b005b61023f600480360381019061023a9190612453565b610819565b60405161024c9190613082565b60405180910390f35b61026f600480360381019061026a91906124e1565b6108be565b60405161027c9190612de0565b60405180910390f35b61029f600480360381019061029a919061234d565b6108d0565b005b6102bb60048036038101906102b691906124e1565b6108f0565b6040516102c89190613082565b60405180910390f35b6102eb60048036038101906102e691906124e1565b610987565b6040516102f89190612d5e565b60405180910390f35b61031b600480360381019061031691906122e8565b610a39565b6040516103289190613082565b60405180910390f35b610339610af1565b005b610343610c2e565b6040516103509190612d5e565b60405180910390f35b610361610c58565b60405161036e9190612de0565b60405180910390f35b610391600480360381019061038c9190612417565b610cea565b005b61039b610e6b565b6040516103a89190613082565b60405180910390f35b6103cb60048036038101906103c6919061239c565b610e70565b005b6103e760048036038101906103e291906124e1565b610ed2565b6040516103f49190612de0565b60405180910390f35b61041760048036038101906104129190612311565b610f79565b6040516104249190612dc5565b60405180910390f35b610447600480360381019061044291906122e8565b61100d565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104bc57506104bb826111b9565b5b9050919050565b6060600080546104d2906132b2565b80601f01602080910402602001604051908101604052809291908181526020018280546104fe906132b2565b801561054b5780601f106105205761010080835404028352916020019161054b565b820191906000526020600020905b81548152906001019060200180831161052e57829003601f168201915b5050505050905090565b60006105608261129b565b61059f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059690612fa2565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006105e582610987565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610656576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064d90613022565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610675611307565b73ffffffffffffffffffffffffffffffffffffffff1614806106a457506106a38161069e611307565b610f79565b5b6106e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106da90612f22565b60405180910390fd5b6106ed838361130f565b505050565b60646106fc6107ac565b1061073c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073390612ec2565b60405180910390fd5b606460016107486107ac565b6107529190613141565b1115610793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078a90612f02565b60405180910390fd5b600061079d6107ac565b90506107a933826113c8565b50565b6000600880549050905090565b6107ca6107c4611307565b826113e6565b610809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080090613042565b60405180910390fd5b6108148383836114c4565b505050565b600061082483610a39565b8210610865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085c90612e02565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60606108c982610ed2565b9050919050565b6108eb83838360405180602001604052806000815250610e70565b505050565b60006108fa6107ac565b821061093b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093290613062565b60405180910390fd5b60088281548110610975577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610a30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2790612f62565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa190612f42565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610af9611307565b73ffffffffffffffffffffffffffffffffffffffff16610b17610c2e565b73ffffffffffffffffffffffffffffffffffffffff1614610b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6490612fc2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610c67906132b2565b80601f0160208091040260200160405190810160405280929190818152602001828054610c93906132b2565b8015610ce05780601f10610cb557610100808354040283529160200191610ce0565b820191906000526020600020905b815481529060010190602001808311610cc357829003601f168201915b5050505050905090565b610cf2611307565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5790612ea2565b60405180910390fd5b8060056000610d6d611307565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610e1a611307565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e5f9190612dc5565b60405180910390a35050565b606481565b610e81610e7b611307565b836113e6565b610ec0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb790613042565b60405180910390fd5b610ecc84848484611720565b50505050565b6060610edd8261129b565b610f1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1390613002565b60405180910390fd5b6000610f2661177c565b90506000815111610f465760405180602001604052806000815250610f71565b80610f508461179c565b604051602001610f61929190612d3a565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611015611307565b73ffffffffffffffffffffffffffffffffffffffff16611033610c2e565b73ffffffffffffffffffffffffffffffffffffffff1614611089576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108090612fc2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f090612e42565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061128457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611294575061129382611949565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661138283610987565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6113e28282604051806020016040528060008152506119b3565b5050565b60006113f18261129b565b611430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142790612ee2565b60405180910390fd5b600061143b83610987565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806114aa57508373ffffffffffffffffffffffffffffffffffffffff1661149284610555565b73ffffffffffffffffffffffffffffffffffffffff16145b806114bb57506114ba8185610f79565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166114e482610987565b73ffffffffffffffffffffffffffffffffffffffff161461153a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153190612fe2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a190612e82565b60405180910390fd5b6115b5838383611a0e565b6115c060008261130f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461161091906131c8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116679190613141565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61172b8484846114c4565b61173784848484611b22565b611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90612e22565b60405180910390fd5b50505050565b606060405180606001604052806036815260200161348860369139905090565b606060008214156117e4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611944565b600082905060005b600082146118165780806117ff906132e4565b915050600a8261180f9190613197565b91506117ec565b60008167ffffffffffffffff811115611858577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561188a5781602001600182028036833780820191505090505b5090505b6000851461193d576001826118a391906131c8565b9150600a856118b2919061332d565b60306118be9190613141565b60f81b8183815181106118fa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856119369190613197565b945061188e565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6119bd8383611cb9565b6119ca6000848484611b22565b611a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0090612e22565b60405180910390fd5b505050565b611a19838383611e87565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611a5c57611a5781611e8c565b611a9b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611a9a57611a998382611ed5565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ade57611ad981612042565b611b1d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611b1c57611b1b8282612185565b5b5b505050565b6000611b438473ffffffffffffffffffffffffffffffffffffffff16612204565b15611cac578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b6c611307565b8786866040518563ffffffff1660e01b8152600401611b8e9493929190612d79565b602060405180830381600087803b158015611ba857600080fd5b505af1925050508015611bd957506040513d601f19601f82011682018060405250810190611bd691906124b8565b60015b611c5c573d8060008114611c09576040519150601f19603f3d011682016040523d82523d6000602084013e611c0e565b606091505b50600081511415611c54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4b90612e22565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611cb1565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2090612f82565b60405180910390fd5b611d328161129b565b15611d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6990612e62565b60405180910390fd5b611d7e60008383611a0e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dce9190613141565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001611ee284610a39565b611eec91906131c8565b9050600060076000848152602001908152602001600020549050818114611fd1576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061205691906131c8565b90506000600960008481526020019081526020016000205490506000600883815481106120ac577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106120f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612169577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061219083610a39565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b600061222a612225846130ce565b61309d565b90508281526020810184848401111561224257600080fd5b61224d848285613270565b509392505050565b6000813590506122648161342b565b92915050565b60008135905061227981613442565b92915050565b60008135905061228e81613459565b92915050565b6000815190506122a381613459565b92915050565b600082601f8301126122ba57600080fd5b81356122ca848260208601612217565b91505092915050565b6000813590506122e281613470565b92915050565b6000602082840312156122fa57600080fd5b600061230884828501612255565b91505092915050565b6000806040838503121561232457600080fd5b600061233285828601612255565b925050602061234385828601612255565b9150509250929050565b60008060006060848603121561236257600080fd5b600061237086828701612255565b935050602061238186828701612255565b9250506040612392868287016122d3565b9150509250925092565b600080600080608085870312156123b257600080fd5b60006123c087828801612255565b94505060206123d187828801612255565b93505060406123e2878288016122d3565b925050606085013567ffffffffffffffff8111156123ff57600080fd5b61240b878288016122a9565b91505092959194509250565b6000806040838503121561242a57600080fd5b600061243885828601612255565b92505060206124498582860161226a565b9150509250929050565b6000806040838503121561246657600080fd5b600061247485828601612255565b9250506020612485858286016122d3565b9150509250929050565b6000602082840312156124a157600080fd5b60006124af8482850161227f565b91505092915050565b6000602082840312156124ca57600080fd5b60006124d884828501612294565b91505092915050565b6000602082840312156124f357600080fd5b6000612501848285016122d3565b91505092915050565b612513816131fc565b82525050565b6125228161320e565b82525050565b6000612533826130fe565b61253d8185613114565b935061254d81856020860161327f565b6125568161341a565b840191505092915050565b600061256c82613109565b6125768185613125565b935061258681856020860161327f565b61258f8161341a565b840191505092915050565b60006125a582613109565b6125af8185613136565b93506125bf81856020860161327f565b80840191505092915050565b60006125d8602b83613125565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061263e603283613125565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006126a4602683613125565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061270a601c83613125565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600061274a602483613125565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006127b0601983613125565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006127f0601a83613125565b91507f416c6c204e4654732068617665206265656e206d696e7465642e0000000000006000830152602082019050919050565b6000612830602c83613125565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000612896604683613125565b91507f54686520616d6f756e74206f6620436869707320796f7520617265207472796960008301527f6e6720746f206d696e74206578636565647320746865204d41585f4e46545f5360208301527f5550504c592e00000000000000000000000000000000000000000000000000006040830152606082019050919050565b6000612922603883613125565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000612988602a83613125565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006129ee602983613125565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000612a54602083613125565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000612a94602c83613125565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000612afa602083613125565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000612b3a602983613125565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000612ba0602f83613125565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000612c06602183613125565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612c6c603183613125565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000612cd2602c83613125565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b612d3481613266565b82525050565b6000612d46828561259a565b9150612d52828461259a565b91508190509392505050565b6000602082019050612d73600083018461250a565b92915050565b6000608082019050612d8e600083018761250a565b612d9b602083018661250a565b612da86040830185612d2b565b8181036060830152612dba8184612528565b905095945050505050565b6000602082019050612dda6000830184612519565b92915050565b60006020820190508181036000830152612dfa8184612561565b905092915050565b60006020820190508181036000830152612e1b816125cb565b9050919050565b60006020820190508181036000830152612e3b81612631565b9050919050565b60006020820190508181036000830152612e5b81612697565b9050919050565b60006020820190508181036000830152612e7b816126fd565b9050919050565b60006020820190508181036000830152612e9b8161273d565b9050919050565b60006020820190508181036000830152612ebb816127a3565b9050919050565b60006020820190508181036000830152612edb816127e3565b9050919050565b60006020820190508181036000830152612efb81612823565b9050919050565b60006020820190508181036000830152612f1b81612889565b9050919050565b60006020820190508181036000830152612f3b81612915565b9050919050565b60006020820190508181036000830152612f5b8161297b565b9050919050565b60006020820190508181036000830152612f7b816129e1565b9050919050565b60006020820190508181036000830152612f9b81612a47565b9050919050565b60006020820190508181036000830152612fbb81612a87565b9050919050565b60006020820190508181036000830152612fdb81612aed565b9050919050565b60006020820190508181036000830152612ffb81612b2d565b9050919050565b6000602082019050818103600083015261301b81612b93565b9050919050565b6000602082019050818103600083015261303b81612bf9565b9050919050565b6000602082019050818103600083015261305b81612c5f565b9050919050565b6000602082019050818103600083015261307b81612cc5565b9050919050565b60006020820190506130976000830184612d2b565b92915050565b6000604051905081810181811067ffffffffffffffff821117156130c4576130c36133eb565b5b8060405250919050565b600067ffffffffffffffff8211156130e9576130e86133eb565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061314c82613266565b915061315783613266565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561318c5761318b61335e565b5b828201905092915050565b60006131a282613266565b91506131ad83613266565b9250826131bd576131bc61338d565b5b828204905092915050565b60006131d382613266565b91506131de83613266565b9250828210156131f1576131f061335e565b5b828203905092915050565b600061320782613246565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561329d578082015181840152602081019050613282565b838111156132ac576000848401525b50505050565b600060028204905060018216806132ca57607f821691505b602082108114156132de576132dd6133bc565b5b50919050565b60006132ef82613266565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156133225761332161335e565b5b600182019050919050565b600061333882613266565b915061334383613266565b9250826133535761335261338d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613434816131fc565b811461343f57600080fd5b50565b61344b8161320e565b811461345657600080fd5b50565b6134628161321a565b811461346d57600080fd5b50565b61347981613266565b811461348457600080fd5b5056fe697066733a2f2f516d564e505865465a3861504665535252684d704476526a76775a61724359756b3239334d4c79506173467332422fa26469706673582212208dd39751e0fb244521b04f2807902e1074a0af538098f4d4395b7e29b3cd4c4764736f6c63430008000033

Deployed Bytecode Sourcemap

42824:780:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34343:237;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21556:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23016:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22553:397;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43272:329;;;:::i;:::-;;34996:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23906:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34664:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43148:117;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24282:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35186:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21250:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20980:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42211:148;;;:::i;:::-;;41560:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21725:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23309:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42875:44;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24504:285;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21900:360;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23675:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42514:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34343:237;34445:4;34484:35;34469:50;;;:11;:50;;;;:103;;;;34536:36;34560:11;34536:23;:36::i;:::-;34469:103;34462:110;;34343:237;;;:::o;21556:100::-;21610:13;21643:5;21636:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21556:100;:::o;23016:221::-;23092:7;23120:16;23128:7;23120;:16::i;:::-;23112:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23205:15;:24;23221:7;23205:24;;;;;;;;;;;;;;;;;;;;;23198:31;;23016:221;;;:::o;22553:397::-;22634:13;22650:23;22665:7;22650:14;:23::i;:::-;22634:39;;22698:5;22692:11;;:2;:11;;;;22684:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22778:5;22762:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22787:37;22804:5;22811:12;:10;:12::i;:::-;22787:16;:37::i;:::-;22762:62;22754:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;22921:21;22930:2;22934:7;22921:8;:21::i;:::-;22553:397;;;:::o;43272:329::-;42916:3;43315:13;:11;:13::i;:::-;:30;43307:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;42916:3;43411:1;43395:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:35;;43387:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;43518:17;43538:13;:11;:13::i;:::-;43518:33;;43562:32;43572:10;43584:9;43562;:32::i;:::-;43272:329;:::o;34996:113::-;35057:7;35084:10;:17;;;;35077:24;;34996:113;:::o;23906:305::-;24067:41;24086:12;:10;:12::i;:::-;24100:7;24067:18;:41::i;:::-;24059:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24175:28;24185:4;24191:2;24195:7;24175:9;:28::i;:::-;23906:305;;;:::o;34664:256::-;34761:7;34797:23;34814:5;34797:16;:23::i;:::-;34789:5;:31;34781:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34886:12;:19;34899:5;34886:19;;;;;;;;;;;;;;;:26;34906:5;34886:26;;;;;;;;;;;;34879:33;;34664:256;;;;:::o;43148:117::-;43207:13;43240:17;43249:7;43240:8;:17::i;:::-;43233:24;;43148:117;;;:::o;24282:151::-;24386:39;24403:4;24409:2;24413:7;24386:39;;;;;;;;;;;;:16;:39::i;:::-;24282:151;;;:::o;35186:233::-;35261:7;35297:30;:28;:30::i;:::-;35289:5;:38;35281:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35394:10;35405:5;35394:17;;;;;;;;;;;;;;;;;;;;;;;;35387:24;;35186:233;;;:::o;21250:239::-;21322:7;21342:13;21358:7;:16;21366:7;21358:16;;;;;;;;;;;;;;;;;;;;;21342:32;;21410:1;21393:19;;:5;:19;;;;21385:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21476:5;21469:12;;;21250:239;;;:::o;20980:208::-;21052:7;21097:1;21080:19;;:5;:19;;;;21072:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21164:9;:16;21174:5;21164:16;;;;;;;;;;;;;;;;21157:23;;20980:208;;;:::o;42211:148::-;41791:12;:10;:12::i;:::-;41780:23;;:7;:5;:7::i;:::-;:23;;;41772:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42318:1:::1;42281:40;;42302:6;;;;;;;;;;;42281:40;;;;;;;;;;;;42349:1;42332:6;;:19;;;;;;;;;;;;;;;;;;42211:148::o:0;41560:87::-;41606:7;41633:6;;;;;;;;;;;41626:13;;41560:87;:::o;21725:104::-;21781:13;21814:7;21807:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21725:104;:::o;23309:295::-;23424:12;:10;:12::i;:::-;23412:24;;:8;:24;;;;23404:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23524:8;23479:18;:32;23498:12;:10;:12::i;:::-;23479:32;;;;;;;;;;;;;;;:42;23512:8;23479:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23577:8;23548:48;;23563:12;:10;:12::i;:::-;23548:48;;;23587:8;23548:48;;;;;;:::i;:::-;;;;;;;;23309:295;;:::o;42875:44::-;42916:3;42875:44;:::o;24504:285::-;24636:41;24655:12;:10;:12::i;:::-;24669:7;24636:18;:41::i;:::-;24628:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24742:39;24756:4;24762:2;24766:7;24775:5;24742:13;:39::i;:::-;24504:285;;;;:::o;21900:360::-;21973:13;22007:16;22015:7;22007;:16::i;:::-;21999:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22088:21;22112:10;:8;:10::i;:::-;22088:34;;22164:1;22146:7;22140:21;:25;:112;;;;;;;;;;;;;;;;;22205:7;22214:18;:7;:16;:18::i;:::-;22188:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22140:112;22133:119;;;21900:360;;;:::o;23675:164::-;23772:4;23796:18;:25;23815:5;23796:25;;;;;;;;;;;;;;;:35;23822:8;23796:35;;;;;;;;;;;;;;;;;;;;;;;;;23789:42;;23675:164;;;;:::o;42514:244::-;41791:12;:10;:12::i;:::-;41780:23;;:7;:5;:7::i;:::-;:23;;;41772:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42623:1:::1;42603:22;;:8;:22;;;;42595:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42713:8;42684:38;;42705:6;;;;;;;;;;;42684:38;;;;;;;;;;;;42742:8;42733:6;;:17;;;;;;;;;;;;;;;;;;42514:244:::0;:::o;20624:292::-;20726:4;20765:25;20750:40;;;:11;:40;;;;:105;;;;20822:33;20807:48;;;:11;:48;;;;20750:105;:158;;;;20872:36;20896:11;20872:23;:36::i;:::-;20750:158;20743:165;;20624:292;;;:::o;26256:127::-;26321:4;26373:1;26345:30;;:7;:16;26353:7;26345:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26338:37;;26256:127;;;:::o;15934:98::-;15987:7;16014:10;16007:17;;15934:98;:::o;30133:174::-;30235:2;30208:15;:24;30224:7;30208:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30291:7;30287:2;30253:46;;30262:23;30277:7;30262:14;:23::i;:::-;30253:46;;;;;;;;;;;;30133:174;;:::o;27240:110::-;27316:26;27326:2;27330:7;27316:26;;;;;;;;;;;;:9;:26::i;:::-;27240:110;;:::o;26550:348::-;26643:4;26668:16;26676:7;26668;:16::i;:::-;26660:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26744:13;26760:23;26775:7;26760:14;:23::i;:::-;26744:39;;26813:5;26802:16;;:7;:16;;;:51;;;;26846:7;26822:31;;:20;26834:7;26822:11;:20::i;:::-;:31;;;26802:51;:87;;;;26857:32;26874:5;26881:7;26857:16;:32::i;:::-;26802:87;26794:96;;;26550:348;;;;:::o;29471:544::-;29596:4;29569:31;;:23;29584:7;29569:14;:23::i;:::-;:31;;;29561:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29679:1;29665:16;;:2;:16;;;;29657:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29735:39;29756:4;29762:2;29766:7;29735:20;:39::i;:::-;29839:29;29856:1;29860:7;29839:8;:29::i;:::-;29900:1;29881:9;:15;29891:4;29881:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29929:1;29912:9;:13;29922:2;29912:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29960:2;29941:7;:16;29949:7;29941:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29999:7;29995:2;29980:27;;29989:4;29980:27;;;;;;;;;;;;29471:544;;;:::o;25671:272::-;25785:28;25795:4;25801:2;25805:7;25785:9;:28::i;:::-;25832:48;25855:4;25861:2;25865:7;25874:5;25832:22;:48::i;:::-;25824:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25671:272;;;;:::o;42983:157::-;43043:13;43069:63;;;;;;;;;;;;;;;;;;;42983:157;:::o;16589:723::-;16645:13;16875:1;16866:5;:10;16862:53;;;16893:10;;;;;;;;;;;;;;;;;;;;;16862:53;16925:12;16940:5;16925:20;;16956:14;16981:78;16996:1;16988:4;:9;16981:78;;17014:8;;;;;:::i;:::-;;;;17045:2;17037:10;;;;;:::i;:::-;;;16981:78;;;17069:19;17101:6;17091:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17069:39;;17119:154;17135:1;17126:5;:10;17119:154;;17163:1;17153:11;;;;;:::i;:::-;;;17230:2;17222:5;:10;;;;:::i;:::-;17209:2;:24;;;;:::i;:::-;17196:39;;17179:6;17186;17179:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17259:2;17250:11;;;;;:::i;:::-;;;17119:154;;;17297:6;17283:21;;;;;16589:723;;;;:::o;19140:157::-;19225:4;19264:25;19249:40;;;:11;:40;;;;19242:47;;19140:157;;;:::o;27577:250::-;27673:18;27679:2;27683:7;27673:5;:18::i;:::-;27710:54;27741:1;27745:2;27749:7;27758:5;27710:22;:54::i;:::-;27702:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;27577:250;;;:::o;36032:555::-;36142:45;36169:4;36175:2;36179:7;36142:26;:45::i;:::-;36220:1;36204:18;;:4;:18;;;36200:187;;;36239:40;36271:7;36239:31;:40::i;:::-;36200:187;;;36309:2;36301:10;;:4;:10;;;36297:90;;36328:47;36361:4;36367:7;36328:32;:47::i;:::-;36297:90;36200:187;36415:1;36401:16;;:2;:16;;;36397:183;;;36434:45;36471:7;36434:36;:45::i;:::-;36397:183;;;36507:4;36501:10;;:2;:10;;;36497:83;;36528:40;36556:2;36560:7;36528:27;:40::i;:::-;36497:83;36397:183;36032:555;;;:::o;30872:843::-;30993:4;31019:15;:2;:13;;;:15::i;:::-;31015:693;;;31071:2;31055:36;;;31092:12;:10;:12::i;:::-;31106:4;31112:7;31121:5;31055:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31051:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31318:1;31301:6;:13;:18;31297:341;;;31344:60;;;;;;;;;;:::i;:::-;;;;;;;;31297:341;31588:6;31582:13;31573:6;31569:2;31565:15;31558:38;31051:602;31188:45;;;31178:55;;;:6;:55;;;;31171:62;;;;;31015:693;31692:4;31685:11;;30872:843;;;;;;;:::o;28163:382::-;28257:1;28243:16;;:2;:16;;;;28235:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28316:16;28324:7;28316;:16::i;:::-;28315:17;28307:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28378:45;28407:1;28411:2;28415:7;28378:20;:45::i;:::-;28453:1;28436:9;:13;28446:2;28436:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28484:2;28465:7;:16;28473:7;28465:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28529:7;28525:2;28504:33;;28521:1;28504:33;;;;;;;;;;;;28163:382;;:::o;32328:93::-;;;;:::o;37310:164::-;37414:10;:17;;;;37387:15;:24;37403:7;37387:24;;;;;;;;;;;:44;;;;37442:10;37458:7;37442:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37310:164;:::o;38101:988::-;38367:22;38417:1;38392:22;38409:4;38392:16;:22::i;:::-;:26;;;;:::i;:::-;38367:51;;38429:18;38450:17;:26;38468:7;38450:26;;;;;;;;;;;;38429:47;;38597:14;38583:10;:28;38579:328;;38628:19;38650:12;:18;38663:4;38650:18;;;;;;;;;;;;;;;:34;38669:14;38650:34;;;;;;;;;;;;38628:56;;38734:11;38701:12;:18;38714:4;38701:18;;;;;;;;;;;;;;;:30;38720:10;38701:30;;;;;;;;;;;:44;;;;38851:10;38818:17;:30;38836:11;38818:30;;;;;;;;;;;:43;;;;38579:328;;39003:17;:26;39021:7;39003:26;;;;;;;;;;;38996:33;;;39047:12;:18;39060:4;39047:18;;;;;;;;;;;;;;;:34;39066:14;39047:34;;;;;;;;;;;39040:41;;;38101:988;;;;:::o;39384:1079::-;39637:22;39682:1;39662:10;:17;;;;:21;;;;:::i;:::-;39637:46;;39694:18;39715:15;:24;39731:7;39715:24;;;;;;;;;;;;39694:45;;40066:19;40088:10;40099:14;40088:26;;;;;;;;;;;;;;;;;;;;;;;;40066:48;;40152:11;40127:10;40138;40127:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;40263:10;40232:15;:28;40248:11;40232:28;;;;;;;;;;;:41;;;;40404:15;:24;40420:7;40404:24;;;;;;;;;;;40397:31;;;40439:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39384:1079;;;;:::o;36888:221::-;36973:14;36990:20;37007:2;36990:16;:20::i;:::-;36973:37;;37048:7;37021:12;:16;37034:2;37021:16;;;;;;;;;;;;;;;:24;37038:6;37021:24;;;;;;;;;;;:34;;;;37095:6;37066:17;:26;37084:7;37066:26;;;;;;;;;;;:35;;;;36888:221;;;:::o;8055:422::-;8115:4;8323:12;8434:7;8422:20;8414:28;;8468:1;8461:4;:8;8454:15;;;8055:422;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:139::-;;439:6;426:20;417:29;;455:33;482:5;455:33;:::i;:::-;407:87;;;;:::o;500:133::-;;581:6;568:20;559:29;;597:30;621:5;597:30;:::i;:::-;549:84;;;;:::o;639:137::-;;722:6;709:20;700:29;;738:32;764:5;738:32;:::i;:::-;690:86;;;;:::o;782:141::-;;869:6;863:13;854:22;;885:32;911:5;885:32;:::i;:::-;844:79;;;;:::o;942:271::-;;1046:3;1039:4;1031:6;1027:17;1023:27;1013:2;;1064:1;1061;1054:12;1013:2;1104:6;1091:20;1129:78;1203:3;1195:6;1188:4;1180:6;1176:17;1129:78;:::i;:::-;1120:87;;1003:210;;;;;:::o;1219:139::-;;1303:6;1290:20;1281:29;;1319:33;1346:5;1319:33;:::i;:::-;1271:87;;;;:::o;1364:262::-;;1472:2;1460:9;1451:7;1447:23;1443:32;1440:2;;;1488:1;1485;1478:12;1440:2;1531:1;1556:53;1601:7;1592:6;1581:9;1577:22;1556:53;:::i;:::-;1546:63;;1502:117;1430:196;;;;:::o;1632:407::-;;;1757:2;1745:9;1736:7;1732:23;1728:32;1725:2;;;1773:1;1770;1763:12;1725:2;1816:1;1841:53;1886:7;1877:6;1866:9;1862:22;1841:53;:::i;:::-;1831:63;;1787:117;1943:2;1969:53;2014:7;2005:6;1994:9;1990:22;1969:53;:::i;:::-;1959:63;;1914:118;1715:324;;;;;:::o;2045:552::-;;;;2187:2;2175:9;2166:7;2162:23;2158:32;2155:2;;;2203:1;2200;2193:12;2155:2;2246:1;2271:53;2316:7;2307:6;2296:9;2292:22;2271:53;:::i;:::-;2261:63;;2217:117;2373:2;2399:53;2444:7;2435:6;2424:9;2420:22;2399:53;:::i;:::-;2389:63;;2344:118;2501:2;2527:53;2572:7;2563:6;2552:9;2548:22;2527:53;:::i;:::-;2517:63;;2472:118;2145:452;;;;;:::o;2603:809::-;;;;;2771:3;2759:9;2750:7;2746:23;2742:33;2739:2;;;2788:1;2785;2778:12;2739:2;2831:1;2856:53;2901:7;2892:6;2881:9;2877:22;2856:53;:::i;:::-;2846:63;;2802:117;2958:2;2984:53;3029:7;3020:6;3009:9;3005:22;2984:53;:::i;:::-;2974:63;;2929:118;3086:2;3112:53;3157:7;3148:6;3137:9;3133:22;3112:53;:::i;:::-;3102:63;;3057:118;3242:2;3231:9;3227:18;3214:32;3273:18;3265:6;3262:30;3259:2;;;3305:1;3302;3295:12;3259:2;3333:62;3387:7;3378:6;3367:9;3363:22;3333:62;:::i;:::-;3323:72;;3185:220;2729:683;;;;;;;:::o;3418:401::-;;;3540:2;3528:9;3519:7;3515:23;3511:32;3508:2;;;3556:1;3553;3546:12;3508:2;3599:1;3624:53;3669:7;3660:6;3649:9;3645:22;3624:53;:::i;:::-;3614:63;;3570:117;3726:2;3752:50;3794:7;3785:6;3774:9;3770:22;3752:50;:::i;:::-;3742:60;;3697:115;3498:321;;;;;:::o;3825:407::-;;;3950:2;3938:9;3929:7;3925:23;3921:32;3918:2;;;3966:1;3963;3956:12;3918:2;4009:1;4034:53;4079:7;4070:6;4059:9;4055:22;4034:53;:::i;:::-;4024:63;;3980:117;4136:2;4162:53;4207:7;4198:6;4187:9;4183:22;4162:53;:::i;:::-;4152:63;;4107:118;3908:324;;;;;:::o;4238:260::-;;4345:2;4333:9;4324:7;4320:23;4316:32;4313:2;;;4361:1;4358;4351:12;4313:2;4404:1;4429:52;4473:7;4464:6;4453:9;4449:22;4429:52;:::i;:::-;4419:62;;4375:116;4303:195;;;;:::o;4504:282::-;;4622:2;4610:9;4601:7;4597:23;4593:32;4590:2;;;4638:1;4635;4628:12;4590:2;4681:1;4706:63;4761:7;4752:6;4741:9;4737:22;4706:63;:::i;:::-;4696:73;;4652:127;4580:206;;;;:::o;4792:262::-;;4900:2;4888:9;4879:7;4875:23;4871:32;4868:2;;;4916:1;4913;4906:12;4868:2;4959:1;4984:53;5029:7;5020:6;5009:9;5005:22;4984:53;:::i;:::-;4974:63;;4930:117;4858:196;;;;:::o;5060:118::-;5147:24;5165:5;5147:24;:::i;:::-;5142:3;5135:37;5125:53;;:::o;5184:109::-;5265:21;5280:5;5265:21;:::i;:::-;5260:3;5253:34;5243:50;;:::o;5299:360::-;;5413:38;5445:5;5413:38;:::i;:::-;5467:70;5530:6;5525:3;5467:70;:::i;:::-;5460:77;;5546:52;5591:6;5586:3;5579:4;5572:5;5568:16;5546:52;:::i;:::-;5623:29;5645:6;5623:29;:::i;:::-;5618:3;5614:39;5607:46;;5389:270;;;;;:::o;5665:364::-;;5781:39;5814:5;5781:39;:::i;:::-;5836:71;5900:6;5895:3;5836:71;:::i;:::-;5829:78;;5916:52;5961:6;5956:3;5949:4;5942:5;5938:16;5916:52;:::i;:::-;5993:29;6015:6;5993:29;:::i;:::-;5988:3;5984:39;5977:46;;5757:272;;;;;:::o;6035:377::-;;6169:39;6202:5;6169:39;:::i;:::-;6224:89;6306:6;6301:3;6224:89;:::i;:::-;6217:96;;6322:52;6367:6;6362:3;6355:4;6348:5;6344:16;6322:52;:::i;:::-;6399:6;6394:3;6390:16;6383:23;;6145:267;;;;;:::o;6418:375::-;;6581:67;6645:2;6640:3;6581:67;:::i;:::-;6574:74;;6678:34;6674:1;6669:3;6665:11;6658:55;6744:13;6739:2;6734:3;6730:12;6723:35;6784:2;6779:3;6775:12;6768:19;;6564:229;;;:::o;6799:382::-;;6962:67;7026:2;7021:3;6962:67;:::i;:::-;6955:74;;7059:34;7055:1;7050:3;7046:11;7039:55;7125:20;7120:2;7115:3;7111:12;7104:42;7172:2;7167:3;7163:12;7156:19;;6945:236;;;:::o;7187:370::-;;7350:67;7414:2;7409:3;7350:67;:::i;:::-;7343:74;;7447:34;7443:1;7438:3;7434:11;7427:55;7513:8;7508:2;7503:3;7499:12;7492:30;7548:2;7543:3;7539:12;7532:19;;7333:224;;;:::o;7563:326::-;;7726:67;7790:2;7785:3;7726:67;:::i;:::-;7719:74;;7823:30;7819:1;7814:3;7810:11;7803:51;7880:2;7875:3;7871:12;7864:19;;7709:180;;;:::o;7895:368::-;;8058:67;8122:2;8117:3;8058:67;:::i;:::-;8051:74;;8155:34;8151:1;8146:3;8142:11;8135:55;8221:6;8216:2;8211:3;8207:12;8200:28;8254:2;8249:3;8245:12;8238:19;;8041:222;;;:::o;8269:323::-;;8432:67;8496:2;8491:3;8432:67;:::i;:::-;8425:74;;8529:27;8525:1;8520:3;8516:11;8509:48;8583:2;8578:3;8574:12;8567:19;;8415:177;;;:::o;8598:324::-;;8761:67;8825:2;8820:3;8761:67;:::i;:::-;8754:74;;8858:28;8854:1;8849:3;8845:11;8838:49;8913:2;8908:3;8904:12;8897:19;;8744:178;;;:::o;8928:376::-;;9091:67;9155:2;9150:3;9091:67;:::i;:::-;9084:74;;9188:34;9184:1;9179:3;9175:11;9168:55;9254:14;9249:2;9244:3;9240:12;9233:36;9295:2;9290:3;9286:12;9279:19;;9074:230;;;:::o;9310:436::-;;9473:67;9537:2;9532:3;9473:67;:::i;:::-;9466:74;;9570:34;9566:1;9561:3;9557:11;9550:55;9636:34;9631:2;9626:3;9622:12;9615:56;9702:8;9697:2;9692:3;9688:12;9681:30;9737:2;9732:3;9728:12;9721:19;;9456:290;;;:::o;9752:388::-;;9915:67;9979:2;9974:3;9915:67;:::i;:::-;9908:74;;10012:34;10008:1;10003:3;9999:11;9992:55;10078:26;10073:2;10068:3;10064:12;10057:48;10131:2;10126:3;10122:12;10115:19;;9898:242;;;:::o;10146:374::-;;10309:67;10373:2;10368:3;10309:67;:::i;:::-;10302:74;;10406:34;10402:1;10397:3;10393:11;10386:55;10472:12;10467:2;10462:3;10458:12;10451:34;10511:2;10506:3;10502:12;10495:19;;10292:228;;;:::o;10526:373::-;;10689:67;10753:2;10748:3;10689:67;:::i;:::-;10682:74;;10786:34;10782:1;10777:3;10773:11;10766:55;10852:11;10847:2;10842:3;10838:12;10831:33;10890:2;10885:3;10881:12;10874:19;;10672:227;;;:::o;10905:330::-;;11068:67;11132:2;11127:3;11068:67;:::i;:::-;11061:74;;11165:34;11161:1;11156:3;11152:11;11145:55;11226:2;11221:3;11217:12;11210:19;;11051:184;;;:::o;11241:376::-;;11404:67;11468:2;11463:3;11404:67;:::i;:::-;11397:74;;11501:34;11497:1;11492:3;11488:11;11481:55;11567:14;11562:2;11557:3;11553:12;11546:36;11608:2;11603:3;11599:12;11592:19;;11387:230;;;:::o;11623:330::-;;11786:67;11850:2;11845:3;11786:67;:::i;:::-;11779:74;;11883:34;11879:1;11874:3;11870:11;11863:55;11944:2;11939:3;11935:12;11928:19;;11769:184;;;:::o;11959:373::-;;12122:67;12186:2;12181:3;12122:67;:::i;:::-;12115:74;;12219:34;12215:1;12210:3;12206:11;12199:55;12285:11;12280:2;12275:3;12271:12;12264:33;12323:2;12318:3;12314:12;12307:19;;12105:227;;;:::o;12338:379::-;;12501:67;12565:2;12560:3;12501:67;:::i;:::-;12494:74;;12598:34;12594:1;12589:3;12585:11;12578:55;12664:17;12659:2;12654:3;12650:12;12643:39;12708:2;12703:3;12699:12;12692:19;;12484:233;;;:::o;12723:365::-;;12886:67;12950:2;12945:3;12886:67;:::i;:::-;12879:74;;12983:34;12979:1;12974:3;12970:11;12963:55;13049:3;13044:2;13039:3;13035:12;13028:25;13079:2;13074:3;13070:12;13063:19;;12869:219;;;:::o;13094:381::-;;13257:67;13321:2;13316:3;13257:67;:::i;:::-;13250:74;;13354:34;13350:1;13345:3;13341:11;13334:55;13420:19;13415:2;13410:3;13406:12;13399:41;13466:2;13461:3;13457:12;13450:19;;13240:235;;;:::o;13481:376::-;;13644:67;13708:2;13703:3;13644:67;:::i;:::-;13637:74;;13741:34;13737:1;13732:3;13728:11;13721:55;13807:14;13802:2;13797:3;13793:12;13786:36;13848:2;13843:3;13839:12;13832:19;;13627:230;;;:::o;13863:118::-;13950:24;13968:5;13950:24;:::i;:::-;13945:3;13938:37;13928:53;;:::o;13987:435::-;;14189:95;14280:3;14271:6;14189:95;:::i;:::-;14182:102;;14301:95;14392:3;14383:6;14301:95;:::i;:::-;14294:102;;14413:3;14406:10;;14171:251;;;;;:::o;14428:222::-;;14559:2;14548:9;14544:18;14536:26;;14572:71;14640:1;14629:9;14625:17;14616:6;14572:71;:::i;:::-;14526:124;;;;:::o;14656:640::-;;14889:3;14878:9;14874:19;14866:27;;14903:71;14971:1;14960:9;14956:17;14947:6;14903:71;:::i;:::-;14984:72;15052:2;15041:9;15037:18;15028:6;14984:72;:::i;:::-;15066;15134:2;15123:9;15119:18;15110:6;15066:72;:::i;:::-;15185:9;15179:4;15175:20;15170:2;15159:9;15155:18;15148:48;15213:76;15284:4;15275:6;15213:76;:::i;:::-;15205:84;;14856:440;;;;;;;:::o;15302:210::-;;15427:2;15416:9;15412:18;15404:26;;15440:65;15502:1;15491:9;15487:17;15478:6;15440:65;:::i;:::-;15394:118;;;;:::o;15518:313::-;;15669:2;15658:9;15654:18;15646:26;;15718:9;15712:4;15708:20;15704:1;15693:9;15689:17;15682:47;15746:78;15819:4;15810:6;15746:78;:::i;:::-;15738:86;;15636:195;;;;:::o;15837:419::-;;16041:2;16030:9;16026:18;16018:26;;16090:9;16084:4;16080:20;16076:1;16065:9;16061:17;16054:47;16118:131;16244:4;16118:131;:::i;:::-;16110:139;;16008:248;;;:::o;16262:419::-;;16466:2;16455:9;16451:18;16443:26;;16515:9;16509:4;16505:20;16501:1;16490:9;16486:17;16479:47;16543:131;16669:4;16543:131;:::i;:::-;16535:139;;16433:248;;;:::o;16687:419::-;;16891:2;16880:9;16876:18;16868:26;;16940:9;16934:4;16930:20;16926:1;16915:9;16911:17;16904:47;16968:131;17094:4;16968:131;:::i;:::-;16960:139;;16858:248;;;:::o;17112:419::-;;17316:2;17305:9;17301:18;17293:26;;17365:9;17359:4;17355:20;17351:1;17340:9;17336:17;17329:47;17393:131;17519:4;17393:131;:::i;:::-;17385:139;;17283:248;;;:::o;17537:419::-;;17741:2;17730:9;17726:18;17718:26;;17790:9;17784:4;17780:20;17776:1;17765:9;17761:17;17754:47;17818:131;17944:4;17818:131;:::i;:::-;17810:139;;17708:248;;;:::o;17962:419::-;;18166:2;18155:9;18151:18;18143:26;;18215:9;18209:4;18205:20;18201:1;18190:9;18186:17;18179:47;18243:131;18369:4;18243:131;:::i;:::-;18235:139;;18133:248;;;:::o;18387:419::-;;18591:2;18580:9;18576:18;18568:26;;18640:9;18634:4;18630:20;18626:1;18615:9;18611:17;18604:47;18668:131;18794:4;18668:131;:::i;:::-;18660:139;;18558:248;;;:::o;18812:419::-;;19016:2;19005:9;19001:18;18993:26;;19065:9;19059:4;19055:20;19051:1;19040:9;19036:17;19029:47;19093:131;19219:4;19093:131;:::i;:::-;19085:139;;18983:248;;;:::o;19237:419::-;;19441:2;19430:9;19426:18;19418:26;;19490:9;19484:4;19480:20;19476:1;19465:9;19461:17;19454:47;19518:131;19644:4;19518:131;:::i;:::-;19510:139;;19408:248;;;:::o;19662:419::-;;19866:2;19855:9;19851:18;19843:26;;19915:9;19909:4;19905:20;19901:1;19890:9;19886:17;19879:47;19943:131;20069:4;19943:131;:::i;:::-;19935:139;;19833:248;;;:::o;20087:419::-;;20291:2;20280:9;20276:18;20268:26;;20340:9;20334:4;20330:20;20326:1;20315:9;20311:17;20304:47;20368:131;20494:4;20368:131;:::i;:::-;20360:139;;20258:248;;;:::o;20512:419::-;;20716:2;20705:9;20701:18;20693:26;;20765:9;20759:4;20755:20;20751:1;20740:9;20736:17;20729:47;20793:131;20919:4;20793:131;:::i;:::-;20785:139;;20683:248;;;:::o;20937:419::-;;21141:2;21130:9;21126:18;21118:26;;21190:9;21184:4;21180:20;21176:1;21165:9;21161:17;21154:47;21218:131;21344:4;21218:131;:::i;:::-;21210:139;;21108:248;;;:::o;21362:419::-;;21566:2;21555:9;21551:18;21543:26;;21615:9;21609:4;21605:20;21601:1;21590:9;21586:17;21579:47;21643:131;21769:4;21643:131;:::i;:::-;21635:139;;21533:248;;;:::o;21787:419::-;;21991:2;21980:9;21976:18;21968:26;;22040:9;22034:4;22030:20;22026:1;22015:9;22011:17;22004:47;22068:131;22194:4;22068:131;:::i;:::-;22060:139;;21958:248;;;:::o;22212:419::-;;22416:2;22405:9;22401:18;22393:26;;22465:9;22459:4;22455:20;22451:1;22440:9;22436:17;22429:47;22493:131;22619:4;22493:131;:::i;:::-;22485:139;;22383:248;;;:::o;22637:419::-;;22841:2;22830:9;22826:18;22818:26;;22890:9;22884:4;22880:20;22876:1;22865:9;22861:17;22854:47;22918:131;23044:4;22918:131;:::i;:::-;22910:139;;22808:248;;;:::o;23062:419::-;;23266:2;23255:9;23251:18;23243:26;;23315:9;23309:4;23305:20;23301:1;23290:9;23286:17;23279:47;23343:131;23469:4;23343:131;:::i;:::-;23335:139;;23233:248;;;:::o;23487:419::-;;23691:2;23680:9;23676:18;23668:26;;23740:9;23734:4;23730:20;23726:1;23715:9;23711:17;23704:47;23768:131;23894:4;23768:131;:::i;:::-;23760:139;;23658:248;;;:::o;23912:419::-;;24116:2;24105:9;24101:18;24093:26;;24165:9;24159:4;24155:20;24151:1;24140:9;24136:17;24129:47;24193:131;24319:4;24193:131;:::i;:::-;24185:139;;24083:248;;;:::o;24337:222::-;;24468:2;24457:9;24453:18;24445:26;;24481:71;24549:1;24538:9;24534:17;24525:6;24481:71;:::i;:::-;24435:124;;;;:::o;24565:283::-;;24631:2;24625:9;24615:19;;24673:4;24665:6;24661:17;24780:6;24768:10;24765:22;24744:18;24732:10;24729:34;24726:62;24723:2;;;24791:18;;:::i;:::-;24723:2;24831:10;24827:2;24820:22;24605:243;;;;:::o;24854:331::-;;25005:18;24997:6;24994:30;24991:2;;;25027:18;;:::i;:::-;24991:2;25112:4;25108:9;25101:4;25093:6;25089:17;25085:33;25077:41;;25173:4;25167;25163:15;25155:23;;24920:265;;;:::o;25191:98::-;;25276:5;25270:12;25260:22;;25249:40;;;:::o;25295:99::-;;25381:5;25375:12;25365:22;;25354:40;;;:::o;25400:168::-;;25517:6;25512:3;25505:19;25557:4;25552:3;25548:14;25533:29;;25495:73;;;;:::o;25574:169::-;;25692:6;25687:3;25680:19;25732:4;25727:3;25723:14;25708:29;;25670:73;;;;:::o;25749:148::-;;25888:3;25873:18;;25863:34;;;;:::o;25903:305::-;;25962:20;25980:1;25962:20;:::i;:::-;25957:25;;25996:20;26014:1;25996:20;:::i;:::-;25991:25;;26150:1;26082:66;26078:74;26075:1;26072:81;26069:2;;;26156:18;;:::i;:::-;26069:2;26200:1;26197;26193:9;26186:16;;25947:261;;;;:::o;26214:185::-;;26271:20;26289:1;26271:20;:::i;:::-;26266:25;;26305:20;26323:1;26305:20;:::i;:::-;26300:25;;26344:1;26334:2;;26349:18;;:::i;:::-;26334:2;26391:1;26388;26384:9;26379:14;;26256:143;;;;:::o;26405:191::-;;26465:20;26483:1;26465:20;:::i;:::-;26460:25;;26499:20;26517:1;26499:20;:::i;:::-;26494:25;;26538:1;26535;26532:8;26529:2;;;26543:18;;:::i;:::-;26529:2;26588:1;26585;26581:9;26573:17;;26450:146;;;;:::o;26602:96::-;;26668:24;26686:5;26668:24;:::i;:::-;26657:35;;26647:51;;;:::o;26704:90::-;;26781:5;26774:13;26767:21;26756:32;;26746:48;;;:::o;26800:149::-;;26876:66;26869:5;26865:78;26854:89;;26844:105;;;:::o;26955:126::-;;27032:42;27025:5;27021:54;27010:65;;27000:81;;;:::o;27087:77::-;;27153:5;27142:16;;27132:32;;;:::o;27170:154::-;27254:6;27249:3;27244;27231:30;27316:1;27307:6;27302:3;27298:16;27291:27;27221:103;;;:::o;27330:307::-;27398:1;27408:113;27422:6;27419:1;27416:13;27408:113;;;27507:1;27502:3;27498:11;27492:18;27488:1;27483:3;27479:11;27472:39;27444:2;27441:1;27437:10;27432:15;;27408:113;;;27539:6;27536:1;27533:13;27530:2;;;27619:1;27610:6;27605:3;27601:16;27594:27;27530:2;27379:258;;;;:::o;27643:320::-;;27724:1;27718:4;27714:12;27704:22;;27771:1;27765:4;27761:12;27792:18;27782:2;;27848:4;27840:6;27836:17;27826:27;;27782:2;27910;27902:6;27899:14;27879:18;27876:38;27873:2;;;27929:18;;:::i;:::-;27873:2;27694:269;;;;:::o;27969:233::-;;28031:24;28049:5;28031:24;:::i;:::-;28022:33;;28077:66;28070:5;28067:77;28064:2;;;28147:18;;:::i;:::-;28064:2;28194:1;28187:5;28183:13;28176:20;;28012:190;;;:::o;28208:176::-;;28257:20;28275:1;28257:20;:::i;:::-;28252:25;;28291:20;28309:1;28291:20;:::i;:::-;28286:25;;28330:1;28320:2;;28335:18;;:::i;:::-;28320:2;28376:1;28373;28369:9;28364:14;;28242:142;;;;:::o;28390:180::-;28438:77;28435:1;28428:88;28535:4;28532:1;28525:15;28559:4;28556:1;28549:15;28576:180;28624:77;28621:1;28614:88;28721:4;28718:1;28711:15;28745:4;28742:1;28735:15;28762:180;28810:77;28807:1;28800:88;28907:4;28904:1;28897:15;28931:4;28928:1;28921:15;28948:180;28996:77;28993:1;28986:88;29093:4;29090:1;29083:15;29117:4;29114:1;29107:15;29134:102;;29226:2;29222:7;29217:2;29210:5;29206:14;29202:28;29192:38;;29182:54;;;:::o;29242:122::-;29315:24;29333:5;29315:24;:::i;:::-;29308:5;29305:35;29295:2;;29354:1;29351;29344:12;29295:2;29285:79;:::o;29370:116::-;29440:21;29455:5;29440:21;:::i;:::-;29433:5;29430:32;29420:2;;29476:1;29473;29466:12;29420:2;29410:76;:::o;29492:120::-;29564:23;29581:5;29564:23;:::i;:::-;29557:5;29554:34;29544:2;;29602:1;29599;29592:12;29544:2;29534:78;:::o;29618:122::-;29691:24;29709:5;29691:24;:::i;:::-;29684:5;29681:35;29671:2;;29730:1;29727;29720:12;29671:2;29661:79;:::o

Swarm Source

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