ETH Price: $2,483.92 (+3.73%)

Pokerlook ORIGIN Avatars (PKLA)
 

Overview

TokenID

2959

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Introducing ORIGIN Avatars, the highly coveted NFT collection boasting a limited supply of only 5000 units. Each ORIGIN Avatar is a unique masterpiece, offering unparalleled value and benefits in the Pokerlook game. But what truly sets this collection apart are the 8 legendary Avatars.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Pokerlook

Compiler Version
v0.8.2+commit.661d1103

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-03-03
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * import "./IERC721.sol";
 * import "./IERC721Receiver.sol";
 * import "./extensions/IERC721Metadata.sol";
 * import "../../utils/Address.sol";
 * import "../../utils/Context.sol";
 * import "../../utils/Strings.sol";
 * import "../../utils/introspection/ERC165.sol";
 * 
 * @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 {}
}

abstract contract Auth {
    address internal owner;
    mapping(address => bool) internal authorizations;

    constructor(address _owner) {
        owner = _owner;
        authorizations[_owner] = true;
    }

    /**
     * Function modifier to require caller to be contract owner
     */
    modifier onlyOwner() {
        require(isOwner(msg.sender), "!OWNER");
        _;
    }

    /**
     * Function modifier to require caller to be authorized
     */
    modifier authorized() {
        require(isAuthorized(msg.sender), "!AUTHORIZED");
        _;
    }

    /**
     * Authorize address. Owner only
     */
    function authorize(address adr) public onlyOwner {
        authorizations[adr] = true;
    }

    /**
     * Remove address' authorization. Owner only
     */
    function unauthorize(address adr) public onlyOwner {
        authorizations[adr] = false;
    }

    /**
     * Check if address is owner
     */
    function isOwner(address account) public view returns (bool) {
        return account == owner;
    }

    /**
     * Return address' authorization status
     */
    function isAuthorized(address adr) public view returns (bool) {
        return authorizations[adr];
    }

    /**
     * Transfer ownership to new address. Caller must be owner. Leaves old owner authorized
     */
    function transferOwnership(address payable adr) public onlyOwner {
        owner = adr;
        authorizations[adr] = true;
        emit OwnershipTransferred(adr);
    }

    event OwnershipTransferred(address owner);
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

contract Pokerlook is ERC721Enumerable, Auth {
    using SafeMath for uint256;

    string baseTokenURI;
    bool public isPublic = false;
    bool public isPrivate = true;

    uint256 public maxSupply = 5000;
    uint256 public privateSupply = 0;
    uint256 public privatePrice = 0.15 ether;
    uint256 public publicPrice = 0.1 ether;
    address adminWallet = 0x11a7070D70fF0aDDFf7A641f074DBf76075Bcb32;
    address devWallet = 0x11a7070D70fF0aDDFf7A641f074DBf76075Bcb32;
    uint256 devFee = 100; // 10%
    uint256 public maxMintNumber = 20;
    uint256[5000] private _availableTokens;
    uint256 private _numAvailableTokens = 5000;

    struct User {
        bool referred;
        address referred_by;
        uint256 earnings_1;
        uint256 earnings_2;
        uint256 earnings_3;
    }
    struct Referral_levels {
        uint256 level_1;
        uint256 level_2;
        uint256 level_3;
    }
    uint256[3] referral_fees = [100, 50, 25]; // unit 1000 (2.5% = 25)
    mapping(address => Referral_levels) public refer_info;
    mapping(address => User) public user_info;

    event TokenMint(address indexed to, uint256 tokenId);
    event SetPrice(uint256 _value);
    event MaxMintNumber(uint256 _value);
    event ChangePublic(bool _value);
    event ChangePrivate(bool _value);
    event SetPrivatePrice(uint256 _value);
    event ChangePrivateSupply(uint256 _value);

    constructor() ERC721("Pokerlook ORIGIN Avatars", "PKLA") payable Auth(msg.sender) { }

    function changePublic() external authorized {
        isPublic = !isPublic;
        emit ChangePublic(isPublic);
    }

    function setPublicPrice(uint256 _publicPrice) external authorized {
        publicPrice = _publicPrice;
        emit SetPrice(_publicPrice);
    }

    function setMaxMintNumber(uint256 _maxMintNumber) external authorized {
        require(_maxMintNumber <= 200, "Too many tokens for one mint!");
        maxMintNumber = _maxMintNumber;
        emit MaxMintNumber(maxMintNumber);
    }

    function setPrivateSupply(uint256 _privateSupply) external authorized {
        require(_privateSupply > totalSupply(), "Private supply should be more than current supply");
        privateSupply = _privateSupply;
        emit ChangePrivateSupply(privateSupply);
    }

    function changePrivate() external authorized {
        isPrivate = !isPrivate;
        emit ChangePrivate(isPrivate);
    }

    function setPrivatePrice(uint256 _privatePrice) external authorized {
        privatePrice = _privatePrice;
        emit SetPrivatePrice(privatePrice);
    }

    function setBaseTokenURI(string memory _baseTokenURI) external authorized {
        baseTokenURI = _baseTokenURI;
    }

    function tokenURI(uint256 _tokenId) override public view returns (string memory) {
        string memory _tokenURI = Strings.toString(_tokenId);
        return string(abi.encodePacked(baseTokenURI, _tokenURI, ".json"));
    }

    function mint(uint256 _number, address ref_addr) public payable {
        require(_number <= maxMintNumber, "Too many tokens to mint at once.");
        if (isPrivate) {
            require(privateSupply > totalSupply(), "Private sale is sold!");
            require(msg.value >= privatePrice.mul(_number), "Amount is not enough!");
            if (_number.add(totalSupply()) > privateSupply) {
                _number = privateSupply.sub(totalSupply());
                isPrivate = false;
                emit ChangePrivate(false);
            }
        } else {
            require(isPublic, "Minting is paused!");
            require(msg.value >= publicPrice.mul(_number), "Amount is not enough!");
        }
        require(_number.add(totalSupply()) <= maxSupply, "No tokens available for minting!");
        referee(ref_addr);
        uint256 devAmount = msg.value.mul(devFee).div(1000);
        (bool dev, ) = payable(devWallet).call{value: devAmount}("");
        require(dev);
        uint256 amount = refereeFee(msg.sender, msg.value);
        uint256 adminAmount = amount.sub(devAmount);
        (bool admin, ) = payable(adminWallet).call{value: adminAmount}("");
        require(admin);
        for (uint256 i = 1; i <= _number; i++) {
            uint256 _mintIndex = useRandomAvailableToken(_number, i);
            _safeMint(ref_addr, _mintIndex); //msg.sender 
            emit TokenMint(ref_addr, _mintIndex); //_msgSender()
        }
    }

    function useRandomAvailableToken(uint256 _numToFetch, uint256 _i) internal returns (uint256) {
        uint256 randomNum = uint256(
            keccak256(
                abi.encode(
                    msg.sender,
                    tx.gasprice,
                    block.number,
                    block.timestamp,
                    blockhash(block.number - 1),
                    _numToFetch,
                    _i
                )
            )
        );
        uint256 randomIndex = (randomNum % _numAvailableTokens);
        return useAvailableTokenAtIndex(randomIndex);
    }
    
    function useAvailableTokenAtIndex(uint256 indexToUse) internal returns (uint256) {
        uint256 valAtIndex = _availableTokens[indexToUse];
        uint256 result;
        if (valAtIndex == 0) {
            result = indexToUse;
        } else {
            result = valAtIndex;
        }
        uint256 lastIndex = _numAvailableTokens - 1;
        if (indexToUse != lastIndex) {
            uint256 lastValInArray = _availableTokens[lastIndex];
            if (lastValInArray == 0) {
               if (lastIndex == 0) {
                    _availableTokens[indexToUse] = maxSupply;
                } else {
                    _availableTokens[indexToUse] = lastIndex;
                }
            } else {
                _availableTokens[indexToUse] = lastValInArray;
            }
        }
        _numAvailableTokens--;
        return result;
    }

    function updateAdminWallet(address _adminWallet) external onlyOwner {
        adminWallet = _adminWallet;
    }

    function updateDevWallet(address _devWallet) external {
        require(msg.sender == devWallet, "You are not a dev.");
        devWallet = _devWallet;
    }

    function setReferralFees(uint256 level1_fee, uint256 level2_fee, uint256 level3_fee) external authorized {
        require(level1_fee + level2_fee + level3_fee < 500, "Too big fee for referrals!");
        referral_fees[0] = level1_fee;
        referral_fees[1] = level2_fee;
        referral_fees[2] = level3_fee;
    }

    function referee(address ref_add) internal {
        if (user_info[msg.sender].referred == false && ref_add != msg.sender && ref_add != address(0)) {
            user_info[msg.sender].referred_by = ref_add;
            user_info[msg.sender].referred = true;

            address level1 = user_info[msg.sender].referred_by;
            address level2 = user_info[level1].referred_by;
            address level3 = user_info[level2].referred_by;

            if ((level1 != msg.sender) && (level1 != address(0))) {
                refer_info[level1].level_1 += 1;
            }
            if ((level2 != msg.sender) && (level2 != address(0))) {
                refer_info[level2].level_2 += 1;
            }
            if ((level3 != msg.sender) && (level3 != address(0))) {
                refer_info[level3].level_3 += 1;
            }
        }
    }

    function refereeFee(address account, uint256 amount) internal returns(uint256) {
        if (user_info[account].referred) {
            address level1 = user_info[account].referred_by;
            address level2 = user_info[level1].referred_by;
            address level3 = user_info[level2].referred_by;
            uint256 amount1  = amount.mul(referral_fees[0]).div(1000);
            uint256 amount2  = amount.mul(referral_fees[1]).div(1000);
            uint256 amount3  = amount.mul(referral_fees[2]).div(1000);
            if ((level1 != account) && (level1 != address(0))) {
                (bool state1, ) = payable(level1).call{value: amount1}("");
                require(state1);
                amount = amount.sub(amount1);
                user_info[level1].earnings_1 = user_info[level1].earnings_1.add(amount1);
            }
            if ((level2 != account) && (level2 != address(0))) {
                (bool state2, ) = payable(level2).call{value: amount2}("");
                require(state2);
                amount = amount.sub(amount2);
                user_info[level2].earnings_2 = user_info[level2].earnings_2.add(amount2);
            }
            if ((level3 != account) && (level3 != address(0))) {
                (bool state3, ) = payable(level3).call{value: amount3}("");
                require(state3);
                amount = amount.sub(amount3);
                user_info[level3].earnings_3 = user_info[level3].earnings_3.add(amount3);
            }
        }
        return amount;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","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":false,"internalType":"bool","name":"_value","type":"bool"}],"name":"ChangePrivate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"ChangePrivateSupply","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_value","type":"bool"}],"name":"ChangePublic","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"MaxMintNumber","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"SetPrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"SetPrivatePrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"TokenMint","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":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"authorize","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":"changePrivate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changePublic","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"adr","type":"address"}],"name":"isAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPrivate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublic","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_number","type":"uint256"},{"internalType":"address","name":"ref_addr","type":"address"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"privatePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"refer_info","outputs":[{"internalType":"uint256","name":"level_1","type":"uint256"},{"internalType":"uint256","name":"level_2","type":"uint256"},{"internalType":"uint256","name":"level_3","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintNumber","type":"uint256"}],"name":"setMaxMintNumber","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_privatePrice","type":"uint256"}],"name":"setPrivatePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_privateSupply","type":"uint256"}],"name":"setPrivateSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicPrice","type":"uint256"}],"name":"setPublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"level1_fee","type":"uint256"},{"internalType":"uint256","name":"level2_fee","type":"uint256"},{"internalType":"uint256","name":"level3_fee","type":"uint256"}],"name":"setReferralFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"adr","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"unauthorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_adminWallet","type":"address"}],"name":"updateAdminWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devWallet","type":"address"}],"name":"updateDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"user_info","outputs":[{"internalType":"bool","name":"referred","type":"bool"},{"internalType":"address","name":"referred_by","type":"address"},{"internalType":"uint256","name":"earnings_1","type":"uint256"},{"internalType":"uint256","name":"earnings_2","type":"uint256"},{"internalType":"uint256","name":"earnings_3","type":"uint256"}],"stateMutability":"view","type":"function"}]

