ETH Price: $3,809.87 (+4.27%)

Token

Tokenpuss (TT)
 

Overview

Max Total Supply

5,555 TT

Holders

2,475

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
6 TT
0x4B68b5A0cfc1FA1a85f6B3c0Db33f546b6Cad57c
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Tokenpuss is a collection of 5555 unique and individual meta-species fighting the blockchain towards wildlife conservation to protect their endangered cousins from Australia, the "Platypus" which faces near extinction due to habitat destruction.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
tokenpuss

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-02
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

//Developer Info:
//Written by Blockchainguy.net
//Email: [email protected]
//Instagram: @sheraz.manzoor

/**
 * @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;
    }
}
pragma solidity ^0.8.0;

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

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

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

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

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

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

        uint256 size;
        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);
            }
        }
    }
}
pragma solidity ^0.8.0;

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

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


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _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);
    }
}
pragma solidity ^0.8.0;


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


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

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

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

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

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

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

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

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

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

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

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

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


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

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

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


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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. 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 allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.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 {}
}pragma solidity ^0.8.0;


contract tokenpuss is Ownable, ERC721 {
    uint public tokenPrice = 0.05 ether;
    uint public maxSupply = 10133;
    
    uint public totalSupply = 0;
    
    uint public sale_startTime = 1639332000;
    uint public presale_startTime = 1639245600;
    bool public pause_sale = false;

    address public dev_wallet = 0xBAa6F3dDaCa46cD0F5e882f0DdA8391bB58Ffd70;

    string public baseURI;
    mapping(address => bool) private presaleList;
    constructor() ERC721("Tokenpuss", "TT"){}

   function buy(uint _count) public payable{
        require(_count > 0, "mint at least one token");
        require(_count <= 10, "Max 10 Allowed.");
        require(totalSupply + _count <= maxSupply, "Not enough tokens left");
        require(msg.value == tokenPrice * _count, "incorrect ether amount");
        require(block.timestamp >= sale_startTime,"Sale not Started Yet.");
        require(pause_sale == false, "Sale is Paused.");
        
        for(uint i = 0; i < _count; i++)
            _safeMint(msg.sender, totalSupply + 1 + i);
            
            totalSupply += _count;
    }
   function buy_Presale(uint _count) public payable{
        require(_count > 0, "mint at least one token");
        require(_count <= 10, "Max 10 Allowed.");
        require(totalSupply + _count <= maxSupply, "Not enough tokens left");
        require(msg.value == tokenPrice * _count, "incorrect ether amount");
        require(block.timestamp >= presale_startTime,"Presale have not started yet.");
        require(block.timestamp < sale_startTime,"Presale Ended.");
        require(pause_sale == false, "Sale is Paused.");

        
        
        for(uint i = 0; i < _count; i++)
            _safeMint(msg.sender, totalSupply + 1 + i);
            
            totalSupply += _count;
    }
    function sendGifts(address[] memory _wallets) public onlyOwner{
        require(totalSupply + _wallets.length <= maxSupply, "not enough tokens left");
        for(uint i = 0; i < _wallets.length; i++)
            _safeMint(_wallets[i], totalSupply + 1 + i);
        totalSupply += _wallets.length;
    }

    function addPresaleList(address[] memory _wallets) public onlyOwner{
        for(uint i; i < _wallets.length; i++)
            presaleList[_wallets[i]] = true;
    }

    function setBaseUri(string memory _uri) external onlyOwner {
        baseURI = _uri;
    }
    function setPauseSale(bool temp) external onlyOwner {
        pause_sale = temp;
    }
    
    function set_tokenPrice(uint256 _price) external onlyOwner{
        tokenPrice = _price;
    }    
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }
    function set_start_time(uint256 time) external onlyOwner{
        sale_startTime = time;
    }
    function change_dev_Wallet(address _wallet) external{
        require(msg.sender == dev_wallet , "You are not developer.");
        dev_wallet = _wallet;
    } 
    function set_max_supply(uint _limit) external onlyOwner{
        maxSupply = _limit;
    }  
    function set_total_supply(uint _limit) external onlyOwner{
        totalSupply = _limit;
    }    
    function withdraw() external onlyOwner {
        uint _balance = address(this).balance;
        payable(dev_wallet).transfer(_balance * 5 / 100);
        payable(owner()).transfer(_balance * 95 / 100);

    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"_wallets","type":"address[]"}],"name":"addPresaleList","outputs":[],"stateMutability":"nonpayable","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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"buy_Presale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"change_dev_Wallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dev_wallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause_sale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presale_startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sale_startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_wallets","type":"address[]"}],"name":"sendGifts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"temp","type":"bool"}],"name":"setPauseSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"set_max_supply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"set_start_time","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"set_tokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"set_total_supply","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":[],"name":"tokenPrice","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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405266b1a2bc2ec5000060075561279560085560006009556361b638a0600a556361b4e720600b55600c80546001600160a81b03191674baa6f3ddaca46cd0f5e882f0dda8391bb58ffd70001790553480156200005e57600080fd5b5060405180604001604052806009815260200168546f6b656e7075737360b81b81525060405180604001604052806002815260200161151560f21b815250620000b6620000b0620000ea60201b60201c565b620000ee565b8151620000cb9060019060208501906200013e565b508051620000e19060029060208401906200013e565b50505062000221565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200014c90620001e4565b90600052602060002090601f016020900481019282620001705760008555620001bb565b82601f106200018b57805160ff1916838001178555620001bb565b82800160010185558215620001bb579182015b82811115620001bb5782518255916020019190600101906200019e565b50620001c9929150620001cd565b5090565b5b80821115620001c95760008155600101620001ce565b600181811c90821680620001f957607f821691505b602082108114156200021b57634e487b7160e01b600052602260045260246000fd5b50919050565b61247080620002316000396000f3fe60806040526004361061020f5760003560e01c806386aed1f711610118578063b88d4fde116100a0578063d80641ec1161006f578063d80641ec146105c5578063d96a094a146105e5578063e985e9c5146105f8578063ebb3151014610641578063f2fde38b1461066157600080fd5b8063b88d4fde14610555578063c1580cb314610575578063c87b56dd1461058f578063d5abeb01146105af57600080fd5b806395d89b41116100e757806395d89b41146104c0578063a0bcfc7f146104d5578063a22cb465146104f5578063aa29e23f14610515578063b27b1a6d1461053557600080fd5b806386aed1f71461044f5780638a938f2f1461046f5780638aa328a21461048f5780638da5cb5b146104a257600080fd5b80633ccfd60b1161019b5780636c0360eb1161016a5780636c0360eb146103cf57806370a08231146103e4578063715018a6146104045780637c8255db146104195780637ff9b5961461043957600080fd5b80633ccfd60b1461036457806342842e0e14610379578063533d80e7146103995780636352211e146103af57600080fd5b8063081812fc116101e2578063081812fc146102b1578063095ea7b3146102e957806318160ddd1461030957806323b872dd1461031f57806333c308fb1461033f57600080fd5b806301ffc9a7146102145780630222d91e1461024957806303158dde1461026b57806306fdde031461028f575b600080fd5b34801561022057600080fd5b5061023461022f366004612084565b610681565b60405190151581526020015b60405180910390f35b34801561025557600080fd5b50610269610264366004612107565b6106d3565b005b34801561027757600080fd5b50610281600a5481565b604051908152602001610240565b34801561029b57600080fd5b506102a461070b565b60405161024091906121b8565b3480156102bd57600080fd5b506102d16102cc366004612107565b61079d565b6040516001600160a01b039091168152602001610240565b3480156102f557600080fd5b50610269610304366004611f8b565b610832565b34801561031557600080fd5b5061028160095481565b34801561032b57600080fd5b5061026961033a366004611ea9565b610948565b34801561034b57600080fd5b50600c546102d19061010090046001600160a01b031681565b34801561037057600080fd5b50610269610979565b34801561038557600080fd5b50610269610394366004611ea9565b610a4b565b3480156103a557600080fd5b50610281600b5481565b3480156103bb57600080fd5b506102d16103ca366004612107565b610a66565b3480156103db57600080fd5b506102a4610add565b3480156103f057600080fd5b506102816103ff366004611e5b565b610b6b565b34801561041057600080fd5b50610269610bf2565b34801561042557600080fd5b50610269610434366004611fb5565b610c28565b34801561044557600080fd5b5061028160075481565b34801561045b57600080fd5b5061026961046a366004612107565b610d21565b34801561047b57600080fd5b5061026961048a366004612107565b610d50565b61026961049d366004612107565b610d7f565b3480156104ae57600080fd5b506000546001600160a01b03166102d1565b3480156104cc57600080fd5b506102a4610fd6565b3480156104e157600080fd5b506102696104f03660046120be565b610fe5565b34801561050157600080fd5b50610269610510366004611f61565b611022565b34801561052157600080fd5b50610269610530366004612069565b6110e7565b34801561054157600080fd5b50610269610550366004612107565b611124565b34801561056157600080fd5b50610269610570366004611ee5565b611153565b34801561058157600080fd5b50600c546102349060ff1681565b34801561059b57600080fd5b506102a46105aa366004612107565b61118b565b3480156105bb57600080fd5b5061028160085481565b3480156105d157600080fd5b506102696105e0366004611e5b565b611266565b6102696105f3366004612107565b6112e6565b34801561060457600080fd5b50610234610613366004611e76565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561064d57600080fd5b5061026961065c366004611fb5565b6114e0565b34801561066d57600080fd5b5061026961067c366004611e5b565b611572565b60006001600160e01b031982166380ac58cd60e01b14806106b257506001600160e01b03198216635b5e139f60e01b145b806106cd57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000546001600160a01b031633146107065760405162461bcd60e51b81526004016106fd9061221d565b60405180910390fd5b600955565b60606001805461071a90612362565b80601f016020809104026020016040519081016040528092919081815260200182805461074690612362565b80156107935780601f1061076857610100808354040283529160200191610793565b820191906000526020600020905b81548152906001019060200180831161077657829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b03166108165760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106fd565b506000908152600560205260409020546001600160a01b031690565b600061083d82610a66565b9050806001600160a01b0316836001600160a01b031614156108ab5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016106fd565b336001600160a01b03821614806108c757506108c78133610613565b6109395760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016106fd565b610943838361160d565b505050565b610952338261167b565b61096e5760405162461bcd60e51b81526004016106fd90612252565b610943838383611772565b6000546001600160a01b031633146109a35760405162461bcd60e51b81526004016106fd9061221d565b600c54479061010090046001600160a01b03166108fc60646109c6846005612300565b6109d091906122ec565b6040518115909202916000818181858888f193505050501580156109f8573d6000803e3d6000fd5b506000546001600160a01b03166108fc6064610a1584605f612300565b610a1f91906122ec565b6040518115909202916000818181858888f19350505050158015610a47573d6000803e3d6000fd5b5050565b61094383838360405180602001604052806000815250611153565b6000818152600360205260408120546001600160a01b0316806106cd5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016106fd565b600d8054610aea90612362565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1690612362565b8015610b635780601f10610b3857610100808354040283529160200191610b63565b820191906000526020600020905b815481529060010190602001808311610b4657829003601f168201915b505050505081565b60006001600160a01b038216610bd65760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016106fd565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b03163314610c1c5760405162461bcd60e51b81526004016106fd9061221d565b610c266000611912565b565b6000546001600160a01b03163314610c525760405162461bcd60e51b81526004016106fd9061221d565b6008548151600954610c6491906122d4565b1115610cab5760405162461bcd60e51b81526020600482015260166024820152751b9bdd08195b9bdd59da081d1bdad95b9cc81b19599d60521b60448201526064016106fd565b60005b8151811015610d0557610cf3828281518110610ccc57610ccc6123f8565b6020026020010151826009546001610ce491906122d4565b610cee91906122d4565b611962565b80610cfd8161239d565b915050610cae565b50805160096000828254610d1991906122d4565b909155505050565b6000546001600160a01b03163314610d4b5760405162461bcd60e51b81526004016106fd9061221d565b600755565b6000546001600160a01b03163314610d7a5760405162461bcd60e51b81526004016106fd9061221d565b600855565b60008111610dc95760405162461bcd60e51b815260206004820152601760248201527636b4b73a1030ba103632b0b9ba1037b732903a37b5b2b760491b60448201526064016106fd565b600a811115610e0c5760405162461bcd60e51b815260206004820152600f60248201526e26b0bc1018981020b63637bbb2b21760891b60448201526064016106fd565b60085481600954610e1d91906122d4565b1115610e645760405162461bcd60e51b8152602060048201526016602482015275139bdd08195b9bdd59da081d1bdad95b9cc81b19599d60521b60448201526064016106fd565b80600754610e729190612300565b3414610eb95760405162461bcd60e51b81526020600482015260166024820152751a5b98dbdc9c9958dd08195d1a195c88185b5bdd5b9d60521b60448201526064016106fd565b600b54421015610f0b5760405162461bcd60e51b815260206004820152601d60248201527f50726573616c652068617665206e6f742073746172746564207965742e00000060448201526064016106fd565b600a544210610f4d5760405162461bcd60e51b815260206004820152600e60248201526d283932b9b0b6329022b73232b21760911b60448201526064016106fd565b600c5460ff1615610f925760405162461bcd60e51b815260206004820152600f60248201526e29b0b6329034b9902830bab9b2b21760891b60448201526064016106fd565b60005b81811015610fc357610fb133826009546001610ce491906122d4565b80610fbb8161239d565b915050610f95565b508060096000828254610d1991906122d4565b60606002805461071a90612362565b6000546001600160a01b0316331461100f5760405162461bcd60e51b81526004016106fd9061221d565b8051610a4790600d906020840190611d3e565b6001600160a01b03821633141561107b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016106fd565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b031633146111115760405162461bcd60e51b81526004016106fd9061221d565b600c805460ff1916911515919091179055565b6000546001600160a01b0316331461114e5760405162461bcd60e51b81526004016106fd9061221d565b600a55565b61115d338361167b565b6111795760405162461bcd60e51b81526004016106fd90612252565b6111858484848461197c565b50505050565b6000818152600360205260409020546060906001600160a01b031661120a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016106fd565b60006112146119af565b90506000815111611234576040518060200160405280600081525061125f565b8061123e846119be565b60405160200161124f92919061214c565b6040516020818303038152906040525b9392505050565b600c5461010090046001600160a01b031633146112be5760405162461bcd60e51b81526020600482015260166024820152752cb7ba9030b932903737ba103232bb32b637b832b91760511b60448201526064016106fd565b600c80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600081116113305760405162461bcd60e51b815260206004820152601760248201527636b4b73a1030ba103632b0b9ba1037b732903a37b5b2b760491b60448201526064016106fd565b600a8111156113735760405162461bcd60e51b815260206004820152600f60248201526e26b0bc1018981020b63637bbb2b21760891b60448201526064016106fd565b6008548160095461138491906122d4565b11156113cb5760405162461bcd60e51b8152602060048201526016602482015275139bdd08195b9bdd59da081d1bdad95b9cc81b19599d60521b60448201526064016106fd565b806007546113d99190612300565b34146114205760405162461bcd60e51b81526020600482015260166024820152751a5b98dbdc9c9958dd08195d1a195c88185b5bdd5b9d60521b60448201526064016106fd565b600a5442101561146a5760405162461bcd60e51b815260206004820152601560248201527429b0b632903737ba1029ba30b93a32b2102cb2ba1760591b60448201526064016106fd565b600c5460ff16156114af5760405162461bcd60e51b815260206004820152600f60248201526e29b0b6329034b9902830bab9b2b21760891b60448201526064016106fd565b60005b81811015610fc3576114ce33826009546001610ce491906122d4565b806114d88161239d565b9150506114b2565b6000546001600160a01b0316331461150a5760405162461bcd60e51b81526004016106fd9061221d565b60005b8151811015610a47576001600e600084848151811061152e5761152e6123f8565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061156a8161239d565b91505061150d565b6000546001600160a01b0316331461159c5760405162461bcd60e51b81526004016106fd9061221d565b6001600160a01b0381166116015760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106fd565b61160a81611912565b50565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061164282610a66565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b03166116f45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106fd565b60006116ff83610a66565b9050806001600160a01b0316846001600160a01b0316148061173a5750836001600160a01b031661172f8461079d565b6001600160a01b0316145b8061176a57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661178582610a66565b6001600160a01b0316146117ed5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016106fd565b6001600160a01b03821661184f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016106fd565b61185a60008261160d565b6001600160a01b038316600090815260046020526040812080546001929061188390849061231f565b90915550506001600160a01b03821660009081526004602052604081208054600192906118b19084906122d4565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610a47828260405180602001604052806000815250611abc565b611987848484611772565b61199384848484611aef565b6111855760405162461bcd60e51b81526004016106fd906121cb565b6060600d805461071a90612362565b6060816119e25750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611a0c57806119f68161239d565b9150611a059050600a836122ec565b91506119e6565b60008167ffffffffffffffff811115611a2757611a2761240e565b6040519080825280601f01601f191660200182016040528015611a51576020820181803683370190505b5090505b841561176a57611a6660018361231f565b9150611a73600a866123b8565b611a7e9060306122d4565b60f81b818381518110611a9357611a936123f8565b60200101906001600160f81b031916908160001a905350611ab5600a866122ec565b9450611a55565b611ac68383611bfc565b611ad36000848484611aef565b6109435760405162461bcd60e51b81526004016106fd906121cb565b60006001600160a01b0384163b15611bf157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611b3390339089908890889060040161217b565b602060405180830381600087803b158015611b4d57600080fd5b505af1925050508015611b7d575060408051601f3d908101601f19168201909252611b7a918101906120a1565b60015b611bd7573d808015611bab576040519150601f19603f3d011682016040523d82523d6000602084013e611bb0565b606091505b508051611bcf5760405162461bcd60e51b81526004016106fd906121cb565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061176a565b506001949350505050565b6001600160a01b038216611c525760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016106fd565b6000818152600360205260409020546001600160a01b031615611cb75760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016106fd565b6001600160a01b0382166000908152600460205260408120805460019290611ce09084906122d4565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611d4a90612362565b90600052602060002090601f016020900481019282611d6c5760008555611db2565b82601f10611d8557805160ff1916838001178555611db2565b82800160010185558215611db2579182015b82811115611db2578251825591602001919060010190611d97565b50611dbe929150611dc2565b5090565b5b80821115611dbe5760008155600101611dc3565b600067ffffffffffffffff831115611df157611df161240e565b611e04601f8401601f19166020016122a3565b9050828152838383011115611e1857600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114611e4657600080fd5b919050565b80358015158114611e4657600080fd5b600060208284031215611e6d57600080fd5b61125f82611e2f565b60008060408385031215611e8957600080fd5b611e9283611e2f565b9150611ea060208401611e2f565b90509250929050565b600080600060608486031215611ebe57600080fd5b611ec784611e2f565b9250611ed560208501611e2f565b9150604084013590509250925092565b60008060008060808587031215611efb57600080fd5b611f0485611e2f565b9350611f1260208601611e2f565b925060408501359150606085013567ffffffffffffffff811115611f3557600080fd5b8501601f81018713611f4657600080fd5b611f5587823560208401611dd7565b91505092959194509250565b60008060408385031215611f7457600080fd5b611f7d83611e2f565b9150611ea060208401611e4b565b60008060408385031215611f9e57600080fd5b611fa783611e2f565b946020939093013593505050565b60006020808385031215611fc857600080fd5b823567ffffffffffffffff80821115611fe057600080fd5b818501915085601f830112611ff457600080fd5b8135818111156120065761200661240e565b8060051b91506120178483016122a3565b8181528481019084860184860187018a101561203257600080fd5b600095505b8386101561205c5761204881611e2f565b835260019590950194918601918601612037565b5098975050505050505050565b60006020828403121561207b57600080fd5b61125f82611e4b565b60006020828403121561209657600080fd5b813561125f81612424565b6000602082840312156120b357600080fd5b815161125f81612424565b6000602082840312156120d057600080fd5b813567ffffffffffffffff8111156120e757600080fd5b8201601f810184136120f857600080fd5b61176a84823560208401611dd7565b60006020828403121561211957600080fd5b5035919050565b60008151808452612138816020860160208601612336565b601f01601f19169290920160200192915050565b6000835161215e818460208801612336565b835190830190612172818360208801612336565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906121ae90830184612120565b9695505050505050565b60208152600061125f6020830184612120565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156122cc576122cc61240e565b604052919050565b600082198211156122e7576122e76123cc565b500190565b6000826122fb576122fb6123e2565b500490565b600081600019048311821515161561231a5761231a6123cc565b500290565b600082821015612331576123316123cc565b500390565b60005b83811015612351578181015183820152602001612339565b838111156111855750506000910152565b600181811c9082168061237657607f821691505b6020821081141561239757634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156123b1576123b16123cc565b5060010190565b6000826123c7576123c76123e2565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461160a57600080fdfea2646970667358221220ef3bac5b8a3be6866ba1133bd6838f9f3dc5da8bc702a6f671a3eb6c1843e84f64736f6c63430008070033

Deployed Bytecode

0x60806040526004361061020f5760003560e01c806386aed1f711610118578063b88d4fde116100a0578063d80641ec1161006f578063d80641ec146105c5578063d96a094a146105e5578063e985e9c5146105f8578063ebb3151014610641578063f2fde38b1461066157600080fd5b8063b88d4fde14610555578063c1580cb314610575578063c87b56dd1461058f578063d5abeb01146105af57600080fd5b806395d89b41116100e757806395d89b41146104c0578063a0bcfc7f146104d5578063a22cb465146104f5578063aa29e23f14610515578063b27b1a6d1461053557600080fd5b806386aed1f71461044f5780638a938f2f1461046f5780638aa328a21461048f5780638da5cb5b146104a257600080fd5b80633ccfd60b1161019b5780636c0360eb1161016a5780636c0360eb146103cf57806370a08231146103e4578063715018a6146104045780637c8255db146104195780637ff9b5961461043957600080fd5b80633ccfd60b1461036457806342842e0e14610379578063533d80e7146103995780636352211e146103af57600080fd5b8063081812fc116101e2578063081812fc146102b1578063095ea7b3146102e957806318160ddd1461030957806323b872dd1461031f57806333c308fb1461033f57600080fd5b806301ffc9a7146102145780630222d91e1461024957806303158dde1461026b57806306fdde031461028f575b600080fd5b34801561022057600080fd5b5061023461022f366004612084565b610681565b60405190151581526020015b60405180910390f35b34801561025557600080fd5b50610269610264366004612107565b6106d3565b005b34801561027757600080fd5b50610281600a5481565b604051908152602001610240565b34801561029b57600080fd5b506102a461070b565b60405161024091906121b8565b3480156102bd57600080fd5b506102d16102cc366004612107565b61079d565b6040516001600160a01b039091168152602001610240565b3480156102f557600080fd5b50610269610304366004611f8b565b610832565b34801561031557600080fd5b5061028160095481565b34801561032b57600080fd5b5061026961033a366004611ea9565b610948565b34801561034b57600080fd5b50600c546102d19061010090046001600160a01b031681565b34801561037057600080fd5b50610269610979565b34801561038557600080fd5b50610269610394366004611ea9565b610a4b565b3480156103a557600080fd5b50610281600b5481565b3480156103bb57600080fd5b506102d16103ca366004612107565b610a66565b3480156103db57600080fd5b506102a4610add565b3480156103f057600080fd5b506102816103ff366004611e5b565b610b6b565b34801561041057600080fd5b50610269610bf2565b34801561042557600080fd5b50610269610434366004611fb5565b610c28565b34801561044557600080fd5b5061028160075481565b34801561045b57600080fd5b5061026961046a366004612107565b610d21565b34801561047b57600080fd5b5061026961048a366004612107565b610d50565b61026961049d366004612107565b610d7f565b3480156104ae57600080fd5b506000546001600160a01b03166102d1565b3480156104cc57600080fd5b506102a4610fd6565b3480156104e157600080fd5b506102696104f03660046120be565b610fe5565b34801561050157600080fd5b50610269610510366004611f61565b611022565b34801561052157600080fd5b50610269610530366004612069565b6110e7565b34801561054157600080fd5b50610269610550366004612107565b611124565b34801561056157600080fd5b50610269610570366004611ee5565b611153565b34801561058157600080fd5b50600c546102349060ff1681565b34801561059b57600080fd5b506102a46105aa366004612107565b61118b565b3480156105bb57600080fd5b5061028160085481565b3480156105d157600080fd5b506102696105e0366004611e5b565b611266565b6102696105f3366004612107565b6112e6565b34801561060457600080fd5b50610234610613366004611e76565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561064d57600080fd5b5061026961065c366004611fb5565b6114e0565b34801561066d57600080fd5b5061026961067c366004611e5b565b611572565b60006001600160e01b031982166380ac58cd60e01b14806106b257506001600160e01b03198216635b5e139f60e01b145b806106cd57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000546001600160a01b031633146107065760405162461bcd60e51b81526004016106fd9061221d565b60405180910390fd5b600955565b60606001805461071a90612362565b80601f016020809104026020016040519081016040528092919081815260200182805461074690612362565b80156107935780601f1061076857610100808354040283529160200191610793565b820191906000526020600020905b81548152906001019060200180831161077657829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b03166108165760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106fd565b506000908152600560205260409020546001600160a01b031690565b600061083d82610a66565b9050806001600160a01b0316836001600160a01b031614156108ab5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016106fd565b336001600160a01b03821614806108c757506108c78133610613565b6109395760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016106fd565b610943838361160d565b505050565b610952338261167b565b61096e5760405162461bcd60e51b81526004016106fd90612252565b610943838383611772565b6000546001600160a01b031633146109a35760405162461bcd60e51b81526004016106fd9061221d565b600c54479061010090046001600160a01b03166108fc60646109c6846005612300565b6109d091906122ec565b6040518115909202916000818181858888f193505050501580156109f8573d6000803e3d6000fd5b506000546001600160a01b03166108fc6064610a1584605f612300565b610a1f91906122ec565b6040518115909202916000818181858888f19350505050158015610a47573d6000803e3d6000fd5b5050565b61094383838360405180602001604052806000815250611153565b6000818152600360205260408120546001600160a01b0316806106cd5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016106fd565b600d8054610aea90612362565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1690612362565b8015610b635780601f10610b3857610100808354040283529160200191610b63565b820191906000526020600020905b815481529060010190602001808311610b4657829003601f168201915b505050505081565b60006001600160a01b038216610bd65760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016106fd565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b03163314610c1c5760405162461bcd60e51b81526004016106fd9061221d565b610c266000611912565b565b6000546001600160a01b03163314610c525760405162461bcd60e51b81526004016106fd9061221d565b6008548151600954610c6491906122d4565b1115610cab5760405162461bcd60e51b81526020600482015260166024820152751b9bdd08195b9bdd59da081d1bdad95b9cc81b19599d60521b60448201526064016106fd565b60005b8151811015610d0557610cf3828281518110610ccc57610ccc6123f8565b6020026020010151826009546001610ce491906122d4565b610cee91906122d4565b611962565b80610cfd8161239d565b915050610cae565b50805160096000828254610d1991906122d4565b909155505050565b6000546001600160a01b03163314610d4b5760405162461bcd60e51b81526004016106fd9061221d565b600755565b6000546001600160a01b03163314610d7a5760405162461bcd60e51b81526004016106fd9061221d565b600855565b60008111610dc95760405162461bcd60e51b815260206004820152601760248201527636b4b73a1030ba103632b0b9ba1037b732903a37b5b2b760491b60448201526064016106fd565b600a811115610e0c5760405162461bcd60e51b815260206004820152600f60248201526e26b0bc1018981020b63637bbb2b21760891b60448201526064016106fd565b60085481600954610e1d91906122d4565b1115610e645760405162461bcd60e51b8152602060048201526016602482015275139bdd08195b9bdd59da081d1bdad95b9cc81b19599d60521b60448201526064016106fd565b80600754610e729190612300565b3414610eb95760405162461bcd60e51b81526020600482015260166024820152751a5b98dbdc9c9958dd08195d1a195c88185b5bdd5b9d60521b60448201526064016106fd565b600b54421015610f0b5760405162461bcd60e51b815260206004820152601d60248201527f50726573616c652068617665206e6f742073746172746564207965742e00000060448201526064016106fd565b600a544210610f4d5760405162461bcd60e51b815260206004820152600e60248201526d283932b9b0b6329022b73232b21760911b60448201526064016106fd565b600c5460ff1615610f925760405162461bcd60e51b815260206004820152600f60248201526e29b0b6329034b9902830bab9b2b21760891b60448201526064016106fd565b60005b81811015610fc357610fb133826009546001610ce491906122d4565b80610fbb8161239d565b915050610f95565b508060096000828254610d1991906122d4565b60606002805461071a90612362565b6000546001600160a01b0316331461100f5760405162461bcd60e51b81526004016106fd9061221d565b8051610a4790600d906020840190611d3e565b6001600160a01b03821633141561107b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016106fd565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b031633146111115760405162461bcd60e51b81526004016106fd9061221d565b600c805460ff1916911515919091179055565b6000546001600160a01b0316331461114e5760405162461bcd60e51b81526004016106fd9061221d565b600a55565b61115d338361167b565b6111795760405162461bcd60e51b81526004016106fd90612252565b6111858484848461197c565b50505050565b6000818152600360205260409020546060906001600160a01b031661120a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016106fd565b60006112146119af565b90506000815111611234576040518060200160405280600081525061125f565b8061123e846119be565b60405160200161124f92919061214c565b6040516020818303038152906040525b9392505050565b600c5461010090046001600160a01b031633146112be5760405162461bcd60e51b81526020600482015260166024820152752cb7ba9030b932903737ba103232bb32b637b832b91760511b60448201526064016106fd565b600c80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600081116113305760405162461bcd60e51b815260206004820152601760248201527636b4b73a1030ba103632b0b9ba1037b732903a37b5b2b760491b60448201526064016106fd565b600a8111156113735760405162461bcd60e51b815260206004820152600f60248201526e26b0bc1018981020b63637bbb2b21760891b60448201526064016106fd565b6008548160095461138491906122d4565b11156113cb5760405162461bcd60e51b8152602060048201526016602482015275139bdd08195b9bdd59da081d1bdad95b9cc81b19599d60521b60448201526064016106fd565b806007546113d99190612300565b34146114205760405162461bcd60e51b81526020600482015260166024820152751a5b98dbdc9c9958dd08195d1a195c88185b5bdd5b9d60521b60448201526064016106fd565b600a5442101561146a5760405162461bcd60e51b815260206004820152601560248201527429b0b632903737ba1029ba30b93a32b2102cb2ba1760591b60448201526064016106fd565b600c5460ff16156114af5760405162461bcd60e51b815260206004820152600f60248201526e29b0b6329034b9902830bab9b2b21760891b60448201526064016106fd565b60005b81811015610fc3576114ce33826009546001610ce491906122d4565b806114d88161239d565b9150506114b2565b6000546001600160a01b0316331461150a5760405162461bcd60e51b81526004016106fd9061221d565b60005b8151811015610a47576001600e600084848151811061152e5761152e6123f8565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061156a8161239d565b91505061150d565b6000546001600160a01b0316331461159c5760405162461bcd60e51b81526004016106fd9061221d565b6001600160a01b0381166116015760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106fd565b61160a81611912565b50565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061164282610a66565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b03166116f45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106fd565b60006116ff83610a66565b9050806001600160a01b0316846001600160a01b0316148061173a5750836001600160a01b031661172f8461079d565b6001600160a01b0316145b8061176a57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661178582610a66565b6001600160a01b0316146117ed5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016106fd565b6001600160a01b03821661184f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016106fd565b61185a60008261160d565b6001600160a01b038316600090815260046020526040812080546001929061188390849061231f565b90915550506001600160a01b03821660009081526004602052604081208054600192906118b19084906122d4565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610a47828260405180602001604052806000815250611abc565b611987848484611772565b61199384848484611aef565b6111855760405162461bcd60e51b81526004016106fd906121cb565b6060600d805461071a90612362565b6060816119e25750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611a0c57806119f68161239d565b9150611a059050600a836122ec565b91506119e6565b60008167ffffffffffffffff811115611a2757611a2761240e565b6040519080825280601f01601f191660200182016040528015611a51576020820181803683370190505b5090505b841561176a57611a6660018361231f565b9150611a73600a866123b8565b611a7e9060306122d4565b60f81b818381518110611a9357611a936123f8565b60200101906001600160f81b031916908160001a905350611ab5600a866122ec565b9450611a55565b611ac68383611bfc565b611ad36000848484611aef565b6109435760405162461bcd60e51b81526004016106fd906121cb565b60006001600160a01b0384163b15611bf157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611b3390339089908890889060040161217b565b602060405180830381600087803b158015611b4d57600080fd5b505af1925050508015611b7d575060408051601f3d908101601f19168201909252611b7a918101906120a1565b60015b611bd7573d808015611bab576040519150601f19603f3d011682016040523d82523d6000602084013e611bb0565b606091505b508051611bcf5760405162461bcd60e51b81526004016106fd906121cb565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061176a565b506001949350505050565b6001600160a01b038216611c525760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016106fd565b6000818152600360205260409020546001600160a01b031615611cb75760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016106fd565b6001600160a01b0382166000908152600460205260408120805460019290611ce09084906122d4565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611d4a90612362565b90600052602060002090601f016020900481019282611d6c5760008555611db2565b82601f10611d8557805160ff1916838001178555611db2565b82800160010185558215611db2579182015b82811115611db2578251825591602001919060010190611d97565b50611dbe929150611dc2565b5090565b5b80821115611dbe5760008155600101611dc3565b600067ffffffffffffffff831115611df157611df161240e565b611e04601f8401601f19166020016122a3565b9050828152838383011115611e1857600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114611e4657600080fd5b919050565b80358015158114611e4657600080fd5b600060208284031215611e6d57600080fd5b61125f82611e2f565b60008060408385031215611e8957600080fd5b611e9283611e2f565b9150611ea060208401611e2f565b90509250929050565b600080600060608486031215611ebe57600080fd5b611ec784611e2f565b9250611ed560208501611e2f565b9150604084013590509250925092565b60008060008060808587031215611efb57600080fd5b611f0485611e2f565b9350611f1260208601611e2f565b925060408501359150606085013567ffffffffffffffff811115611f3557600080fd5b8501601f81018713611f4657600080fd5b611f5587823560208401611dd7565b91505092959194509250565b60008060408385031215611f7457600080fd5b611f7d83611e2f565b9150611ea060208401611e4b565b60008060408385031215611f9e57600080fd5b611fa783611e2f565b946020939093013593505050565b60006020808385031215611fc857600080fd5b823567ffffffffffffffff80821115611fe057600080fd5b818501915085601f830112611ff457600080fd5b8135818111156120065761200661240e565b8060051b91506120178483016122a3565b8181528481019084860184860187018a101561203257600080fd5b600095505b8386101561205c5761204881611e2f565b835260019590950194918601918601612037565b5098975050505050505050565b60006020828403121561207b57600080fd5b61125f82611e4b565b60006020828403121561209657600080fd5b813561125f81612424565b6000602082840312156120b357600080fd5b815161125f81612424565b6000602082840312156120d057600080fd5b813567ffffffffffffffff8111156120e757600080fd5b8201601f810184136120f857600080fd5b61176a84823560208401611dd7565b60006020828403121561211957600080fd5b5035919050565b60008151808452612138816020860160208601612336565b601f01601f19169290920160200192915050565b6000835161215e818460208801612336565b835190830190612172818360208801612336565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906121ae90830184612120565b9695505050505050565b60208152600061125f6020830184612120565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156122cc576122cc61240e565b604052919050565b600082198211156122e7576122e76123cc565b500190565b6000826122fb576122fb6123e2565b500490565b600081600019048311821515161561231a5761231a6123cc565b500290565b600082821015612331576123316123cc565b500390565b60005b83811015612351578181015183820152602001612339565b838111156111855750506000910152565b600181811c9082168061237657607f821691505b6020821081141561239757634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156123b1576123b16123cc565b5060010190565b6000826123c7576123c76123e2565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461160a57600080fdfea2646970667358221220ef3bac5b8a3be6866ba1133bd6838f9f3dc5da8bc702a6f671a3eb6c1843e84f64736f6c63430008070033

Deployed Bytecode Sourcemap

34528:3437:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22380:305;;;;;;;;;;-1:-1:-1;22380:305:0;;;;;:::i;:::-;;:::i;:::-;;;6646:14:1;;6639:22;6621:41;;6609:2;6594:18;22380:305:0;;;;;;;;37643:96;;;;;;;;;;-1:-1:-1;37643:96:0;;;;;:::i;:::-;;:::i;:::-;;34697:39;;;;;;;;;;;;;;;;;;;16920:25:1;;;16908:2;16893:18;34697:39:0;16774:177:1;23325:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24884:221::-;;;;;;;;;;-1:-1:-1;24884:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;5944:32:1;;;5926:51;;5914:2;5899:18;24884:221:0;5780:203:1;24407:411:0;;;;;;;;;;-1:-1:-1;24407:411:0;;;;;:::i;:::-;;:::i;34657:27::-;;;;;;;;;;;;;;;;25774:339;;;;;;;;;;-1:-1:-1;25774:339:0;;;;;:::i;:::-;;:::i;34831:70::-;;;;;;;;;;-1:-1:-1;34831:70:0;;;;;;;-1:-1:-1;;;;;34831:70:0;;;37749:213;;;;;;;;;;;;;:::i;26184:185::-;;;;;;;;;;-1:-1:-1;26184:185:0;;;;;:::i;:::-;;:::i;34743:42::-;;;;;;;;;;;;;;;;23019:239;;;;;;;;;;-1:-1:-1;23019:239:0;;;;;:::i;:::-;;:::i;34910:21::-;;;;;;;;;;;;;:::i;22749:208::-;;;;;;;;;;-1:-1:-1;22749:208:0;;;;;:::i;:::-;;:::i;14227:94::-;;;;;;;;;;;;;:::i;36362:308::-;;;;;;;;;;-1:-1:-1;36362:308:0;;;;;:::i;:::-;;:::i;34573:35::-;;;;;;;;;;;;;;;;37052:96;;;;;;;;;;-1:-1:-1;37052:96:0;;;;;:::i;:::-;;:::i;37543:92::-;;;;;;;;;;-1:-1:-1;37543:92:0;;;;;:::i;:::-;;:::i;35649:707::-;;;;;;:::i;:::-;;:::i;13576:87::-;;;;;;;;;;-1:-1:-1;13622:7:0;13649:6;-1:-1:-1;;;;;13649:6:0;13576:87;;23494:104;;;;;;;;;;;;;:::i;36854:92::-;;;;;;;;;;-1:-1:-1;36854:92:0;;;;;:::i;:::-;;:::i;25177:295::-;;;;;;;;;;-1:-1:-1;25177:295:0;;;;;:::i;:::-;;:::i;36952:88::-;;;;;;;;;;-1:-1:-1;36952:88:0;;;;;:::i;:::-;;:::i;37272:96::-;;;;;;;;;;-1:-1:-1;37272:96:0;;;;;:::i;:::-;;:::i;26440:328::-;;;;;;;;;;-1:-1:-1;26440:328:0;;;;;:::i;:::-;;:::i;34792:30::-;;;;;;;;;;-1:-1:-1;34792:30:0;;;;;;;;23669:334;;;;;;;;;;-1:-1:-1;23669:334:0;;;;;:::i;:::-;;:::i;34615:29::-;;;;;;;;;;;;;;;;37374:162;;;;;;;;;;-1:-1:-1;37374:162:0;;;;;:::i;:::-;;:::i;35037:607::-;;;;;;:::i;:::-;;:::i;25543:164::-;;;;;;;;;;-1:-1:-1;25543:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;25664:25:0;;;25640:4;25664:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25543:164;36678:168;;;;;;;;;;-1:-1:-1;36678:168:0;;;;;:::i;:::-;;:::i;14476:192::-;;;;;;;;;;-1:-1:-1;14476:192:0;;;;;:::i;:::-;;:::i;22380:305::-;22482:4;-1:-1:-1;;;;;;22519:40:0;;-1:-1:-1;;;22519:40:0;;:105;;-1:-1:-1;;;;;;;22576:48:0;;-1:-1:-1;;;22576:48:0;22519:105;:158;;;-1:-1:-1;;;;;;;;;;15690:40:0;;;22641:36;22499:178;22380:305;-1:-1:-1;;22380:305:0:o;37643:96::-;13622:7;13649:6;-1:-1:-1;;;;;13649:6:0;796:10;13796:23;13788:68;;;;-1:-1:-1;;;13788:68:0;;;;;;;:::i;:::-;;;;;;;;;37711:11:::1;:20:::0;37643:96::o;23325:100::-;23379:13;23412:5;23405:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23325:100;:::o;24884:221::-;24960:7;28367:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28367:16:0;24980:73;;;;-1:-1:-1;;;24980:73:0;;12114:2:1;24980:73:0;;;12096:21:1;12153:2;12133:18;;;12126:30;12192:34;12172:18;;;12165:62;-1:-1:-1;;;12243:18:1;;;12236:42;12295:19;;24980:73:0;11912:408:1;24980:73:0;-1:-1:-1;25073:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25073:24:0;;24884:221::o;24407:411::-;24488:13;24504:23;24519:7;24504:14;:23::i;:::-;24488:39;;24552:5;-1:-1:-1;;;;;24546:11:0;:2;-1:-1:-1;;;;;24546:11:0;;;24538:57;;;;-1:-1:-1;;;24538:57:0;;14422:2:1;24538:57:0;;;14404:21:1;14461:2;14441:18;;;14434:30;14500:34;14480:18;;;14473:62;-1:-1:-1;;;14551:18:1;;;14544:31;14592:19;;24538:57:0;14220:397:1;24538:57:0;796:10;-1:-1:-1;;;;;24630:21:0;;;;:62;;-1:-1:-1;24655:37:0;24672:5;796:10;25543:164;:::i;24655:37::-;24608:168;;;;-1:-1:-1;;;24608:168:0;;10156:2:1;24608:168:0;;;10138:21:1;10195:2;10175:18;;;10168:30;10234:34;10214:18;;;10207:62;10305:26;10285:18;;;10278:54;10349:19;;24608:168:0;9954:420:1;24608:168:0;24789:21;24798:2;24802:7;24789:8;:21::i;:::-;24477:341;24407:411;;:::o;25774:339::-;25969:41;796:10;26002:7;25969:18;:41::i;:::-;25961:103;;;;-1:-1:-1;;;25961:103:0;;;;;;;:::i;:::-;26077:28;26087:4;26093:2;26097:7;26077:9;:28::i;37749:213::-;13622:7;13649:6;-1:-1:-1;;;;;13649:6:0;796:10;13796:23;13788:68;;;;-1:-1:-1;;;13788:68:0;;;;;;;:::i;:::-;37855:10:::1;::::0;37815:21:::1;::::0;37855:10:::1;::::0;::::1;-1:-1:-1::0;;;;;37855:10:0::1;37847:48;37891:3;37876:12;37815:21:::0;37887:1:::1;37876:12;:::i;:::-;:18;;;;:::i;:::-;37847:48;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;13622:7:0;13649:6;-1:-1:-1;;;;;13649:6:0;37906:46:::1;37948:3;37932:13;:8:::0;37943:2:::1;37932:13;:::i;:::-;:19;;;;:::i;:::-;37906:46;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;37788:174;37749:213::o:0;26184:185::-;26322:39;26339:4;26345:2;26349:7;26322:39;;;;;;;;;;;;:16;:39::i;23019:239::-;23091:7;23127:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23127:16:0;23162:19;23154:73;;;;-1:-1:-1;;;23154:73:0;;10992:2:1;23154:73:0;;;10974:21:1;11031:2;11011:18;;;11004:30;11070:34;11050:18;;;11043:62;-1:-1:-1;;;11121:18:1;;;11114:39;11170:19;;23154:73:0;10790:405:1;34910:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22749:208::-;22821:7;-1:-1:-1;;;;;22849:19:0;;22841:74;;;;-1:-1:-1;;;22841:74:0;;10581:2:1;22841:74:0;;;10563:21:1;10620:2;10600:18;;;10593:30;10659:34;10639:18;;;10632:62;-1:-1:-1;;;10710:18:1;;;10703:40;10760:19;;22841:74:0;10379:406:1;22841:74:0;-1:-1:-1;;;;;;22933:16:0;;;;;:9;:16;;;;;;;22749:208::o;14227:94::-;13622:7;13649:6;-1:-1:-1;;;;;13649:6:0;796:10;13796:23;13788:68;;;;-1:-1:-1;;;13788:68:0;;;;;;;:::i;:::-;14292:21:::1;14310:1;14292:9;:21::i;:::-;14227:94::o:0;36362:308::-;13622:7;13649:6;-1:-1:-1;;;;;13649:6:0;796:10;13796:23;13788:68;;;;-1:-1:-1;;;13788:68:0;;;;;;;:::i;:::-;36476:9:::1;;36457:8;:15;36443:11;;:29;;;;:::i;:::-;:42;;36435:77;;;::::0;-1:-1:-1;;;36435:77:0;;15937:2:1;36435:77:0::1;::::0;::::1;15919:21:1::0;15976:2;15956:18;;;15949:30;-1:-1:-1;;;15995:18:1;;;15988:52;16057:18;;36435:77:0::1;15735:346:1::0;36435:77:0::1;36527:6;36523:98;36543:8;:15;36539:1;:19;36523:98;;;36578:43;36588:8;36597:1;36588:11;;;;;;;;:::i;:::-;;;;;;;36619:1;36601:11;;36615:1;36601:15;;;;:::i;:::-;:19;;;;:::i;:::-;36578:9;:43::i;:::-;36560:3:::0;::::1;::::0;::::1;:::i;:::-;;;;36523:98;;;;36647:8;:15;36632:11;;:30;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;36362:308:0:o;37052:96::-;13622:7;13649:6;-1:-1:-1;;;;;13649:6:0;796:10;13796:23;13788:68;;;;-1:-1:-1;;;13788:68:0;;;;;;;:::i;:::-;37121:10:::1;:19:::0;37052:96::o;37543:92::-;13622:7;13649:6;-1:-1:-1;;;;;13649:6:0;796:10;13796:23;13788:68;;;;-1:-1:-1;;;13788:68:0;;;;;;;:::i;:::-;37609:9:::1;:18:::0;37543:92::o;35649:707::-;35725:1;35716:6;:10;35708:46;;;;-1:-1:-1;;;35708:46:0;;15585:2:1;35708:46:0;;;15567:21:1;15624:2;15604:18;;;15597:30;-1:-1:-1;;;15643:18:1;;;15636:53;15706:18;;35708:46:0;15383:347:1;35708:46:0;35783:2;35773:6;:12;;35765:40;;;;-1:-1:-1;;;35765:40:0;;16288:2:1;35765:40:0;;;16270:21:1;16327:2;16307:18;;;16300:30;-1:-1:-1;;;16346:18:1;;;16339:45;16401:18;;35765:40:0;16086:339:1;35765:40:0;35848:9;;35838:6;35824:11;;:20;;;;:::i;:::-;:33;;35816:68;;;;-1:-1:-1;;;35816:68:0;;11402:2:1;35816:68:0;;;11384:21:1;11441:2;11421:18;;;11414:30;-1:-1:-1;;;11460:18:1;;;11453:52;11522:18;;35816:68:0;11200:346:1;35816:68:0;35929:6;35916:10;;:19;;;;:::i;:::-;35903:9;:32;35895:67;;;;-1:-1:-1;;;35895:67:0;;9805:2:1;35895:67:0;;;9787:21:1;9844:2;9824:18;;;9817:30;-1:-1:-1;;;9863:18:1;;;9856:52;9925:18;;35895:67:0;9603:346:1;35895:67:0;36000:17;;35981:15;:36;;35973:77;;;;-1:-1:-1;;;35973:77:0;;12888:2:1;35973:77:0;;;12870:21:1;12927:2;12907:18;;;12900:30;12966:31;12946:18;;;12939:59;13015:18;;35973:77:0;12686:353:1;35973:77:0;36087:14;;36069:15;:32;36061:58;;;;-1:-1:-1;;;36061:58:0;;14824:2:1;36061:58:0;;;14806:21:1;14863:2;14843:18;;;14836:30;-1:-1:-1;;;14882:18:1;;;14875:44;14936:18;;36061:58:0;14622:338:1;36061:58:0;36138:10;;;;:19;36130:47;;;;-1:-1:-1;;;36130:47:0;;16632:2:1;36130:47:0;;;16614:21:1;16671:2;16651:18;;;16644:30;-1:-1:-1;;;16690:18:1;;;16683:45;16745:18;;36130:47:0;16430:339:1;36130:47:0;36214:6;36210:88;36230:6;36226:1;:10;36210:88;;;36256:42;36266:10;36296:1;36278:11;;36292:1;36278:15;;;;:::i;36256:42::-;36238:3;;;;:::i;:::-;;;;36210:88;;;;36342:6;36327:11;;:21;;;;;;;:::i;23494:104::-;23550:13;23583:7;23576:14;;;;;:::i;36854:92::-;13622:7;13649:6;-1:-1:-1;;;;;13649:6:0;796:10;13796:23;13788:68;;;;-1:-1:-1;;;13788:68:0;;;;;;;:::i;:::-;36924:14;;::::1;::::0;:7:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;25177:295::-:0;-1:-1:-1;;;;;25280:24:0;;796:10;25280:24;;25272:62;;;;-1:-1:-1;;;25272:62:0;;9038:2:1;25272:62:0;;;9020:21:1;9077:2;9057:18;;;9050:30;9116:27;9096:18;;;9089:55;9161:18;;25272:62:0;8836:349:1;25272:62:0;796:10;25347:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;25347:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;25347:53:0;;;;;;;;;;25416:48;;6621:41:1;;;25347:42:0;;796:10;25416:48;;6594:18:1;25416:48:0;;;;;;;25177:295;;:::o;36952:88::-;13622:7;13649:6;-1:-1:-1;;;;;13649:6:0;796:10;13796:23;13788:68;;;;-1:-1:-1;;;13788:68:0;;;;;;;:::i;:::-;37015:10:::1;:17:::0;;-1:-1:-1;;37015:17:0::1;::::0;::::1;;::::0;;;::::1;::::0;;36952:88::o;37272:96::-;13622:7;13649:6;-1:-1:-1;;;;;13649:6:0;796:10;13796:23;13788:68;;;;-1:-1:-1;;;13788:68:0;;;;;;;:::i;:::-;37339:14:::1;:21:::0;37272:96::o;26440:328::-;26615:41;796:10;26648:7;26615:18;:41::i;:::-;26607:103;;;;-1:-1:-1;;;26607:103:0;;;;;;;:::i;:::-;26721:39;26735:4;26741:2;26745:7;26754:5;26721:13;:39::i;:::-;26440:328;;;;:::o;23669:334::-;28343:4;28367:16;;;:7;:16;;;;;;23742:13;;-1:-1:-1;;;;;28367:16:0;23768:76;;;;-1:-1:-1;;;23768:76:0;;14006:2:1;23768:76:0;;;13988:21:1;14045:2;14025:18;;;14018:30;14084:34;14064:18;;;14057:62;-1:-1:-1;;;14135:18:1;;;14128:45;14190:19;;23768:76:0;13804:411:1;23768:76:0;23857:21;23881:10;:8;:10::i;:::-;23857:34;;23933:1;23915:7;23909:21;:25;:86;;;;;;;;;;;;;;;;;23961:7;23970:18;:7;:16;:18::i;:::-;23944:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23909:86;23902:93;23669:334;-1:-1:-1;;;23669:334:0:o;37374:162::-;37459:10;;;;;-1:-1:-1;;;;;37459:10:0;37445;:24;37437:60;;;;-1:-1:-1;;;37437:60:0;;7925:2:1;37437:60:0;;;7907:21:1;7964:2;7944:18;;;7937:30;-1:-1:-1;;;7983:18:1;;;7976:52;8045:18;;37437:60:0;7723:346:1;37437:60:0;37508:10;:20;;-1:-1:-1;;;;;37508:20:0;;;;;-1:-1:-1;;;;;;37508:20:0;;;;;;;;;37374:162::o;35037:607::-;35105:1;35096:6;:10;35088:46;;;;-1:-1:-1;;;35088:46:0;;15585:2:1;35088:46:0;;;15567:21:1;15624:2;15604:18;;;15597:30;-1:-1:-1;;;15643:18:1;;;15636:53;15706:18;;35088:46:0;15383:347:1;35088:46:0;35163:2;35153:6;:12;;35145:40;;;;-1:-1:-1;;;35145:40:0;;16288:2:1;35145:40:0;;;16270:21:1;16327:2;16307:18;;;16300:30;-1:-1:-1;;;16346:18:1;;;16339:45;16401:18;;35145:40:0;16086:339:1;35145:40:0;35228:9;;35218:6;35204:11;;:20;;;;:::i;:::-;:33;;35196:68;;;;-1:-1:-1;;;35196:68:0;;11402:2:1;35196:68:0;;;11384:21:1;11441:2;11421:18;;;11414:30;-1:-1:-1;;;11460:18:1;;;11453:52;11522:18;;35196:68:0;11200:346:1;35196:68:0;35309:6;35296:10;;:19;;;;:::i;:::-;35283:9;:32;35275:67;;;;-1:-1:-1;;;35275:67:0;;9805:2:1;35275:67:0;;;9787:21:1;9844:2;9824:18;;;9817:30;-1:-1:-1;;;9863:18:1;;;9856:52;9925:18;;35275:67:0;9603:346:1;35275:67:0;35380:14;;35361:15;:33;;35353:66;;;;-1:-1:-1;;;35353:66:0;;13246:2:1;35353:66:0;;;13228:21:1;13285:2;13265:18;;;13258:30;-1:-1:-1;;;13304:18:1;;;13297:51;13365:18;;35353:66:0;13044:345:1;35353:66:0;35438:10;;;;:19;35430:47;;;;-1:-1:-1;;;35430:47:0;;16632:2:1;35430:47:0;;;16614:21:1;16671:2;16651:18;;;16644:30;-1:-1:-1;;;16690:18:1;;;16683:45;16745:18;;35430:47:0;16430:339:1;35430:47:0;35502:6;35498:88;35518:6;35514:1;:10;35498:88;;;35544:42;35554:10;35584:1;35566:11;;35580:1;35566:15;;;;:::i;35544:42::-;35526:3;;;;:::i;:::-;;;;35498:88;;36678:168;13622:7;13649:6;-1:-1:-1;;;;;13649:6:0;796:10;13796:23;13788:68;;;;-1:-1:-1;;;13788:68:0;;;;;;;:::i;:::-;36760:6:::1;36756:82;36772:8;:15;36768:1;:19;36756:82;;;36834:4;36807:11;:24;36819:8;36828:1;36819:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;36807:24:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;36807:24:0;:31;;-1:-1:-1;;36807:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;36789:3;::::1;::::0;::::1;:::i;:::-;;;;36756:82;;14476:192:::0;13622:7;13649:6;-1:-1:-1;;;;;13649:6:0;796:10;13796:23;13788:68;;;;-1:-1:-1;;;13788:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14565:22:0;::::1;14557:73;;;::::0;-1:-1:-1;;;14557:73:0;;7518:2:1;14557:73:0::1;::::0;::::1;7500:21:1::0;7557:2;7537:18;;;7530:30;7596:34;7576:18;;;7569:62;-1:-1:-1;;;7647:18:1;;;7640:36;7693:19;;14557:73:0::1;7316:402:1::0;14557:73:0::1;14641:19;14651:8;14641:9;:19::i;:::-;14476:192:::0;:::o;32260:174::-;32335:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32335:29:0;-1:-1:-1;;;;;32335:29:0;;;;;;;;:24;;32389:23;32335:24;32389:14;:23::i;:::-;-1:-1:-1;;;;;32380:46:0;;;;;;;;;;;32260:174;;:::o;28572:348::-;28665:4;28367:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28367:16:0;28682:73;;;;-1:-1:-1;;;28682:73:0;;9392:2:1;28682:73:0;;;9374:21:1;9431:2;9411:18;;;9404:30;9470:34;9450:18;;;9443:62;-1:-1:-1;;;9521:18:1;;;9514:42;9573:19;;28682:73:0;9190:408:1;28682:73:0;28766:13;28782:23;28797:7;28782:14;:23::i;:::-;28766:39;;28835:5;-1:-1:-1;;;;;28824:16:0;:7;-1:-1:-1;;;;;28824:16:0;;:51;;;;28868:7;-1:-1:-1;;;;;28844:31:0;:20;28856:7;28844:11;:20::i;:::-;-1:-1:-1;;;;;28844:31:0;;28824:51;:87;;;-1:-1:-1;;;;;;25664:25:0;;;25640:4;25664:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;28879:32;28816:96;28572:348;-1:-1:-1;;;;28572:348:0:o;31564:578::-;31723:4;-1:-1:-1;;;;;31696:31:0;:23;31711:7;31696:14;:23::i;:::-;-1:-1:-1;;;;;31696:31:0;;31688:85;;;;-1:-1:-1;;;31688:85:0;;13596:2:1;31688:85:0;;;13578:21:1;13635:2;13615:18;;;13608:30;13674:34;13654:18;;;13647:62;-1:-1:-1;;;13725:18:1;;;13718:39;13774:19;;31688:85:0;13394:405:1;31688:85:0;-1:-1:-1;;;;;31792:16:0;;31784:65;;;;-1:-1:-1;;;31784:65:0;;8633:2:1;31784:65:0;;;8615:21:1;8672:2;8652:18;;;8645:30;8711:34;8691:18;;;8684:62;-1:-1:-1;;;8762:18:1;;;8755:34;8806:19;;31784:65:0;8431:400:1;31784:65:0;31966:29;31983:1;31987:7;31966:8;:29::i;:::-;-1:-1:-1;;;;;32008:15:0;;;;;;:9;:15;;;;;:20;;32027:1;;32008:15;:20;;32027:1;;32008:20;:::i;:::-;;;;-1:-1:-1;;;;;;;32039:13:0;;;;;;:9;:13;;;;;:18;;32056:1;;32039:13;:18;;32056:1;;32039:18;:::i;:::-;;;;-1:-1:-1;;32068:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32068:21:0;-1:-1:-1;;;;;32068:21:0;;;;;;;;;32107:27;;32068:16;;32107:27;;;;;;;31564:578;;;:::o;14676:173::-;14732:16;14751:6;;-1:-1:-1;;;;;14768:17:0;;;-1:-1:-1;;;;;;14768:17:0;;;;;;14801:40;;14751:6;;;;;;;14801:40;;14732:16;14801:40;14721:128;14676:173;:::o;29262:110::-;29338:26;29348:2;29352:7;29338:26;;;;;;;;;;;;:9;:26::i;27650:315::-;27807:28;27817:4;27823:2;27827:7;27807:9;:28::i;:::-;27854:48;27877:4;27883:2;27887:7;27896:5;27854:22;:48::i;:::-;27846:111;;;;-1:-1:-1;;;27846:111:0;;;;;;;:::i;37158:108::-;37218:13;37251:7;37244:14;;;;;:::i;1181:723::-;1237:13;1458:10;1454:53;;-1:-1:-1;;1485:10:0;;;;;;;;;;;;-1:-1:-1;;;1485:10:0;;;;;1181:723::o;1454:53::-;1532:5;1517:12;1573:78;1580:9;;1573:78;;1606:8;;;;:::i;:::-;;-1:-1:-1;1629:10:0;;-1:-1:-1;1637:2:0;1629:10;;:::i;:::-;;;1573:78;;;1661:19;1693:6;1683:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1683:17:0;;1661:39;;1711:154;1718:10;;1711:154;;1745:11;1755:1;1745:11;;:::i;:::-;;-1:-1:-1;1814:10:0;1822:2;1814:5;:10;:::i;:::-;1801:24;;:2;:24;:::i;:::-;1788:39;;1771:6;1778;1771:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;1771:56:0;;;;;;;;-1:-1:-1;1842:11:0;1851:2;1842:11;;:::i;:::-;;;1711:154;;29599:321;29729:18;29735:2;29739:7;29729:5;:18::i;:::-;29780:54;29811:1;29815:2;29819:7;29828:5;29780:22;:54::i;:::-;29758:154;;;;-1:-1:-1;;;29758:154:0;;;;;;;:::i;32999:799::-;33154:4;-1:-1:-1;;;;;33175:13:0;;3969:20;4017:8;33171:620;;33211:72;;-1:-1:-1;;;33211:72:0;;-1:-1:-1;;;;;33211:36:0;;;;;:72;;796:10;;33262:4;;33268:7;;33277:5;;33211:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33211:72:0;;;;;;;;-1:-1:-1;;33211:72:0;;;;;;;;;;;;:::i;:::-;;;33207:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33453:13:0;;33449:272;;33496:60;;-1:-1:-1;;;33496:60:0;;;;;;;:::i;33449:272::-;33671:6;33665:13;33656:6;33652:2;33648:15;33641:38;33207:529;-1:-1:-1;;;;;;33334:51:0;-1:-1:-1;;;33334:51:0;;-1:-1:-1;33327:58:0;;33171:620;-1:-1:-1;33775:4:0;32999:799;;;;;;:::o;30256:382::-;-1:-1:-1;;;;;30336:16:0;;30328:61;;;;-1:-1:-1;;;30328:61:0;;11753:2:1;30328:61:0;;;11735:21:1;;;11772:18;;;11765:30;11831:34;11811:18;;;11804:62;11883:18;;30328:61:0;11551:356:1;30328:61:0;28343:4;28367:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28367:16:0;:30;30400:58;;;;-1:-1:-1;;;30400:58:0;;8276:2:1;30400:58:0;;;8258:21:1;8315:2;8295:18;;;8288:30;8354;8334:18;;;8327:58;8402:18;;30400:58:0;8074:352:1;30400:58:0;-1:-1:-1;;;;;30529:13:0;;;;;;:9;:13;;;;;:18;;30546:1;;30529:13;:18;;30546:1;;30529:18;:::i;:::-;;;;-1:-1:-1;;30558:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30558:21:0;-1:-1:-1;;;;;30558:21:0;;;;;;;;30597:33;;30558:16;;;30597:33;;30558:16;;30597:33;30256:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;522:70;425:173;;;:::o;603:160::-;668:20;;724:13;;717:21;707:32;;697:60;;753:1;750;743:12;768:186;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;919:29;938:9;919:29;:::i;959:260::-;1027:6;1035;1088:2;1076:9;1067:7;1063:23;1059:32;1056:52;;;1104:1;1101;1094:12;1056:52;1127:29;1146:9;1127:29;:::i;:::-;1117:39;;1175:38;1209:2;1198:9;1194:18;1175:38;:::i;:::-;1165:48;;959:260;;;;;:::o;1224:328::-;1301:6;1309;1317;1370:2;1358:9;1349:7;1345:23;1341:32;1338:52;;;1386:1;1383;1376:12;1338:52;1409:29;1428:9;1409:29;:::i;:::-;1399:39;;1457:38;1491:2;1480:9;1476:18;1457:38;:::i;:::-;1447:48;;1542:2;1531:9;1527:18;1514:32;1504:42;;1224:328;;;;;:::o;1557:666::-;1652:6;1660;1668;1676;1729:3;1717:9;1708:7;1704:23;1700:33;1697:53;;;1746:1;1743;1736:12;1697:53;1769:29;1788:9;1769:29;:::i;:::-;1759:39;;1817:38;1851:2;1840:9;1836:18;1817:38;:::i;:::-;1807:48;;1902:2;1891:9;1887:18;1874:32;1864:42;;1957:2;1946:9;1942:18;1929:32;1984:18;1976:6;1973:30;1970:50;;;2016:1;2013;2006:12;1970:50;2039:22;;2092:4;2084:13;;2080:27;-1:-1:-1;2070:55:1;;2121:1;2118;2111:12;2070:55;2144:73;2209:7;2204:2;2191:16;2186:2;2182;2178:11;2144:73;:::i;:::-;2134:83;;;1557:666;;;;;;;:::o;2228:254::-;2293:6;2301;2354:2;2342:9;2333:7;2329:23;2325:32;2322:52;;;2370:1;2367;2360:12;2322:52;2393:29;2412:9;2393:29;:::i;:::-;2383:39;;2441:35;2472:2;2461:9;2457:18;2441:35;:::i;2487:254::-;2555:6;2563;2616:2;2604:9;2595:7;2591:23;2587:32;2584:52;;;2632:1;2629;2622:12;2584:52;2655:29;2674:9;2655:29;:::i;:::-;2645:39;2731:2;2716:18;;;;2703:32;;-1:-1:-1;;;2487:254:1:o;2746:963::-;2830:6;2861:2;2904;2892:9;2883:7;2879:23;2875:32;2872:52;;;2920:1;2917;2910:12;2872:52;2960:9;2947:23;2989:18;3030:2;3022:6;3019:14;3016:34;;;3046:1;3043;3036:12;3016:34;3084:6;3073:9;3069:22;3059:32;;3129:7;3122:4;3118:2;3114:13;3110:27;3100:55;;3151:1;3148;3141:12;3100:55;3187:2;3174:16;3209:2;3205;3202:10;3199:36;;;3215:18;;:::i;:::-;3261:2;3258:1;3254:10;3244:20;;3284:28;3308:2;3304;3300:11;3284:28;:::i;:::-;3346:15;;;3377:12;;;;3409:11;;;3439;;;3435:20;;3432:33;-1:-1:-1;3429:53:1;;;3478:1;3475;3468:12;3429:53;3500:1;3491:10;;3510:169;3524:2;3521:1;3518:9;3510:169;;;3581:23;3600:3;3581:23;:::i;:::-;3569:36;;3542:1;3535:9;;;;;3625:12;;;;3657;;3510:169;;;-1:-1:-1;3698:5:1;2746:963;-1:-1:-1;;;;;;;;2746:963:1:o;3714:180::-;3770:6;3823:2;3811:9;3802:7;3798:23;3794:32;3791:52;;;3839:1;3836;3829:12;3791:52;3862:26;3878:9;3862:26;:::i;3899:245::-;3957:6;4010:2;3998:9;3989:7;3985:23;3981:32;3978:52;;;4026:1;4023;4016:12;3978:52;4065:9;4052:23;4084:30;4108:5;4084:30;:::i;4149:249::-;4218:6;4271:2;4259:9;4250:7;4246:23;4242:32;4239:52;;;4287:1;4284;4277:12;4239:52;4319:9;4313:16;4338:30;4362:5;4338:30;:::i;4403:450::-;4472:6;4525:2;4513:9;4504:7;4500:23;4496:32;4493:52;;;4541:1;4538;4531:12;4493:52;4581:9;4568:23;4614:18;4606:6;4603:30;4600:50;;;4646:1;4643;4636:12;4600:50;4669:22;;4722:4;4714:13;;4710:27;-1:-1:-1;4700:55:1;;4751:1;4748;4741:12;4700:55;4774:73;4839:7;4834:2;4821:16;4816:2;4812;4808:11;4774:73;:::i;4858:180::-;4917:6;4970:2;4958:9;4949:7;4945:23;4941:32;4938:52;;;4986:1;4983;4976:12;4938:52;-1:-1:-1;5009:23:1;;4858:180;-1:-1:-1;4858:180:1:o;5043:257::-;5084:3;5122:5;5116:12;5149:6;5144:3;5137:19;5165:63;5221:6;5214:4;5209:3;5205:14;5198:4;5191:5;5187:16;5165:63;:::i;:::-;5282:2;5261:15;-1:-1:-1;;5257:29:1;5248:39;;;;5289:4;5244:50;;5043:257;-1:-1:-1;;5043:257:1:o;5305:470::-;5484:3;5522:6;5516:13;5538:53;5584:6;5579:3;5572:4;5564:6;5560:17;5538:53;:::i;:::-;5654:13;;5613:16;;;;5676:57;5654:13;5613:16;5710:4;5698:17;;5676:57;:::i;:::-;5749:20;;5305:470;-1:-1:-1;;;;5305:470:1:o;5988:488::-;-1:-1:-1;;;;;6257:15:1;;;6239:34;;6309:15;;6304:2;6289:18;;6282:43;6356:2;6341:18;;6334:34;;;6404:3;6399:2;6384:18;;6377:31;;;6182:4;;6425:45;;6450:19;;6442:6;6425:45;:::i;:::-;6417:53;5988:488;-1:-1:-1;;;;;;5988:488:1:o;6673:219::-;6822:2;6811:9;6804:21;6785:4;6842:44;6882:2;6871:9;6867:18;6859:6;6842:44;:::i;6897:414::-;7099:2;7081:21;;;7138:2;7118:18;;;7111:30;7177:34;7172:2;7157:18;;7150:62;-1:-1:-1;;;7243:2:1;7228:18;;7221:48;7301:3;7286:19;;6897:414::o;12325:356::-;12527:2;12509:21;;;12546:18;;;12539:30;12605:34;12600:2;12585:18;;12578:62;12672:2;12657:18;;12325:356::o;14965:413::-;15167:2;15149:21;;;15206:2;15186:18;;;15179:30;15245:34;15240:2;15225:18;;15218:62;-1:-1:-1;;;15311:2:1;15296:18;;15289:47;15368:3;15353:19;;14965:413::o;16956:275::-;17027:2;17021:9;17092:2;17073:13;;-1:-1:-1;;17069:27:1;17057:40;;17127:18;17112:34;;17148:22;;;17109:62;17106:88;;;17174:18;;:::i;:::-;17210:2;17203:22;16956:275;;-1:-1:-1;16956:275:1:o;17236:128::-;17276:3;17307:1;17303:6;17300:1;17297:13;17294:39;;;17313:18;;:::i;:::-;-1:-1:-1;17349:9:1;;17236:128::o;17369:120::-;17409:1;17435;17425:35;;17440:18;;:::i;:::-;-1:-1:-1;17474:9:1;;17369:120::o;17494:168::-;17534:7;17600:1;17596;17592:6;17588:14;17585:1;17582:21;17577:1;17570:9;17563:17;17559:45;17556:71;;;17607:18;;:::i;:::-;-1:-1:-1;17647:9:1;;17494:168::o;17667:125::-;17707:4;17735:1;17732;17729:8;17726:34;;;17740:18;;:::i;:::-;-1:-1:-1;17777:9:1;;17667:125::o;17797:258::-;17869:1;17879:113;17893:6;17890:1;17887:13;17879:113;;;17969:11;;;17963:18;17950:11;;;17943:39;17915:2;17908:10;17879:113;;;18010:6;18007:1;18004:13;18001:48;;;-1:-1:-1;;18045:1:1;18027:16;;18020:27;17797:258::o;18060:380::-;18139:1;18135:12;;;;18182;;;18203:61;;18257:4;18249:6;18245:17;18235:27;;18203:61;18310:2;18302:6;18299:14;18279:18;18276:38;18273:161;;;18356:10;18351:3;18347:20;18344:1;18337:31;18391:4;18388:1;18381:15;18419:4;18416:1;18409:15;18273:161;;18060:380;;;:::o;18445:135::-;18484:3;-1:-1:-1;;18505:17:1;;18502:43;;;18525:18;;:::i;:::-;-1:-1:-1;18572:1:1;18561:13;;18445:135::o;18585:112::-;18617:1;18643;18633:35;;18648:18;;:::i;:::-;-1:-1:-1;18682:9:1;;18585:112::o;18702:127::-;18763:10;18758:3;18754:20;18751:1;18744:31;18794:4;18791:1;18784:15;18818:4;18815:1;18808:15;18834:127;18895:10;18890:3;18886:20;18883:1;18876:31;18926:4;18923:1;18916:15;18950:4;18947:1;18940:15;18966:127;19027:10;19022:3;19018:20;19015:1;19008:31;19058:4;19055:1;19048:15;19082:4;19079:1;19072:15;19098:127;19159:10;19154:3;19150:20;19147:1;19140:31;19190:4;19187:1;19180:15;19214:4;19211:1;19204:15;19230:131;-1:-1:-1;;;;;;19304:32:1;;19294:43;;19284:71;;19351:1;19348;19341:12

Swarm Source

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