ETH Price: $2,391.36 (+2.29%)

Token

EMETH (EMETH)
 

Overview

Max Total Supply

643 EMETH

Holders

333

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 EMETH
0x70eddc502cb72affcdd064edf0c8c3e731988cfe
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
EMETH

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 2000 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-11-29
*/

/**
 *Submitted for verification at Etherscan.io on 2021-11-04
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.4;

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

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


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

/**
 * @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 whiteed 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 whiteed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

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


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

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


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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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


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

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

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

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

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

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


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

/**
 * @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/[email protected]

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        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 whiteed 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.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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


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

/**
 * @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/[email protected]


/**
 * @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 whites 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/utils/math/[email protected]


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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

/**
 * @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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


contract EMETH is ERC721("EMETH", "EMETH"), ERC721Enumerable, Ownable {
    using SafeMath for uint256;
    using Strings for uint256;
    /*
     * Currently Assuming there will be one baseURI.
     * If it fails to upload all NFTs data under one baseURI,
     * we will divide baseURI and tokenURI function will be changed accordingly.
    */
    string private baseURI;
    string private blindURI;
    uint256 public constant BUY_LIMIT_PER_TX = 10;
    uint256 public constant MAX_NFT_PUBLIC = 8688;
    uint256 private constant MAX_NFT = 8888;
    uint256 public NFTPrice = 100000000000000000;  // 0.10 ETH
    bool public reveal;
    bool public isActive;
    bool public isPresaleActive;
    bytes32 public root;
    uint256 public constant WHITELIST_MAX_MINT = 5;
    mapping(address => uint256) private whiteListClaimed;
    uint256 public giveawayCount;
    /*
     * Function to reveal all NFTs
    */
    function revealNow() 
        external 
        onlyOwner 
    {
        reveal = true;
    }
    
   
   
    
    /*
     * Function setIsActive to activate/desactivate the smart contract
    */
    function setIsActive(
        bool _isActive
    ) 
        external 
        onlyOwner 
    {
        isActive = _isActive;
    }
    
    /*
     * Function setPresaleActive to activate/desactivate the presale  
    */
    function setPresaleActive(
        bool _isActive
    ) 
        external 
        onlyOwner 
    {
        isPresaleActive = _isActive;
    }
    
    /*
     * Function to set Base and Blind URI 
    */
    function setURIs(
        string memory _blindURI, 
        string memory _URI
    ) 
        external 
        onlyOwner 
    {
        blindURI = _blindURI;
        baseURI = _URI;
    }
    
    /*
     * Function to withdraw collected amount during minting by the owner
    */
    function withdraw(
        address _to
    ) 
        public 
        onlyOwner 
    {
        uint balance = address(this).balance;
        require(balance > 0, "Balance should be more then zero");
        payable(_to).transfer(balance);
    }
    
    /*
     * Function to mint new NFTs during the public sale
     * It is payable. Amount is calculated as per (NFTPrice.mul(_numOfTokens))
    */
    function mintNFT(
        uint256 _numOfTokens
    ) 
        public 
        payable 
    {
    
        require(isActive, 'Contract is not active');
        require(!isPresaleActive, 'Only whiteing from White List');
        require(_numOfTokens <= BUY_LIMIT_PER_TX, "Cannot mint above limit");
        require(totalSupply().add(_numOfTokens).sub(giveawayCount) <= MAX_NFT_PUBLIC, "Purchase would exceed max public supply of NFTs");
        require(NFTPrice.mul(_numOfTokens) == msg.value, "Ether value sent is not correct");
        
        for(uint i = 0; i < _numOfTokens; i++) {
            _safeMint(msg.sender, totalSupply().sub(giveawayCount));
        }
    }
    
    /*
     * Function to mint new NFTs during the presale
     * It is payable. Amount is calculated as per (NFTPrice.mul(_numOfTokens))
    */ 
    function mintNFTDuringPresale(
        uint256 _numOfTokens,
        bytes32[] memory _proof
    ) 
        public 
        payable
    {
        require(isActive, 'Contract is not active');
        require(isPresaleActive, 'Only whiteing from White List');
        require(verify(_proof, bytes32(uint256(uint160(msg.sender)))), "Not whitelisted");
        require(totalSupply() < MAX_NFT_PUBLIC, 'All public tokens have been minted');
        require(_numOfTokens <= WHITELIST_MAX_MINT, 'Cannot purchase this many tokens');
        require(totalSupply().add(_numOfTokens).sub(giveawayCount) <= MAX_NFT_PUBLIC, 'Purchase would exceed max public supply of NFTs');
        require(whiteListClaimed[msg.sender].add(_numOfTokens) <= WHITELIST_MAX_MINT, 'Purchase exceeds max whiteed');
        require(NFTPrice.mul(_numOfTokens) == msg.value, "Ether value sent is not correct");
        for (uint256 i = 0; i < _numOfTokens; i++) {
            
            whiteListClaimed[msg.sender] += 1;
            _safeMint(msg.sender, totalSupply().sub(giveawayCount));
        }
    }
    
    /*
     * Function to mint all NFTs for giveaway and partnerships
    */
    function mintByOwner(
        address _to, 
        uint256 _tokenId
    ) 
        public 
        onlyOwner
    {
        require(_tokenId >= MAX_NFT_PUBLIC, "Tokens number to mint must exceed number of public tokens");
        require(_tokenId < MAX_NFT, "Tokens number to mint cannot exceed number of MAX tokens");
        _safeMint(_to, _tokenId);
        giveawayCount=giveawayCount.add(1);
    }
    
    /*
     * Function to mint all NFTs for giveaway and partnerships
    */
    function mintMultipleByOwner(
        address[] memory _to, 
        uint256[] memory _tokenId
    ) 
        public 
        onlyOwner
    {
        require(_to.length == _tokenId.length, "Should have same length");
        for(uint256 i = 0; i < _to.length; i++){
            require(_tokenId[i] >= MAX_NFT_PUBLIC, "Tokens number to mint must exceed number of public tokens");
            require(_tokenId[i] < MAX_NFT, "Tokens number to mint cannot exceed number of MAX tokens");
            _safeMint(_to[i], _tokenId[i]);
            giveawayCount = giveawayCount.add(1);
        }
    }
    
    /*
     * Function to get token URI of given token ID
     * URI will be blank untill totalSupply reaches MAX_NFT_PUBLIC
    */
    function tokenURI(
        uint256 _tokenId
    ) 
        public 
        view 
        virtual 
        override 
        returns (string memory) 
    {
        require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
        if (!reveal) {
            return string(abi.encodePacked(blindURI));
        } else {
            return string(abi.encodePacked(baseURI, _tokenId.toString()));
        }
    }
    
    function supportsInterface(
        bytes4 _interfaceId
    ) 
        public
        view 
        override (ERC721, ERC721Enumerable) 
        returns (bool) 
    {
        return super.supportsInterface(_interfaceId);
    }

    // Standard functions to be overridden 
    function _beforeTokenTransfer(
        address _from, 
        address _to, 
        uint256 _tokenId
    ) 
        internal 
        override(ERC721, ERC721Enumerable) 
    {
        super._beforeTokenTransfer(_from, _to, _tokenId);
    }

    function setRoot(uint256 _root) onlyOwner() public {
        root = bytes32(_root);
    }

    function verify(bytes32[] memory proof, bytes32 leaf) public view returns (bool) {
        bytes32 computedHash = leaf;

        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = sha256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = sha256(abi.encodePacked(proofElement, computedHash));
            }
        }

        // Check if the computed hash (root) is equal to the provided root
        return computedHash == root;
    }
}

Contract Security Audit

Contract ABI