600d805461ffff1916610100179055611388600e8190556000600f55670214e8348c4f000060105567016345785d8a0000601155601280546001600160a01b03199081167311a7070d70ff0addff7a641f074dbf76075bcb329081179092556013805490911690911790556064601481815560155561139e9190915560e06040526080908152603260a052601960c052620000a09061139f9060036200015a565b50604080518082018252601881527f506f6b65726c6f6f6b204f524947494e20417661746172730000000000000000602080830191825283518085019094526004845263504b4c4160e01b908401528151339391620001039160009190620001a2565b50805162000119906001906020840190620001a2565b5050600a80546001600160a01b039093166001600160a01b031990931683179055506000908152600b60205260409020805460ff1916600117905562000273565b826003810192821562000190579160200282015b8281111562000190578251829060ff169055916020019190600101906200016e565b506200019e9291506200021f565b5090565b828054620001b09062000236565b90600052602060002090601f016020900481019282620001d4576000855562000190565b82601f10620001ef57805160ff191683800117855562000190565b8280016001018555821562000190579182015b828111156200019057825182559160200191906001019062000202565b5b808211156200019e576000815560010162000220565b6002810460018216806200024b57607f821691505b602082108114156200026d57634e487b7160e01b600052602260045260246000fd5b50919050565b61305880620002836000396000f3fe6080604052600436106102465760003560e01c806391d9c4ed11610139578063c87b56dd116100b6578063e62cb46e1161007a578063e62cb46e1461072e578063e985e9c514610743578063f0b37c041461078c578063f2fde38b146107ac578063faff660e146107cc578063fe9fbb80146107eb57610246565b8063c87b56dd14610666578063d067358314610686578063d5abeb01146106a6578063dbf80fec146106bc578063dc9a15351461071457610246565b8063a22cb465116100fd578063a22cb465146105d0578063a945bf80146105f0578063b6a5d7de14610606578063b88d4fde14610626578063c62752551461064657610246565b806391d9c4ed1461055257806394bf804d1461057257806395d89b41146105855780639a997c471461059a578063a10f151e146105b057610246565b806330176e13116101c75780635eec08701161018b5780635eec0870146104bc5780636352211e146104dc57806370a08231146104fc57806387c0568b1461051c578063897045461461053257610246565b806330176e131461043157806342842e0e14610451578063492a1629146104715780634f6ccce71461048657806356bd182d146104a657610246565b80631816467f1161020e5780631816467f1461031b57806321058d2a1461033b57806323b872dd146103c25780632f54bf6e146103e25780632f745c591461041157610246565b806301ffc9a71461024b57806306fdde0314610280578063081812fc146102a2578063095ea7b3146102da57806318160ddd146102fc575b600080fd5b34801561025757600080fd5b5061026b610266366004612b96565b61080b565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b50610295610838565b6040516102779190612db1565b3480156102ae57600080fd5b506102c26102bd366004612c14565b6108ca565b6040516001600160a01b039091168152602001610277565b3480156102e657600080fd5b506102fa6102f5366004612b6b565b610964565b005b34801561030857600080fd5b506008545b604051908152602001610277565b34801561032757600080fd5b506102fa610336366004612a29565b610a7a565b34801561034757600080fd5b50610390610356366004612a29565b6113a360205260009081526040902080546001820154600283015460039093015460ff8316936101009093046001600160a01b0316929085565b6040805195151586526001600160a01b039094166020860152928401919091526060830152608082015260a001610277565b3480156103ce57600080fd5b506102fa6103dd366004612a7d565b610aeb565b3480156103ee57600080fd5b5061026b6103fd366004612a29565b600a546001600160a01b0390811691161490565b34801561041d57600080fd5b5061030d61042c366004612b6b565b610b1c565b34801561043d57600080fd5b506102fa61044c366004612bce565b610bb2565b34801561045d57600080fd5b506102fa61046c366004612a7d565b610bee565b34801561047d57600080fd5b506102fa610c09565b34801561049257600080fd5b5061030d6104a1366004612c14565b610c80565b3480156104b257600080fd5b5061030d600f5481565b3480156104c857600080fd5b506102fa6104d7366004612a29565b610d21565b3480156104e857600080fd5b506102c26104f7366004612c14565b610d6d565b34801561050857600080fd5b5061030d610517366004612a29565b610de4565b34801561052857600080fd5b5061030d60105481565b34801561053e57600080fd5b506102fa61054d366004612c50565b610e6b565b34801561055e57600080fd5b506102fa61056d366004612c14565b610f06565b6102fa610580366004612c2c565b610fb8565b34801561059157600080fd5b506102956113bc565b3480156105a657600080fd5b5061030d60155481565b3480156105bc57600080fd5b506102fa6105cb366004612c14565b6113cb565b3480156105dc57600080fd5b506102fa6105eb366004612b3a565b611425565b3480156105fc57600080fd5b5061030d60115481565b34801561061257600080fd5b506102fa610621366004612a29565b6114f7565b34801561063257600080fd5b506102fa610641366004612abd565b611545565b34801561065257600080fd5b506102fa610661366004612c14565b61157d565b34801561067257600080fd5b50610295610681366004612c14565b6115d7565b34801561069257600080fd5b506102fa6106a1366004612c14565b611611565b3480156106b257600080fd5b5061030d600e5481565b3480156106c857600080fd5b506106f96106d7366004612a29565b6113a26020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610277565b34801561072057600080fd5b50600d5461026b9060ff1681565b34801561073a57600080fd5b506102fa6116d6565b34801561074f57600080fd5b5061026b61075e366004612a45565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561079857600080fd5b506102fa6107a7366004612a29565b611753565b3480156107b857600080fd5b506102fa6107c7366004612a29565b61179e565b3480156107d857600080fd5b50600d5461026b90610100900460ff1681565b3480156107f757600080fd5b5061026b610806366004612a29565b611830565b60006001600160e01b0319821663780e9d6360e01b148061083057506108308261184e565b90505b919050565b60606000805461084790612f51565b80601f016020809104026020016040519081016040528092919081815260200182805461087390612f51565b80156108c05780601f10610895576101008083540402835291602001916108c0565b820191906000526020600020905b8154815290600101906020018083116108a357829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109485760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061096f82610d6d565b9050806001600160a01b0316836001600160a01b031614156109dd5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161093f565b336001600160a01b03821614806109f957506109f9813361075e565b610a6b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161093f565b610a75838361189e565b505050565b6013546001600160a01b03163314610ac95760405162461bcd60e51b81526020600482015260126024820152712cb7ba9030b932903737ba1030903232bb1760711b604482015260640161093f565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b610af5338261190c565b610b115760405162461bcd60e51b815260040161093f90612e36565b610a75838383611a03565b6000610b2783610de4565b8210610b895760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161093f565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610bbb33611830565b610bd75760405162461bcd60e51b815260040161093f90612e87565b8051610bea90600c90602084019061291a565b5050565b610a7583838360405180602001604052806000815250611545565b610c1233611830565b610c2e5760405162461bcd60e51b815260040161093f90612e87565b600d805460ff19811660ff9182161517918290556040517ff35e7f85b714ecbd62a45b6269c072c67fa2f41e4467a7612df441c6ec2fae9492610c7692161515815260200190565b60405180910390a1565b6000610c8b60085490565b8210610cee5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161093f565b60088281548110610d0f57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600a546001600160a01b03163314610d4b5760405162461bcd60e51b815260040161093f90612e16565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600260205260408120546001600160a01b0316806108305760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161093f565b60006001600160a01b038216610e4f5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161093f565b506001600160a01b031660009081526003602052604090205490565b610e7433611830565b610e905760405162461bcd60e51b815260040161093f90612e87565b6101f481610e9e8486612eac565b610ea89190612eac565b10610ef55760405162461bcd60e51b815260206004820152601a60248201527f546f6f206269672066656520666f7220726566657272616c7321000000000000604482015260640161093f565b61139f929092556113a0556113a155565b610f0f33611830565b610f2b5760405162461bcd60e51b815260040161093f90612e87565b60c8811115610f7c5760405162461bcd60e51b815260206004820152601d60248201527f546f6f206d616e7920746f6b656e7320666f72206f6e65206d696e7421000000604482015260640161093f565b60158190556040518181527f540af958bf28c91b5dfb1fa9e8b0329bda30813960dc8b6f1711d995aec3c779906020015b60405180910390a150565b60155482111561100a5760405162461bcd60e51b815260206004820181905260248201527f546f6f206d616e7920746f6b656e7320746f206d696e74206174206f6e63652e604482015260640161093f565b600d54610100900460ff161561113257600854600f54116110655760405162461bcd60e51b8152602060048201526015602482015274507269766174652073616c6520697320736f6c642160581b604482015260640161093f565b6010546110729083611bae565b3410156110b95760405162461bcd60e51b8152602060048201526015602482015274416d6f756e74206973206e6f7420656e6f7567682160581b604482015260640161093f565b600f546110cf6110c860085490565b8490611bc1565b111561112d576110ea6110e160085490565b600f5490611bcd565b600d805461ff0019169055604051600081529092507f271fd4f40231b04dc2cdec4c65a09f89fe8cb2dbb3a70dd716fff2017d53b93f9060200160405180910390a15b6111cd565b600d5460ff166111795760405162461bcd60e51b81526020600482015260126024820152714d696e74696e67206973207061757365642160701b604482015260640161093f565b6011546111869083611bae565b3410156111cd5760405162461bcd60e51b8152602060048201526015602482015274416d6f756e74206973206e6f7420656e6f7567682160581b604482015260640161093f565b600e546111dc6110c860085490565b111561122a5760405162461bcd60e51b815260206004820181905260248201527f4e6f20746f6b656e7320617661696c61626c6520666f72206d696e74696e6721604482015260640161093f565b61123381611bd9565b60006112566103e861125060145434611bae90919063ffffffff16565b90611d85565b6013546040519192506000916001600160a01b039091169083908381818185875af1925050503d80600081146112a8576040519150601f19603f3d011682016040523d82523d6000602084013e6112ad565b606091505b50509050806112bb57600080fd5b60006112c73334611d91565b905060006112d58285611bcd565b6012546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114611327576040519150601f19603f3d011682016040523d82523d6000602084013e61132c565b606091505b505090508061133a57600080fd5b60015b8781116113b257600061135089836120f7565b905061135c8882612188565b876001600160a01b03167f36bf5aa3964be01dbd95a0154a8930793fe68353bdc580871ffb2c911366bbc78260405161139791815260200190565b60405180910390a250806113aa81612f86565b91505061133d565b5050505050505050565b60606001805461084790612f51565b6113d433611830565b6113f05760405162461bcd60e51b815260040161093f90612e87565b60108190556040518181527f8a81ba946dafb8f106b660022186fe69243575cf4a67b9673cadb007d0b138c290602001610fad565b6001600160a01b03821633141561147e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161093f565b3360008181526005602090815260408083206001600160a01b0387168085529252909120805460ff1916841515179055906001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114eb911515815260200190565b60405180910390a35050565b600a546001600160a01b031633146115215760405162461bcd60e51b815260040161093f90612e16565b6001600160a01b03166000908152600b60205260409020805460ff19166001179055565b61154f338361190c565b61156b5760405162461bcd60e51b815260040161093f90612e36565b611577848484846121a2565b50505050565b61158633611830565b6115a25760405162461bcd60e51b815260040161093f90612e87565b60118190556040518181527f4f5539c0409dfc4cb06f64cbd31237e1fbfe443f531584bf4dd77ec7fc5ba7b190602001610fad565b606060006115e4836121d5565b9050600c816040516020016115fa929190612cc3565b604051602081830303815290604052915050919050565b61161a33611830565b6116365760405162461bcd60e51b815260040161093f90612e87565b60085481116116a15760405162461bcd60e51b815260206004820152603160248201527f5072697661746520737570706c792073686f756c64206265206d6f7265207468604482015270616e2063757272656e7420737570706c7960781b606482015260840161093f565b600f8190556040518181527f9f989c825e903c1304253f5fad1cd0245f5f27c790539742140e7aa443e718a690602001610fad565b6116df33611830565b6116fb5760405162461bcd60e51b815260040161093f90612e87565b600d805460ff610100808304821615810261ff001990931692909217928390556040517f271fd4f40231b04dc2cdec4c65a09f89fe8cb2dbb3a70dd716fff2017d53b93f93610c769390049091161515815260200190565b600a546001600160a01b0316331461177d5760405162461bcd60e51b815260040161093f90612e16565b6001600160a01b03166000908152600b60205260409020805460ff19169055565b600a546001600160a01b031633146117c85760405162461bcd60e51b815260040161093f90612e16565b600a80546001600160a01b0319166001600160a01b0383169081179091556000818152600b6020908152604091829020805460ff1916600117905590519182527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639101610fad565b6001600160a01b03166000908152600b602052604090205460ff1690565b60006001600160e01b031982166380ac58cd60e01b148061187f57506001600160e01b03198216635b5e139f60e01b145b8061083057506301ffc9a760e01b6001600160e01b0319831614610830565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906118d382610d6d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166119855760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161093f565b600061199083610d6d565b9050806001600160a01b0316846001600160a01b031614806119cb5750836001600160a01b03166119c0846108ca565b6001600160a01b0316145b806119fb57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611a1682610d6d565b6001600160a01b031614611a7e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161093f565b6001600160a01b038216611ae05760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161093f565b611aeb8383836122f0565b611af660008261189e565b6001600160a01b0383166000908152600360205260408120805460019290611b1f908490612ef7565b90915550506001600160a01b0382166000908152600360205260408120805460019290611b4d908490612eac565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000611bba8284612ed8565b9392505050565b6000611bba8284612eac565b6000611bba8284612ef7565b3360009081526113a3602052604090205460ff16158015611c0357506001600160a01b0381163314155b8015611c1757506001600160a01b03811615155b15611d82573360008181526113a3602052604080822080546001610100600160a81b03199091166101006001600160a01b0388811682029290921760ff191692909217928390559181900482168085528385205482900483168086529390942054939492930416908314801590611c9657506001600160a01b03831615155b15611ccb576001600160a01b03831660009081526113a260205260408120805460019290611cc5908490612eac565b90915550505b6001600160a01b0382163314801590611cec57506001600160a01b03821615155b15611d26576001600160a01b03821660009081526113a2602052604081206001908101805491929091611d20908490612eac565b90915550505b6001600160a01b0381163314801590611d4757506001600160a01b03811615155b15611577576001600160a01b03811660009081526113a260205260408120600201805460019290611d79908490612eac565b90915550505050505b50565b6000611bba8284612ec4565b6001600160a01b03821660009081526113a3602052604081205460ff16156120f1576001600160a01b0380841660009081526113a3602052604080822054610100908190048416808452828420548290048516808552928420549094929391900490911690611e0c6103e861125061139f8401548990611bae565b90506000611e276103e861125061139f600101548a90611bae565b90506000611e426103e861125061139f600201548b90611bae565b9050886001600160a01b0316866001600160a01b031614158015611e6e57506001600160a01b03861615155b15611f26576000866001600160a01b03168460405160006040518083038185875af1925050503d8060008114611ec0576040519150601f19603f3d011682016040523d82523d6000602084013e611ec5565b606091505b5050905080611ed357600080fd5b611edd8985611bcd565b6001600160a01b03881660009081526113a36020526040902060010154909950611f079085611bc1565b6001600160a01b03881660009081526113a36020526040902060010155505b886001600160a01b0316856001600160a01b031614158015611f5057506001600160a01b03851615155b15612008576000856001600160a01b03168360405160006040518083038185875af1925050503d8060008114611fa2576040519150601f19603f3d011682016040523d82523d6000602084013e611fa7565b606091505b5050905080611fb557600080fd5b611fbf8984611bcd565b6001600160a01b03871660009081526113a36020526040902060020154909950611fe99084611bc1565b6001600160a01b03871660009081526113a36020526040902060020155505b886001600160a01b0316846001600160a01b03161415801561203257506001600160a01b03841615155b156120ea576000846001600160a01b03168260405160006040518083038185875af1925050503d8060008114612084576040519150601f19603f3d011682016040523d82523d6000602084013e612089565b606091505b505090508061209757600080fd5b6120a18983611bcd565b6001600160a01b03861660009081526113a360205260409020600301549099506120cb9083611bc1565b6001600160a01b03861660009081526113a36020526040902060030155505b5050505050505b50919050565b600080333a4342612109600183612ef7565b604080516001600160a01b039096166020870152850193909352606084019190915260808301524060a082015260c0810185905260e08101849052610100016040516020818303038152906040528051906020012060001c9050600061139e54826121749190612fa1565b905061217f816123ad565b95945050505050565b610bea8282604051806020016040528060008152506124d2565b6121ad848484611a03565b6121b984848484612505565b6115775760405162461bcd60e51b815260040161093f90612dc4565b6060816121fa57506040805180820190915260018152600360fc1b6020820152610833565b8160005b8115612224578061220e81612f86565b915061221d9050600a83612ec4565b91506121fe565b60008167ffffffffffffffff81111561224d57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612277576020820181803683370190505b5090505b84156119fb5761228c600183612ef7565b9150612299600a86612fa1565b6122a4906030612eac565b60f81b8183815181106122c757634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506122e9600a86612ec4565b945061227b565b6001600160a01b03831661234b5761234681600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61236e565b816001600160a01b0316836001600160a01b03161461236e5761236e8382612612565b6001600160a01b03821661238a57612385816126af565b610a75565b826001600160a01b0316826001600160a01b031614610a7557610a758282612788565b60008060168361138881106123d257634e487b7160e01b600052603260045260246000fd5b015490506000816123e45750826123e7565b50805b6000600161139e546123f99190612ef7565b90508085146124b3576000601682611388811061242657634e487b7160e01b600052603260045260246000fd5b015490508061248b578161246057600e54601687611388811061245957634e487b7160e01b600052603260045260246000fd5b0155612486565b81601687611388811061248357634e487b7160e01b600052603260045260246000fd5b01555b6124b1565b8060168761138881106124ae57634e487b7160e01b600052603260045260246000fd5b01555b505b61139e80549060006124c483612f3a565b909155509195945050505050565b6124dc83836127cc565b6124e96000848484612505565b610a755760405162461bcd60e51b815260040161093f90612dc4565b60006001600160a01b0384163b1561260757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612549903390899088908890600401612d74565b602060405180830381600087803b15801561256357600080fd5b505af1925050508015612593575060408051601f3d908101601f1916820190925261259091810190612bb2565b60015b6125ed573d8080156125c1576040519150601f19603f3d011682016040523d82523d6000602084013e6125c6565b606091505b5080516125e55760405162461bcd60e51b815260040161093f90612dc4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506119fb565b506001949350505050565b6000600161261f84610de4565b6126299190612ef7565b60008381526007602052604090205490915080821461267c576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906126c190600190612ef7565b600083815260096020526040812054600880549394509092849081106126f757634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061272657634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061276c57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061279383610de4565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166128225760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161093f565b6000818152600260205260409020546001600160a01b0316156128875760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161093f565b612893600083836122f0565b6001600160a01b03821660009081526003602052604081208054600192906128bc908490612eac565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461292690612f51565b90600052602060002090601f016020900481019282612948576000855561298e565b82601f1061296157805160ff191683800117855561298e565b8280016001018555821561298e579182015b8281111561298e578251825591602001919060010190612973565b5061299a92915061299e565b5090565b5b8082111561299a576000815560010161299f565b600067ffffffffffffffff808411156129ce576129ce612fe1565b604051601f8501601f19908116603f011681019082821181831017156129f6576129f6612fe1565b81604052809350858152868686011115612a0f57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612a3a578081fd5b8135611bba81612ff7565b60008060408385031215612a57578081fd5b8235612a6281612ff7565b91506020830135612a7281612ff7565b809150509250929050565b600080600060608486031215612a91578081fd5b8335612a9c81612ff7565b92506020840135612aac81612ff7565b929592945050506040919091013590565b60008060008060808587031215612ad2578081fd5b8435612add81612ff7565b93506020850135612aed81612ff7565b925060408501359150606085013567ffffffffffffffff811115612b0f578182fd5b8501601f81018713612b1f578182fd5b612b2e878235602084016129b3565b91505092959194509250565b60008060408385031215612b4c578182fd5b8235612b5781612ff7565b915060208301358015158114612a72578182fd5b60008060408385031215612b7d578182fd5b8235612b8881612ff7565b946020939093013593505050565b600060208284031215612ba7578081fd5b8135611bba8161300c565b600060208284031215612bc3578081fd5b8151611bba8161300c565b600060208284031215612bdf578081fd5b813567ffffffffffffffff811115612bf5578182fd5b8201601f81018413612c05578182fd5b6119fb848235602084016129b3565b600060208284031215612c25578081fd5b5035919050565b60008060408385031215612c3e578182fd5b823591506020830135612a7281612ff7565b600080600060608486031215612c64578283fd5b505081359360208301359350604090920135919050565b60008151808452612c93816020860160208601612f0e565b601f01601f19169290920160200192915050565b60008151612cb9818560208601612f0e565b9290920192915050565b8254600090819060028104600180831680612cdf57607f831692505b6020808410821415612cff57634e487b7160e01b87526022600452602487fd5b818015612d135760018114612d2457612d50565b60ff19861689528489019650612d50565b60008b815260209020885b86811015612d485781548b820152908501908301612d2f565b505084890196505b50505050505061217f612d638286612ca7565b64173539b7b760d91b815260050190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612da790830184612c7b565b9695505050505050565b600060208252611bba6020830184612c7b565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526006908201526510a7aba722a960d11b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252600b908201526a085055551213d49256915160aa1b604082015260600190565b60008219821115612ebf57612ebf612fb5565b500190565b600082612ed357612ed3612fcb565b500490565b6000816000190483118215151615612ef257612ef2612fb5565b500290565b600082821015612f0957612f09612fb5565b500390565b60005b83811015612f29578181015183820152602001612f11565b838111156115775750506000910152565b600081612f4957612f49612fb5565b506000190190565b600281046001821680612f6557607f821691505b602082108114156120f157634e487b7160e01b600052602260045260246000fd5b6000600019821415612f9a57612f9a612fb5565b5060010190565b600082612fb057612fb0612fcb565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611d8257600080fd5b6001600160e01b031981168114611d8257600080fdfea26469706673582212201335fcc94170d111698d1fe3e62f983703ca416a898c93528e035a1bea0bbbfc64736f6c63430008020033

Deployed Bytecode

0x6080604052600436106102465760003560e01c806391d9c4ed11610139578063c87b56dd116100b6578063e62cb46e1161007a578063e62cb46e1461072e578063e985e9c514610743578063f0b37c041461078c578063f2fde38b146107ac578063faff660e146107cc578063fe9fbb80146107eb57610246565b8063c87b56dd14610666578063d067358314610686578063d5abeb01146106a6578063dbf80fec146106bc578063dc9a15351461071457610246565b8063a22cb465116100fd578063a22cb465146105d0578063a945bf80146105f0578063b6a5d7de14610606578063b88d4fde14610626578063c62752551461064657610246565b806391d9c4ed1461055257806394bf804d1461057257806395d89b41146105855780639a997c471461059a578063a10f151e146105b057610246565b806330176e13116101c75780635eec08701161018b5780635eec0870146104bc5780636352211e146104dc57806370a08231146104fc57806387c0568b1461051c578063897045461461053257610246565b806330176e131461043157806342842e0e14610451578063492a1629146104715780634f6ccce71461048657806356bd182d146104a657610246565b80631816467f1161020e5780631816467f1461031b57806321058d2a1461033b57806323b872dd146103c25780632f54bf6e146103e25780632f745c591461041157610246565b806301ffc9a71461024b57806306fdde0314610280578063081812fc146102a2578063095ea7b3146102da57806318160ddd146102fc575b600080fd5b34801561025757600080fd5b5061026b610266366004612b96565b61080b565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b50610295610838565b6040516102779190612db1565b3480156102ae57600080fd5b506102c26102bd366004612c14565b6108ca565b6040516001600160a01b039091168152602001610277565b3480156102e657600080fd5b506102fa6102f5366004612b6b565b610964565b005b34801561030857600080fd5b506008545b604051908152602001610277565b34801561032757600080fd5b506102fa610336366004612a29565b610a7a565b34801561034757600080fd5b50610390610356366004612a29565b6113a360205260009081526040902080546001820154600283015460039093015460ff8316936101009093046001600160a01b0316929085565b6040805195151586526001600160a01b039094166020860152928401919091526060830152608082015260a001610277565b3480156103ce57600080fd5b506102fa6103dd366004612a7d565b610aeb565b3480156103ee57600080fd5b5061026b6103fd366004612a29565b600a546001600160a01b0390811691161490565b34801561041d57600080fd5b5061030d61042c366004612b6b565b610b1c565b34801561043d57600080fd5b506102fa61044c366004612bce565b610bb2565b34801561045d57600080fd5b506102fa61046c366004612a7d565b610bee565b34801561047d57600080fd5b506102fa610c09565b34801561049257600080fd5b5061030d6104a1366004612c14565b610c80565b3480156104b257600080fd5b5061030d600f5481565b3480156104c857600080fd5b506102fa6104d7366004612a29565b610d21565b3480156104e857600080fd5b506102c26104f7366004612c14565b610d6d565b34801561050857600080fd5b5061030d610517366004612a29565b610de4565b34801561052857600080fd5b5061030d60105481565b34801561053e57600080fd5b506102fa61054d366004612c50565b610e6b565b34801561055e57600080fd5b506102fa61056d366004612c14565b610f06565b6102fa610580366004612c2c565b610fb8565b34801561059157600080fd5b506102956113bc565b3480156105a657600080fd5b5061030d60155481565b3480156105bc57600080fd5b506102fa6105cb366004612c14565b6113cb565b3480156105dc57600080fd5b506102fa6105eb366004612b3a565b611425565b3480156105fc57600080fd5b5061030d60115481565b34801561061257600080fd5b506102fa610621366004612a29565b6114f7565b34801561063257600080fd5b506102fa610641366004612abd565b611545565b34801561065257600080fd5b506102fa610661366004612c14565b61157d565b34801561067257600080fd5b50610295610681366004612c14565b6115d7565b34801561069257600080fd5b506102fa6106a1366004612c14565b611611565b3480156106b257600080fd5b5061030d600e5481565b3480156106c857600080fd5b506106f96106d7366004612a29565b6113a26020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610277565b34801561072057600080fd5b50600d5461026b9060ff1681565b34801561073a57600080fd5b506102fa6116d6565b34801561074f57600080fd5b5061026b61075e366004612a45565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561079857600080fd5b506102fa6107a7366004612a29565b611753565b3480156107b857600080fd5b506102fa6107c7366004612a29565b61179e565b3480156107d857600080fd5b50600d5461026b90610100900460ff1681565b3480156107f757600080fd5b5061026b610806366004612a29565b611830565b60006001600160e01b0319821663780e9d6360e01b148061083057506108308261184e565b90505b919050565b60606000805461084790612f51565b80601f016020809104026020016040519081016040528092919081815260200182805461087390612f51565b80156108c05780601f10610895576101008083540402835291602001916108c0565b820191906000526020600020905b8154815290600101906020018083116108a357829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109485760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061096f82610d6d565b9050806001600160a01b0316836001600160a01b031614156109dd5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161093f565b336001600160a01b03821614806109f957506109f9813361075e565b610a6b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161093f565b610a75838361189e565b505050565b6013546001600160a01b03163314610ac95760405162461bcd60e51b81526020600482015260126024820152712cb7ba9030b932903737ba1030903232bb1760711b604482015260640161093f565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b610af5338261190c565b610b115760405162461bcd60e51b815260040161093f90612e36565b610a75838383611a03565b6000610b2783610de4565b8210610b895760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161093f565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610bbb33611830565b610bd75760405162461bcd60e51b815260040161093f90612e87565b8051610bea90600c90602084019061291a565b5050565b610a7583838360405180602001604052806000815250611545565b610c1233611830565b610c2e5760405162461bcd60e51b815260040161093f90612e87565b600d805460ff19811660ff9182161517918290556040517ff35e7f85b714ecbd62a45b6269c072c67fa2f41e4467a7612df441c6ec2fae9492610c7692161515815260200190565b60405180910390a1565b6000610c8b60085490565b8210610cee5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161093f565b60088281548110610d0f57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600a546001600160a01b03163314610d4b5760405162461bcd60e51b815260040161093f90612e16565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600260205260408120546001600160a01b0316806108305760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161093f565b60006001600160a01b038216610e4f5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161093f565b506001600160a01b031660009081526003602052604090205490565b610e7433611830565b610e905760405162461bcd60e51b815260040161093f90612e87565b6101f481610e9e8486612eac565b610ea89190612eac565b10610ef55760405162461bcd60e51b815260206004820152601a60248201527f546f6f206269672066656520666f7220726566657272616c7321000000000000604482015260640161093f565b61139f929092556113a0556113a155565b610f0f33611830565b610f2b5760405162461bcd60e51b815260040161093f90612e87565b60c8811115610f7c5760405162461bcd60e51b815260206004820152601d60248201527f546f6f206d616e7920746f6b656e7320666f72206f6e65206d696e7421000000604482015260640161093f565b60158190556040518181527f540af958bf28c91b5dfb1fa9e8b0329bda30813960dc8b6f1711d995aec3c779906020015b60405180910390a150565b60155482111561100a5760405162461bcd60e51b815260206004820181905260248201527f546f6f206d616e7920746f6b656e7320746f206d696e74206174206f6e63652e604482015260640161093f565b600d54610100900460ff161561113257600854600f54116110655760405162461bcd60e51b8152602060048201526015602482015274507269766174652073616c6520697320736f6c642160581b604482015260640161093f565b6010546110729083611bae565b3410156110b95760405162461bcd60e51b8152602060048201526015602482015274416d6f756e74206973206e6f7420656e6f7567682160581b604482015260640161093f565b600f546110cf6110c860085490565b8490611bc1565b111561112d576110ea6110e160085490565b600f5490611bcd565b600d805461ff0019169055604051600081529092507f271fd4f40231b04dc2cdec4c65a09f89fe8cb2dbb3a70dd716fff2017d53b93f9060200160405180910390a15b6111cd565b600d5460ff166111795760405162461bcd60e51b81526020600482015260126024820152714d696e74696e67206973207061757365642160701b604482015260640161093f565b6011546111869083611bae565b3410156111cd5760405162461bcd60e51b8152602060048201526015602482015274416d6f756e74206973206e6f7420656e6f7567682160581b604482015260640161093f565b600e546111dc6110c860085490565b111561122a5760405162461bcd60e51b815260206004820181905260248201527f4e6f20746f6b656e7320617661696c61626c6520666f72206d696e74696e6721604482015260640161093f565b61123381611bd9565b60006112566103e861125060145434611bae90919063ffffffff16565b90611d85565b6013546040519192506000916001600160a01b039091169083908381818185875af1925050503d80600081146112a8576040519150601f19603f3d011682016040523d82523d6000602084013e6112ad565b606091505b50509050806112bb57600080fd5b60006112c73334611d91565b905060006112d58285611bcd565b6012546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114611327576040519150601f19603f3d011682016040523d82523d6000602084013e61132c565b606091505b505090508061133a57600080fd5b60015b8781116113b257600061135089836120f7565b905061135c8882612188565b876001600160a01b03167f36bf5aa3964be01dbd95a0154a8930793fe68353bdc580871ffb2c911366bbc78260405161139791815260200190565b60405180910390a250806113aa81612f86565b91505061133d565b5050505050505050565b60606001805461084790612f51565b6113d433611830565b6113f05760405162461bcd60e51b815260040161093f90612e87565b60108190556040518181527f8a81ba946dafb8f106b660022186fe69243575cf4a67b9673cadb007d0b138c290602001610fad565b6001600160a01b03821633141561147e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161093f565b3360008181526005602090815260408083206001600160a01b0387168085529252909120805460ff1916841515179055906001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114eb911515815260200190565b60405180910390a35050565b600a546001600160a01b031633146115215760405162461bcd60e51b815260040161093f90612e16565b6001600160a01b03166000908152600b60205260409020805460ff19166001179055565b61154f338361190c565b61156b5760405162461bcd60e51b815260040161093f90612e36565b611577848484846121a2565b50505050565b61158633611830565b6115a25760405162461bcd60e51b815260040161093f90612e87565b60118190556040518181527f4f5539c0409dfc4cb06f64cbd31237e1fbfe443f531584bf4dd77ec7fc5ba7b190602001610fad565b606060006115e4836121d5565b9050600c816040516020016115fa929190612cc3565b604051602081830303815290604052915050919050565b61161a33611830565b6116365760405162461bcd60e51b815260040161093f90612e87565b60085481116116a15760405162461bcd60e51b815260206004820152603160248201527f5072697661746520737570706c792073686f756c64206265206d6f7265207468604482015270616e2063757272656e7420737570706c7960781b606482015260840161093f565b600f8190556040518181527f9f989c825e903c1304253f5fad1cd0245f5f27c790539742140e7aa443e718a690602001610fad565b6116df33611830565b6116fb5760405162461bcd60e51b815260040161093f90612e87565b600d805460ff610100808304821615810261ff001990931692909217928390556040517f271fd4f40231b04dc2cdec4c65a09f89fe8cb2dbb3a70dd716fff2017d53b93f93610c769390049091161515815260200190565b600a546001600160a01b0316331461177d5760405162461bcd60e51b815260040161093f90612e16565b6001600160a01b03166000908152600b60205260409020805460ff19169055565b600a546001600160a01b031633146117c85760405162461bcd60e51b815260040161093f90612e16565b600a80546001600160a01b0319166001600160a01b0383169081179091556000818152600b6020908152604091829020805460ff1916600117905590519182527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639101610fad565b6001600160a01b03166000908152600b602052604090205460ff1690565b60006001600160e01b031982166380ac58cd60e01b148061187f57506001600160e01b03198216635b5e139f60e01b145b8061083057506301ffc9a760e01b6001600160e01b0319831614610830565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906118d382610d6d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166119855760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161093f565b600061199083610d6d565b9050806001600160a01b0316846001600160a01b031614806119cb5750836001600160a01b03166119c0846108ca565b6001600160a01b0316145b806119fb57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611a1682610d6d565b6001600160a01b031614611a7e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161093f565b6001600160a01b038216611ae05760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161093f565b611aeb8383836122f0565b611af660008261189e565b6001600160a01b0383166000908152600360205260408120805460019290611b1f908490612ef7565b90915550506001600160a01b0382166000908152600360205260408120805460019290611b4d908490612eac565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000611bba8284612ed8565b9392505050565b6000611bba8284612eac565b6000611bba8284612ef7565b3360009081526113a3602052604090205460ff16158015611c0357506001600160a01b0381163314155b8015611c1757506001600160a01b03811615155b15611d82573360008181526113a3602052604080822080546001610100600160a81b03199091166101006001600160a01b0388811682029290921760ff191692909217928390559181900482168085528385205482900483168086529390942054939492930416908314801590611c9657506001600160a01b03831615155b15611ccb576001600160a01b03831660009081526113a260205260408120805460019290611cc5908490612eac565b90915550505b6001600160a01b0382163314801590611cec57506001600160a01b03821615155b15611d26576001600160a01b03821660009081526113a2602052604081206001908101805491929091611d20908490612eac565b90915550505b6001600160a01b0381163314801590611d4757506001600160a01b03811615155b15611577576001600160a01b03811660009081526113a260205260408120600201805460019290611d79908490612eac565b90915550505050505b50565b6000611bba8284612ec4565b6001600160a01b03821660009081526113a3602052604081205460ff16156120f1576001600160a01b0380841660009081526113a3602052604080822054610100908190048416808452828420548290048516808552928420549094929391900490911690611e0c6103e861125061139f8401548990611bae565b90506000611e276103e861125061139f600101548a90611bae565b90506000611e426103e861125061139f600201548b90611bae565b9050886001600160a01b0316866001600160a01b031614158015611e6e57506001600160a01b03861615155b15611f26576000866001600160a01b03168460405160006040518083038185875af1925050503d8060008114611ec0576040519150601f19603f3d011682016040523d82523d6000602084013e611ec5565b606091505b5050905080611ed357600080fd5b611edd8985611bcd565b6001600160a01b03881660009081526113a36020526040902060010154909950611f079085611bc1565b6001600160a01b03881660009081526113a36020526040902060010155505b886001600160a01b0316856001600160a01b031614158015611f5057506001600160a01b03851615155b15612008576000856001600160a01b03168360405160006040518083038185875af1925050503d8060008114611fa2576040519150601f19603f3d011682016040523d82523d6000602084013e611fa7565b606091505b5050905080611fb557600080fd5b611fbf8984611bcd565b6001600160a01b03871660009081526113a36020526040902060020154909950611fe99084611bc1565b6001600160a01b03871660009081526113a36020526040902060020155505b886001600160a01b0316846001600160a01b03161415801561203257506001600160a01b03841615155b156120ea576000846001600160a01b03168260405160006040518083038185875af1925050503d8060008114612084576040519150601f19603f3d011682016040523d82523d6000602084013e612089565b606091505b505090508061209757600080fd5b6120a18983611bcd565b6001600160a01b03861660009081526113a360205260409020600301549099506120cb9083611bc1565b6001600160a01b03861660009081526113a36020526040902060030155505b5050505050505b50919050565b600080333a4342612109600183612ef7565b604080516001600160a01b039096166020870152850193909352606084019190915260808301524060a082015260c0810185905260e08101849052610100016040516020818303038152906040528051906020012060001c9050600061139e54826121749190612fa1565b905061217f816123ad565b95945050505050565b610bea8282604051806020016040528060008152506124d2565b6121ad848484611a03565b6121b984848484612505565b6115775760405162461bcd60e51b815260040161093f90612dc4565b6060816121fa57506040805180820190915260018152600360fc1b6020820152610833565b8160005b8115612224578061220e81612f86565b915061221d9050600a83612ec4565b91506121fe565b60008167ffffffffffffffff81111561224d57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612277576020820181803683370190505b5090505b84156119fb5761228c600183612ef7565b9150612299600a86612fa1565b6122a4906030612eac565b60f81b8183815181106122c757634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506122e9600a86612ec4565b945061227b565b6001600160a01b03831661234b5761234681600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61236e565b816001600160a01b0316836001600160a01b03161461236e5761236e8382612612565b6001600160a01b03821661238a57612385816126af565b610a75565b826001600160a01b0316826001600160a01b031614610a7557610a758282612788565b60008060168361138881106123d257634e487b7160e01b600052603260045260246000fd5b015490506000816123e45750826123e7565b50805b6000600161139e546123f99190612ef7565b90508085146124b3576000601682611388811061242657634e487b7160e01b600052603260045260246000fd5b015490508061248b578161246057600e54601687611388811061245957634e487b7160e01b600052603260045260246000fd5b0155612486565b81601687611388811061248357634e487b7160e01b600052603260045260246000fd5b01555b6124b1565b8060168761138881106124ae57634e487b7160e01b600052603260045260246000fd5b01555b505b61139e80549060006124c483612f3a565b909155509195945050505050565b6124dc83836127cc565b6124e96000848484612505565b610a755760405162461bcd60e51b815260040161093f90612dc4565b60006001600160a01b0384163b1561260757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612549903390899088908890600401612d74565b602060405180830381600087803b15801561256357600080fd5b505af1925050508015612593575060408051601f3d908101601f1916820190925261259091810190612bb2565b60015b6125ed573d8080156125c1576040519150601f19603f3d011682016040523d82523d6000602084013e6125c6565b606091505b5080516125e55760405162461bcd60e51b815260040161093f90612dc4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506119fb565b506001949350505050565b6000600161261f84610de4565b6126299190612ef7565b60008381526007602052604090205490915080821461267c576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906126c190600190612ef7565b600083815260096020526040812054600880549394509092849081106126f757634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061272657634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061276c57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061279383610de4565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166128225760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161093f565b6000818152600260205260409020546001600160a01b0316156128875760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161093f565b612893600083836122f0565b6001600160a01b03821660009081526003602052604081208054600192906128bc908490612eac565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461292690612f51565b90600052602060002090601f016020900481019282612948576000855561298e565b82601f1061296157805160ff191683800117855561298e565b8280016001018555821561298e579182015b8281111561298e578251825591602001919060010190612973565b5061299a92915061299e565b5090565b5b8082111561299a576000815560010161299f565b600067ffffffffffffffff808411156129ce576129ce612fe1565b604051601f8501601f19908116603f011681019082821181831017156129f6576129f6612fe1565b81604052809350858152868686011115612a0f57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612a3a578081fd5b8135611bba81612ff7565b60008060408385031215612a57578081fd5b8235612a6281612ff7565b91506020830135612a7281612ff7565b809150509250929050565b600080600060608486031215612a91578081fd5b8335612a9c81612ff7565b92506020840135612aac81612ff7565b929592945050506040919091013590565b60008060008060808587031215612ad2578081fd5b8435612add81612ff7565b93506020850135612aed81612ff7565b925060408501359150606085013567ffffffffffffffff811115612b0f578182fd5b8501601f81018713612b1f578182fd5b612b2e878235602084016129b3565b91505092959194509250565b60008060408385031215612b4c578182fd5b8235612b5781612ff7565b915060208301358015158114612a72578182fd5b60008060408385031215612b7d578182fd5b8235612b8881612ff7565b946020939093013593505050565b600060208284031215612ba7578081fd5b8135611bba8161300c565b600060208284031215612bc3578081fd5b8151611bba8161300c565b600060208284031215612bdf578081fd5b813567ffffffffffffffff811115612bf5578182fd5b8201601f81018413612c05578182fd5b6119fb848235602084016129b3565b600060208284031215612c25578081fd5b5035919050565b60008060408385031215612c3e578182fd5b823591506020830135612a7281612ff7565b600080600060608486031215612c64578283fd5b505081359360208301359350604090920135919050565b60008151808452612c93816020860160208601612f0e565b601f01601f19169290920160200192915050565b60008151612cb9818560208601612f0e565b9290920192915050565b8254600090819060028104600180831680612cdf57607f831692505b6020808410821415612cff57634e487b7160e01b87526022600452602487fd5b818015612d135760018114612d2457612d50565b60ff19861689528489019650612d50565b60008b815260209020885b86811015612d485781548b820152908501908301612d2f565b505084890196505b50505050505061217f612d638286612ca7565b64173539b7b760d91b815260050190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612da790830184612c7b565b9695505050505050565b600060208252611bba6020830184612c7b565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526006908201526510a7aba722a960d11b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252600b908201526a085055551213d49256915160aa1b604082015260600190565b60008219821115612ebf57612ebf612fb5565b500190565b600082612ed357612ed3612fcb565b500490565b6000816000190483118215151615612ef257612ef2612fb5565b500290565b600082821015612f0957612f09612fb5565b500390565b60005b83811015612f29578181015183820152602001612f11565b838111156115775750506000910152565b600081612f4957612f49612fb5565b506000190190565b600281046001821680612f6557607f821691505b602082108114156120f157634e487b7160e01b600052602260045260246000fd5b6000600019821415612f9a57612f9a612fb5565b5060010190565b600082612fb057612fb0612fcb565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611d8257600080fd5b6001600160e01b031981168114611d8257600080fdfea26469706673582212201335fcc94170d111698d1fe3e62f983703ca416a898c93528e035a1bea0bbbfc64736f6c63430008020033