[{"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":"BUY_LIMIT_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NFT_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFTPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_MAX_MINT","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":[],"name":"giveawayCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"isPresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"mintByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[]","name":"_tokenId","type":"uint256[]"}],"name":"mintMultipleByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numOfTokens","type":"uint256"}],"name":"mintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numOfTokens","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"mintNFTDuringPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revealNow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setPresaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_root","type":"uint256"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_blindURI","type":"string"},{"internalType":"string","name":"_URI","type":"string"}],"name":"setURIs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes32","name":"leaf","type":"bytes32"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405267016345785d8a0000600d553480156200001d57600080fd5b5060408051808201825260058082526408a9a8aa8960db1b6020808401828152855180870190965292855284015281519192916200005e91600091620000ed565b50805162000074906001906020840190620000ed565b505050620000916200008b6200009760201b60201c565b6200009b565b620001d0565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620000fb9062000193565b90600052602060002090601f0160209004810192826200011f57600085556200016a565b82601f106200013a57805160ff19168380011785556200016a565b828001600101855582156200016a579182015b828111156200016a5782518255916020019190600101906200014d565b50620001789291506200017c565b5090565b5b808211156200017857600081556001016200017d565b600181811c90821680620001a857607f821691505b60208210811415620001ca57634e487b7160e01b600052602260045260246000fd5b50919050565b61342a80620001e06000396000f3fe6080604052600436106102a05760003560e01c80638da5cb5b1161016e578063c151a5f8116100cb578063e985e9c51161007f578063ebf0c71711610064578063ebf0c71714610706578063f2f5a7e51461071c578063f2fde38b1461073c57600080fd5b8063e985e9c5146106a7578063e9be0f3f146106f057600080fd5b8063d1d80f30116100b0578063d1d80f301461065c578063e748e07c14610672578063e82541741461068757600080fd5b8063c151a5f81461061c578063c87b56dd1461063c57600080fd5b8063a22cb46511610122578063a475b5dd11610107578063a475b5dd146105cd578063aeb16768146105e7578063b88d4fde146105fc57600080fd5b8063a22cb46514610597578063a38bffda146105b757600080fd5b80639264274411610153578063926427441461054f57806395d89b4114610562578063972a2a621461057757600080fd5b80638da5cb5b1461051e5780638f76696c1461053c57600080fd5b80633542aee21161021c5780635f0f45b2116101d05780636352211e116101b55780636352211e146104c957806370a08231146104e9578063715018a61461050957600080fd5b80635f0f45b21461049457806360d938dc146104a957600080fd5b806342842e0e1161020157806342842e0e146104345780634f6ccce71461045457806351cff8d91461047457600080fd5b80633542aee2146103f45780633f8121a21461041457600080fd5b806318160ddd1161027357806323b872dd1161025857806323b872dd146103945780632750fc78146103b45780632f745c59146103d457600080fd5b806318160ddd1461035657806322f3e2d41461037557600080fd5b806301ffc9a7146102a557806306fdde03146102da578063081812fc146102fc578063095ea7b314610334575b600080fd5b3480156102b157600080fd5b506102c56102c0366004612ff5565b61075c565b60405190151581526020015b60405180910390f35b3480156102e657600080fd5b506102ef61076d565b6040516102d19190613224565b34801561030857600080fd5b5061031c610317366004613084565b6107ff565b6040516001600160a01b0390911681526020016102d1565b34801561034057600080fd5b5061035461034f366004612e96565b6108aa565b005b34801561036257600080fd5b506008545b6040519081526020016102d1565b34801561038157600080fd5b50600e546102c590610100900460ff1681565b3480156103a057600080fd5b506103546103af366004612db9565b6109dc565b3480156103c057600080fd5b506103546103cf366004612fc3565b610a63565b3480156103e057600080fd5b506103676103ef366004612e96565b610af4565b34801561040057600080fd5b5061035461040f366004612e96565b610b9c565b34801561042057600080fd5b5061035461042f366004612fc3565b610d04565b34801561044057600080fd5b5061035461044f366004612db9565b610d96565b34801561046057600080fd5b5061036761046f366004613084565b610db1565b34801561048057600080fd5b5061035461048f366004612d6d565b610e63565b3480156104a057600080fd5b50610354610f41565b3480156104b557600080fd5b50600e546102c59062010000900460ff1681565b3480156104d557600080fd5b5061031c6104e4366004613084565b610faa565b3480156104f557600080fd5b50610367610504366004612d6d565b611035565b34801561051557600080fd5b506103546110cf565b34801561052a57600080fd5b50600a546001600160a01b031661031c565b61035461054a36600461309c565b611135565b61035461055d366004613084565b6114c3565b34801561056e57600080fd5b506102ef6116de565b34801561058357600080fd5b506102c5610592366004612f80565b6116ed565b3480156105a357600080fd5b506103546105b2366004612e6d565b611839565b3480156105c357600080fd5b50610367600d5481565b3480156105d957600080fd5b50600e546102c59060ff1681565b3480156105f357600080fd5b50610367600581565b34801561060857600080fd5b50610354610617366004612df4565b6118fe565b34801561062857600080fd5b50610354610637366004612ebf565b61198c565b34801561064857600080fd5b506102ef610657366004613084565b611bfb565b34801561066857600080fd5b506103676121f081565b34801561067e57600080fd5b50610367600a81565b34801561069357600080fd5b506103546106a236600461302d565b611cdb565b3480156106b357600080fd5b506102c56106c2366004612d87565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106fc57600080fd5b5061036760115481565b34801561071257600080fd5b50610367600f5481565b34801561072857600080fd5b50610354610737366004613084565b611d5c565b34801561074857600080fd5b50610354610757366004612d6d565b611dbb565b600061076782611e9d565b92915050565b60606000805461077c9061331a565b80601f01602080910402602001604051908101604052809291908181526020018280546107a89061331a565b80156107f55780601f106107ca576101008083540402835291602001916107f5565b820191906000526020600020905b8154815290600101906020018083116107d857829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661088e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006108b582610faa565b9050806001600160a01b0316836001600160a01b0316141561093f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610885565b336001600160a01b038216148061095b575061095b81336106c2565b6109cd5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610885565b6109d78383611ef3565b505050565b6109e63382611f6e565b610a585760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610885565b6109d7838383612076565b600a546001600160a01b03163314610abd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610885565b600e8054911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909216919091179055565b6000610aff83611035565b8210610b735760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610885565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610bf65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610885565b6121f0811015610c6e5760405162461bcd60e51b815260206004820152603960248201527f546f6b656e73206e756d62657220746f206d696e74206d75737420657863656560448201527f64206e756d626572206f66207075626c696320746f6b656e73000000000000006064820152608401610885565b6122b88110610ce55760405162461bcd60e51b815260206004820152603860248201527f546f6b656e73206e756d62657220746f206d696e742063616e6e6f742065786360448201527f656564206e756d626572206f66204d415820746f6b656e7300000000000000006064820152608401610885565b610cef828261225b565b601154610cfd906001612275565b6011555050565b600a546001600160a01b03163314610d5e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610885565b600e805491151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff909216919091179055565b6109d7838383604051806020016040528060008152506118fe565b6000610dbc60085490565b8210610e305760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610885565b60088281548110610e5157634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600a546001600160a01b03163314610ebd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610885565b4780610f0b5760405162461bcd60e51b815260206004820181905260248201527f42616c616e63652073686f756c64206265206d6f7265207468656e207a65726f6044820152606401610885565b6040516001600160a01b0383169082156108fc029083906000818181858888f193505050501580156109d7573d6000803e3d6000fd5b600a546001600160a01b03163314610f9b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610885565b600e805460ff19166001179055565b6000818152600260205260408120546001600160a01b0316806107675760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610885565b60006001600160a01b0382166110b35760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610885565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146111295760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610885565b6111336000612288565b565b600e54610100900460ff1661118c5760405162461bcd60e51b815260206004820152601660248201527f436f6e7472616374206973206e6f7420616374697665000000000000000000006044820152606401610885565b600e5462010000900460ff166111e45760405162461bcd60e51b815260206004820152601d60248201527f4f6e6c79207768697465696e672066726f6d205768697465204c6973740000006044820152606401610885565b6111ee81336116ed565b61123a5760405162461bcd60e51b815260206004820152600f60248201527f4e6f742077686974656c697374656400000000000000000000000000000000006044820152606401610885565b6121f061124660085490565b106112b95760405162461bcd60e51b815260206004820152602260248201527f416c6c207075626c696320746f6b656e732068617665206265656e206d696e7460448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610885565b600582111561130a5760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e736044820152606401610885565b6121f061132c6011546113268561132060085490565b90612275565b906122e7565b11156113a05760405162461bcd60e51b815260206004820152602f60248201527f507572636861736520776f756c6420657863656564206d6178207075626c696360448201527f20737570706c79206f66204e46547300000000000000000000000000000000006064820152608401610885565b336000908152601060205260409020546005906113bd9084612275565b111561140b5760405162461bcd60e51b815260206004820152601c60248201527f50757263686173652065786365656473206d61782077686974656564000000006044820152606401610885565b600d54349061141a90846122f3565b146114675760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610885565b60005b828110156109d75733600090815260106020526040812080546001929061149290849061328c565b925050819055506114b1336114ac60115461132660085490565b61225b565b806114bb81613355565b91505061146a565b600e54610100900460ff1661151a5760405162461bcd60e51b815260206004820152601660248201527f436f6e7472616374206973206e6f7420616374697665000000000000000000006044820152606401610885565b600e5462010000900460ff16156115735760405162461bcd60e51b815260206004820152601d60248201527f4f6e6c79207768697465696e672066726f6d205768697465204c6973740000006044820152606401610885565b600a8111156115c45760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74206d696e742061626f7665206c696d69740000000000000000006044820152606401610885565b6121f06115da6011546113268461132060085490565b111561164e5760405162461bcd60e51b815260206004820152602f60248201527f507572636861736520776f756c6420657863656564206d6178207075626c696360448201527f20737570706c79206f66204e46547300000000000000000000000000000000006064820152608401610885565b600d54349061165d90836122f3565b146116aa5760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610885565b60005b818110156116da576116c8336114ac60115461132660085490565b806116d281613355565b9150506116ad565b5050565b60606001805461077c9061331a565b600081815b845181101561182d57600085828151811061171d57634e487b7160e01b600052603260045260246000fd5b602002602001015190508083116117a657604080516020810185905290810182905260029060600160408051601f198184030181529082905261175f9161319b565b602060405180830381855afa15801561177c573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061179f9190612fdd565b925061181a565b604080516020810183905290810184905260029060600160408051601f19818403018152908290526117d79161319b565b602060405180830381855afa1580156117f4573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906118179190612fdd565b92505b508061182581613355565b9150506116f2565b50600f54149392505050565b6001600160a01b0382163314156118925760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610885565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6119083383611f6e565b61197a5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610885565b611986848484846122ff565b50505050565b600a546001600160a01b031633146119e65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610885565b8051825114611a375760405162461bcd60e51b815260206004820152601760248201527f53686f756c6420686176652073616d65206c656e6774680000000000000000006044820152606401610885565b60005b82518110156109d7576121f0828281518110611a6657634e487b7160e01b600052603260045260246000fd5b60200260200101511015611ae25760405162461bcd60e51b815260206004820152603960248201527f546f6b656e73206e756d62657220746f206d696e74206d75737420657863656560448201527f64206e756d626572206f66207075626c696320746f6b656e73000000000000006064820152608401610885565b6122b8828281518110611b0557634e487b7160e01b600052603260045260246000fd5b602002602001015110611b805760405162461bcd60e51b815260206004820152603860248201527f546f6b656e73206e756d62657220746f206d696e742063616e6e6f742065786360448201527f656564206e756d626572206f66204d415820746f6b656e7300000000000000006064820152608401610885565b611bd8838281518110611ba357634e487b7160e01b600052603260045260246000fd5b6020026020010151838381518110611bcb57634e487b7160e01b600052603260045260246000fd5b602002602001015161225b565b601154611be6906001612275565b60115580611bf381613355565b915050611a3a565b6000818152600260205260409020546060906001600160a01b0316611c885760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610885565b600e5460ff16611cba57600c604051602001611ca491906131b7565b6040516020818303038152906040529050919050565b600b611cc583612388565b604051602001611ca49291906131c3565b919050565b600a546001600160a01b03163314611d355760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610885565b8151611d4890600c906020850190612bc7565b5080516109d790600b906020840190612bc7565b600a546001600160a01b03163314611db65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610885565b600f55565b600a546001600160a01b03163314611e155760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610885565b6001600160a01b038116611e915760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610885565b611e9a81612288565b50565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806107675750610767826124d6565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384169081179091558190611f3582610faa565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611ff85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610885565b600061200383610faa565b9050806001600160a01b0316846001600160a01b0316148061203e5750836001600160a01b0316612033846107ff565b6001600160a01b0316145b8061206e57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661208982610faa565b6001600160a01b0316146121055760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610885565b6001600160a01b0382166121805760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610885565b61218b8383836125b9565b612196600082611ef3565b6001600160a01b03831660009081526003602052604081208054600192906121bf9084906132d7565b90915550506001600160a01b03821660009081526003602052604081208054600192906121ed90849061328c565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6116da8282604051806020016040528060008152506125c4565b6000612281828461328c565b9392505050565b600a80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061228182846132d7565b600061228182846132b8565b61230a848484612076565b6123168484848461264d565b6119865760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610885565b6060816123c857505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156123f257806123dc81613355565b91506123eb9050600a836132a4565b91506123cc565b60008167ffffffffffffffff81111561241b57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612445576020820181803683370190505b5090505b841561206e5761245a6001836132d7565b9150612467600a86613370565b61247290603061328c565b60f81b81838151811061249557634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506124cf600a866132a4565b9450612449565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061256957507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061076757507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610767565b6109d78383836127fa565b6125ce83836128b2565b6125db600084848461264d565b6109d75760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610885565b60006001600160a01b0384163b156127ef576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a02906126aa9033908990889088906004016131e8565b602060405180830381600087803b1580156126c457600080fd5b505af19250505080156126f4575060408051601f3d908101601f191682019092526126f191810190613011565b60015b6127a4573d808015612722576040519150601f19603f3d011682016040523d82523d6000602084013e612727565b606091505b50805161279c5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610885565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a020000000000000000000000000000000000000000000000000000000014905061206e565b506001949350505050565b6001600160a01b0383166128555761285081600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612878565b816001600160a01b0316836001600160a01b031614612878576128788382612a0d565b6001600160a01b03821661288f576109d781612aaa565b826001600160a01b0316826001600160a01b0316146109d7576109d78282612b83565b6001600160a01b0382166129085760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610885565b6000818152600260205260409020546001600160a01b03161561296d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610885565b612979600083836125b9565b6001600160a01b03821660009081526003602052604081208054600192906129a290849061328c565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001612a1a84611035565b612a2491906132d7565b600083815260076020526040902054909150808214612a77576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612abc906001906132d7565b60008381526009602052604081205460088054939450909284908110612af257634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110612b2157634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612b6757634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612b8e83611035565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054612bd39061331a565b90600052602060002090601f016020900481019282612bf55760008555612c3b565b82601f10612c0e57805160ff1916838001178555612c3b565b82800160010185558215612c3b579182015b82811115612c3b578251825591602001919060010190612c20565b50612c47929150612c4b565b5090565b5b80821115612c475760008155600101612c4c565b600067ffffffffffffffff831115612c7a57612c7a6133b0565b612c8d6020601f19601f86011601613237565b9050828152838383011115612ca157600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114611cd657600080fd5b600082601f830112612cdf578081fd5b81356020612cf4612cef83613268565b613237565b80838252828201915082860187848660051b8901011115612d13578586fd5b855b85811015612d3157813584529284019290840190600101612d15565b5090979650505050505050565b80358015158114611cd657600080fd5b600082601f830112612d5e578081fd5b61228183833560208501612c60565b600060208284031215612d7e578081fd5b61228182612cb8565b60008060408385031215612d99578081fd5b612da283612cb8565b9150612db060208401612cb8565b90509250929050565b600080600060608486031215612dcd578081fd5b612dd684612cb8565b9250612de460208501612cb8565b9150604084013590509250925092565b60008060008060808587031215612e09578081fd5b612e1285612cb8565b9350612e2060208601612cb8565b925060408501359150606085013567ffffffffffffffff811115612e42578182fd5b8501601f81018713612e52578182fd5b612e6187823560208401612c60565b91505092959194509250565b60008060408385031215612e7f578182fd5b612e8883612cb8565b9150612db060208401612d3e565b60008060408385031215612ea8578182fd5b612eb183612cb8565b946020939093013593505050565b60008060408385031215612ed1578182fd5b823567ffffffffffffffff80821115612ee8578384fd5b818501915085601f830112612efb578384fd5b81356020612f0b612cef83613268565b8083825282820191508286018a848660051b8901011115612f2a578889fd5b8896505b84871015612f5357612f3f81612cb8565b835260019690960195918301918301612f2e565b5096505086013592505080821115612f69578283fd5b50612f7685828601612ccf565b9150509250929050565b60008060408385031215612f92578182fd5b823567ffffffffffffffff811115612fa8578283fd5b612fb485828601612ccf565b95602094909401359450505050565b600060208284031215612fd4578081fd5b61228182612d3e565b600060208284031215612fee578081fd5b5051919050565b600060208284031215613006578081fd5b8135612281816133c6565b600060208284031215613022578081fd5b8151612281816133c6565b6000806040838503121561303f578182fd5b823567ffffffffffffffff80821115613056578384fd5b61306286838701612d4e565b93506020850135915080821115613077578283fd5b50612f7685828601612d4e565b600060208284031215613095578081fd5b5035919050565b600080604083850312156130ae578182fd5b82359150602083013567ffffffffffffffff8111156130cb578182fd5b612f7685828601612ccf565b600081518084526130ef8160208601602086016132ee565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061311d57607f831692505b602080841082141561313d57634e487b7160e01b86526022600452602486fd5b81801561315157600181146131625761318f565b60ff1986168952848901965061318f565b60008881526020902060005b868110156131875781548b82015290850190830161316e565b505084890196505b50505050505092915050565b600082516131ad8184602087016132ee565b9190910192915050565b60006122818284613103565b60006131cf8285613103565b83516131df8183602088016132ee565b01949350505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261321a60808301846130d7565b9695505050505050565b60208152600061228160208301846130d7565b604051601f8201601f1916810167ffffffffffffffff81118282101715613260576132606133b0565b604052919050565b600067ffffffffffffffff821115613282576132826133b0565b5060051b60200190565b6000821982111561329f5761329f613384565b500190565b6000826132b3576132b361339a565b500490565b60008160001904831182151516156132d2576132d2613384565b500290565b6000828210156132e9576132e9613384565b500390565b60005b838110156133095781810151838201526020016132f1565b838111156119865750506000910152565b600181811c9082168061332e57607f821691505b6020821081141561334f57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561336957613369613384565b5060010190565b60008261337f5761337f61339a565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611e9a57600080fdfea264697066735822122015ecd3bc36b39fcf7b94999b0d607259f26cde9ff95acf9ebac2bb95f49984f664736f6c63430008040033