Deployed Bytecode Sourcemap

48615:9069:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42467:224;;;;;;;;;;-1:-1:-1;42467:224:0;;;;;:::i;:::-;;:::i;:::-;;;9330:14:1;;9323:22;9305:41;;9293:2;9278:18;42467:224:0;;;;;;;;21951:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23510:221::-;;;;;;;;;;-1:-1:-1;23510:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7774:32:1;;;7756:51;;7744:2;7729:18;23510:221:0;7711:102:1;23033:411:0;;;;;;;;;;-1:-1:-1;23033:411:0;;;;;:::i;:::-;;:::i;:::-;;43107:113;;;;;;;;;;-1:-1:-1;43195:10:0;:17;43107:113;;;20175:25:1;;;20163:2;20148:18;43107:113:0;20130:76:1;54745:160:0;;;;;;;;;;-1:-1:-1;54745:160:0;;;;;:::i;:::-;;:::i;49693:41::-;;;;;;;;;;-1:-1:-1;49693:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49693:41:0;;;;;;;;;9635:14:1;;9628:22;9610:41;;-1:-1:-1;;;;;9687:32:1;;;9682:2;9667:18;;9660:60;9736:18;;;9729:34;;;;9794:2;9779:18;;9772:34;9837:3;9822:19;;9815:35;9597:3;9582:19;49693:41:0;9564:292:1;24400:339:0;;;;;;;;;;-1:-1:-1;24400:339:0;;;;;:::i;:::-;;:::i;34106:103::-;;;;;;;;;;-1:-1:-1;34106:103:0;;;;;:::i;:::-;34196:5;;-1:-1:-1;;;;;34196:5:0;;;34185:16;;;;34106:103;42775:256;;;;;;;;;;-1:-1:-1;42775:256:0;;;;;:::i;:::-;;:::i;51258:121::-;;;;;;;;;;-1:-1:-1;51258:121:0;;;;;:::i;:::-;;:::i;24810:185::-;;;;;;;;;;-1:-1:-1;24810:185:0;;;;;:::i;:::-;;:::i;50145:121::-;;;;;;;;;;;;;:::i;43297:233::-;;;;;;;;;;-1:-1:-1;43297:233:0;;;;;:::i;:::-;;:::i;48838:32::-;;;;;;;;;;;;;;;;54624:113;;;;;;;;;;-1:-1:-1;54624:113:0;;;;;:::i;:::-;;:::i;21645:239::-;;;;;;;;;;-1:-1:-1;21645:239:0;;;;;:::i;:::-;;:::i;21375:208::-;;;;;;;;;;-1:-1:-1;21375:208:0;;;;;:::i;:::-;;:::i;48877:40::-;;;;;;;;;;;;;;;;54913:325;;;;;;;;;;-1:-1:-1;54913:325:0;;;;;:::i;:::-;;:::i;50431:237::-;;;;;;;;;;-1:-1:-1;50431:237:0;;;;;:::i;:::-;;:::i;51623:1485::-;;;;;;:::i;:::-;;:::i;22120:104::-;;;;;;;;;;;;;:::i;49143:33::-;;;;;;;;;;;;;;;;51090:160;;;;;;;;;;-1:-1:-1;51090:160:0;;;;;:::i;:::-;;:::i;23803:295::-;;;;;;;;;;-1:-1:-1;23803:295:0;;;;;:::i;:::-;;:::i;48924:38::-;;;;;;;;;;;;;;;;33779:94;;;;;;;;;;-1:-1:-1;33779:94:0;;;;;:::i;:::-;;:::i;25066:328::-;;;;;;;;;;-1:-1:-1;25066:328:0;;;;;:::i;:::-;;:::i;50274:149::-;;;;;;;;;;-1:-1:-1;50274:149:0;;;;;:::i;:::-;;:::i;51387:228::-;;;;;;;;;;-1:-1:-1;51387:228:0;;;;;:::i;:::-;;:::i;50676:272::-;;;;;;;;;;-1:-1:-1;50676:272:0;;;;;:::i;:::-;;:::i;48800:31::-;;;;;;;;;;;;;;;;49633:53;;;;;;;;;;-1:-1:-1;49633:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20413:25:1;;;20469:2;20454:18;;20447:34;;;;20497:18;;;20490:34;20401:2;20386:18;49633:53:0;20368:162:1;48728:28:0;;;;;;;;;;-1:-1:-1;48728:28:0;;;;;;;;50956:126;;;;;;;;;;;;;:::i;24169:164::-;;;;;;;;;;-1:-1:-1;24169:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;24290:25:0;;;24266:4;24290:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24169:164;33949:97;;;;;;;;;;-1:-1:-1;33949:97:0;;;;;:::i;:::-;;:::i;34506:173::-;;;;;;;;;;-1:-1:-1;34506:173:0;;;;;:::i;:::-;;:::i;48763:28::-;;;;;;;;;;-1:-1:-1;48763:28:0;;;;;;;;;;;34280:107;;;;;;;;;;-1:-1:-1;34280:107:0;;;;;:::i;:::-;;:::i;42467:224::-;42569:4;-1:-1:-1;;;;;;42593:50:0;;-1:-1:-1;;;42593:50:0;;:90;;;42647:36;42671:11;42647:23;:36::i;:::-;42586:97;;42467:224;;;;:::o;21951:100::-;22005:13;22038:5;22031:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21951:100;:::o;23510:221::-;23586:7;26993:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26993:16:0;23606:73;;;;-1:-1:-1;;;23606:73:0;;15662:2:1;23606:73:0;;;15644:21:1;15701:2;15681:18;;;15674:30;15740:34;15720:18;;;15713:62;-1:-1:-1;;;15791:18:1;;;15784:42;15843:19;;23606:73:0;;;;;;;;;-1:-1:-1;23699:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23699:24:0;;23510:221::o;23033:411::-;23114:13;23130:23;23145:7;23130:14;:23::i;:::-;23114:39;;23178:5;-1:-1:-1;;;;;23172:11:0;:2;-1:-1:-1;;;;;23172:11:0;;;23164:57;;;;-1:-1:-1;;;23164:57:0;;16840:2:1;23164:57:0;;;16822:21:1;16879:2;16859:18;;;16852:30;16918:34;16898:18;;;16891:62;-1:-1:-1;;;16969:18:1;;;16962:31;17010:19;;23164:57:0;16812:223:1;23164:57:0;8986:10;-1:-1:-1;;;;;23256:21:0;;;;:62;;-1:-1:-1;23281:37:0;23298:5;8986:10;23305:12;8906:98;23281:37;23234:168;;;;-1:-1:-1;;;23234:168:0;;13694:2:1;23234:168:0;;;13676:21:1;13733:2;13713:18;;;13706:30;13772:34;13752:18;;;13745:62;13843:26;13823:18;;;13816:54;13887:19;;23234:168:0;13666:246:1;23234:168:0;23415:21;23424:2;23428:7;23415:8;:21::i;:::-;23033:411;;;:::o;54745:160::-;54832:9;;-1:-1:-1;;;;;54832:9:0;54818:10;:23;54810:54;;;;-1:-1:-1;;;54810:54:0;;18355:2:1;54810:54:0;;;18337:21:1;18394:2;18374:18;;;18367:30;-1:-1:-1;;;18413:18:1;;;18406:48;18471:18;;54810:54:0;18327:168:1;54810:54:0;54875:9;:22;;-1:-1:-1;;;;;;54875:22:0;-1:-1:-1;;;;;54875:22:0;;;;;;;;;;54745:160::o;24400:339::-;24595:41;8986:10;24628:7;24595:18;:41::i;:::-;24587:103;;;;-1:-1:-1;;;24587:103:0;;;;;;;:::i;:::-;24703:28;24713:4;24719:2;24723:7;24703:9;:28::i;42775:256::-;42872:7;42908:23;42925:5;42908:16;:23::i;:::-;42900:5;:31;42892:87;;;;-1:-1:-1;;;42892:87:0;;10287:2:1;42892:87:0;;;10269:21:1;10326:2;10306:18;;;10299:30;10365:34;10345:18;;;10338:62;-1:-1:-1;;;10416:18:1;;;10409:41;10467:19;;42892:87:0;10259:233:1;42892:87:0;-1:-1:-1;;;;;;42997:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;42775:256::o;51258:121::-;33655:24;33668:10;33655:12;:24::i;:::-;33647:48;;;;-1:-1:-1;;;33647:48:0;;;;;;;:::i;:::-;51343:28;;::::1;::::0;:12:::1;::::0;:28:::1;::::0;::::1;::::0;::::1;:::i;:::-;;51258:121:::0;:::o;24810:185::-;24948:39;24965:4;24971:2;24975:7;24948:39;;;;;;;;;;;;:16;:39::i;50145:121::-;33655:24;33668:10;33655:12;:24::i;:::-;33647:48;;;;-1:-1:-1;;;33647:48:0;;;;;;;:::i;:::-;50212:8:::1;::::0;;-1:-1:-1;;50200:20:0;::::1;50212:8;::::0;;::::1;50211:9;50200:20;::::0;;;;50236:22:::1;::::0;::::1;::::0;::::1;::::0;50249:8:::1;9330:14:1::0;9323:22;9305:41;;9293:2;9278:18;;9260:92;50236:22:0::1;;;;;;;;50145:121::o:0;43297:233::-;43372:7;43408:30;43195:10;:17;43107:113;;43408:30;43400:5;:38;43392:95;;;;-1:-1:-1;;;43392:95:0;;18702:2:1;43392:95:0;;;18684:21:1;18741:2;18721:18;;;18714:30;18780:34;18760:18;;;18753:62;-1:-1:-1;;;18831:18:1;;;18824:42;18883:19;;43392:95:0;18674:234:1;43392:95:0;43505:10;43516:5;43505:17;;;;;;-1:-1:-1;;;43505:17:0;;;;;;;;;;;;;;;;;43498:24;;43297:233;;;:::o;54624:113::-;34196:5;;-1:-1:-1;;;;;34196:5:0;33485:10;34185:16;33469:38;;;;-1:-1:-1;;;33469:38:0;;;;;;;:::i;:::-;54703:11:::1;:26:::0;;-1:-1:-1;;;;;;54703:26:0::1;-1:-1:-1::0;;;;;54703:26:0;;;::::1;::::0;;;::::1;::::0;;54624:113::o;21645:239::-;21717:7;21753:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21753:16:0;21788:19;21780:73;;;;-1:-1:-1;;;21780:73:0;;14530:2:1;21780:73:0;;;14512:21:1;14569:2;14549:18;;;14542:30;14608:34;14588:18;;;14581:62;-1:-1:-1;;;14659:18:1;;;14652:39;14708:19;;21780:73:0;14502:231:1;21375:208:0;21447:7;-1:-1:-1;;;;;21475:19:0;;21467:74;;;;-1:-1:-1;;;21467:74:0;;14119:2:1;21467:74:0;;;14101:21:1;14158:2;14138:18;;;14131:30;14197:34;14177:18;;;14170:62;-1:-1:-1;;;14248:18:1;;;14241:40;14298:19;;21467:74:0;14091:232:1;21467:74:0;-1:-1:-1;;;;;;21559:16:0;;;;;:9;:16;;;;;;;21375:208::o;54913:325::-;33655:24;33668:10;33655:12;:24::i;:::-;33647:48;;;;-1:-1:-1;;;33647:48:0;;;;;;;:::i;:::-;55076:3:::1;55063:10:::0;55037:23:::1;55050:10:::0;55037;:23:::1;:::i;:::-;:36;;;;:::i;:::-;:42;55029:81;;;::::0;-1:-1:-1;;;55029:81:0;;16485:2:1;55029:81:0::1;::::0;::::1;16467:21:1::0;16524:2;16504:18;;;16497:30;16563:28;16543:18;;;16536:56;16609:18;;55029:81:0::1;16457:176:1::0;55029:81:0::1;55121:13;:29:::0;;;;55161:16;:29;55201:16;:29;54913:325::o;50431:237::-;33655:24;33668:10;33655:12;:24::i;:::-;33647:48;;;;-1:-1:-1;;;33647:48:0;;;;;;;:::i;:::-;50538:3:::1;50520:14;:21;;50512:63;;;::::0;-1:-1:-1;;;50512:63:0;;19873:2:1;50512:63:0::1;::::0;::::1;19855:21:1::0;19912:2;19892:18;;;19885:30;19951:31;19931:18;;;19924:59;20000:18;;50512:63:0::1;19845:179:1::0;50512:63:0::1;50586:13;:30:::0;;;50632:28:::1;::::0;20175:25:1;;;50632:28:0::1;::::0;20163:2:1;20148:18;50632:28:0::1;;;;;;;;50431:237:::0;:::o;51623:1485::-;51717:13;;51706:7;:24;;51698:69;;;;-1:-1:-1;;;51698:69:0;;17242:2:1;51698:69:0;;;17224:21:1;;;17261:18;;;17254:30;17320:34;17300:18;;;17293:62;17372:18;;51698:69:0;17214:182:1;51698:69:0;51782:9;;;;;;;51778:569;;;43195:10;:17;51816:13;;:29;51808:63;;;;-1:-1:-1;;;51808:63:0;;11825:2:1;51808:63:0;;;11807:21:1;11864:2;11844:18;;;11837:30;-1:-1:-1;;;11883:18:1;;;11876:51;11944:18;;51808:63:0;11797:171:1;51808:63:0;51907:12;;:25;;51924:7;51907:16;:25::i;:::-;51894:9;:38;;51886:72;;;;-1:-1:-1;;;51886:72:0;;11118:2:1;51886:72:0;;;11100:21:1;11157:2;11137:18;;;11130:30;-1:-1:-1;;;11176:18:1;;;11169:51;11237:18;;51886:72:0;11090:171:1;51886:72:0;52006:13;;51977:26;51989:13;43195:10;:17;43107:113;;51989:13;51977:7;;:11;:26::i;:::-;:42;51973:205;;;52050:32;52068:13;43195:10;:17;43107:113;;52068:13;52050;;;:17;:32::i;:::-;52101:9;:17;;-1:-1:-1;;52101:17:0;;;52142:20;;-1:-1:-1;9305:41:1;;52040:42:0;;-1:-1:-1;52142:20:0;;9293:2:1;9278:18;52142:20:0;;;;;;;51973:205;51778:569;;;52218:8;;;;52210:39;;;;-1:-1:-1;;;52210:39:0;;13347:2:1;52210:39:0;;;13329:21:1;13386:2;13366:18;;;13359:30;-1:-1:-1;;;13405:18:1;;;13398:48;13463:18;;52210:39:0;13319:168:1;52210:39:0;52285:11;;:24;;52301:7;52285:15;:24::i;:::-;52272:9;:37;;52264:71;;;;-1:-1:-1;;;52264:71:0;;11118:2:1;52264:71:0;;;11100:21:1;11157:2;11137:18;;;11130:30;-1:-1:-1;;;11176:18:1;;;11169:51;11237:18;;52264:71:0;11090:171:1;52264:71:0;52395:9;;52365:26;52377:13;43195:10;:17;43107:113;;52365:26;:39;;52357:84;;;;-1:-1:-1;;;52357:84:0;;15301:2:1;52357:84:0;;;15283:21:1;;;15320:18;;;15313:30;15379:34;15359:18;;;15352:62;15431:18;;52357:84:0;15273:182:1;52357:84:0;52452:17;52460:8;52452:7;:17::i;:::-;52480;52500:31;52526:4;52500:21;52514:6;;52500:9;:13;;:21;;;;:::i;:::-;:25;;:31::i;:::-;52565:9;;52557:45;;52480:51;;-1:-1:-1;52543:8:0;;-1:-1:-1;;;;;52565:9:0;;;;52480:51;;52543:8;52557:45;52543:8;52557:45;52480:51;52565:9;52557:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52542:60;;;52621:3;52613:12;;;;;;52636:14;52653:33;52664:10;52676:9;52653:10;:33::i;:::-;52636:50;-1:-1:-1;52697:19:0;52719:21;52636:50;52730:9;52719:10;:21::i;:::-;52776:11;;52768:49;;52697:43;;-1:-1:-1;52752:10:0;;-1:-1:-1;;;;;52776:11:0;;;;52697:43;;52752:10;52768:49;52752:10;52768:49;52697:43;52776:11;52768:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52751:66;;;52836:5;52828:14;;;;;;52870:1;52853:248;52878:7;52873:1;:12;52853:248;;52907:18;52928:35;52952:7;52961:1;52928:23;:35::i;:::-;52907:56;;52978:31;52988:8;52998:10;52978:9;:31::i;:::-;53053:8;-1:-1:-1;;;;;53043:31:0;;53063:10;53043:31;;;;20175:25:1;;20163:2;20148:18;;20130:76;53043:31:0;;;;;;;;-1:-1:-1;52887:3:0;;;;:::i;:::-;;;;52853:248;;;;51623:1485;;;;;;;:::o;22120:104::-;22176:13;22209:7;22202:14;;;;;:::i;51090:160::-;33655:24;33668:10;33655:12;:24::i;:::-;33647:48;;;;-1:-1:-1;;;33647:48:0;;;;;;;:::i;:::-;51169:12:::1;:28:::0;;;51213:29:::1;::::0;20175:25:1;;;51213:29:0::1;::::0;20163:2:1;20148:18;51213:29:0::1;20130:76:1::0;23803:295:0;-1:-1:-1;;;;;23906:24:0;;8986:10;23906:24;;23898:62;;;;-1:-1:-1;;;23898:62:0;;12580:2:1;23898:62:0;;;12562:21:1;12619:2;12599:18;;;12592:30;12658:27;12638:18;;;12631:55;12703:18;;23898:62:0;12552:175:1;23898:62:0;8986:10;23973:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;23973:42:0;;;;;;;;;;:53;;-1:-1:-1;;23973:53:0;;;;;;;:42;-1:-1:-1;;;;;24042:48:0;;24081:8;24042:48;;;;9330:14:1;9323:22;9305:41;;9293:2;9278:18;;9260:92;24042:48:0;;;;;;;;23803:295;;:::o;33779:94::-;34196:5;;-1:-1:-1;;;;;34196:5:0;33485:10;34185:16;33469:38;;;;-1:-1:-1;;;33469:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33839:19:0::1;;::::0;;;:14:::1;:19;::::0;;;;:26;;-1:-1:-1;;33839:26:0::1;33861:4;33839:26;::::0;;33779:94::o;25066:328::-;25241:41;8986:10;25274:7;25241:18;:41::i;:::-;25233:103;;;;-1:-1:-1;;;25233:103:0;;;;;;;:::i;:::-;25347:39;25361:4;25367:2;25371:7;25380:5;25347:13;:39::i;:::-;25066:328;;;;:::o;50274:149::-;33655:24;33668:10;33655:12;:24::i;:::-;33647:48;;;;-1:-1:-1;;;33647:48:0;;;;;;;:::i;:::-;50351:11:::1;:26:::0;;;50393:22:::1;::::0;20175:25:1;;;50393:22:0::1;::::0;20163:2:1;20148:18;50393:22:0::1;20130:76:1::0;51387:228:0;51453:13;51479:23;51505:26;51522:8;51505:16;:26::i;:::-;51479:52;;51573:12;51587:9;51556:50;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51542:65;;;51387:228;;;:::o;50676:272::-;33655:24;33668:10;33655:12;:24::i;:::-;33647:48;;;;-1:-1:-1;;;33647:48:0;;;;;;;:::i;:::-;43195:10;:17;50765:14:::1;:30;50757:92;;;::::0;-1:-1:-1;;;50757:92:0;;19115:2:1;50757:92:0::1;::::0;::::1;19097:21:1::0;19154:2;19134:18;;;19127:30;19193:34;19173:18;;;19166:62;-1:-1:-1;;;19244:18:1;;;19237:47;19301:19;;50757:92:0::1;19087:239:1::0;50757:92:0::1;50860:13;:30:::0;;;50906:34:::1;::::0;20175:25:1;;;50906:34:0::1;::::0;20163:2:1;20148:18;50906:34:0::1;20130:76:1::0;50956:126:0;33655:24;33668:10;33655:12;:24::i;:::-;33647:48;;;;-1:-1:-1;;;33647:48:0;;;;;;;:::i;:::-;51025:9:::1;::::0;;::::1;;::::0;;::::1;::::0;::::1;51024:10;51012:22:::0;::::1;-1:-1:-1::0;;51012:22:0;;::::1;::::0;;;::::1;::::0;;;;51050:24:::1;::::0;::::1;::::0;::::1;::::0;51064:9;::::1;::::0;;::::1;9330:14:1::0;9323:22;9305:41;;9293:2;9278:18;;9260:92;33949:97:0;34196:5;;-1:-1:-1;;;;;34196:5:0;33485:10;34185:16;33469:38;;;;-1:-1:-1;;;33469:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34011:19:0::1;34033:5;34011:19:::0;;;:14:::1;:19;::::0;;;;:27;;-1:-1:-1;;34011:27:0::1;::::0;;33949:97::o;34506:173::-;34196:5;;-1:-1:-1;;;;;34196:5:0;33485:10;34185:16;33469:38;;;;-1:-1:-1;;;33469:38:0;;;;;;;:::i;:::-;34582:5:::1;:11:::0;;-1:-1:-1;;;;;;34582:11:0::1;-1:-1:-1::0;;;;;34582:11:0;::::1;::::0;;::::1;::::0;;;-1:-1:-1;34604:19:0;;;:14:::1;:19;::::0;;;;;;;;:26;;-1:-1:-1;;34604:26:0::1;-1:-1:-1::0;34604:26:0::1;::::0;;34646:25;;7756:51:1;;;34646:25:0::1;::::0;7729:18:1;34646:25:0::1;7711:102:1::0;34280:107:0;-1:-1:-1;;;;;34360:19:0;34336:4;34360:19;;;:14;:19;;;;;;;;;34280:107::o;21006:305::-;21108:4;-1:-1:-1;;;;;;21145:40:0;;-1:-1:-1;;;21145:40:0;;:105;;-1:-1:-1;;;;;;;21202:48:0;;-1:-1:-1;;;21202:48:0;21145:105;:158;;;-1:-1:-1;;;;;;;;;;6326:40:0;;;21267:36;6217:157;30886:174;30961:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30961:29:0;-1:-1:-1;;;;;30961:29:0;;;;;;;;:24;;31015:23;30961:24;31015:14;:23::i;:::-;-1:-1:-1;;;;;31006:46:0;;;;;;;;;;;30886:174;;:::o;27198:348::-;27291:4;26993:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26993:16:0;27308:73;;;;-1:-1:-1;;;27308:73:0;;12934:2:1;27308:73:0;;;12916:21:1;12973:2;12953:18;;;12946:30;13012:34;12992:18;;;12985:62;-1:-1:-1;;;13063:18:1;;;13056:42;13115:19;;27308:73:0;12906:234:1;27308:73:0;27392:13;27408:23;27423:7;27408:14;:23::i;:::-;27392:39;;27461:5;-1:-1:-1;;;;;27450:16:0;:7;-1:-1:-1;;;;;27450:16:0;;:51;;;;27494:7;-1:-1:-1;;;;;27470:31:0;:20;27482:7;27470:11;:20::i;:::-;-1:-1:-1;;;;;27470:31:0;;27450:51;:87;;;-1:-1:-1;;;;;;24290:25:0;;;24266:4;24290:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27505:32;27442:96;27198:348;-1:-1:-1;;;;27198:348:0:o;30190:578::-;30349:4;-1:-1:-1;;;;;30322:31:0;:23;30337:7;30322:14;:23::i;:::-;-1:-1:-1;;;;;30322:31:0;;30314:85;;;;-1:-1:-1;;;30314:85:0;;16075:2:1;30314:85:0;;;16057:21:1;16114:2;16094:18;;;16087:30;16153:34;16133:18;;;16126:62;-1:-1:-1;;;16204:18:1;;;16197:39;16253:19;;30314:85:0;16047:231:1;30314:85:0;-1:-1:-1;;;;;30418:16:0;;30410:65;;;;-1:-1:-1;;;30410:65:0;;12175:2:1;30410:65:0;;;12157:21:1;12214:2;12194:18;;;12187:30;12253:34;12233:18;;;12226:62;-1:-1:-1;;;12304:18:1;;;12297:34;12348:19;;30410:65:0;12147:226:1;30410:65:0;30488:39;30509:4;30515:2;30519:7;30488:20;:39::i;:::-;30592:29;30609:1;30613:7;30592:8;:29::i;:::-;-1:-1:-1;;;;;30634:15:0;;;;;;:9;:15;;;;;:20;;30653:1;;30634:15;:20;;30653:1;;30634:20;:::i;:::-;;;;-1:-1:-1;;;;;;;30665:13:0;;;;;;:9;:13;;;;;:18;;30682:1;;30665:13;:18;;30682:1;;30665:18;:::i;:::-;;;;-1:-1:-1;;30694:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30694:21:0;-1:-1:-1;;;;;30694:21:0;;;;;;;;;30733:27;;30694:16;;30733:27;;;;;;;30190:578;;;:::o;38208:98::-;38266:7;38293:5;38297:1;38293;:5;:::i;:::-;38286:12;38208:98;-1:-1:-1;;;38208:98:0:o;37470:::-;37528:7;37555:5;37559:1;37555;:5;:::i;37851:98::-;37909:7;37936:5;37940:1;37936;:5;:::i;55246:871::-;55314:10;55304:21;;;;:9;:21;;;;;:30;;;:39;;;:64;;-1:-1:-1;;;;;;55347:21:0;;55358:10;55347:21;;55304:64;:89;;;;-1:-1:-1;;;;;;55372:21:0;;;;55304:89;55300:810;;;55420:10;55410:21;;;;:9;:21;;;;;;:43;;:33;-1:-1:-1;;;;;;55410:43:0;;;;-1:-1:-1;;;;;55410:43:0;;;;;;;;;-1:-1:-1;;55468:37:0;;;;;;;;;55539:33;;;;;;55604:17;;;;;;:29;;;;;;55665:17;;;;;;;:29;55539:33;;55604:29;;55665;;;55716:20;;;;;55715:48;;-1:-1:-1;;;;;;55742:20:0;;;;55715:48;55711:120;;;-1:-1:-1;;;;;55784:18:0;;;;;;:10;:18;;;;;:31;;55814:1;;55784:18;:31;;55814:1;;55784:31;:::i;:::-;;;;-1:-1:-1;;55711:120:0;-1:-1:-1;;;;;55850:20:0;;55860:10;55850:20;;;;55849:48;;-1:-1:-1;;;;;;55876:20:0;;;;55849:48;55845:120;;;-1:-1:-1;;;;;55918:18:0;;;;;;:10;:18;;;;;55948:1;55918:26;;;:31;;55948:1;;55918:26;;:31;;55948:1;;55918:31;:::i;:::-;;;;-1:-1:-1;;55845:120:0;-1:-1:-1;;;;;55984:20:0;;55994:10;55984:20;;;;55983:48;;-1:-1:-1;;;;;;56010:20:0;;;;55983:48;55979:120;;;-1:-1:-1;;;;;56052:18:0;;;;;;:10;:18;;;;;:26;;:31;;56082:1;;56052:18;:31;;56082:1;;56052:31;:::i;:::-;;;;-1:-1:-1;;55300:810:0;;;;55246:871;:::o;38607:98::-;38665:7;38692:5;38696:1;38692;:5;:::i;56125:1556::-;-1:-1:-1;;;;;56219:18:0;;56195:7;56219:18;;;:9;:18;;;;;:27;;;56215:1435;;;-1:-1:-1;;;;;56280:18:0;;;56263:14;56280:18;;;:9;:18;;;;;;:30;;;;;;;;56342:17;;;;;;:29;;;;;;56403:17;;;;;;:29;56280:30;;56342:29;;56403;;;;;;;56466:38;56499:4;56466:28;56477:13;56263:14;56477:16;;56466:6;;:10;:28::i;:38::-;56447:57;-1:-1:-1;56519:15:0;56538:38;56571:4;56538:28;56549:13;56563:1;56549:16;;56538:6;;:10;:28::i;:38::-;56519:57;-1:-1:-1;56591:15:0;56610:38;56643:4;56610:28;56621:13;56635:1;56621:16;;56610:6;;:10;:28::i;:38::-;56591:57;;56678:7;-1:-1:-1;;;;;56668:17:0;:6;-1:-1:-1;;;;;56668:17:0;;;56667:45;;;;-1:-1:-1;;;;;;56691:20:0;;;;56667:45;56663:316;;;56734:11;56759:6;-1:-1:-1;;;;;56751:20:0;56779:7;56751:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56733:58;;;56818:6;56810:15;;;;;;56853:19;:6;56864:7;56853:10;:19::i;:::-;-1:-1:-1;;;;;56922:17:0;;;;;;:9;:17;;;;;:28;;;56844;;-1:-1:-1;56922:41:0;;56955:7;56922:32;:41::i;:::-;-1:-1:-1;;;;;56891:17:0;;;;;;:9;:17;;;;;:28;;:72;-1:-1:-1;56663:316:0;57008:7;-1:-1:-1;;;;;56998:17:0;:6;-1:-1:-1;;;;;56998:17:0;;;56997:45;;;;-1:-1:-1;;;;;;57021:20:0;;;;56997:45;56993:316;;;57064:11;57089:6;-1:-1:-1;;;;;57081:20:0;57109:7;57081:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57063:58;;;57148:6;57140:15;;;;;;57183:19;:6;57194:7;57183:10;:19::i;:::-;-1:-1:-1;;;;;57252:17:0;;;;;;:9;:17;;;;;:28;;;57174;;-1:-1:-1;57252:41:0;;57285:7;57252:32;:41::i;:::-;-1:-1:-1;;;;;57221:17:0;;;;;;:9;:17;;;;;:28;;:72;-1:-1:-1;56993:316:0;57338:7;-1:-1:-1;;;;;57328:17:0;:6;-1:-1:-1;;;;;57328:17:0;;;57327:45;;;;-1:-1:-1;;;;;;57351:20:0;;;;57327:45;57323:316;;;57394:11;57419:6;-1:-1:-1;;;;;57411:20:0;57439:7;57411:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57393:58;;;57478:6;57470:15;;;;;;57513:19;:6;57524:7;57513:10;:19::i;:::-;-1:-1:-1;;;;;57582:17:0;;;;;;:9;:17;;;;;:28;;;57504;;-1:-1:-1;57582:41:0;;57615:7;57582:32;:41::i;:::-;-1:-1:-1;;;;;57551:17:0;;;;;;:9;:17;;;;;:28;;:72;-1:-1:-1;57323:316:0;56215:1435;;;;;;;-1:-1:-1;57667:6:0;56125:1556;-1:-1:-1;56125:1556:0:o;53116:607::-;53200:7;;53323:10;53356:11;53390:12;53425:15;53473:16;53488:1;53390:12;53473:16;:::i;:::-;53290:278;;;-1:-1:-1;;;;;8860:32:1;;;53290:278:0;;;8842:51:1;8909:18;;8902:34;;;;8952:18;;;8945:34;;;;8995:18;;;8988:34;53463:27:0;9038:19:1;;;9031:35;9082:19;;;9075:35;;;9126:19;;;9119:35;;;8814:19;;53290:278:0;;;;;;;;;;;;53262:321;;;;;;53240:354;;53220:374;;53605:19;53640;;53628:9;:31;;;;:::i;:::-;53605:55;;53678:37;53703:11;53678:24;:37::i;:::-;53671:44;53116:607;-1:-1:-1;;;;;53116:607:0:o;27888:110::-;27964:26;27974:2;27978:7;27964:26;;;;;;;;;;;;:9;:26::i;26276:315::-;26433:28;26443:4;26449:2;26453:7;26433:9;:28::i;:::-;26480:48;26503:4;26509:2;26513:7;26522:5;26480:22;:48::i;:::-;26472:111;;;;-1:-1:-1;;;26472:111:0;;;;;;;:::i;6607:723::-;6663:13;6884:10;6880:53;;-1:-1:-1;6911:10:0;;;;;;;;;;;;-1:-1:-1;;;6911:10:0;;;;;;6880:53;6958:5;6943:12;6999:78;7006:9;;6999:78;;7032:8;;;;:::i;:::-;;-1:-1:-1;7055:10:0;;-1:-1:-1;7063:2:0;7055:10;;:::i;:::-;;;6999:78;;;7087:19;7119:6;7109:17;;;;;;-1:-1:-1;;;7109:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7109:17:0;;7087:39;;7137:154;7144:10;;7137:154;;7171:11;7181:1;7171:11;;:::i;:::-;;-1:-1:-1;7240:10:0;7248:2;7240:5;:10;:::i;:::-;7227:24;;:2;:24;:::i;:::-;7214:39;;7197:6;7204;7197:14;;;;;;-1:-1:-1;;;7197:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;7197:56:0;;;;;;;;-1:-1:-1;7268:11:0;7277:2;7268:11;;:::i;:::-;;;7137:154;;44143:589;-1:-1:-1;;;;;44349:18:0;;44345:187;;44384:40;44416:7;45559:10;:17;;45532:24;;;;:15;:24;;;;;:44;;;45587:24;;;;;;;;;;;;45455:164;44384:40;44345:187;;;44454:2;-1:-1:-1;;;;;44446:10:0;:4;-1:-1:-1;;;;;44446:10:0;;44442:90;;44473:47;44506:4;44512:7;44473:32;:47::i;:::-;-1:-1:-1;;;;;44546:16:0;;44542:183;;44579:45;44616:7;44579:36;:45::i;:::-;44542:183;;;44652:4;-1:-1:-1;;;;;44646:10:0;:2;-1:-1:-1;;;;;44646:10:0;;44642:83;;44673:40;44701:2;44705:7;44673:27;:40::i;53735:881::-;53807:7;53827:18;53848:16;53865:10;53848:28;;;;;-1:-1:-1;;;53848:28:0;;;;;;;;;;;;-1:-1:-1;53887:14:0;53916:15;53912:119;;-1:-1:-1;53957:10:0;53912:119;;;-1:-1:-1;54009:10:0;53912:119;54041:17;54083:1;54061:19;;:23;;;;:::i;:::-;54041:43;;54113:9;54099:10;:23;54095:458;;54139:22;54164:16;54181:9;54164:27;;;;;-1:-1:-1;;;54164:27:0;;;;;;;;;;;;-1:-1:-1;54210:19:0;54206:336;;54253:14;54249:192;;54323:9;;54292:16;54309:10;54292:28;;;;;-1:-1:-1;;;54292:28:0;;;;;;;;;;:40;54249:192;;;54412:9;54381:16;54398:10;54381:28;;;;;-1:-1:-1;;;54381:28:0;;;;;;;;;;:40;54249:192;54206:336;;;54512:14;54481:16;54498:10;54481:28;;;;;-1:-1:-1;;;54481:28:0;;;;;;;;;;:45;54206:336;54095:458;;54563:19;:21;;;:19;:21;;;:::i;:::-;;;;-1:-1:-1;54602:6:0;;53735:881;-1:-1:-1;;;;;53735:881:0:o;28225:321::-;28355:18;28361:2;28365:7;28355:5;:18::i;:::-;28406:54;28437:1;28441:2;28445:7;28454:5;28406:22;:54::i;:::-;28384:154;;;;-1:-1:-1;;;28384:154:0;;;;;;;:::i;31625:799::-;31780:4;-1:-1:-1;;;;;31801:13:0;;10128:20;10176:8;31797:620;;31837:72;;-1:-1:-1;;;31837:72:0;;-1:-1:-1;;;;;31837:36:0;;;;;:72;;8986:10;;31888:4;;31894:7;;31903:5;;31837:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31837:72:0;;;;;;;;-1:-1:-1;;31837:72:0;;;;;;;;;;;;:::i;:::-;;;31833:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32079:13:0;;32075:272;;32122:60;;-1:-1:-1;;;32122:60:0;;;;;;;:::i;32075:272::-;32297:6;32291:13;32282:6;32278:2;32274:15;32267:38;31833:529;-1:-1:-1;;;;;;31960:51:0;-1:-1:-1;;;31960:51:0;;-1:-1:-1;31953:58:0;;31797:620;-1:-1:-1;32401:4:0;31625:799;;;;;;:::o;46246:988::-;46512:22;46562:1;46537:22;46554:4;46537:16;:22::i;:::-;:26;;;;:::i;:::-;46574:18;46595:26;;;:17;:26;;;;;;46512:51;;-1:-1:-1;46728:28:0;;;46724:328;;-1:-1:-1;;;;;46795:18:0;;46773:19;46795:18;;;:12;:18;;;;;;;;:34;;;;;;;;;46846:30;;;;;;:44;;;46963:30;;:17;:30;;;;;:43;;;46724:328;-1:-1:-1;47148:26:0;;;;:17;:26;;;;;;;;47141:33;;;-1:-1:-1;;;;;47192:18:0;;;;;:12;:18;;;;;:34;;;;;;;47185:41;46246:988::o;47529:1079::-;47807:10;:17;47782:22;;47807:21;;47827:1;;47807:21;:::i;:::-;47839:18;47860:24;;;:15;:24;;;;;;48233:10;:26;;47782:46;;-1:-1:-1;47860:24:0;;47782:46;;48233:26;;;;-1:-1:-1;;;48233:26:0;;;;;;;;;;;;;;;;;48211:48;;48297:11;48272:10;48283;48272:22;;;;;;-1:-1:-1;;;48272:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;48377:28;;;:15;:28;;;;;;;:41;;;48549:24;;;;;48542:31;48584:10;:16;;;;;-1:-1:-1;;;48584:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;47529:1079;;;;:::o;45033:221::-;45118:14;45135:20;45152:2;45135:16;:20::i;:::-;-1:-1:-1;;;;;45166:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;45211:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;45033:221:0:o;28882:382::-;-1:-1:-1;;;;;28962:16:0;;28954:61;;;;-1:-1:-1;;;28954:61:0;;14940:2:1;28954:61:0;;;14922:21:1;;;14959:18;;;14952:30;15018:34;14998:18;;;14991:62;15070:18;;28954:61:0;14912:182:1;28954:61:0;26969:4;26993:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26993:16:0;:30;29026:58;;;;-1:-1:-1;;;29026:58:0;;11468:2:1;29026:58:0;;;11450:21:1;11507:2;11487:18;;;11480:30;11546;11526:18;;;11519:58;11594:18;;29026:58:0;11440:178:1;29026:58:0;29097:45;29126:1;29130:2;29134:7;29097:20;:45::i;:::-;-1:-1:-1;;;;;29155:13:0;;;;;;:9;:13;;;;;:18;;29172:1;;29155:13;:18;;29172:1;;29155:18;:::i;:::-;;;;-1:-1:-1;;29184:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29184:21:0;-1:-1:-1;;;;;29184:21:0;;;;;;;;29223:33;;29184:16;;;29223:33;;29184:16;;29223:33;28882:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:257::-;;762:2;750:9;741:7;737:23;733:32;730:2;;;783:6;775;768:22;730:2;827:9;814:23;846:31;871:5;846:31;:::i;1182:398::-;;;1311:2;1299:9;1290:7;1286:23;1282:32;1279:2;;;1332:6;1324;1317:22;1279:2;1376:9;1363:23;1395:31;1420:5;1395:31;:::i;:::-;1445:5;-1:-1:-1;1502:2:1;1487:18;;1474:32;1515:33;1474:32;1515:33;:::i;:::-;1567:7;1557:17;;;1269:311;;;;;:::o;1585:466::-;;;;1731:2;1719:9;1710:7;1706:23;1702:32;1699:2;;;1752:6;1744;1737:22;1699:2;1796:9;1783:23;1815:31;1840:5;1815:31;:::i;:::-;1865:5;-1:-1:-1;1922:2:1;1907:18;;1894:32;1935:33;1894:32;1935:33;:::i;:::-;1689:362;;1987:7;;-1:-1:-1;;;2041:2:1;2026:18;;;;2013:32;;1689:362::o;2056:824::-;;;;;2228:3;2216:9;2207:7;2203:23;2199:33;2196:2;;;2250:6;2242;2235:22;2196:2;2294:9;2281:23;2313:31;2338:5;2313:31;:::i;:::-;2363:5;-1:-1:-1;2420:2:1;2405:18;;2392:32;2433:33;2392:32;2433:33;:::i;:::-;2485:7;-1:-1:-1;2539:2:1;2524:18;;2511:32;;-1:-1:-1;2594:2:1;2579:18;;2566:32;2621:18;2610:30;;2607:2;;;2658:6;2650;2643:22;2607:2;2686:22;;2739:4;2731:13;;2727:27;-1:-1:-1;2717:2:1;;2773:6;2765;2758:22;2717:2;2801:73;2866:7;2861:2;2848:16;2843:2;2839;2835:11;2801:73;:::i;:::-;2791:83;;;2186:694;;;;;;;:::o;2885:436::-;;;3011:2;2999:9;2990:7;2986:23;2982:32;2979:2;;;3032:6;3024;3017:22;2979:2;3076:9;3063:23;3095:31;3120:5;3095:31;:::i;:::-;3145:5;-1:-1:-1;3202:2:1;3187:18;;3174:32;3244:15;;3237:23;3225:36;;3215:2;;3280:6;3272;3265:22;3326:325;;;3455:2;3443:9;3434:7;3430:23;3426:32;3423:2;;;3476:6;3468;3461:22;3423:2;3520:9;3507:23;3539:31;3564:5;3539:31;:::i;:::-;3589:5;3641:2;3626:18;;;;3613:32;;-1:-1:-1;;;3413:238:1:o;3656:255::-;;3767:2;3755:9;3746:7;3742:23;3738:32;3735:2;;;3788:6;3780;3773:22;3735:2;3832:9;3819:23;3851:30;3875:5;3851:30;:::i;3916:259::-;;4038:2;4026:9;4017:7;4013:23;4009:32;4006:2;;;4059:6;4051;4044:22;4006:2;4096:9;4090:16;4115:30;4139:5;4115:30;:::i;4180:480::-;;4302:2;4290:9;4281:7;4277:23;4273:32;4270:2;;;4323:6;4315;4308:22;4270:2;4368:9;4355:23;4401:18;4393:6;4390:30;4387:2;;;4438:6;4430;4423:22;4387:2;4466:22;;4519:4;4511:13;;4507:27;-1:-1:-1;4497:2:1;;4553:6;4545;4538:22;4497:2;4581:73;4646:7;4641:2;4628:16;4623:2;4619;4615:11;4581:73;:::i;4665:190::-;;4777:2;4765:9;4756:7;4752:23;4748:32;4745:2;;;4798:6;4790;4783:22;4745:2;-1:-1:-1;4826:23:1;;4735:120;-1:-1:-1;4735:120:1:o;4860:325::-;;;4989:2;4977:9;4968:7;4964:23;4960:32;4957:2;;;5010:6;5002;4995:22;4957:2;5051:9;5038:23;5028:33;;5111:2;5100:9;5096:18;5083:32;5124:31;5149:5;5124:31;:::i;5190:326::-;;;;5336:2;5324:9;5315:7;5311:23;5307:32;5304:2;;;5357:6;5349;5342:22;5304:2;-1:-1:-1;;5385:23:1;;;5455:2;5440:18;;5427:32;;-1:-1:-1;5506:2:1;5491:18;;;5478:32;;5294:222;-1:-1:-1;5294:222:1:o;5521:257::-;;5600:5;5594:12;5627:6;5622:3;5615:19;5643:63;5699:6;5692:4;5687:3;5683:14;5676:4;5669:5;5665:16;5643:63;:::i;:::-;5760:2;5739:15;-1:-1:-1;;5735:29:1;5726:39;;;;5767:4;5722:50;;5570:208;-1:-1:-1;;5570:208:1:o;5783:185::-;;5863:5;5857:12;5878:52;5923:6;5918:3;5911:4;5904:5;5900:16;5878:52;:::i;:::-;5946:16;;;;;5833:135;-1:-1:-1;;5833:135:1:o;6091:1304::-;6426:13;;6091:1304;;;;6499:1;6484:17;;6520:1;6556:18;;;;6583:2;;6637:4;6629:6;6625:17;6615:27;;6583:2;6663;6711;6703:6;6700:14;6680:18;6677:38;6674:2;;;-1:-1:-1;;;6738:33:1;;6794:4;6791:1;6784:15;6824:4;6745:3;6812:17;6674:2;6855:18;6882:104;;;;7000:1;6995:322;;;;6848:469;;6882:104;-1:-1:-1;;6915:24:1;;6903:37;;6960:16;;;;-1:-1:-1;6882:104:1;;6995:322;20535:127;20601:17;;;20651:4;20635:21;;7090:3;7106:165;7120:6;7117:1;7114:13;7106:165;;;7198:14;;7185:11;;;7178:35;7241:16;;;;7135:10;;7106:165;;;7110:3;;7300:6;7295:3;7291:16;7284:23;;6848:469;;;;;;;7333:56;7358:30;7384:3;7376:6;7358:30;:::i;:::-;-1:-1:-1;;;6033:20:1;;6078:1;6069:11;;6023:63;8034:488;-1:-1:-1;;;;;8303:15:1;;;8285:34;;8355:15;;8350:2;8335:18;;8328:43;8402:2;8387:18;;8380:34;;;8450:3;8445:2;8430:18;;8423:31;;;8034:488;;8471:45;;8496:19;;8488:6;8471:45;:::i;:::-;8463:53;8237:285;-1:-1:-1;;;;;;8237:285:1:o;9861:219::-;;10010:2;9999:9;9992:21;10030:44;10070:2;10059:9;10055:18;10047:6;10030:44;:::i;10497:414::-;10699:2;10681:21;;;10738:2;10718:18;;;10711:30;10777:34;10772:2;10757:18;;10750:62;-1:-1:-1;;;10843:2:1;10828:18;;10821:48;10901:3;10886:19;;10671:240::o;17401:329::-;17603:2;17585:21;;;17642:1;17622:18;;;17615:29;-1:-1:-1;;;17675:2:1;17660:18;;17653:36;17721:2;17706:18;;17575:155::o;17735:413::-;17937:2;17919:21;;;17976:2;17956:18;;;17949:30;18015:34;18010:2;17995:18;;17988:62;-1:-1:-1;;;18081:2:1;18066:18;;18059:47;18138:3;18123:19;;17909:239::o;19331:335::-;19533:2;19515:21;;;19572:2;19552:18;;;19545:30;-1:-1:-1;;;19606:2:1;19591:18;;19584:41;19657:2;19642:18;;19505:161::o;20667:128::-;;20738:1;20734:6;20731:1;20728:13;20725:2;;;20744:18;;:::i;:::-;-1:-1:-1;20780:9:1;;20715:80::o;20800:120::-;;20866:1;20856:2;;20871:18;;:::i;:::-;-1:-1:-1;20905:9:1;;20846:74::o;20925:168::-;;21031:1;21027;21023:6;21019:14;21016:1;21013:21;21008:1;21001:9;20994:17;20990:45;20987:2;;;21038:18;;:::i;:::-;-1:-1:-1;21078:9:1;;20977:116::o;21098:125::-;;21166:1;21163;21160:8;21157:2;;;21171:18;;:::i;:::-;-1:-1:-1;21208:9:1;;21147:76::o;21228:258::-;21300:1;21310:113;21324:6;21321:1;21318:13;21310:113;;;21400:11;;;21394:18;21381:11;;;21374:39;21346:2;21339:10;21310:113;;;21441:6;21438:1;21435:13;21432:2;;;-1:-1:-1;;21476:1:1;21458:16;;21451:27;21281:205::o;21491:136::-;;21558:5;21548:2;;21567:18;;:::i;:::-;-1:-1:-1;;;21603:18:1;;21538:89::o;21632:380::-;21717:1;21707:12;;21764:1;21754:12;;;21775:2;;21829:4;21821:6;21817:17;21807:27;;21775:2;21882;21874:6;21871:14;21851:18;21848:38;21845:2;;;21928:10;21923:3;21919:20;21916:1;21909:31;21963:4;21960:1;21953:15;21991:4;21988:1;21981:15;22017:135;;-1:-1:-1;;22077:17:1;;22074:2;;;22097:18;;:::i;:::-;-1:-1:-1;22144:1:1;22133:13;;22064:88::o;22157:112::-;;22215:1;22205:2;;22220:18;;:::i;:::-;-1:-1:-1;22254:9:1;;22195:74::o;22274:127::-;22335:10;22330:3;22326:20;22323:1;22316:31;22366:4;22363:1;22356:15;22390:4;22387:1;22380:15;22406:127;22467:10;22462:3;22458:20;22455:1;22448:31;22498:4;22495:1;22488:15;22522:4;22519:1;22512:15;22538:127;22599:10;22594:3;22590:20;22587:1;22580:31;22630:4;22627:1;22620:15;22654:4;22651:1;22644:15;22670:131;-1:-1:-1;;;;;22745:31:1;;22735:42;;22725:2;;22791:1;22788;22781:12;22806:131;-1:-1:-1;;;;;;22880:32:1;;22870:43;;22860:2;;22927:1;22924;22917:12

Swarm Source

ipfs://1335fcc94170d111698d1fe3e62f983703ca416a898c93528e035a1bea0bbbfc
Loading...
Loading
Loading...
Loading
[ 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.