Deployed Bytecode

0x6080604052600436106102a05760003560e01c80638da5cb5b1161016e578063c151a5f8116100cb578063e985e9c51161007f578063ebf0c71711610064578063ebf0c71714610706578063f2f5a7e51461071c578063f2fde38b1461073c57600080fd5b8063e985e9c5146106a7578063e9be0f3f146106f057600080fd5b8063d1d80f30116100b0578063d1d80f301461065c578063e748e07c14610672578063e82541741461068757600080fd5b8063c151a5f81461061c578063c87b56dd1461063c57600080fd5b8063a22cb46511610122578063a475b5dd11610107578063a475b5dd146105cd578063aeb16768146105e7578063b88d4fde146105fc57600080fd5b8063a22cb46514610597578063a38bffda146105b757600080fd5b80639264274411610153578063926427441461054f57806395d89b4114610562578063972a2a621461057757600080fd5b80638da5cb5b1461051e5780638f76696c1461053c57600080fd5b80633542aee21161021c5780635f0f45b2116101d05780636352211e116101b55780636352211e146104c957806370a08231146104e9578063715018a61461050957600080fd5b80635f0f45b21461049457806360d938dc146104a957600080fd5b806342842e0e1161020157806342842e0e146104345780634f6ccce71461045457806351cff8d91461047457600080fd5b80633542aee2146103f45780633f8121a21461041457600080fd5b806318160ddd1161027357806323b872dd1161025857806323b872dd146103945780632750fc78146103b45780632f745c59146103d457600080fd5b806318160ddd1461035657806322f3e2d41461037557600080fd5b806301ffc9a7146102a557806306fdde03146102da578063081812fc146102fc578063095ea7b314610334575b600080fd5b3480156102b157600080fd5b506102c56102c0366004612ff5565b61075c565b60405190151581526020015b60405180910390f35b3480156102e657600080fd5b506102ef61076d565b6040516102d19190613224565b34801561030857600080fd5b5061031c610317366004613084565b6107ff565b6040516001600160a01b0390911681526020016102d1565b34801561034057600080fd5b5061035461034f366004612e96565b6108aa565b005b34801561036257600080fd5b506008545b6040519081526020016102d1565b34801561038157600080fd5b50600e546102c590610100900460ff1681565b3480156103a057600080fd5b506103546103af366004612db9565b6109dc565b3480156103c057600080fd5b506103546103cf366004612fc3565b610a63565b3480156103e057600080fd5b506103676103ef366004612e96565b610af4565b34801561040057600080fd5b5061035461040f366004612e96565b610b9c565b34801561042057600080fd5b5061035461042f366004612fc3565b610d04565b34801561044057600080fd5b5061035461044f366004612db9565b610d96565b34801561046057600080fd5b5061036761046f366004613084565b610db1565b34801561048057600080fd5b5061035461048f366004612d6d565b610e63565b3480156104a057600080fd5b50610354610f41565b3480156104b557600080fd5b50600e546102c59062010000900460ff1681565b3480156104d557600080fd5b5061031c6104e4366004613084565b610faa565b3480156104f557600080fd5b50610367610504366004612d6d565b611035565b34801561051557600080fd5b506103546110cf565b34801561052a57600080fd5b50600a546001600160a01b031661031c565b61035461054a36600461309c565b611135565b61035461055d366004613084565b6114c3565b34801561056e57600080fd5b506102ef6116de565b34801561058357600080fd5b506102c5610592366004612f80565b6116ed565b3480156105a357600080fd5b506103546105b2366004612e6d565b611839565b3480156105c357600080fd5b50610367600d5481565b3480156105d957600080fd5b50600e546102c59060ff1681565b3480156105f357600080fd5b50610367600581565b34801561060857600080fd5b50610354610617366004612df4565b6118fe565b34801561062857600080fd5b50610354610637366004612ebf565b61198c565b34801561064857600080fd5b506102ef610657366004613084565b611bfb565b34801561066857600080fd5b506103676121f081565b34801561067e57600080fd5b50610367600a81565b34801561069357600080fd5b506103546106a236600461302d565b611cdb565b3480156106b357600080fd5b506102c56106c2366004612d87565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106fc57600080fd5b5061036760115481565b34801561071257600080fd5b50610367600f5481565b34801561072857600080fd5b50610354610737366004613084565b611d5c565b34801561074857600080fd5b50610354610757366004612d6d565b611dbb565b600061076782611e9d565b92915050565b60606000805461077c9061331a565b80601f01602080910402602001604051908101604052809291908181526020018280546107a89061331a565b80156107f55780601f106107ca576101008083540402835291602001916107f5565b820191906000526020600020905b8154815290600101906020018083116107d857829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661088e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006108b582610faa565b9050806001600160a01b0316836001600160a01b0316141561093f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610885565b336001600160a01b038216148061095b575061095b81336106c2565b6109cd5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610885565b6109d78383611ef3565b505050565b6109e63382611f6e565b610a585760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610885565b6109d7838383612076565b600a546001600160a01b03163314610abd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610885565b600e8054911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909216919091179055565b6000610aff83611035565b8210610b735760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610885565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610bf65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610885565b6121f0811015610c6e5760405162461bcd60e51b815260206004820152603960248201527f546f6b656e73206e756d62657220746f206d696e74206d75737420657863656560448201527f64206e756d626572206f66207075626c696320746f6b656e73000000000000006064820152608401610885565b6122b88110610ce55760405162461bcd60e51b815260206004820152603860248201527f546f6b656e73206e756d62657220746f206d696e742063616e6e6f742065786360448201527f656564206e756d626572206f66204d415820746f6b656e7300000000000000006064820152608401610885565b610cef828261225b565b601154610cfd906001612275565b6011555050565b600a546001600160a01b03163314610d5e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610885565b600e805491151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff909216919091179055565b6109d7838383604051806020016040528060008152506118fe565b6000610dbc60085490565b8210610e305760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610885565b60088281548110610e5157634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600a546001600160a01b03163314610ebd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610885565b4780610f0b5760405162461bcd60e51b815260206004820181905260248201527f42616c616e63652073686f756c64206265206d6f7265207468656e207a65726f6044820152606401610885565b6040516001600160a01b0383169082156108fc029083906000818181858888f193505050501580156109d7573d6000803e3d6000fd5b600a546001600160a01b03163314610f9b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610885565b600e805460ff19166001179055565b6000818152600260205260408120546001600160a01b0316806107675760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610885565b60006001600160a01b0382166110b35760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610885565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146111295760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610885565b6111336000612288565b565b600e54610100900460ff1661118c5760405162461bcd60e51b815260206004820152601660248201527f436f6e7472616374206973206e6f7420616374697665000000000000000000006044820152606401610885565b600e5462010000900460ff166111e45760405162461bcd60e51b815260206004820152601d60248201527f4f6e6c79207768697465696e672066726f6d205768697465204c6973740000006044820152606401610885565b6111ee81336116ed565b61123a5760405162461bcd60e51b815260206004820152600f60248201527f4e6f742077686974656c697374656400000000000000000000000000000000006044820152606401610885565b6121f061124660085490565b106112b95760405162461bcd60e51b815260206004820152602260248201527f416c6c207075626c696320746f6b656e732068617665206265656e206d696e7460448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610885565b600582111561130a5760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e736044820152606401610885565b6121f061132c6011546113268561132060085490565b90612275565b906122e7565b11156113a05760405162461bcd60e51b815260206004820152602f60248201527f507572636861736520776f756c6420657863656564206d6178207075626c696360448201527f20737570706c79206f66204e46547300000000000000000000000000000000006064820152608401610885565b336000908152601060205260409020546005906113bd9084612275565b111561140b5760405162461bcd60e51b815260206004820152601c60248201527f50757263686173652065786365656473206d61782077686974656564000000006044820152606401610885565b600d54349061141a90846122f3565b146114675760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610885565b60005b828110156109d75733600090815260106020526040812080546001929061149290849061328c565b925050819055506114b1336114ac60115461132660085490565b61225b565b806114bb81613355565b91505061146a565b600e54610100900460ff1661151a5760405162461bcd60e51b815260206004820152601660248201527f436f6e7472616374206973206e6f7420616374697665000000000000000000006044820152606401610885565b600e5462010000900460ff16156115735760405162461bcd60e51b815260206004820152601d60248201527f4f6e6c79207768697465696e672066726f6d205768697465204c6973740000006044820152606401610885565b600a8111156115c45760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74206d696e742061626f7665206c696d69740000000000000000006044820152606401610885565b6121f06115da6011546113268461132060085490565b111561164e5760405162461bcd60e51b815260206004820152602f60248201527f507572636861736520776f756c6420657863656564206d6178207075626c696360448201527f20737570706c79206f66204e46547300000000000000000000000000000000006064820152608401610885565b600d54349061165d90836122f3565b146116aa5760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610885565b60005b818110156116da576116c8336114ac60115461132660085490565b806116d281613355565b9150506116ad565b5050565b60606001805461077c9061331a565b600081815b845181101561182d57600085828151811061171d57634e487b7160e01b600052603260045260246000fd5b602002602001015190508083116117a657604080516020810185905290810182905260029060600160408051601f198184030181529082905261175f9161319b565b602060405180830381855afa15801561177c573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061179f9190612fdd565b925061181a565b604080516020810183905290810184905260029060600160408051601f19818403018152908290526117d79161319b565b602060405180830381855afa1580156117f4573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906118179190612fdd565b92505b508061182581613355565b9150506116f2565b50600f54149392505050565b6001600160a01b0382163314156118925760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610885565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6119083383611f6e565b61197a5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610885565b611986848484846122ff565b50505050565b600a546001600160a01b031633146119e65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610885565b8051825114611a375760405162461bcd60e51b815260206004820152601760248201527f53686f756c6420686176652073616d65206c656e6774680000000000000000006044820152606401610885565b60005b82518110156109d7576121f0828281518110611a6657634e487b7160e01b600052603260045260246000fd5b60200260200101511015611ae25760405162461bcd60e51b815260206004820152603960248201527f546f6b656e73206e756d62657220746f206d696e74206d75737420657863656560448201527f64206e756d626572206f66207075626c696320746f6b656e73000000000000006064820152608401610885565b6122b8828281518110611b0557634e487b7160e01b600052603260045260246000fd5b602002602001015110611b805760405162461bcd60e51b815260206004820152603860248201527f546f6b656e73206e756d62657220746f206d696e742063616e6e6f742065786360448201527f656564206e756d626572206f66204d415820746f6b656e7300000000000000006064820152608401610885565b611bd8838281518110611ba357634e487b7160e01b600052603260045260246000fd5b6020026020010151838381518110611bcb57634e487b7160e01b600052603260045260246000fd5b602002602001015161225b565b601154611be6906001612275565b60115580611bf381613355565b915050611a3a565b6000818152600260205260409020546060906001600160a01b0316611c885760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610885565b600e5460ff16611cba57600c604051602001611ca491906131b7565b6040516020818303038152906040529050919050565b600b611cc583612388565b604051602001611ca49291906131c3565b919050565b600a546001600160a01b03163314611d355760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610885565b8151611d4890600c906020850190612bc7565b5080516109d790600b906020840190612bc7565b600a546001600160a01b03163314611db65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610885565b600f55565b600a546001600160a01b03163314611e155760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610885565b6001600160a01b038116611e915760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610885565b611e9a81612288565b50565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806107675750610767826124d6565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384169081179091558190611f3582610faa565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611ff85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610885565b600061200383610faa565b9050806001600160a01b0316846001600160a01b0316148061203e5750836001600160a01b0316612033846107ff565b6001600160a01b0316145b8061206e57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661208982610faa565b6001600160a01b0316146121055760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610885565b6001600160a01b0382166121805760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610885565b61218b8383836125b9565b612196600082611ef3565b6001600160a01b03831660009081526003602052604081208054600192906121bf9084906132d7565b90915550506001600160a01b03821660009081526003602052604081208054600192906121ed90849061328c565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6116da8282604051806020016040528060008152506125c4565b6000612281828461328c565b9392505050565b600a80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061228182846132d7565b600061228182846132b8565b61230a848484612076565b6123168484848461264d565b6119865760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610885565b6060816123c857505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156123f257806123dc81613355565b91506123eb9050600a836132a4565b91506123cc565b60008167ffffffffffffffff81111561241b57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612445576020820181803683370190505b5090505b841561206e5761245a6001836132d7565b9150612467600a86613370565b61247290603061328c565b60f81b81838151811061249557634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506124cf600a866132a4565b9450612449565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061256957507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061076757507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610767565b6109d78383836127fa565b6125ce83836128b2565b6125db600084848461264d565b6109d75760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610885565b60006001600160a01b0384163b156127ef576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a02906126aa9033908990889088906004016131e8565b602060405180830381600087803b1580156126c457600080fd5b505af19250505080156126f4575060408051601f3d908101601f191682019092526126f191810190613011565b60015b6127a4573d808015612722576040519150601f19603f3d011682016040523d82523d6000602084013e612727565b606091505b50805161279c5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610885565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a020000000000000000000000000000000000000000000000000000000014905061206e565b506001949350505050565b6001600160a01b0383166128555761285081600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612878565b816001600160a01b0316836001600160a01b031614612878576128788382612a0d565b6001600160a01b03821661288f576109d781612aaa565b826001600160a01b0316826001600160a01b0316146109d7576109d78282612b83565b6001600160a01b0382166129085760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610885565b6000818152600260205260409020546001600160a01b03161561296d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610885565b612979600083836125b9565b6001600160a01b03821660009081526003602052604081208054600192906129a290849061328c565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001612a1a84611035565b612a2491906132d7565b600083815260076020526040902054909150808214612a77576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612abc906001906132d7565b60008381526009602052604081205460088054939450909284908110612af257634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110612b2157634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612b6757634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612b8e83611035565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054612bd39061331a565b90600052602060002090601f016020900481019282612bf55760008555612c3b565b82601f10612c0e57805160ff1916838001178555612c3b565b82800160010185558215612c3b579182015b82811115612c3b578251825591602001919060010190612c20565b50612c47929150612c4b565b5090565b5b80821115612c475760008155600101612c4c565b600067ffffffffffffffff831115612c7a57612c7a6133b0565b612c8d6020601f19601f86011601613237565b9050828152838383011115612ca157600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114611cd657600080fd5b600082601f830112612cdf578081fd5b81356020612cf4612cef83613268565b613237565b80838252828201915082860187848660051b8901011115612d13578586fd5b855b85811015612d3157813584529284019290840190600101612d15565b5090979650505050505050565b80358015158114611cd657600080fd5b600082601f830112612d5e578081fd5b61228183833560208501612c60565b600060208284031215612d7e578081fd5b61228182612cb8565b60008060408385031215612d99578081fd5b612da283612cb8565b9150612db060208401612cb8565b90509250929050565b600080600060608486031215612dcd578081fd5b612dd684612cb8565b9250612de460208501612cb8565b9150604084013590509250925092565b60008060008060808587031215612e09578081fd5b612e1285612cb8565b9350612e2060208601612cb8565b925060408501359150606085013567ffffffffffffffff811115612e42578182fd5b8501601f81018713612e52578182fd5b612e6187823560208401612c60565b91505092959194509250565b60008060408385031215612e7f578182fd5b612e8883612cb8565b9150612db060208401612d3e565b60008060408385031215612ea8578182fd5b612eb183612cb8565b946020939093013593505050565b60008060408385031215612ed1578182fd5b823567ffffffffffffffff80821115612ee8578384fd5b818501915085601f830112612efb578384fd5b81356020612f0b612cef83613268565b8083825282820191508286018a848660051b8901011115612f2a578889fd5b8896505b84871015612f5357612f3f81612cb8565b835260019690960195918301918301612f2e565b5096505086013592505080821115612f69578283fd5b50612f7685828601612ccf565b9150509250929050565b60008060408385031215612f92578182fd5b823567ffffffffffffffff811115612fa8578283fd5b612fb485828601612ccf565b95602094909401359450505050565b600060208284031215612fd4578081fd5b61228182612d3e565b600060208284031215612fee578081fd5b5051919050565b600060208284031215613006578081fd5b8135612281816133c6565b600060208284031215613022578081fd5b8151612281816133c6565b6000806040838503121561303f578182fd5b823567ffffffffffffffff80821115613056578384fd5b61306286838701612d4e565b93506020850135915080821115613077578283fd5b50612f7685828601612d4e565b600060208284031215613095578081fd5b5035919050565b600080604083850312156130ae578182fd5b82359150602083013567ffffffffffffffff8111156130cb578182fd5b612f7685828601612ccf565b600081518084526130ef8160208601602086016132ee565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061311d57607f831692505b602080841082141561313d57634e487b7160e01b86526022600452602486fd5b81801561315157600181146131625761318f565b60ff1986168952848901965061318f565b60008881526020902060005b868110156131875781548b82015290850190830161316e565b505084890196505b50505050505092915050565b600082516131ad8184602087016132ee565b9190910192915050565b60006122818284613103565b60006131cf8285613103565b83516131df8183602088016132ee565b01949350505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261321a60808301846130d7565b9695505050505050565b60208152600061228160208301846130d7565b604051601f8201601f1916810167ffffffffffffffff81118282101715613260576132606133b0565b604052919050565b600067ffffffffffffffff821115613282576132826133b0565b5060051b60200190565b6000821982111561329f5761329f613384565b500190565b6000826132b3576132b361339a565b500490565b60008160001904831182151516156132d2576132d2613384565b500290565b6000828210156132e9576132e9613384565b500390565b60005b838110156133095781810151838201526020016132f1565b838111156119865750506000910152565b600181811c9082168061332e57607f821691505b6020821081141561334f57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561336957613369613384565b5060010190565b60008261337f5761337f61339a565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611e9a57600080fdfea264697066735822122015ecd3bc36b39fcf7b94999b0d607259f26cde9ff95acf9ebac2bb95f49984f664736f6c63430008040033

Deployed Bytecode Sourcemap

49881:7508:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55956:235;;;;;;;;;;-1:-1:-1;55956:235:0;;;;;:::i;:::-;;:::i;:::-;;;11774:14:1;;11767:22;11749:41;;11737:2;11722:18;55956:235:0;;;;;;;;21493:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23052:221::-;;;;;;;;;;-1:-1:-1;23052:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;11026:55:1;;;11008:74;;10996:2;10981:18;23052:221:0;10963:125:1;22575:411:0;;;;;;;;;;-1:-1:-1;22575:411:0;;;;;:::i;:::-;;:::i;:::-;;35182:113;;;;;;;;;;-1:-1:-1;35270:10:0;:17;35182:113;;;11947:25:1;;;11935:2;11920:18;35182:113:0;11902:76:1;50536:20:0;;;;;;;;;;-1:-1:-1;50536:20:0;;;;;;;;;;;23942:339;;;;;;;;;;-1:-1:-1;23942:339:0;;;;;:::i;:::-;;:::i;51036:137::-;;;;;;;;;;-1:-1:-1;51036:137:0;;;;;:::i;:::-;;:::i;34850:256::-;;;;;;;;;;-1:-1:-1;34850:256:0;;;;;:::i;:::-;;:::i;54243:413::-;;;;;;;;;;-1:-1:-1;54243:413:0;;;;;:::i;:::-;;:::i;51273:149::-;;;;;;;;;;-1:-1:-1;51273:149:0;;;;;:::i;:::-;;:::i;24352:185::-;;;;;;;;;;-1:-1:-1;24352:185:0;;;;;:::i;:::-;;:::i;35372:233::-;;;;;;;;;;-1:-1:-1;35372:233:0;;;;;:::i;:::-;;:::i;51793:253::-;;;;;;;;;;-1:-1:-1;51793:253:0;;;;;:::i;:::-;;:::i;50822:98::-;;;;;;;;;;;;;:::i;50563:27::-;;;;;;;;;;-1:-1:-1;50563:27:0;;;;;;;;;;;21187:239;;;;;;;;;;-1:-1:-1;21187:239:0;;;;;:::i;:::-;;:::i;20917:208::-;;;;;;;;;;-1:-1:-1;20917:208:0;;;;;:::i;:::-;;:::i;49250:94::-;;;;;;;;;;;;;:::i;48599:87::-;;;;;;;;;;-1:-1:-1;48672:6:0;;-1:-1:-1;;;;;48672:6:0;48599:87;;53059:1092;;;;;;:::i;:::-;;:::i;52211:686::-;;;;;;:::i;:::-;;:::i;21662:104::-;;;;;;;;;;;;;:::i;56600:786::-;;;;;;;;;;-1:-1:-1;56600:786:0;;;;;:::i;:::-;;:::i;23345:295::-;;;;;;;;;;-1:-1:-1;23345:295:0;;;;;:::i;:::-;;:::i;50447:44::-;;;;;;;;;;;;;;;;50511:18;;;;;;;;;;-1:-1:-1;50511:18:0;;;;;;;;50623:46;;;;;;;;;;;;50668:1;50623:46;;24608:328;;;;;;;;;;-1:-1:-1;24608:328:0;;;;;:::i;:::-;;:::i;54748:606::-;;;;;;;;;;-1:-1:-1;54748:606:0;;;;;:::i;:::-;;:::i;55502:442::-;;;;;;;;;;-1:-1:-1;55502:442:0;;;;;:::i;:::-;;:::i;50349:45::-;;;;;;;;;;;;50390:4;50349:45;;50297;;;;;;;;;;;;50340:2;50297:45;;51494:197;;;;;;;;;;-1:-1:-1;51494:197:0;;;;;:::i;:::-;;:::i;23711:164::-;;;;;;;;;;-1:-1:-1;23711:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;23832:25:0;;;23808:4;23832:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23711:164;50735:28;;;;;;;;;;;;;;;;50597:19;;;;;;;;;;;;;;;;56501:91;;;;;;;;;;-1:-1:-1;56501:91:0;;;;;:::i;:::-;;:::i;49499:192::-;;;;;;;;;;-1:-1:-1;49499:192:0;;;;;:::i;:::-;;:::i;55956:235::-;56116:4;56146:37;56170:12;56146:23;:37::i;:::-;56139:44;55956:235;-1:-1:-1;;55956:235:0:o;21493:100::-;21547:13;21580:5;21573:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21493:100;:::o;23052:221::-;23128:7;26535:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26535:16:0;23148:73;;;;-1:-1:-1;;;23148:73:0;;19333:2:1;23148:73:0;;;19315:21:1;19372:2;19352:18;;;19345:30;19411:34;19391:18;;;19384:62;19482:14;19462:18;;;19455:42;19514:19;;23148:73:0;;;;;;;;;-1:-1:-1;23241:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23241:24:0;;23052:221::o;22575:411::-;22656:13;22672:23;22687:7;22672:14;:23::i;:::-;22656:39;;22720:5;-1:-1:-1;;;;;22714:11:0;:2;-1:-1:-1;;;;;22714:11:0;;;22706:57;;;;-1:-1:-1;;;22706:57:0;;20933:2:1;22706:57:0;;;20915:21:1;20972:2;20952:18;;;20945:30;21011:34;20991:18;;;20984:62;21082:3;21062:18;;;21055:31;21103:19;;22706:57:0;20905:223:1;22706:57:0;16135:10;-1:-1:-1;;;;;22798:21:0;;;;:62;;-1:-1:-1;22823:37:0;22840:5;16135:10;23711:164;:::i;22823:37::-;22776:168;;;;-1:-1:-1;;;22776:168:0;;16606:2:1;22776:168:0;;;16588:21:1;16645:2;16625:18;;;16618:30;16684:34;16664:18;;;16657:62;16755:26;16735:18;;;16728:54;16799:19;;22776:168:0;16578:246:1;22776:168:0;22957:21;22966:2;22970:7;22957:8;:21::i;:::-;22575:411;;;:::o;23942:339::-;24137:41;16135:10;24170:7;24137:18;:41::i;:::-;24129:103;;;;-1:-1:-1;;;24129:103:0;;21751:2:1;24129:103:0;;;21733:21:1;21790:2;21770:18;;;21763:30;21829:34;21809:18;;;21802:62;21900:19;21880:18;;;21873:47;21937:19;;24129:103:0;21723:239:1;24129:103:0;24245:28;24255:4;24261:2;24265:7;24245:9;:28::i;51036:137::-;48672:6;;-1:-1:-1;;;;;48672:6:0;16135:10;48819:23;48811:68;;;;-1:-1:-1;;;48811:68:0;;19746:2:1;48811:68:0;;;19728:21:1;;;19765:18;;;19758:30;19824:34;19804:18;;;19797:62;19876:18;;48811:68:0;19718:182:1;48811:68:0;51145:8:::1;:20:::0;;;::::1;;;;::::0;;;::::1;::::0;;;::::1;::::0;;51036:137::o;34850:256::-;34947:7;34983:23;35000:5;34983:16;:23::i;:::-;34975:5;:31;34967:87;;;;-1:-1:-1;;;34967:87:0;;12409:2:1;34967:87:0;;;12391:21:1;12448:2;12428:18;;;12421:30;12487:34;12467:18;;;12460:62;12558:13;12538:18;;;12531:41;12589:19;;34967:87:0;12381:233:1;34967:87:0;-1:-1:-1;;;;;;35072:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;34850:256::o;54243:413::-;48672:6;;-1:-1:-1;;;;;48672:6:0;16135:10;48819:23;48811:68;;;;-1:-1:-1;;;48811:68:0;;19746:2:1;48811:68:0;;;19728:21:1;;;19765:18;;;19758:30;19824:34;19804:18;;;19797:62;19876:18;;48811:68:0;19718:182:1;48811:68:0;50390:4:::1;54382:8;:26;;54374:96;;;::::0;-1:-1:-1;;;54374:96:0;;23337:2:1;54374:96:0::1;::::0;::::1;23319:21:1::0;23376:2;23356:18;;;23349:30;23415:34;23395:18;;;23388:62;23486:27;23466:18;;;23459:55;23531:19;;54374:96:0::1;23309:247:1::0;54374:96:0::1;50436:4;54489:8;:18;54481:87;;;::::0;-1:-1:-1;;;54481:87:0;;17786:2:1;54481:87:0::1;::::0;::::1;17768:21:1::0;17825:2;17805:18;;;17798:30;17864:34;17844:18;;;17837:62;17935:26;17915:18;;;17908:54;17979:19;;54481:87:0::1;17758:246:1::0;54481:87:0::1;54579:24;54589:3;54594:8;54579:9;:24::i;:::-;54628:13;::::0;:20:::1;::::0;54646:1:::1;54628:17;:20::i;:::-;54614:13;:34:::0;-1:-1:-1;;54243:413:0:o;51273:149::-;48672:6;;-1:-1:-1;;;;;48672:6:0;16135:10;48819:23;48811:68;;;;-1:-1:-1;;;48811:68:0;;19746:2:1;48811:68:0;;;19728:21:1;;;19765:18;;;19758:30;19824:34;19804:18;;;19797:62;19876:18;;48811:68:0;19718:182:1;48811:68:0;51387:15:::1;:27:::0;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;51273:149::o;24352:185::-;24490:39;24507:4;24513:2;24517:7;24490:39;;;;;;;;;;;;:16;:39::i;35372:233::-;35447:7;35483:30;35270:10;:17;;35182:113;35483:30;35475:5;:38;35467:95;;;;-1:-1:-1;;;35467:95:0;;22169:2:1;35467:95:0;;;22151:21:1;22208:2;22188:18;;;22181:30;22247:34;22227:18;;;22220:62;22318:14;22298:18;;;22291:42;22350:19;;35467:95:0;22141:234:1;35467:95:0;35580:10;35591:5;35580:17;;;;;;-1:-1:-1;;;35580:17:0;;;;;;;;;;;;;;;;;35573:24;;35372:233;;;:::o;51793:253::-;48672:6;;-1:-1:-1;;;;;48672:6:0;16135:10;48819:23;48811:68;;;;-1:-1:-1;;;48811:68:0;;19746:2:1;48811:68:0;;;19728:21:1;;;19765:18;;;19758:30;19824:34;19804:18;;;19797:62;19876:18;;48811:68:0;19718:182:1;48811:68:0;51909:21:::1;51949:11:::0;51941:56:::1;;;::::0;-1:-1:-1;;;51941:56:0;;15832:2:1;51941:56:0::1;::::0;::::1;15814:21:1::0;;;15851:18;;;15844:30;15910:34;15890:18;;;15883:62;15962:18;;51941:56:0::1;15804:182:1::0;51941:56:0::1;52008:30;::::0;-1:-1:-1;;;;;52008:21:0;::::1;::::0;:30;::::1;;;::::0;52030:7;;52008:30:::1;::::0;;;52030:7;52008:21;:30;::::1;;;;;;;;;;;;;::::0;::::1;;;;50822:98:::0;48672:6;;-1:-1:-1;;;;;48672:6:0;16135:10;48819:23;48811:68;;;;-1:-1:-1;;;48811:68:0;;19746:2:1;48811:68:0;;;19728:21:1;;;19765:18;;;19758:30;19824:34;19804:18;;;19797:62;19876:18;;48811:68:0;19718:182:1;48811:68:0;50899:6:::1;:13:::0;;-1:-1:-1;;50899:13:0::1;50908:4;50899:13;::::0;;50822:98::o;21187:239::-;21259:7;21295:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21295:16:0;21330:19;21322:73;;;;-1:-1:-1;;;21322:73:0;;18211:2:1;21322:73:0;;;18193:21:1;18250:2;18230:18;;;18223:30;18289:34;18269:18;;;18262:62;18360:11;18340:18;;;18333:39;18389:19;;21322:73:0;18183:231:1;20917:208:0;20989:7;-1:-1:-1;;;;;21017:19:0;;21009:74;;;;-1:-1:-1;;;21009:74:0;;17375:2:1;21009:74:0;;;17357:21:1;17414:2;17394:18;;;17387:30;17453:34;17433:18;;;17426:62;17524:12;17504:18;;;17497:40;17554:19;;21009:74:0;17347:232:1;21009:74:0;-1:-1:-1;;;;;;21101:16:0;;;;;:9;:16;;;;;;;20917:208::o;49250:94::-;48672:6;;-1:-1:-1;;;;;48672:6:0;16135:10;48819:23;48811:68;;;;-1:-1:-1;;;48811:68:0;;19746:2:1;48811:68:0;;;19728:21:1;;;19765:18;;;19758:30;19824:34;19804:18;;;19797:62;19876:18;;48811:68:0;19718:182:1;48811:68:0;49315:21:::1;49333:1;49315:9;:21::i;:::-;49250:94::o:0;53059:1092::-;53220:8;;;;;;;53212:43;;;;-1:-1:-1;;;53212:43:0;;18982:2:1;53212:43:0;;;18964:21:1;19021:2;19001:18;;;18994:30;19060:24;19040:18;;;19033:52;19102:18;;53212:43:0;18954:172:1;53212:43:0;53274:15;;;;;;;53266:57;;;;-1:-1:-1;;;53266:57:0;;23763:2:1;53266:57:0;;;23745:21:1;23802:2;23782:18;;;23775:30;23841:31;23821:18;;;23814:59;23890:18;;53266:57:0;23735:179:1;53266:57:0;53342:53;53349:6;53381:10;53342:6;:53::i;:::-;53334:81;;;;-1:-1:-1;;;53334:81:0;;17031:2:1;53334:81:0;;;17013:21:1;17070:2;17050:18;;;17043:30;17109:17;17089:18;;;17082:45;17144:18;;53334:81:0;17003:165:1;53334:81:0;50390:4;53434:13;35270:10;:17;;35182:113;53434:13;:30;53426:77;;;;-1:-1:-1;;;53426:77:0;;22934:2:1;53426:77:0;;;22916:21:1;22973:2;22953:18;;;22946:30;23012:34;22992:18;;;22985:62;23083:4;23063:18;;;23056:32;23105:19;;53426:77:0;22906:224:1;53426:77:0;50668:1;53522:12;:34;;53514:79;;;;-1:-1:-1;;;53514:79:0;;24121:2:1;53514:79:0;;;24103:21:1;;;24140:18;;;24133:30;24199:34;24179:18;;;24172:62;24251:18;;53514:79:0;24093:182:1;53514:79:0;50390:4;53612:50;53648:13;;53612:31;53630:12;53612:13;35270:10;:17;;35182:113;53612:13;:17;;:31::i;:::-;:35;;:50::i;:::-;:68;;53604:128;;;;-1:-1:-1;;;53604:128:0;;21335:2:1;53604:128:0;;;21317:21:1;21374:2;21354:18;;;21347:30;21413:34;21393:18;;;21386:62;21484:17;21464:18;;;21457:45;21519:19;;53604:128:0;21307:237:1;53604:128:0;53768:10;53751:28;;;;:16;:28;;;;;;50668:1;;53751:46;;53784:12;53751:32;:46::i;:::-;:68;;53743:109;;;;-1:-1:-1;;;53743:109:0;;13240:2:1;53743:109:0;;;13222:21:1;13279:2;13259:18;;;13252:30;13318;13298:18;;;13291:58;13366:18;;53743:109:0;13212:178:1;53743:109:0;53871:8;;53901:9;;53871:26;;53884:12;53871;:26::i;:::-;:39;53863:83;;;;-1:-1:-1;;;53863:83:0;;15472:2:1;53863:83:0;;;15454:21:1;15511:2;15491:18;;;15484:30;15550:33;15530:18;;;15523:61;15601:18;;53863:83:0;15444:181:1;53863:83:0;53962:9;53957:187;53981:12;53977:1;:16;53957:187;;;54046:10;54029:28;;;;:16;:28;;;;;:33;;54061:1;;54029:28;:33;;54061:1;;54029:33;:::i;:::-;;;;;;;;54077:55;54087:10;54099:32;54117:13;;54099;35270:10;:17;;35182:113;54099:32;54077:9;:55::i;:::-;53995:3;;;;:::i;:::-;;;;53957:187;;52211:686;52332:8;;;;;;;52324:43;;;;-1:-1:-1;;;52324:43:0;;18982:2:1;52324:43:0;;;18964:21:1;19021:2;19001:18;;;18994:30;19060:24;19040:18;;;19033:52;19102:18;;52324:43:0;18954:172:1;52324:43:0;52387:15;;;;;;;52386:16;52378:58;;;;-1:-1:-1;;;52378:58:0;;23763:2:1;52378:58:0;;;23745:21:1;23802:2;23782:18;;;23775:30;23841:31;23821:18;;;23814:59;23890:18;;52378:58:0;23735:179:1;52378:58:0;50340:2;52455:12;:32;;52447:68;;;;-1:-1:-1;;;52447:68:0;;14361:2:1;52447:68:0;;;14343:21:1;14400:2;14380:18;;;14373:30;14439:25;14419:18;;;14412:53;14482:18;;52447:68:0;14333:173:1;52447:68:0;50390:4;52534:50;52570:13;;52534:31;52552:12;52534:13;35270:10;:17;;35182:113;52534:50;:68;;52526:128;;;;-1:-1:-1;;;52526:128:0;;21335:2:1;52526:128:0;;;21317:21:1;21374:2;21354:18;;;21347:30;21413:34;21393:18;;;21386:62;21484:17;21464:18;;;21457:45;21519:19;;52526:128:0;21307:237:1;52526:128:0;52673:8;;52703:9;;52673:26;;52686:12;52673;:26::i;:::-;:39;52665:83;;;;-1:-1:-1;;;52665:83:0;;15472:2:1;52665:83:0;;;15454:21:1;15511:2;15491:18;;;15484:30;15550:33;15530:18;;;15523:61;15601:18;;52665:83:0;15444:181:1;52665:83:0;52773:6;52769:121;52789:12;52785:1;:16;52769:121;;;52823:55;52833:10;52845:32;52863:13;;52845;35270:10;:17;;35182:113;52823:55;52803:3;;;;:::i;:::-;;;;52769:121;;;;52211:686;:::o;21662:104::-;21718:13;21751:7;21744:14;;;;;:::i;56600:786::-;56675:4;56715;56675;56732:531;56756:5;:12;56752:1;:16;56732:531;;;56790:20;56813:5;56819:1;56813:8;;;;;;-1:-1:-1;;;56813:8:0;;;;;;;;;;;;;;;56790:31;;56870:12;56854;:28;56850:402;;57004:44;;;;;;9905:19:1;;;9940:12;;;9933:28;;;56997:52:0;;9977:12:1;;57004:44:0;;;-1:-1:-1;;57004:44:0;;;;;;;;;;56997:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56982:67;;56850:402;;;57191:44;;;;;;9905:19:1;;;9940:12;;;9933:28;;;57184:52:0;;9977:12:1;;57191:44:0;;;-1:-1:-1;;57191:44:0;;;;;;;;;;57184:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57169:67;;56850:402;-1:-1:-1;56770:3:0;;;;:::i;:::-;;;;56732:531;;;-1:-1:-1;57374:4:0;;57358:20;;56600:786;-1:-1:-1;;;56600:786:0:o;23345:295::-;-1:-1:-1;;;;;23448:24:0;;16135:10;23448:24;;23440:62;;;;-1:-1:-1;;;23440:62:0;;15118:2:1;23440:62:0;;;15100:21:1;15157:2;15137:18;;;15130:30;15196:27;15176:18;;;15169:55;15241:18;;23440:62:0;15090:175:1;23440:62:0;16135:10;23515:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;23515:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;23515:53:0;;;;;;;;;;23584:48;;11749:41:1;;;23515:42:0;;16135:10;23584:48;;11722:18:1;23584:48:0;;;;;;;23345:295;;:::o;24608:328::-;24783:41;16135:10;24816:7;24783:18;:41::i;:::-;24775:103;;;;-1:-1:-1;;;24775:103:0;;21751:2:1;24775:103:0;;;21733:21:1;21790:2;21770:18;;;21763:30;21829:34;21809:18;;;21802:62;21900:19;21880:18;;;21873:47;21937:19;;24775:103:0;21723:239:1;24775:103:0;24889:39;24903:4;24909:2;24913:7;24922:5;24889:13;:39::i;:::-;24608:328;;;;:::o;54748:606::-;48672:6;;-1:-1:-1;;;;;48672:6:0;16135:10;48819:23;48811:68;;;;-1:-1:-1;;;48811:68:0;;19746:2:1;48811:68:0;;;19728:21:1;;;19765:18;;;19758:30;19824:34;19804:18;;;19797:62;19876:18;;48811:68:0;19718:182:1;48811:68:0;54927:8:::1;:15;54913:3;:10;:29;54905:65;;;::::0;-1:-1:-1;;;54905:65:0;;22582:2:1;54905:65:0::1;::::0;::::1;22564:21:1::0;22621:2;22601:18;;;22594:30;22660:25;22640:18;;;22633:53;22703:18;;54905:65:0::1;22554:173:1::0;54905:65:0::1;54985:9;54981:366;55004:3;:10;55000:1;:14;54981:366;;;50390:4;55043:8;55052:1;55043:11;;;;;;-1:-1:-1::0;;;55043:11:0::1;;;;;;;;;;;;;;;:29;;55035:99;;;::::0;-1:-1:-1;;;55035:99:0;;23337:2:1;55035:99:0::1;::::0;::::1;23319:21:1::0;23376:2;23356:18;;;23349:30;23415:34;23395:18;;;23388:62;23486:27;23466:18;;;23459:55;23531:19;;55035:99:0::1;23309:247:1::0;55035:99:0::1;50436:4;55157:8;55166:1;55157:11;;;;;;-1:-1:-1::0;;;55157:11:0::1;;;;;;;;;;;;;;;:21;55149:90;;;::::0;-1:-1:-1;;;55149:90:0;;17786:2:1;55149:90:0::1;::::0;::::1;17768:21:1::0;17825:2;17805:18;;;17798:30;17864:34;17844:18;;;17837:62;17935:26;17915:18;;;17908:54;17979:19;;55149:90:0::1;17758:246:1::0;55149:90:0::1;55254:30;55264:3;55268:1;55264:6;;;;;;-1:-1:-1::0;;;55264:6:0::1;;;;;;;;;;;;;;;55272:8;55281:1;55272:11;;;;;;-1:-1:-1::0;;;55272:11:0::1;;;;;;;;;;;;;;;55254:9;:30::i;:::-;55315:13;::::0;:20:::1;::::0;55333:1:::1;55315:17;:20::i;:::-;55299:13;:36:::0;55016:3;::::1;::::0;::::1;:::i;:::-;;;;54981:366;;55502:442:::0;26511:4;26535:16;;;:7;:16;;;;;;55642:13;;-1:-1:-1;;;;;26535:16:0;55674:77;;;;-1:-1:-1;;;55674:77:0;;20517:2:1;55674:77:0;;;20499:21:1;20556:2;20536:18;;;20529:30;20595:34;20575:18;;;20568:62;20666:17;20646:18;;;20639:45;20701:19;;55674:77:0;20489:237:1;55674:77:0;55767:6;;;;55762:175;;55821:8;55804:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;55790:41;;55502:442;;;:::o;55762:175::-;55895:7;55904:19;:8;:17;:19::i;:::-;55878:46;;;;;;;;;:::i;55762:175::-;55502:442;;;:::o;51494:197::-;48672:6;;-1:-1:-1;;;;;48672:6:0;16135:10;48819:23;48811:68;;;;-1:-1:-1;;;48811:68:0;;19746:2:1;48811:68:0;;;19728:21:1;;;19765:18;;;19758:30;19824:34;19804:18;;;19797:62;19876:18;;48811:68:0;19718:182:1;48811:68:0;51638:20;;::::1;::::0;:8:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;51669:14:0;;::::1;::::0;:7:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;56501:91::-:0;48672:6;;-1:-1:-1;;;;;48672:6:0;16135:10;48819:23;48811:68;;;;-1:-1:-1;;;48811:68:0;;19746:2:1;48811:68:0;;;19728:21:1;;;19765:18;;;19758:30;19824:34;19804:18;;;19797:62;19876:18;;48811:68:0;19718:182:1;48811:68:0;56563:4:::1;:21:::0;56501:91::o;49499:192::-;48672:6;;-1:-1:-1;;;;;48672:6:0;16135:10;48819:23;48811:68;;;;-1:-1:-1;;;48811:68:0;;19746:2:1;48811:68:0;;;19728:21:1;;;19765:18;;;19758:30;19824:34;19804:18;;;19797:62;19876:18;;48811:68:0;19718:182:1;48811:68:0;-1:-1:-1;;;;;49588:22:0;::::1;49580:73;;;::::0;-1:-1:-1;;;49580:73:0;;13597:2:1;49580:73:0::1;::::0;::::1;13579:21:1::0;13636:2;13616:18;;;13609:30;13675:34;13655:18;;;13648:62;13746:8;13726:18;;;13719:36;13772:19;;49580:73:0::1;13569:228:1::0;49580:73:0::1;49664:19;49674:8;49664:9;:19::i;:::-;49499:192:::0;:::o;34542:224::-;34644:4;34668:50;;;34683:35;34668:50;;:90;;;34722:36;34746:11;34722:23;:36::i;30428:174::-;30503:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;30503:29:0;-1:-1:-1;;;;;30503:29:0;;;;;;;;:24;;30557:23;30503:24;30557:14;:23::i;:::-;-1:-1:-1;;;;;30548:46:0;;;;;;;;;;;30428:174;;:::o;26740:348::-;26833:4;26535:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26535:16:0;26850:73;;;;-1:-1:-1;;;26850:73:0;;16193:2:1;26850:73:0;;;16175:21:1;16232:2;16212:18;;;16205:30;16271:34;16251:18;;;16244:62;16342:14;16322:18;;;16315:42;16374:19;;26850:73:0;16165:234:1;26850:73:0;26934:13;26950:23;26965:7;26950:14;:23::i;:::-;26934:39;;27003:5;-1:-1:-1;;;;;26992:16:0;:7;-1:-1:-1;;;;;26992:16:0;;:51;;;;27036:7;-1:-1:-1;;;;;27012:31:0;:20;27024:7;27012:11;:20::i;:::-;-1:-1:-1;;;;;27012:31:0;;26992:51;:87;;;-1:-1:-1;;;;;;23832:25:0;;;23808:4;23832:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27047:32;26984:96;26740:348;-1:-1:-1;;;;26740:348:0:o;29732:578::-;29891:4;-1:-1:-1;;;;;29864:31:0;:23;29879:7;29864:14;:23::i;:::-;-1:-1:-1;;;;;29864:31:0;;29856:85;;;;-1:-1:-1;;;29856:85:0;;20107:2:1;29856:85:0;;;20089:21:1;20146:2;20126:18;;;20119:30;20185:34;20165:18;;;20158:62;20256:11;20236:18;;;20229:39;20285:19;;29856:85:0;20079:231:1;29856:85:0;-1:-1:-1;;;;;29960:16:0;;29952:65;;;;-1:-1:-1;;;29952:65:0;;14713:2:1;29952:65:0;;;14695:21:1;14752:2;14732:18;;;14725:30;14791:34;14771:18;;;14764:62;14862:6;14842:18;;;14835:34;14886:19;;29952:65:0;14685:226:1;29952:65:0;30030:39;30051:4;30057:2;30061:7;30030:20;:39::i;:::-;30134:29;30151:1;30155:7;30134:8;:29::i;:::-;-1:-1:-1;;;;;30176:15:0;;;;;;:9;:15;;;;;:20;;30195:1;;30176:15;:20;;30195:1;;30176:20;:::i;:::-;;;;-1:-1:-1;;;;;;;30207:13:0;;;;;;:9;:13;;;;;:18;;30224:1;;30207:13;:18;;30224:1;;30207:18;:::i;:::-;;;;-1:-1:-1;;30236:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;30236:21:0;-1:-1:-1;;;;;30236:21:0;;;;;;;;;30275:27;;30236:16;;30275:27;;;;;;;29732:578;;;:::o;27430:110::-;27506:26;27516:2;27520:7;27506:26;;;;;;;;;;;;:9;:26::i;43461:98::-;43519:7;43546:5;43550:1;43546;:5;:::i;:::-;43539:12;43461:98;-1:-1:-1;;;43461:98:0:o;49699:173::-;49774:6;;;-1:-1:-1;;;;;49791:17:0;;;-1:-1:-1;;49791:17:0;;;;;;;49824:40;;49774:6;;;49791:17;49774:6;;49824:40;;49755:16;;49824:40;49699:173;;:::o;43842:98::-;43900:7;43927:5;43931:1;43927;:5;:::i;44199:98::-;44257:7;44284:5;44288:1;44284;:5;:::i;25818:315::-;25975:28;25985:4;25991:2;25995:7;25975:9;:28::i;:::-;26022:48;26045:4;26051:2;26055:7;26064:5;26022:22;:48::i;:::-;26014:111;;;;-1:-1:-1;;;26014:111:0;;12821:2:1;26014:111:0;;;12803:21:1;12860:2;12840:18;;;12833:30;12899:34;12879:18;;;12872:62;12970:20;12950:18;;;12943:48;13008:19;;26014:111:0;12793:240:1;16557:723:0;16613:13;16834:10;16830:53;;-1:-1:-1;;16861:10:0;;;;;;;;;;;;;;;;;;16557:723::o;16830:53::-;16908:5;16893:12;16949:78;16956:9;;16949:78;;16982:8;;;;:::i;:::-;;-1:-1:-1;17005:10:0;;-1:-1:-1;17013:2:0;17005:10;;:::i;:::-;;;16949:78;;;17037:19;17069:6;17059:17;;;;;;-1:-1:-1;;;17059:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17059:17:0;;17037:39;;17087:154;17094:10;;17087:154;;17121:11;17131:1;17121:11;;:::i;:::-;;-1:-1:-1;17190:10:0;17198:2;17190:5;:10;:::i;:::-;17177:24;;:2;:24;:::i;:::-;17164:39;;17147:6;17154;17147:14;;;;;;-1:-1:-1;;;17147:14:0;;;;;;;;;;;;:56;;;;;;;;;;-1:-1:-1;17218:11:0;17227:2;17218:11;;:::i;:::-;;;17087:154;;20548:305;20650:4;20687:40;;;20702:25;20687:40;;:105;;-1:-1:-1;20744:48:0;;;20759:33;20744:48;20687:105;:158;;;-1:-1:-1;19213:25:0;19198:40;;;;20809:36;19089:157;56244:249;56437:48;56464:5;56471:3;56476:8;56437:26;:48::i;27767:321::-;27897:18;27903:2;27907:7;27897:5;:18::i;:::-;27948:54;27979:1;27983:2;27987:7;27996:5;27948:22;:54::i;:::-;27926:154;;;;-1:-1:-1;;;27926:154:0;;12821:2:1;27926:154:0;;;12803:21:1;12860:2;12840:18;;;12833:30;12899:34;12879:18;;;12872:62;12970:20;12950:18;;;12943:48;13008:19;;27926:154:0;12793:240:1;31167:799:0;31322:4;-1:-1:-1;;;;;31343:13:0;;8445:20;8493:8;31339:620;;31379:72;;;;;-1:-1:-1;;;;;31379:36:0;;;;;:72;;16135:10;;31430:4;;31436:7;;31445:5;;31379:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31379:72:0;;;;;;;;-1:-1:-1;;31379:72:0;;;;;;;;;;;;:::i;:::-;;;31375:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31621:13:0;;31617:272;;31664:60;;-1:-1:-1;;;31664:60:0;;12821:2:1;31664:60:0;;;12803:21:1;12860:2;12840:18;;;12833:30;12899:34;12879:18;;;12872:62;12970:20;12950:18;;;12943:48;13008:19;;31664:60:0;12793:240:1;31617:272:0;31839:6;31833:13;31824:6;31820:2;31816:15;31809:38;31375:529;31502:51;;31512:41;31502:51;;-1:-1:-1;31495:58:0;;31339:620;-1:-1:-1;31943:4:0;31167:799;;;;;;:::o;36218:589::-;-1:-1:-1;;;;;36424:18:0;;36420:187;;36459:40;36491:7;37634:10;:17;;37607:24;;;;:15;:24;;;;;:44;;;37662:24;;;;;;;;;;;;37530:164;36459:40;36420:187;;;36529:2;-1:-1:-1;;;;;36521:10:0;:4;-1:-1:-1;;;;;36521:10:0;;36517:90;;36548:47;36581:4;36587:7;36548:32;:47::i;:::-;-1:-1:-1;;;;;36621:16:0;;36617:183;;36654:45;36691:7;36654:36;:45::i;36617:183::-;36727:4;-1:-1:-1;;;;;36721:10:0;:2;-1:-1:-1;;;;;36721:10:0;;36717:83;;36748:40;36776:2;36780:7;36748:27;:40::i;28424:382::-;-1:-1:-1;;;;;28504:16:0;;28496:61;;;;-1:-1:-1;;;28496:61:0;;18621:2:1;28496:61:0;;;18603:21:1;;;18640:18;;;18633:30;18699:34;18679:18;;;18672:62;18751:18;;28496:61:0;18593:182:1;28496:61:0;26511:4;26535:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26535:16:0;:30;28568:58;;;;-1:-1:-1;;;28568:58:0;;14004:2:1;28568:58:0;;;13986:21:1;14043:2;14023:18;;;14016:30;14082;14062:18;;;14055:58;14130:18;;28568:58:0;13976:178:1;28568:58:0;28639:45;28668:1;28672:2;28676:7;28639:20;:45::i;:::-;-1:-1:-1;;;;;28697:13:0;;;;;;:9;:13;;;;;:18;;28714:1;;28697:13;:18;;28714:1;;28697:18;:::i;:::-;;;;-1:-1:-1;;28726:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;28726:21:0;-1:-1:-1;;;;;28726:21:0;;;;;;;;28765:33;;28726:16;;;28765:33;;28726:16;;28765:33;28424:382;;:::o;38321:988::-;38587:22;38637:1;38612:22;38629:4;38612:16;:22::i;:::-;:26;;;;:::i;:::-;38649:18;38670:26;;;:17;:26;;;;;;38587:51;;-1:-1:-1;38803:28:0;;;38799:328;;-1:-1:-1;;;;;38870:18:0;;38848:19;38870:18;;;:12;:18;;;;;;;;:34;;;;;;;;;38921:30;;;;;;:44;;;39038:30;;:17;:30;;;;;:43;;;38799:328;-1:-1:-1;39223:26:0;;;;:17;:26;;;;;;;;39216:33;;;-1:-1:-1;;;;;39267:18:0;;;;;:12;:18;;;;;:34;;;;;;;39260:41;38321:988::o;39604:1079::-;39882:10;:17;39857:22;;39882:21;;39902:1;;39882:21;:::i;:::-;39914:18;39935:24;;;:15;:24;;;;;;40308:10;:26;;39857:46;;-1:-1:-1;39935:24:0;;39857:46;;40308:26;;;;-1:-1:-1;;;40308:26:0;;;;;;;;;;;;;;;;;40286:48;;40372:11;40347:10;40358;40347:22;;;;;;-1:-1:-1;;;40347:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;40452:28;;;:15;:28;;;;;;;:41;;;40624:24;;;;;40617:31;40659:10;:16;;;;;-1:-1:-1;;;40659:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;39604:1079;;;;:::o;37108:221::-;37193:14;37210:20;37227:2;37210:16;:20::i;:::-;-1:-1:-1;;;;;37241:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;37286:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;37108:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:465:1;78:5;112:18;104:6;101:30;98:2;;;134:18;;:::i;:::-;172:116;282:4;-1:-1:-1;;208:2:1;200:6;196:15;192:88;188:99;172:116;:::i;:::-;163:125;;311:6;304:5;297:21;351:3;342:6;337:3;333:16;330:25;327:2;;;368:1;365;358:12;327:2;417:6;412:3;405:4;398:5;394:16;381:43;471:1;464:4;455:6;448:5;444:18;440:29;433:40;88:391;;;;;:::o;484:196::-;552:20;;-1:-1:-1;;;;;601:54:1;;591:65;;581:2;;670:1;667;660:12;685:693;739:5;792:3;785:4;777:6;773:17;769:27;759:2;;814:5;807;800:20;759:2;854:6;841:20;880:4;904:60;920:43;960:2;920:43;:::i;:::-;904:60;:::i;:::-;986:3;1010:2;1005:3;998:15;1038:2;1033:3;1029:12;1022:19;;1073:2;1065:6;1061:15;1125:3;1120:2;1114;1111:1;1107:10;1099:6;1095:23;1091:32;1088:41;1085:2;;;1146:5;1139;1132:20;1085:2;1172:5;1186:163;1200:2;1197:1;1194:9;1186:163;;;1257:17;;1245:30;;1295:12;;;;1327;;;;1218:1;1211:9;1186:163;;;-1:-1:-1;1367:5:1;;749:629;-1:-1:-1;;;;;;;749:629:1:o;2081:160::-;2146:20;;2202:13;;2195:21;2185:32;;2175:2;;2231:1;2228;2221:12;2246:229;2289:5;2342:3;2335:4;2327:6;2323:17;2319:27;2309:2;;2364:5;2357;2350:20;2309:2;2390:79;2465:3;2456:6;2443:20;2436:4;2428:6;2424:17;2390:79;:::i;2480:196::-;2539:6;2592:2;2580:9;2571:7;2567:23;2563:32;2560:2;;;2613:6;2605;2598:22;2560:2;2641:29;2660:9;2641:29;:::i;2681:270::-;2749:6;2757;2810:2;2798:9;2789:7;2785:23;2781:32;2778:2;;;2831:6;2823;2816:22;2778:2;2859:29;2878:9;2859:29;:::i;:::-;2849:39;;2907:38;2941:2;2930:9;2926:18;2907:38;:::i;:::-;2897:48;;2768:183;;;;;:::o;2956:338::-;3033:6;3041;3049;3102:2;3090:9;3081:7;3077:23;3073:32;3070:2;;;3123:6;3115;3108:22;3070:2;3151:29;3170:9;3151:29;:::i;:::-;3141:39;;3199:38;3233:2;3222:9;3218:18;3199:38;:::i;:::-;3189:48;;3284:2;3273:9;3269:18;3256:32;3246:42;;3060:234;;;;;:::o;3299:696::-;3394:6;3402;3410;3418;3471:3;3459:9;3450:7;3446:23;3442:33;3439:2;;;3493:6;3485;3478:22;3439:2;3521:29;3540:9;3521:29;:::i;:::-;3511:39;;3569:38;3603:2;3592:9;3588:18;3569:38;:::i;:::-;3559:48;;3654:2;3643:9;3639:18;3626:32;3616:42;;3709:2;3698:9;3694:18;3681:32;3736:18;3728:6;3725:30;3722:2;;;3773:6;3765;3758:22;3722:2;3801:22;;3854:4;3846:13;;3842:27;-1:-1:-1;3832:2:1;;3888:6;3880;3873:22;3832:2;3916:73;3981:7;3976:2;3963:16;3958:2;3954;3950:11;3916:73;:::i;:::-;3906:83;;;3429:566;;;;;;;:::o;4000:264::-;4065:6;4073;4126:2;4114:9;4105:7;4101:23;4097:32;4094:2;;;4147:6;4139;4132:22;4094:2;4175:29;4194:9;4175:29;:::i;:::-;4165:39;;4223:35;4254:2;4243:9;4239:18;4223:35;:::i;4269:264::-;4337:6;4345;4398:2;4386:9;4377:7;4373:23;4369:32;4366:2;;;4419:6;4411;4404:22;4366:2;4447:29;4466:9;4447:29;:::i;:::-;4437:39;4523:2;4508:18;;;;4495:32;;-1:-1:-1;;;4356:177:1:o;4538:1212::-;4656:6;4664;4717:2;4705:9;4696:7;4692:23;4688:32;4685:2;;;4738:6;4730;4723:22;4685:2;4783:9;4770:23;4812:18;4853:2;4845:6;4842:14;4839:2;;;4874:6;4866;4859:22;4839:2;4917:6;4906:9;4902:22;4892:32;;4962:7;4955:4;4951:2;4947:13;4943:27;4933:2;;4989:6;4981;4974:22;4933:2;5030;5017:16;5052:4;5076:60;5092:43;5132:2;5092:43;:::i;5076:60::-;5158:3;5182:2;5177:3;5170:15;5210:2;5205:3;5201:12;5194:19;;5241:2;5237;5233:11;5289:7;5284:2;5278;5275:1;5271:10;5267:2;5263:19;5259:28;5256:41;5253:2;;;5315:6;5307;5300:22;5253:2;5342:6;5333:15;;5357:169;5371:2;5368:1;5365:9;5357:169;;;5428:23;5447:3;5428:23;:::i;:::-;5416:36;;5389:1;5382:9;;;;;5472:12;;;;5504;;5357:169;;;-1:-1:-1;5545:5:1;-1:-1:-1;;5588:18:1;;5575:32;;-1:-1:-1;;5619:16:1;;;5616:2;;;5653:6;5645;5638:22;5616:2;;5681:63;5736:7;5725:8;5714:9;5710:24;5681:63;:::i;:::-;5671:73;;;4675:1075;;;;;:::o;5755:436::-;5848:6;5856;5909:2;5897:9;5888:7;5884:23;5880:32;5877:2;;;5930:6;5922;5915:22;5877:2;5975:9;5962:23;6008:18;6000:6;5997:30;5994:2;;;6045:6;6037;6030:22;5994:2;6073:61;6126:7;6117:6;6106:9;6102:22;6073:61;:::i;:::-;6063:71;6181:2;6166:18;;;;6153:32;;-1:-1:-1;;;;5867:324:1:o;6196:190::-;6252:6;6305:2;6293:9;6284:7;6280:23;6276:32;6273:2;;;6326:6;6318;6311:22;6273:2;6354:26;6370:9;6354:26;:::i;6391:194::-;6461:6;6514:2;6502:9;6493:7;6489:23;6485:32;6482:2;;;6535:6;6527;6520:22;6482:2;-1:-1:-1;6563:16:1;;6472:113;-1:-1:-1;6472:113:1:o;6590:255::-;6648:6;6701:2;6689:9;6680:7;6676:23;6672:32;6669:2;;;6722:6;6714;6707:22;6669:2;6766:9;6753:23;6785:30;6809:5;6785:30;:::i;6850:259::-;6919:6;6972:2;6960:9;6951:7;6947:23;6943:32;6940:2;;;6993:6;6985;6978:22;6940:2;7030:9;7024:16;7049:30;7073:5;7049:30;:::i;7114:573::-;7202:6;7210;7263:2;7251:9;7242:7;7238:23;7234:32;7231:2;;;7284:6;7276;7269:22;7231:2;7329:9;7316:23;7358:18;7399:2;7391:6;7388:14;7385:2;;;7420:6;7412;7405:22;7385:2;7448:50;7490:7;7481:6;7470:9;7466:22;7448:50;:::i;:::-;7438:60;;7551:2;7540:9;7536:18;7523:32;7507:48;;7580:2;7570:8;7567:16;7564:2;;;7601:6;7593;7586:22;7564:2;;7629:52;7673:7;7662:8;7651:9;7647:24;7629:52;:::i;7692:190::-;7751:6;7804:2;7792:9;7783:7;7779:23;7775:32;7772:2;;;7825:6;7817;7810:22;7772:2;-1:-1:-1;7853:23:1;;7762:120;-1:-1:-1;7762:120:1:o;7887:436::-;7980:6;7988;8041:2;8029:9;8020:7;8016:23;8012:32;8009:2;;;8062:6;8054;8047:22;8009:2;8103:9;8090:23;8080:33;;8164:2;8153:9;8149:18;8136:32;8191:18;8183:6;8180:30;8177:2;;;8228:6;8220;8213:22;8177:2;8256:61;8309:7;8300:6;8289:9;8285:22;8256:61;:::i;8328:316::-;8369:3;8407:5;8401:12;8434:6;8429:3;8422:19;8450:63;8506:6;8499:4;8494:3;8490:14;8483:4;8476:5;8472:16;8450:63;:::i;:::-;8558:2;8546:15;-1:-1:-1;;8542:88:1;8533:98;;;;8633:4;8529:109;;8377:267;-1:-1:-1;;8377:267:1:o;8649:1094::-;8734:12;;8699:3;;8791:1;8811:18;;;;8864;;;;8891:2;;8945:4;8937:6;8933:17;8923:27;;8891:2;8971;9019;9011:6;9008:14;8988:18;8985:38;8982:2;;;-1:-1:-1;;;9053:3:1;9046:90;9159:4;9156:1;9149:15;9189:4;9184:3;9177:17;8982:2;9220:18;9247:162;;;;9423:1;9418:319;;;;9213:524;;9247:162;-1:-1:-1;;9284:9:1;9280:82;9275:3;9268:95;9392:6;9387:3;9383:16;9376:23;;9247:162;;9418:319;25036:4;25055:17;;;25105:4;25089:21;;9512:1;9526:165;9540:6;9537:1;9534:13;9526:165;;;9618:14;;9605:11;;;9598:35;9661:16;;;;9555:10;;9526:165;;;9530:3;;9720:6;9715:3;9711:16;9704:23;;9213:524;;;;;;;8707:1036;;;;:::o;10000:274::-;10129:3;10167:6;10161:13;10183:53;10229:6;10224:3;10217:4;10209:6;10205:17;10183:53;:::i;:::-;10252:16;;;;;10137:137;-1:-1:-1;;10137:137:1:o;10279:197::-;10407:3;10432:38;10466:3;10458:6;10432:38;:::i;10481:376::-;10657:3;10685:38;10719:3;10711:6;10685:38;:::i;:::-;10752:6;10746:13;10768:52;10813:6;10809:2;10802:4;10794:6;10790:17;10768:52;:::i;:::-;10836:15;;10665:192;-1:-1:-1;;;;10665:192:1:o;11093:511::-;11287:4;-1:-1:-1;;;;;11397:2:1;11389:6;11385:15;11374:9;11367:34;11449:2;11441:6;11437:15;11432:2;11421:9;11417:18;11410:43;;11489:6;11484:2;11473:9;11469:18;11462:34;11532:3;11527:2;11516:9;11512:18;11505:31;11553:45;11593:3;11582:9;11578:19;11570:6;11553:45;:::i;:::-;11545:53;11296:308;-1:-1:-1;;;;;;11296:308:1:o;11983:219::-;12132:2;12121:9;12114:21;12095:4;12152:44;12192:2;12181:9;12177:18;12169:6;12152:44;:::i;24462:334::-;24533:2;24527:9;24589:2;24579:13;;-1:-1:-1;;24575:86:1;24563:99;;24692:18;24677:34;;24713:22;;;24674:62;24671:2;;;24739:18;;:::i;:::-;24775:2;24768:22;24507:289;;-1:-1:-1;24507:289:1:o;24801:183::-;24861:4;24894:18;24886:6;24883:30;24880:2;;;24916:18;;:::i;:::-;-1:-1:-1;24961:1:1;24957:14;24973:4;24953:25;;24870:114::o;25121:128::-;25161:3;25192:1;25188:6;25185:1;25182:13;25179:2;;;25198:18;;:::i;:::-;-1:-1:-1;25234:9:1;;25169:80::o;25254:120::-;25294:1;25320;25310:2;;25325:18;;:::i;:::-;-1:-1:-1;25359:9:1;;25300:74::o;25379:228::-;25419:7;25545:1;-1:-1:-1;;25473:74:1;25470:1;25467:81;25462:1;25455:9;25448:17;25444:105;25441:2;;;25552:18;;:::i;:::-;-1:-1:-1;25592:9:1;;25431:176::o;25612:125::-;25652:4;25680:1;25677;25674:8;25671:2;;;25685:18;;:::i;:::-;-1:-1:-1;25722:9:1;;25661:76::o;25742:258::-;25814:1;25824:113;25838:6;25835:1;25832:13;25824:113;;;25914:11;;;25908:18;25895:11;;;25888:39;25860:2;25853:10;25824:113;;;25955:6;25952:1;25949:13;25946:2;;;-1:-1:-1;;25990:1:1;25972:16;;25965:27;25795:205::o;26005:437::-;26084:1;26080:12;;;;26127;;;26148:2;;26202:4;26194:6;26190:17;26180:27;;26148:2;26255;26247:6;26244:14;26224:18;26221:38;26218:2;;;-1:-1:-1;;;26289:1:1;26282:88;26393:4;26390:1;26383:15;26421:4;26418:1;26411:15;26218:2;;26060:382;;;:::o;26447:195::-;26486:3;-1:-1:-1;;26510:5:1;26507:77;26504:2;;;26587:18;;:::i;:::-;-1:-1:-1;26634:1:1;26623:13;;26494:148::o;26647:112::-;26679:1;26705;26695:2;;26710:18;;:::i;:::-;-1:-1:-1;26744:9:1;;26685:74::o;26764:184::-;-1:-1:-1;;;26813:1:1;26806:88;26913:4;26910:1;26903:15;26937:4;26934:1;26927:15;26953:184;-1:-1:-1;;;27002:1:1;26995:88;27102:4;27099:1;27092:15;27126:4;27123:1;27116:15;27142:184;-1:-1:-1;;;27191:1:1;27184:88;27291:4;27288:1;27281:15;27315:4;27312:1;27305:15;27331:177;27416:66;27409:5;27405:78;27398:5;27395:89;27385:2;;27498:1;27495;27488:12

Swarm Source

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