ETH Price: $3,269.48 (+0.71%)
Gas: 1 Gwei

Token

Ponzi Plug Inu Node (ppNode)
 

Overview

Max Total Supply

92 ppNode

Holders

17

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
likeclockwork.eth
Balance
3 ppNode
0x58e8869ccf201fdb2ab2014445a59c69b72fc494
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
ppNode

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

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

// SPDX-License-Identifier: MIT

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol
pragma solidity ^0.8.0;

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

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

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol
pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/Context.sol
pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol
pragma solidity ^0.8.0;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. 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 {}
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/access/Ownable.sol
pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

interface IRewardPool {
    function addNodeInfo(uint _nftId, uint _nodeType, address _owner) external returns (bool);
    function updateNodeOwner(uint _nftId, address _owner) external returns (bool);
    function claimReward(uint _nftId) external returns (bool);
}

interface IERC20 {
  /**
   * @dev Returns the amount of tokens in existence.
   */
  function totalSupply() external view returns (uint256);

  /**
   * @dev Returns the amount of tokens owned by `account`.
   */
  function balanceOf(address account) external view returns (uint256);

  /**
   * @dev Moves `amount` tokens from the caller's account to `recipient`.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * Emits a {Transfer} event.
   */
  function transfer(address recipient, uint256 amount) external returns (bool);

  /**
   * @dev Returns the remaining number of tokens that `spender` will be
   * allowed to spend on behalf of `owner` through {transferFrom}. This is
   * zero by default.
   *
   * This value changes when {approve} or {transferFrom} are called.
   */
  function allowance(address owner, address spender) external view returns (uint256);

  /**
   * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * IMPORTANT: Beware that changing an allowance with this method brings the risk
   * that someone may use both the old and the new allowance by unfortunate
   * transaction ordering. One possible solution to mitigate this race
   * condition is to first reduce the spender's allowance to 0 and set the
   * desired value afterwards:
   * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
   *
   * Emits an {Approval} event.
   */
  function approve(address spender, uint256 amount) external returns (bool);

  /**
   * @dev Moves `amount` tokens from `sender` to `recipient` using the
   * allowance mechanism. `amount` is then deducted from the caller's
   * allowance.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * Emits a {Transfer} event.
   */
  function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

  /**
   * @dev Emitted when `value` tokens are moved from one account (`from`) to
   * another (`to`).
   *
   * Note that `value` may be zero.
   */
  event Transfer(address indexed from, address indexed to, uint256 value);

  /**
   * @dev Emitted when the allowance of a `spender` for an `owner` is set by
   * a call to {approve}. `value` is the new allowance.
   */
  event Approval(address indexed owner, address indexed spender, uint256 value);
}


pragma solidity ^0.8.7;


contract ControlledAccess is Ownable {
    
    
   /* 
    * @dev Requires msg.sender to have valid access message.
    * @param _v ECDSA signature parameter v.
    * @param _r ECDSA signature parameters r.
    * @param _s ECDSA signature parameters s.
    */
    modifier onlyValidAccess(uint8 _v, bytes32 _r, bytes32 _s) 
    {
        require( isValidAccessMessage(msg.sender,_v,_r,_s), "Not valid Message");
        _;
    }
 
    /* 
    * @dev Verifies if message was signed by owner to give access to _add for this contract.
    *      Assumes Geth signature prefix.
    * @param _add Address of agent with access
    * @param _v ECDSA signature parameter v.
    * @param _r ECDSA signature parameters r.
    * @param _s ECDSA signature parameters s.
    * @return Validity of access message for a given address.
    */
    function isValidAccessMessage(
        address _add,
        uint8 _v, 
        bytes32 _r, 
        bytes32 _s

        ) 
        public view returns (bool)

    {
        bytes32 msgHash = keccak256(abi.encodePacked(address(this), _add));

        bytes memory prefix = "\x19Ethereum Signed Message:\n32";
        bytes32 prefixedHash = keccak256(abi.encodePacked(prefix, msgHash));
                
        address _recovered = ecrecover(prefixedHash, _v, _r, _s);
        if (owner() == _recovered)
            {
                return true;
            }
            return false;
    }
}



pragma solidity >=0.7.0 <0.9.0;

contract ppNode is ERC721Enumerable, Ownable, ControlledAccess{
    using Strings for uint256;
    bool public autosell = false;
    string baseURI;
    string public baseExtension = ".json";
    uint256 public maxSupply = 10000000;
    uint256 public timeDeployed;
    uint256 public allowMintingAfter = 0;
    address public XPPINU;
    bool public isPaused = false;
    address public rewardPool;
    mapping(uint256 => uint) public nodeType;
    IUniswapV2Router02 public uniswapV2Router;
    // tax in 1e4 (10000 = 100%)
    uint256 public tax;
    uint256[5] public mintPrices=[0,0,0,0,0];

    constructor(
        string memory _name,
        string memory _symbol,
        string memory _initBaseURI,
        uint256 _revealTime,
        address _xPpInuAddress
    ) ERC721(_name, _symbol) {
        if (_revealTime > block.timestamp) {
            allowMintingAfter = _revealTime;
        }
        XPPINU = _xPpInuAddress;
        timeDeployed = block.timestamp;
        setBaseURI(_initBaseURI);
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        uniswapV2Router = _uniswapV2Router;
        

    }

    receive() external payable {

  	}

    function toggleAutoSell() public  onlyOwner {
        autosell = !autosell;
    }

    function updateMintPrices(uint256[5] memory _prices) public onlyOwner{
        mintPrices = _prices;
    }

    function setRewardPool(address _rewardPool) public onlyOwner{
        rewardPool = _rewardPool;
    }

    function updateTax(uint256 _tax) public onlyOwner{
        tax = _tax;
    }

    // internal
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    function updateXPPINUAddress( address _xPpInuAddress) public onlyOwner{
        XPPINU = _xPpInuAddress;
    }

    // public
    function mint(uint _type) public payable {
        require(
            block.timestamp >= allowMintingAfter,
            "Minting now allowed yet"
        );
        require(_type>0 && _type<=5, "Invalid node type");
        uint256 price = mintPrices[_type-1];
        uint256 supply = totalSupply();
        nodeType[supply+1] = _type;
        require(IERC20(XPPINU).transferFrom(msg.sender, address(this), price), "Not enough funds");
        require(!isPaused);
        require(supply + 1 <= maxSupply);
        
        _safeMint(msg.sender, supply + 1);
    }

       
    function walletOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

        string memory currentBaseURI = _baseURI();
        return
            bytes(currentBaseURI).length > 0
                ? string(
                    abi.encodePacked(
                        currentBaseURI,
                        nodeType[tokenId].toString(),
                        baseExtension
                    )
                )
                : "";
    }

    function getSecondsUntilMinting() public view returns (uint256) {
        if (block.timestamp < allowMintingAfter) {
            return (allowMintingAfter) - block.timestamp;
        } else {
            return 0;
        }
    }


    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function setBaseExtension(string memory _newBaseExtension)
        public
        onlyOwner
    {
        baseExtension = _newBaseExtension;
    }

    function setIsPaused(bool _state) public onlyOwner {
        isPaused = _state;
    }

    function swapTokensForEth(uint256 tokenAmount) private {

        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = XPPINU;
        path[1] = uniswapV2Router.WETH();

        IERC20(XPPINU).approve(address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
        
    }

    function sell(uint256 tokenAmount) public onlyOwner {

        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = XPPINU;
        path[1] = uniswapV2Router.WETH();

        IERC20(XPPINU).approve(address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
        
    }


    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);
        if (from == address(0)) {
            IRewardPool(rewardPool).addNodeInfo(tokenId, nodeType[tokenId], to);        
        } else if (from != to) {
            IRewardPool(rewardPool).claimReward(tokenId);        
            IRewardPool(rewardPool).updateNodeOwner(tokenId, to);
        }
    }

    function claimRewards( address _owner) public {
        uint256[] memory tokens = walletOfOwner(_owner);
        for (uint256 i; i < tokens.length; i++) {
            IRewardPool(rewardPool).claimReward(tokens[i]);
        }
    }


    function withdraw() public payable onlyOwner {
        (bool success, ) = payable(msg.sender).call{
            value: address(this).balance
        }("");
        require(success);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"uint256","name":"_revealTime","type":"uint256"},{"internalType":"address","name":"_xPpInuAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"XPPINU","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowMintingAfter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autosell","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"claimRewards","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":[],"name":"getSecondsUntilMinting","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"isValidAccessMessage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_type","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintPrices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nodeType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPool","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"uint256","name":"tokenAmount","type":"uint256"}],"name":"sell","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":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setIsPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardPool","type":"address"}],"name":"setRewardPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeDeployed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleAutoSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[5]","name":"_prices","type":"uint256[5]"}],"name":"updateMintPrices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tax","type":"uint256"}],"name":"updateTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_xPpInuAddress","type":"address"}],"name":"updateXPPINUAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526000600a60146101000a81548160ff0219169083151502179055506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c90805190602001906200006c929190620003de565b5062989680600d556000600f556000601060146101000a81548160ff0219169083151502179055506040518060a00160405280600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152506015906005620000e19291906200046f565b50348015620000ef57600080fd5b50604051620060a3380380620060a3833981810160405281019062000115919062000584565b848481600090805190602001906200012f929190620003de565b50806001908051906020019062000148929190620003de565b5050506200016b6200015f6200023b60201b60201c565b6200024360201b60201c565b428211156200017c5781600f819055505b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555042600e81905550620001d5836200030960201b60201c565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d905080601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050505050620008e2565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003196200023b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200033f620003b460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000398576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200038f9062000690565b60405180910390fd5b80600b9080519060200190620003b0929190620003de565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003ec9062000796565b90600052602060002090601f0160209004810192826200041057600085556200045c565b82601f106200042b57805160ff19168380011785556200045c565b828001600101855582156200045c579182015b828111156200045b5782518255916020019190600101906200043e565b5b5090506200046b9190620004b9565b5090565b8260058101928215620004a6579160200282015b82811115620004a5578251829060ff1690559160200191906001019062000483565b5b509050620004b59190620004b9565b5090565b5b80821115620004d4576000816000905550600101620004ba565b5090565b6000620004ef620004e984620006db565b620006b2565b9050828152602081018484840111156200050e576200050d62000865565b5b6200051b84828562000760565b509392505050565b6000815190506200053481620008ae565b92915050565b600082601f83011262000552576200055162000860565b5b815162000564848260208601620004d8565b91505092915050565b6000815190506200057e81620008c8565b92915050565b600080600080600060a08688031215620005a357620005a26200086f565b5b600086015167ffffffffffffffff811115620005c457620005c36200086a565b5b620005d2888289016200053a565b955050602086015167ffffffffffffffff811115620005f657620005f56200086a565b5b62000604888289016200053a565b945050604086015167ffffffffffffffff8111156200062857620006276200086a565b5b62000636888289016200053a565b935050606062000649888289016200056d565b92505060806200065c8882890162000523565b9150509295509295909350565b60006200067860208362000711565b9150620006858262000885565b602082019050919050565b60006020820190508181036000830152620006ab8162000669565b9050919050565b6000620006be620006d1565b9050620006cc8282620007cc565b919050565b6000604051905090565b600067ffffffffffffffff821115620006f957620006f862000831565b5b620007048262000874565b9050602081019050919050565b600082825260208201905092915050565b60006200072f8262000736565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200078057808201518184015260208101905062000763565b8381111562000790576000848401525b50505050565b60006002820490506001821680620007af57607f821691505b60208210811415620007c657620007c562000802565b5b50919050565b620007d78262000874565b810181811067ffffffffffffffff82111715620007f957620007f862000831565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b620008b98162000722565b8114620008c557600080fd5b50565b620008d38162000756565b8114620008df57600080fd5b50565b6157b180620008f26000396000f3fe6080604052600436106102815760003560e01c8063715018a61161014f578063c6682862116100c1578063e4849b321161007a578063e4849b321461099d578063e985e9c5146109c6578063ef5cfb8c14610a03578063f2fde38b14610a2c578063fa1f7b0c14610a55578063ffdcc2fa14610a7e57610288565b8063c66828621461088f578063c87b56dd146108ba578063cca0feb6146108f7578063d3ed9def14610920578063d5abeb0114610949578063da3ef23f1461097457610288565b806399c8d5561161011357806399c8d556146107a0578063a0712d68146107cb578063a22cb465146107e7578063a75052cb14610810578063b187bd261461083b578063b88d4fde1461086657610288565b8063715018a6146106df57806378238c37146106f6578063872bdcdb1461071f5780638da5cb5b1461074a57806395d89b411461077557610288565b80632f745c59116101f357806355f804b3116101ac57806355f804b3146105bd5780636187b33e146105e65780636352211e1461062357806366666aa9146106605780636677ef011461068b57806370a08231146106a257610288565b80632f745c591461049657806332624114146104d35780633ccfd60b1461051057806342842e0e1461051a578063438b6300146105435780634f6ccce71461058057610288565b80631694505e116102455780631694505e1461038657806318160ddd146103b157806319188c35146103dc5780631c794b841461040757806323b872dd14610444578063240976bf1461046d57610288565b806301ffc9a71461028d57806306fdde03146102ca578063081812fc146102f5578063095ea7b314610332578063139a71f41461035b57610288565b3661028857005b600080fd5b34801561029957600080fd5b506102b460048036038101906102af9190613f74565b610aa9565b6040516102c191906147bd565b60405180910390f35b3480156102d657600080fd5b506102df610b23565b6040516102ec9190614838565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190614017565b610bb5565b60405161032991906146d4565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190613e46565b610c3a565b005b34801561036757600080fd5b50610370610d52565b60405161037d91906146d4565b60405180910390f35b34801561039257600080fd5b5061039b610d78565b6040516103a8919061481d565b60405180910390f35b3480156103bd57600080fd5b506103c6610d9e565b6040516103d39190614afa565b60405180910390f35b3480156103e857600080fd5b506103f1610dab565b6040516103fe9190614afa565b60405180910390f35b34801561041357600080fd5b5061042e60048036038101906104299190614017565b610db1565b60405161043b9190614afa565b60405180910390f35b34801561045057600080fd5b5061046b60048036038101906104669190613d30565b610dc9565b005b34801561047957600080fd5b50610494600480360381019061048f9190613f1a565b610e29565b005b3480156104a257600080fd5b506104bd60048036038101906104b89190613e46565b610ec2565b6040516104ca9190614afa565b60405180910390f35b3480156104df57600080fd5b506104fa60048036038101906104f59190613e86565b610f67565b60405161050791906147bd565b60405180910390f35b6105186110a8565b005b34801561052657600080fd5b50610541600480360381019061053c9190613d30565b61119d565b005b34801561054f57600080fd5b5061056a60048036038101906105659190613c96565b6111bd565b604051610577919061479b565b60405180910390f35b34801561058c57600080fd5b506105a760048036038101906105a29190614017565b61126b565b6040516105b49190614afa565b60405180910390f35b3480156105c957600080fd5b506105e460048036038101906105df9190613fce565b6112dc565b005b3480156105f257600080fd5b5061060d60048036038101906106089190614017565b611372565b60405161061a9190614afa565b60405180910390f35b34801561062f57600080fd5b5061064a60048036038101906106459190614017565b61138d565b60405161065791906146d4565b60405180910390f35b34801561066c57600080fd5b5061067561143f565b60405161068291906146d4565b60405180910390f35b34801561069757600080fd5b506106a0611465565b005b3480156106ae57600080fd5b506106c960048036038101906106c49190613c96565b61150d565b6040516106d69190614afa565b60405180910390f35b3480156106eb57600080fd5b506106f46115c5565b005b34801561070257600080fd5b5061071d60048036038101906107189190613c96565b61164d565b005b34801561072b57600080fd5b5061073461170d565b6040516107419190614afa565b60405180910390f35b34801561075657600080fd5b5061075f611713565b60405161076c91906146d4565b60405180910390f35b34801561078157600080fd5b5061078a61173d565b6040516107979190614838565b60405180910390f35b3480156107ac57600080fd5b506107b56117cf565b6040516107c29190614afa565b60405180910390f35b6107e560048036038101906107e09190614017565b6117d5565b005b3480156107f357600080fd5b5061080e60048036038101906108099190613e06565b611a00565b005b34801561081c57600080fd5b50610825611b81565b6040516108329190614afa565b60405180910390f35b34801561084757600080fd5b50610850611baa565b60405161085d91906147bd565b60405180910390f35b34801561087257600080fd5b5061088d60048036038101906108889190613d83565b611bbd565b005b34801561089b57600080fd5b506108a4611c1f565b6040516108b19190614838565b60405180910390f35b3480156108c657600080fd5b506108e160048036038101906108dc9190614017565b611cad565b6040516108ee9190614838565b60405180910390f35b34801561090357600080fd5b5061091e60048036038101906109199190614017565b611d6a565b005b34801561092c57600080fd5b5061094760048036038101906109429190613c96565b611df0565b005b34801561095557600080fd5b5061095e611eb0565b60405161096b9190614afa565b60405180910390f35b34801561098057600080fd5b5061099b60048036038101906109969190613fce565b611eb6565b005b3480156109a957600080fd5b506109c460048036038101906109bf9190614017565b611f4c565b005b3480156109d257600080fd5b506109ed60048036038101906109e89190613cf0565b6122e1565b6040516109fa91906147bd565b60405180910390f35b348015610a0f57600080fd5b50610a2a6004803603810190610a259190613c96565b612375565b005b348015610a3857600080fd5b50610a536004803603810190610a4e9190613c96565b61246e565b005b348015610a6157600080fd5b50610a7c6004803603810190610a779190613eed565b612566565b005b348015610a8a57600080fd5b50610a936125f7565b604051610aa091906147bd565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b1c5750610b1b8261260a565b5b9050919050565b606060008054610b3290614f21565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5e90614f21565b8015610bab5780601f10610b8057610100808354040283529160200191610bab565b820191906000526020600020905b815481529060010190602001808311610b8e57829003601f168201915b5050505050905090565b6000610bc0826126ec565b610bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf6906149fa565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c458261138d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cad90614a7a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cd5612758565b73ffffffffffffffffffffffffffffffffffffffff161480610d045750610d0381610cfe612758565b6122e1565b5b610d43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3a9061497a565b60405180910390fd5b610d4d8383612760565b505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600880549050905090565b600e5481565b60126020528060005260406000206000915090505481565b610dda610dd4612758565b82612819565b610e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1090614aba565b60405180910390fd5b610e248383836128f7565b505050565b610e31612758565b73ffffffffffffffffffffffffffffffffffffffff16610e4f611713565b73ffffffffffffffffffffffffffffffffffffffff1614610ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9c90614a1a565b60405180910390fd5b80601060146101000a81548160ff02191690831515021790555050565b6000610ecd8361150d565b8210610f0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f059061485a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000803086604051602001610f7d92919061463a565b60405160208183030381529060405280519060200120905060006040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250905060008183604051602001610fe4929190614666565b60405160208183030381529060405280519060200120905060006001828989896040516000815260200160405260405161102194939291906147d8565b6020604051602081039080840390855afa158015611043573d6000803e3d6000fd5b5050506020604051035190508073ffffffffffffffffffffffffffffffffffffffff1661106e611713565b73ffffffffffffffffffffffffffffffffffffffff1614156110975760019450505050506110a0565b60009450505050505b949350505050565b6110b0612758565b73ffffffffffffffffffffffffffffffffffffffff166110ce611713565b73ffffffffffffffffffffffffffffffffffffffff1614611124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111b90614a1a565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161114a906146bf565b60006040518083038185875af1925050503d8060008114611187576040519150601f19603f3d011682016040523d82523d6000602084013e61118c565b606091505b505090508061119a57600080fd5b50565b6111b883838360405180602001604052806000815250611bbd565b505050565b606060006111ca8361150d565b905060008167ffffffffffffffff8111156111e8576111e7615117565b5b6040519080825280602002602001820160405280156112165781602001602082028036833780820191505090505b50905060005b828110156112605761122e8582610ec2565b828281518110611241576112406150e8565b5b602002602001018181525050808061125890614f84565b91505061121c565b508092505050919050565b6000611275610d9e565b82106112b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ad90614ada565b60405180910390fd5b600882815481106112ca576112c96150e8565b5b90600052602060002001549050919050565b6112e4612758565b73ffffffffffffffffffffffffffffffffffffffff16611302611713565b73ffffffffffffffffffffffffffffffffffffffff1614611358576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134f90614a1a565b60405180910390fd5b80600b908051906020019061136e929190613984565b5050565b6015816005811061138257600080fd5b016000915090505481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611436576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142d906149ba565b60405180910390fd5b80915050919050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61146d612758565b73ffffffffffffffffffffffffffffffffffffffff1661148b611713565b73ffffffffffffffffffffffffffffffffffffffff16146114e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d890614a1a565b60405180910390fd5b600a60149054906101000a900460ff1615600a60146101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561157e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115759061499a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115cd612758565b73ffffffffffffffffffffffffffffffffffffffff166115eb611713565b73ffffffffffffffffffffffffffffffffffffffff1614611641576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163890614a1a565b60405180910390fd5b61164b6000612b53565b565b611655612758565b73ffffffffffffffffffffffffffffffffffffffff16611673611713565b73ffffffffffffffffffffffffffffffffffffffff16146116c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c090614a1a565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461174c90614f21565b80601f016020809104026020016040519081016040528092919081815260200182805461177890614f21565b80156117c55780601f1061179a576101008083540402835291602001916117c5565b820191906000526020600020905b8154815290600101906020018083116117a857829003601f168201915b5050505050905090565b60145481565b600f5442101561181a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181190614a9a565b60405180910390fd5b60008111801561182b575060058111155b61186a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611861906148fa565b60405180910390fd5b6000601560018361187b9190614dd8565b6005811061188c5761188b6150e8565b5b01549050600061189a610d9e565b905082601260006001846118ae9190614d51565b815260200190815260200160002081905550601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b815260040161191f939291906146ef565b602060405180830381600087803b15801561193957600080fd5b505af115801561194d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119719190613f47565b6119b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a7906148da565b60405180910390fd5b601060149054906101000a900460ff16156119ca57600080fd5b600d546001826119da9190614d51565b11156119e557600080fd5b6119fb336001836119f69190614d51565b612c19565b505050565b611a08612758565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6d9061493a565b60405180910390fd5b8060056000611a83612758565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b30612758565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b7591906147bd565b60405180910390a35050565b6000600f54421015611ba25742600f54611b9b9190614dd8565b9050611ba7565b600090505b90565b601060149054906101000a900460ff1681565b611bce611bc8612758565b83612819565b611c0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0490614aba565b60405180910390fd5b611c1984848484612c37565b50505050565b600c8054611c2c90614f21565b80601f0160208091040260200160405190810160405280929190818152602001828054611c5890614f21565b8015611ca55780601f10611c7a57610100808354040283529160200191611ca5565b820191906000526020600020905b815481529060010190602001808311611c8857829003601f168201915b505050505081565b6060611cb8826126ec565b611cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cee90614a5a565b60405180910390fd5b6000611d01612c93565b90506000815111611d215760405180602001604052806000815250611d62565b80611d3e6012600086815260200190815260200160002054612d25565b600c604051602001611d529392919061468e565b6040516020818303038152906040525b915050919050565b611d72612758565b73ffffffffffffffffffffffffffffffffffffffff16611d90611713565b73ffffffffffffffffffffffffffffffffffffffff1614611de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddd90614a1a565b60405180910390fd5b8060148190555050565b611df8612758565b73ffffffffffffffffffffffffffffffffffffffff16611e16611713565b73ffffffffffffffffffffffffffffffffffffffff1614611e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6390614a1a565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d5481565b611ebe612758565b73ffffffffffffffffffffffffffffffffffffffff16611edc611713565b73ffffffffffffffffffffffffffffffffffffffff1614611f32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2990614a1a565b60405180910390fd5b80600c9080519060200190611f48929190613984565b5050565b611f54612758565b73ffffffffffffffffffffffffffffffffffffffff16611f72611713565b73ffffffffffffffffffffffffffffffffffffffff1614611fc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fbf90614a1a565b60405180910390fd5b6000600267ffffffffffffffff811115611fe557611fe4615117565b5b6040519080825280602002602001820160405280156120135781602001602082028036833780820191505090505b509050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160008151811061204d5761204c6150e8565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156120ef57600080fd5b505afa158015612103573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121279190613cc3565b8160018151811061213b5761213a6150e8565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b81526004016121f4929190614772565b602060405180830381600087803b15801561220e57600080fd5b505af1158015612222573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122469190613f47565b50601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016122ab959493929190614b3e565b600060405180830381600087803b1580156122c557600080fd5b505af11580156122d9573d6000803e3d6000fd5b505050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000612380826111bd565b905060005b815181101561246957601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ae169a508383815181106123df576123de6150e8565b5b60200260200101516040518263ffffffff1660e01b81526004016124039190614afa565b602060405180830381600087803b15801561241d57600080fd5b505af1158015612431573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124559190613f47565b50808061246190614f84565b915050612385565b505050565b612476612758565b73ffffffffffffffffffffffffffffffffffffffff16612494611713565b73ffffffffffffffffffffffffffffffffffffffff16146124ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e190614a1a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561255a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125519061489a565b60405180910390fd5b61256381612b53565b50565b61256e612758565b73ffffffffffffffffffffffffffffffffffffffff1661258c611713565b73ffffffffffffffffffffffffffffffffffffffff16146125e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d990614a1a565b60405180910390fd5b8060159060056125f3929190613a0a565b5050565b600a60149054906101000a900460ff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126d557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126e557506126e482612e86565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127d38361138d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612824826126ec565b612863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285a9061495a565b60405180910390fd5b600061286e8361138d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128dd57508373ffffffffffffffffffffffffffffffffffffffff166128c584610bb5565b73ffffffffffffffffffffffffffffffffffffffff16145b806128ee57506128ed81856122e1565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166129178261138d565b73ffffffffffffffffffffffffffffffffffffffff161461296d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296490614a3a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d49061491a565b60405180910390fd5b6129e8838383612ef0565b6129f3600082612760565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a439190614dd8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a9a9190614d51565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612c33828260405180602001604052806000815250613192565b5050565b612c428484846128f7565b612c4e848484846131ed565b612c8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c849061487a565b60405180910390fd5b50505050565b6060600b8054612ca290614f21565b80601f0160208091040260200160405190810160405280929190818152602001828054612cce90614f21565b8015612d1b5780601f10612cf057610100808354040283529160200191612d1b565b820191906000526020600020905b815481529060010190602001808311612cfe57829003601f168201915b5050505050905090565b60606000821415612d6d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e81565b600082905060005b60008214612d9f578080612d8890614f84565b915050600a82612d989190614da7565b9150612d75565b60008167ffffffffffffffff811115612dbb57612dba615117565b5b6040519080825280601f01601f191660200182016040528015612ded5781602001600182028036833780820191505090505b5090505b60008514612e7a57600182612e069190614dd8565b9150600a85612e159190614ffb565b6030612e219190614d51565b60f81b818381518110612e3757612e366150e8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e739190614da7565b9450612df1565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612efb838383613384565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ffa57601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638b9b4667826012600085815260200190815260200160002054856040518463ffffffff1660e01b8152600401612fa293929190614b98565b602060405180830381600087803b158015612fbc57600080fd5b505af1158015612fd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ff49190613f47565b5061318d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461318c57601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ae169a50826040518263ffffffff1660e01b81526004016130889190614afa565b602060405180830381600087803b1580156130a257600080fd5b505af11580156130b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130da9190613f47565b50601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639774950682846040518363ffffffff1660e01b8152600401613138929190614b15565b602060405180830381600087803b15801561315257600080fd5b505af1158015613166573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061318a9190613f47565b505b5b505050565b61319c8383613498565b6131a960008484846131ed565b6131e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131df9061487a565b60405180910390fd5b505050565b600061320e8473ffffffffffffffffffffffffffffffffffffffff16613666565b15613377578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613237612758565b8786866040518563ffffffff1660e01b81526004016132599493929190614726565b602060405180830381600087803b15801561327357600080fd5b505af19250505080156132a457506040513d601f19601f820116820180604052508101906132a19190613fa1565b60015b613327573d80600081146132d4576040519150601f19603f3d011682016040523d82523d6000602084013e6132d9565b606091505b5060008151141561331f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133169061487a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061337c565b600190505b949350505050565b61338f838383613679565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156133d2576133cd8161367e565b613411565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146134105761340f83826136c7565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134545761344f81613834565b613493565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613492576134918282613905565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613508576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ff906149da565b60405180910390fd5b613511816126ec565b15613551576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613548906148ba565b60405180910390fd5b61355d60008383612ef0565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135ad9190614d51565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016136d48461150d565b6136de9190614dd8565b90506000600760008481526020019081526020016000205490508181146137c3576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506138489190614dd8565b9050600060096000848152602001908152602001600020549050600060088381548110613878576138776150e8565b5b90600052602060002001549050806008838154811061389a576138996150e8565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806138e9576138e86150b9565b5b6001900381819060005260206000200160009055905550505050565b60006139108361150d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461399090614f21565b90600052602060002090601f0160209004810192826139b257600085556139f9565b82601f106139cb57805160ff19168380011785556139f9565b828001600101855582156139f9579182015b828111156139f85782518255916020019190600101906139dd565b5b509050613a069190613a4a565b5090565b8260058101928215613a39579160200282015b82811115613a38578251825591602001919060010190613a1d565b5b509050613a469190613a4a565b5090565b5b80821115613a63576000816000905550600101613a4b565b5090565b6000613a7a613a7584614bf4565b614bcf565b90508082856020860282011115613a9457613a9361514b565b5b60005b85811015613ac45781613aaa8882613c6c565b845260208401935060208301925050600181019050613a97565b5050509392505050565b6000613ae1613adc84614c1a565b614bcf565b905082815260208101848484011115613afd57613afc615150565b5b613b08848285614edf565b509392505050565b6000613b23613b1e84614c4b565b614bcf565b905082815260208101848484011115613b3f57613b3e615150565b5b613b4a848285614edf565b509392505050565b600081359050613b61816156f1565b92915050565b600081519050613b76816156f1565b92915050565b600082601f830112613b9157613b90615146565b5b6005613b9e848285613a67565b91505092915050565b600081359050613bb681615708565b92915050565b600081519050613bcb81615708565b92915050565b600081359050613be08161571f565b92915050565b600081359050613bf581615736565b92915050565b600081519050613c0a81615736565b92915050565b600082601f830112613c2557613c24615146565b5b8135613c35848260208601613ace565b91505092915050565b600082601f830112613c5357613c52615146565b5b8135613c63848260208601613b10565b91505092915050565b600081359050613c7b8161574d565b92915050565b600081359050613c9081615764565b92915050565b600060208284031215613cac57613cab61515a565b5b6000613cba84828501613b52565b91505092915050565b600060208284031215613cd957613cd861515a565b5b6000613ce784828501613b67565b91505092915050565b60008060408385031215613d0757613d0661515a565b5b6000613d1585828601613b52565b9250506020613d2685828601613b52565b9150509250929050565b600080600060608486031215613d4957613d4861515a565b5b6000613d5786828701613b52565b9350506020613d6886828701613b52565b9250506040613d7986828701613c6c565b9150509250925092565b60008060008060808587031215613d9d57613d9c61515a565b5b6000613dab87828801613b52565b9450506020613dbc87828801613b52565b9350506040613dcd87828801613c6c565b925050606085013567ffffffffffffffff811115613dee57613ded615155565b5b613dfa87828801613c10565b91505092959194509250565b60008060408385031215613e1d57613e1c61515a565b5b6000613e2b85828601613b52565b9250506020613e3c85828601613ba7565b9150509250929050565b60008060408385031215613e5d57613e5c61515a565b5b6000613e6b85828601613b52565b9250506020613e7c85828601613c6c565b9150509250929050565b60008060008060808587031215613ea057613e9f61515a565b5b6000613eae87828801613b52565b9450506020613ebf87828801613c81565b9350506040613ed087828801613bd1565b9250506060613ee187828801613bd1565b91505092959194509250565b600060a08284031215613f0357613f0261515a565b5b6000613f1184828501613b7c565b91505092915050565b600060208284031215613f3057613f2f61515a565b5b6000613f3e84828501613ba7565b91505092915050565b600060208284031215613f5d57613f5c61515a565b5b6000613f6b84828501613bbc565b91505092915050565b600060208284031215613f8a57613f8961515a565b5b6000613f9884828501613be6565b91505092915050565b600060208284031215613fb757613fb661515a565b5b6000613fc584828501613bfb565b91505092915050565b600060208284031215613fe457613fe361515a565b5b600082013567ffffffffffffffff81111561400257614001615155565b5b61400e84828501613c3e565b91505092915050565b60006020828403121561402d5761402c61515a565b5b600061403b84828501613c6c565b91505092915050565b60006140508383614074565b60208301905092915050565b6000614068838361460d565b60208301905092915050565b61407d81614e0c565b82525050565b61408c81614e0c565b82525050565b6140a361409e82614e0c565b614fcd565b82525050565b60006140b482614cb1565b6140be8185614cf7565b93506140c983614c7c565b8060005b838110156140fa5781516140e18882614044565b97506140ec83614cdd565b9250506001810190506140cd565b5085935050505092915050565b600061411282614cbc565b61411c8185614d08565b935061412783614c8c565b8060005b8381101561415857815161413f888261405c565b975061414a83614cea565b92505060018101905061412b565b5085935050505092915050565b61416e81614e1e565b82525050565b61417d81614e2a565b82525050565b61419461418f82614e2a565b614fdf565b82525050565b60006141a582614cc7565b6141af8185614d19565b93506141bf818560208601614eee565b6141c88161515f565b840191505092915050565b60006141de82614cc7565b6141e88185614d2a565b93506141f8818560208601614eee565b80840191505092915050565b61420d81614e97565b82525050565b61421c81614ea9565b82525050565b600061422d82614cd2565b6142378185614d35565b9350614247818560208601614eee565b6142508161515f565b840191505092915050565b600061426682614cd2565b6142708185614d46565b9350614280818560208601614eee565b80840191505092915050565b6000815461429981614f21565b6142a38186614d46565b945060018216600081146142be57600181146142cf57614302565b60ff19831686528186019350614302565b6142d885614c9c565b60005b838110156142fa578154818901526001820191506020810190506142db565b838801955050505b50505092915050565b6000614318602b83614d35565b91506143238261517d565b604082019050919050565b600061433b603283614d35565b9150614346826151cc565b604082019050919050565b600061435e602683614d35565b91506143698261521b565b604082019050919050565b6000614381601c83614d35565b915061438c8261526a565b602082019050919050565b60006143a4601083614d35565b91506143af82615293565b602082019050919050565b60006143c7601183614d35565b91506143d2826152bc565b602082019050919050565b60006143ea602483614d35565b91506143f5826152e5565b604082019050919050565b600061440d601983614d35565b915061441882615334565b602082019050919050565b6000614430602c83614d35565b915061443b8261535d565b604082019050919050565b6000614453603883614d35565b915061445e826153ac565b604082019050919050565b6000614476602a83614d35565b9150614481826153fb565b604082019050919050565b6000614499602983614d35565b91506144a48261544a565b604082019050919050565b60006144bc602083614d35565b91506144c782615499565b602082019050919050565b60006144df602c83614d35565b91506144ea826154c2565b604082019050919050565b6000614502602083614d35565b915061450d82615511565b602082019050919050565b6000614525602983614d35565b91506145308261553a565b604082019050919050565b6000614548602f83614d35565b915061455382615589565b604082019050919050565b600061456b602183614d35565b9150614576826155d8565b604082019050919050565b600061458e601783614d35565b915061459982615627565b602082019050919050565b60006145b1600083614d2a565b91506145bc82615650565b600082019050919050565b60006145d4603183614d35565b91506145df82615653565b604082019050919050565b60006145f7602c83614d35565b9150614602826156a2565b604082019050919050565b61461681614e80565b82525050565b61462581614e80565b82525050565b61463481614e8a565b82525050565b60006146468285614092565b6014820191506146568284614092565b6014820191508190509392505050565b600061467282856141d3565b915061467e8284614183565b6020820191508190509392505050565b600061469a828661425b565b91506146a6828561425b565b91506146b2828461428c565b9150819050949350505050565b60006146ca826145a4565b9150819050919050565b60006020820190506146e96000830184614083565b92915050565b60006060820190506147046000830186614083565b6147116020830185614083565b61471e604083018461461c565b949350505050565b600060808201905061473b6000830187614083565b6147486020830186614083565b614755604083018561461c565b8181036060830152614767818461419a565b905095945050505050565b60006040820190506147876000830185614083565b614794602083018461461c565b9392505050565b600060208201905081810360008301526147b58184614107565b905092915050565b60006020820190506147d26000830184614165565b92915050565b60006080820190506147ed6000830187614174565b6147fa602083018661462b565b6148076040830185614174565b6148146060830184614174565b95945050505050565b60006020820190506148326000830184614204565b92915050565b600060208201905081810360008301526148528184614222565b905092915050565b600060208201905081810360008301526148738161430b565b9050919050565b600060208201905081810360008301526148938161432e565b9050919050565b600060208201905081810360008301526148b381614351565b9050919050565b600060208201905081810360008301526148d381614374565b9050919050565b600060208201905081810360008301526148f381614397565b9050919050565b60006020820190508181036000830152614913816143ba565b9050919050565b60006020820190508181036000830152614933816143dd565b9050919050565b6000602082019050818103600083015261495381614400565b9050919050565b6000602082019050818103600083015261497381614423565b9050919050565b6000602082019050818103600083015261499381614446565b9050919050565b600060208201905081810360008301526149b381614469565b9050919050565b600060208201905081810360008301526149d38161448c565b9050919050565b600060208201905081810360008301526149f3816144af565b9050919050565b60006020820190508181036000830152614a13816144d2565b9050919050565b60006020820190508181036000830152614a33816144f5565b9050919050565b60006020820190508181036000830152614a5381614518565b9050919050565b60006020820190508181036000830152614a738161453b565b9050919050565b60006020820190508181036000830152614a938161455e565b9050919050565b60006020820190508181036000830152614ab381614581565b9050919050565b60006020820190508181036000830152614ad3816145c7565b9050919050565b60006020820190508181036000830152614af3816145ea565b9050919050565b6000602082019050614b0f600083018461461c565b92915050565b6000604082019050614b2a600083018561461c565b614b376020830184614083565b9392505050565b600060a082019050614b53600083018861461c565b614b606020830187614213565b8181036040830152614b7281866140a9565b9050614b816060830185614083565b614b8e608083018461461c565b9695505050505050565b6000606082019050614bad600083018661461c565b614bba602083018561461c565b614bc76040830184614083565b949350505050565b6000614bd9614bea565b9050614be58282614f53565b919050565b6000604051905090565b600067ffffffffffffffff821115614c0f57614c0e615117565b5b602082029050919050565b600067ffffffffffffffff821115614c3557614c34615117565b5b614c3e8261515f565b9050602081019050919050565b600067ffffffffffffffff821115614c6657614c65615117565b5b614c6f8261515f565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614d5c82614e80565b9150614d6783614e80565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d9c57614d9b61502c565b5b828201905092915050565b6000614db282614e80565b9150614dbd83614e80565b925082614dcd57614dcc61505b565b5b828204905092915050565b6000614de382614e80565b9150614dee83614e80565b925082821015614e0157614e0061502c565b5b828203905092915050565b6000614e1782614e60565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000614ea282614ebb565b9050919050565b6000614eb482614e80565b9050919050565b6000614ec682614ecd565b9050919050565b6000614ed882614e60565b9050919050565b82818337600083830152505050565b60005b83811015614f0c578082015181840152602081019050614ef1565b83811115614f1b576000848401525b50505050565b60006002820490506001821680614f3957607f821691505b60208210811415614f4d57614f4c61508a565b5b50919050565b614f5c8261515f565b810181811067ffffffffffffffff82111715614f7b57614f7a615117565b5b80604052505050565b6000614f8f82614e80565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614fc257614fc161502c565b5b600182019050919050565b6000614fd882614fe9565b9050919050565b6000819050919050565b6000614ff482615170565b9050919050565b600061500682614e80565b915061501183614e80565b9250826150215761502061505b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4e6f7420656e6f7567682066756e647300000000000000000000000000000000600082015250565b7f496e76616c6964206e6f64652074797065000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74696e67206e6f7720616c6c6f77656420796574000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6156fa81614e0c565b811461570557600080fd5b50565b61571181614e1e565b811461571c57600080fd5b50565b61572881614e2a565b811461573357600080fd5b50565b61573f81614e34565b811461574a57600080fd5b50565b61575681614e80565b811461576157600080fd5b50565b61576d81614e8a565b811461577857600080fd5b5056fea264697066735822122025ba9a6eb1c6f67ab0417a2aa0e0c97f5e1f57b5a3d37508bda7dac27687e76c64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000be05c9775dbf9ecbbbd936999dd8750f7875505f0000000000000000000000000000000000000000000000000000000000000013506f6e7a6920506c756720496e75204e6f646500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000670704e6f646500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102815760003560e01c8063715018a61161014f578063c6682862116100c1578063e4849b321161007a578063e4849b321461099d578063e985e9c5146109c6578063ef5cfb8c14610a03578063f2fde38b14610a2c578063fa1f7b0c14610a55578063ffdcc2fa14610a7e57610288565b8063c66828621461088f578063c87b56dd146108ba578063cca0feb6146108f7578063d3ed9def14610920578063d5abeb0114610949578063da3ef23f1461097457610288565b806399c8d5561161011357806399c8d556146107a0578063a0712d68146107cb578063a22cb465146107e7578063a75052cb14610810578063b187bd261461083b578063b88d4fde1461086657610288565b8063715018a6146106df57806378238c37146106f6578063872bdcdb1461071f5780638da5cb5b1461074a57806395d89b411461077557610288565b80632f745c59116101f357806355f804b3116101ac57806355f804b3146105bd5780636187b33e146105e65780636352211e1461062357806366666aa9146106605780636677ef011461068b57806370a08231146106a257610288565b80632f745c591461049657806332624114146104d35780633ccfd60b1461051057806342842e0e1461051a578063438b6300146105435780634f6ccce71461058057610288565b80631694505e116102455780631694505e1461038657806318160ddd146103b157806319188c35146103dc5780631c794b841461040757806323b872dd14610444578063240976bf1461046d57610288565b806301ffc9a71461028d57806306fdde03146102ca578063081812fc146102f5578063095ea7b314610332578063139a71f41461035b57610288565b3661028857005b600080fd5b34801561029957600080fd5b506102b460048036038101906102af9190613f74565b610aa9565b6040516102c191906147bd565b60405180910390f35b3480156102d657600080fd5b506102df610b23565b6040516102ec9190614838565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190614017565b610bb5565b60405161032991906146d4565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190613e46565b610c3a565b005b34801561036757600080fd5b50610370610d52565b60405161037d91906146d4565b60405180910390f35b34801561039257600080fd5b5061039b610d78565b6040516103a8919061481d565b60405180910390f35b3480156103bd57600080fd5b506103c6610d9e565b6040516103d39190614afa565b60405180910390f35b3480156103e857600080fd5b506103f1610dab565b6040516103fe9190614afa565b60405180910390f35b34801561041357600080fd5b5061042e60048036038101906104299190614017565b610db1565b60405161043b9190614afa565b60405180910390f35b34801561045057600080fd5b5061046b60048036038101906104669190613d30565b610dc9565b005b34801561047957600080fd5b50610494600480360381019061048f9190613f1a565b610e29565b005b3480156104a257600080fd5b506104bd60048036038101906104b89190613e46565b610ec2565b6040516104ca9190614afa565b60405180910390f35b3480156104df57600080fd5b506104fa60048036038101906104f59190613e86565b610f67565b60405161050791906147bd565b60405180910390f35b6105186110a8565b005b34801561052657600080fd5b50610541600480360381019061053c9190613d30565b61119d565b005b34801561054f57600080fd5b5061056a60048036038101906105659190613c96565b6111bd565b604051610577919061479b565b60405180910390f35b34801561058c57600080fd5b506105a760048036038101906105a29190614017565b61126b565b6040516105b49190614afa565b60405180910390f35b3480156105c957600080fd5b506105e460048036038101906105df9190613fce565b6112dc565b005b3480156105f257600080fd5b5061060d60048036038101906106089190614017565b611372565b60405161061a9190614afa565b60405180910390f35b34801561062f57600080fd5b5061064a60048036038101906106459190614017565b61138d565b60405161065791906146d4565b60405180910390f35b34801561066c57600080fd5b5061067561143f565b60405161068291906146d4565b60405180910390f35b34801561069757600080fd5b506106a0611465565b005b3480156106ae57600080fd5b506106c960048036038101906106c49190613c96565b61150d565b6040516106d69190614afa565b60405180910390f35b3480156106eb57600080fd5b506106f46115c5565b005b34801561070257600080fd5b5061071d60048036038101906107189190613c96565b61164d565b005b34801561072b57600080fd5b5061073461170d565b6040516107419190614afa565b60405180910390f35b34801561075657600080fd5b5061075f611713565b60405161076c91906146d4565b60405180910390f35b34801561078157600080fd5b5061078a61173d565b6040516107979190614838565b60405180910390f35b3480156107ac57600080fd5b506107b56117cf565b6040516107c29190614afa565b60405180910390f35b6107e560048036038101906107e09190614017565b6117d5565b005b3480156107f357600080fd5b5061080e60048036038101906108099190613e06565b611a00565b005b34801561081c57600080fd5b50610825611b81565b6040516108329190614afa565b60405180910390f35b34801561084757600080fd5b50610850611baa565b60405161085d91906147bd565b60405180910390f35b34801561087257600080fd5b5061088d60048036038101906108889190613d83565b611bbd565b005b34801561089b57600080fd5b506108a4611c1f565b6040516108b19190614838565b60405180910390f35b3480156108c657600080fd5b506108e160048036038101906108dc9190614017565b611cad565b6040516108ee9190614838565b60405180910390f35b34801561090357600080fd5b5061091e60048036038101906109199190614017565b611d6a565b005b34801561092c57600080fd5b5061094760048036038101906109429190613c96565b611df0565b005b34801561095557600080fd5b5061095e611eb0565b60405161096b9190614afa565b60405180910390f35b34801561098057600080fd5b5061099b60048036038101906109969190613fce565b611eb6565b005b3480156109a957600080fd5b506109c460048036038101906109bf9190614017565b611f4c565b005b3480156109d257600080fd5b506109ed60048036038101906109e89190613cf0565b6122e1565b6040516109fa91906147bd565b60405180910390f35b348015610a0f57600080fd5b50610a2a6004803603810190610a259190613c96565b612375565b005b348015610a3857600080fd5b50610a536004803603810190610a4e9190613c96565b61246e565b005b348015610a6157600080fd5b50610a7c6004803603810190610a779190613eed565b612566565b005b348015610a8a57600080fd5b50610a936125f7565b604051610aa091906147bd565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b1c5750610b1b8261260a565b5b9050919050565b606060008054610b3290614f21565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5e90614f21565b8015610bab5780601f10610b8057610100808354040283529160200191610bab565b820191906000526020600020905b815481529060010190602001808311610b8e57829003601f168201915b5050505050905090565b6000610bc0826126ec565b610bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf6906149fa565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c458261138d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cad90614a7a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cd5612758565b73ffffffffffffffffffffffffffffffffffffffff161480610d045750610d0381610cfe612758565b6122e1565b5b610d43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3a9061497a565b60405180910390fd5b610d4d8383612760565b505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600880549050905090565b600e5481565b60126020528060005260406000206000915090505481565b610dda610dd4612758565b82612819565b610e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1090614aba565b60405180910390fd5b610e248383836128f7565b505050565b610e31612758565b73ffffffffffffffffffffffffffffffffffffffff16610e4f611713565b73ffffffffffffffffffffffffffffffffffffffff1614610ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9c90614a1a565b60405180910390fd5b80601060146101000a81548160ff02191690831515021790555050565b6000610ecd8361150d565b8210610f0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f059061485a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000803086604051602001610f7d92919061463a565b60405160208183030381529060405280519060200120905060006040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250905060008183604051602001610fe4929190614666565b60405160208183030381529060405280519060200120905060006001828989896040516000815260200160405260405161102194939291906147d8565b6020604051602081039080840390855afa158015611043573d6000803e3d6000fd5b5050506020604051035190508073ffffffffffffffffffffffffffffffffffffffff1661106e611713565b73ffffffffffffffffffffffffffffffffffffffff1614156110975760019450505050506110a0565b60009450505050505b949350505050565b6110b0612758565b73ffffffffffffffffffffffffffffffffffffffff166110ce611713565b73ffffffffffffffffffffffffffffffffffffffff1614611124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111b90614a1a565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161114a906146bf565b60006040518083038185875af1925050503d8060008114611187576040519150601f19603f3d011682016040523d82523d6000602084013e61118c565b606091505b505090508061119a57600080fd5b50565b6111b883838360405180602001604052806000815250611bbd565b505050565b606060006111ca8361150d565b905060008167ffffffffffffffff8111156111e8576111e7615117565b5b6040519080825280602002602001820160405280156112165781602001602082028036833780820191505090505b50905060005b828110156112605761122e8582610ec2565b828281518110611241576112406150e8565b5b602002602001018181525050808061125890614f84565b91505061121c565b508092505050919050565b6000611275610d9e565b82106112b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ad90614ada565b60405180910390fd5b600882815481106112ca576112c96150e8565b5b90600052602060002001549050919050565b6112e4612758565b73ffffffffffffffffffffffffffffffffffffffff16611302611713565b73ffffffffffffffffffffffffffffffffffffffff1614611358576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134f90614a1a565b60405180910390fd5b80600b908051906020019061136e929190613984565b5050565b6015816005811061138257600080fd5b016000915090505481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611436576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142d906149ba565b60405180910390fd5b80915050919050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61146d612758565b73ffffffffffffffffffffffffffffffffffffffff1661148b611713565b73ffffffffffffffffffffffffffffffffffffffff16146114e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d890614a1a565b60405180910390fd5b600a60149054906101000a900460ff1615600a60146101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561157e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115759061499a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115cd612758565b73ffffffffffffffffffffffffffffffffffffffff166115eb611713565b73ffffffffffffffffffffffffffffffffffffffff1614611641576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163890614a1a565b60405180910390fd5b61164b6000612b53565b565b611655612758565b73ffffffffffffffffffffffffffffffffffffffff16611673611713565b73ffffffffffffffffffffffffffffffffffffffff16146116c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c090614a1a565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461174c90614f21565b80601f016020809104026020016040519081016040528092919081815260200182805461177890614f21565b80156117c55780601f1061179a576101008083540402835291602001916117c5565b820191906000526020600020905b8154815290600101906020018083116117a857829003601f168201915b5050505050905090565b60145481565b600f5442101561181a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181190614a9a565b60405180910390fd5b60008111801561182b575060058111155b61186a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611861906148fa565b60405180910390fd5b6000601560018361187b9190614dd8565b6005811061188c5761188b6150e8565b5b01549050600061189a610d9e565b905082601260006001846118ae9190614d51565b815260200190815260200160002081905550601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b815260040161191f939291906146ef565b602060405180830381600087803b15801561193957600080fd5b505af115801561194d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119719190613f47565b6119b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a7906148da565b60405180910390fd5b601060149054906101000a900460ff16156119ca57600080fd5b600d546001826119da9190614d51565b11156119e557600080fd5b6119fb336001836119f69190614d51565b612c19565b505050565b611a08612758565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6d9061493a565b60405180910390fd5b8060056000611a83612758565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b30612758565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b7591906147bd565b60405180910390a35050565b6000600f54421015611ba25742600f54611b9b9190614dd8565b9050611ba7565b600090505b90565b601060149054906101000a900460ff1681565b611bce611bc8612758565b83612819565b611c0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0490614aba565b60405180910390fd5b611c1984848484612c37565b50505050565b600c8054611c2c90614f21565b80601f0160208091040260200160405190810160405280929190818152602001828054611c5890614f21565b8015611ca55780601f10611c7a57610100808354040283529160200191611ca5565b820191906000526020600020905b815481529060010190602001808311611c8857829003601f168201915b505050505081565b6060611cb8826126ec565b611cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cee90614a5a565b60405180910390fd5b6000611d01612c93565b90506000815111611d215760405180602001604052806000815250611d62565b80611d3e6012600086815260200190815260200160002054612d25565b600c604051602001611d529392919061468e565b6040516020818303038152906040525b915050919050565b611d72612758565b73ffffffffffffffffffffffffffffffffffffffff16611d90611713565b73ffffffffffffffffffffffffffffffffffffffff1614611de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddd90614a1a565b60405180910390fd5b8060148190555050565b611df8612758565b73ffffffffffffffffffffffffffffffffffffffff16611e16611713565b73ffffffffffffffffffffffffffffffffffffffff1614611e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6390614a1a565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d5481565b611ebe612758565b73ffffffffffffffffffffffffffffffffffffffff16611edc611713565b73ffffffffffffffffffffffffffffffffffffffff1614611f32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2990614a1a565b60405180910390fd5b80600c9080519060200190611f48929190613984565b5050565b611f54612758565b73ffffffffffffffffffffffffffffffffffffffff16611f72611713565b73ffffffffffffffffffffffffffffffffffffffff1614611fc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fbf90614a1a565b60405180910390fd5b6000600267ffffffffffffffff811115611fe557611fe4615117565b5b6040519080825280602002602001820160405280156120135781602001602082028036833780820191505090505b509050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160008151811061204d5761204c6150e8565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156120ef57600080fd5b505afa158015612103573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121279190613cc3565b8160018151811061213b5761213a6150e8565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b81526004016121f4929190614772565b602060405180830381600087803b15801561220e57600080fd5b505af1158015612222573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122469190613f47565b50601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016122ab959493929190614b3e565b600060405180830381600087803b1580156122c557600080fd5b505af11580156122d9573d6000803e3d6000fd5b505050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000612380826111bd565b905060005b815181101561246957601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ae169a508383815181106123df576123de6150e8565b5b60200260200101516040518263ffffffff1660e01b81526004016124039190614afa565b602060405180830381600087803b15801561241d57600080fd5b505af1158015612431573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124559190613f47565b50808061246190614f84565b915050612385565b505050565b612476612758565b73ffffffffffffffffffffffffffffffffffffffff16612494611713565b73ffffffffffffffffffffffffffffffffffffffff16146124ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e190614a1a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561255a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125519061489a565b60405180910390fd5b61256381612b53565b50565b61256e612758565b73ffffffffffffffffffffffffffffffffffffffff1661258c611713565b73ffffffffffffffffffffffffffffffffffffffff16146125e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d990614a1a565b60405180910390fd5b8060159060056125f3929190613a0a565b5050565b600a60149054906101000a900460ff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126d557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126e557506126e482612e86565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127d38361138d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612824826126ec565b612863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285a9061495a565b60405180910390fd5b600061286e8361138d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128dd57508373ffffffffffffffffffffffffffffffffffffffff166128c584610bb5565b73ffffffffffffffffffffffffffffffffffffffff16145b806128ee57506128ed81856122e1565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166129178261138d565b73ffffffffffffffffffffffffffffffffffffffff161461296d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296490614a3a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d49061491a565b60405180910390fd5b6129e8838383612ef0565b6129f3600082612760565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a439190614dd8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a9a9190614d51565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612c33828260405180602001604052806000815250613192565b5050565b612c428484846128f7565b612c4e848484846131ed565b612c8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c849061487a565b60405180910390fd5b50505050565b6060600b8054612ca290614f21565b80601f0160208091040260200160405190810160405280929190818152602001828054612cce90614f21565b8015612d1b5780601f10612cf057610100808354040283529160200191612d1b565b820191906000526020600020905b815481529060010190602001808311612cfe57829003601f168201915b5050505050905090565b60606000821415612d6d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e81565b600082905060005b60008214612d9f578080612d8890614f84565b915050600a82612d989190614da7565b9150612d75565b60008167ffffffffffffffff811115612dbb57612dba615117565b5b6040519080825280601f01601f191660200182016040528015612ded5781602001600182028036833780820191505090505b5090505b60008514612e7a57600182612e069190614dd8565b9150600a85612e159190614ffb565b6030612e219190614d51565b60f81b818381518110612e3757612e366150e8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e739190614da7565b9450612df1565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612efb838383613384565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ffa57601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638b9b4667826012600085815260200190815260200160002054856040518463ffffffff1660e01b8152600401612fa293929190614b98565b602060405180830381600087803b158015612fbc57600080fd5b505af1158015612fd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ff49190613f47565b5061318d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461318c57601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ae169a50826040518263ffffffff1660e01b81526004016130889190614afa565b602060405180830381600087803b1580156130a257600080fd5b505af11580156130b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130da9190613f47565b50601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639774950682846040518363ffffffff1660e01b8152600401613138929190614b15565b602060405180830381600087803b15801561315257600080fd5b505af1158015613166573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061318a9190613f47565b505b5b505050565b61319c8383613498565b6131a960008484846131ed565b6131e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131df9061487a565b60405180910390fd5b505050565b600061320e8473ffffffffffffffffffffffffffffffffffffffff16613666565b15613377578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613237612758565b8786866040518563ffffffff1660e01b81526004016132599493929190614726565b602060405180830381600087803b15801561327357600080fd5b505af19250505080156132a457506040513d601f19601f820116820180604052508101906132a19190613fa1565b60015b613327573d80600081146132d4576040519150601f19603f3d011682016040523d82523d6000602084013e6132d9565b606091505b5060008151141561331f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133169061487a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061337c565b600190505b949350505050565b61338f838383613679565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156133d2576133cd8161367e565b613411565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146134105761340f83826136c7565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134545761344f81613834565b613493565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613492576134918282613905565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613508576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ff906149da565b60405180910390fd5b613511816126ec565b15613551576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613548906148ba565b60405180910390fd5b61355d60008383612ef0565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135ad9190614d51565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016136d48461150d565b6136de9190614dd8565b90506000600760008481526020019081526020016000205490508181146137c3576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506138489190614dd8565b9050600060096000848152602001908152602001600020549050600060088381548110613878576138776150e8565b5b90600052602060002001549050806008838154811061389a576138996150e8565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806138e9576138e86150b9565b5b6001900381819060005260206000200160009055905550505050565b60006139108361150d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461399090614f21565b90600052602060002090601f0160209004810192826139b257600085556139f9565b82601f106139cb57805160ff19168380011785556139f9565b828001600101855582156139f9579182015b828111156139f85782518255916020019190600101906139dd565b5b509050613a069190613a4a565b5090565b8260058101928215613a39579160200282015b82811115613a38578251825591602001919060010190613a1d565b5b509050613a469190613a4a565b5090565b5b80821115613a63576000816000905550600101613a4b565b5090565b6000613a7a613a7584614bf4565b614bcf565b90508082856020860282011115613a9457613a9361514b565b5b60005b85811015613ac45781613aaa8882613c6c565b845260208401935060208301925050600181019050613a97565b5050509392505050565b6000613ae1613adc84614c1a565b614bcf565b905082815260208101848484011115613afd57613afc615150565b5b613b08848285614edf565b509392505050565b6000613b23613b1e84614c4b565b614bcf565b905082815260208101848484011115613b3f57613b3e615150565b5b613b4a848285614edf565b509392505050565b600081359050613b61816156f1565b92915050565b600081519050613b76816156f1565b92915050565b600082601f830112613b9157613b90615146565b5b6005613b9e848285613a67565b91505092915050565b600081359050613bb681615708565b92915050565b600081519050613bcb81615708565b92915050565b600081359050613be08161571f565b92915050565b600081359050613bf581615736565b92915050565b600081519050613c0a81615736565b92915050565b600082601f830112613c2557613c24615146565b5b8135613c35848260208601613ace565b91505092915050565b600082601f830112613c5357613c52615146565b5b8135613c63848260208601613b10565b91505092915050565b600081359050613c7b8161574d565b92915050565b600081359050613c9081615764565b92915050565b600060208284031215613cac57613cab61515a565b5b6000613cba84828501613b52565b91505092915050565b600060208284031215613cd957613cd861515a565b5b6000613ce784828501613b67565b91505092915050565b60008060408385031215613d0757613d0661515a565b5b6000613d1585828601613b52565b9250506020613d2685828601613b52565b9150509250929050565b600080600060608486031215613d4957613d4861515a565b5b6000613d5786828701613b52565b9350506020613d6886828701613b52565b9250506040613d7986828701613c6c565b9150509250925092565b60008060008060808587031215613d9d57613d9c61515a565b5b6000613dab87828801613b52565b9450506020613dbc87828801613b52565b9350506040613dcd87828801613c6c565b925050606085013567ffffffffffffffff811115613dee57613ded615155565b5b613dfa87828801613c10565b91505092959194509250565b60008060408385031215613e1d57613e1c61515a565b5b6000613e2b85828601613b52565b9250506020613e3c85828601613ba7565b9150509250929050565b60008060408385031215613e5d57613e5c61515a565b5b6000613e6b85828601613b52565b9250506020613e7c85828601613c6c565b9150509250929050565b60008060008060808587031215613ea057613e9f61515a565b5b6000613eae87828801613b52565b9450506020613ebf87828801613c81565b9350506040613ed087828801613bd1565b9250506060613ee187828801613bd1565b91505092959194509250565b600060a08284031215613f0357613f0261515a565b5b6000613f1184828501613b7c565b91505092915050565b600060208284031215613f3057613f2f61515a565b5b6000613f3e84828501613ba7565b91505092915050565b600060208284031215613f5d57613f5c61515a565b5b6000613f6b84828501613bbc565b91505092915050565b600060208284031215613f8a57613f8961515a565b5b6000613f9884828501613be6565b91505092915050565b600060208284031215613fb757613fb661515a565b5b6000613fc584828501613bfb565b91505092915050565b600060208284031215613fe457613fe361515a565b5b600082013567ffffffffffffffff81111561400257614001615155565b5b61400e84828501613c3e565b91505092915050565b60006020828403121561402d5761402c61515a565b5b600061403b84828501613c6c565b91505092915050565b60006140508383614074565b60208301905092915050565b6000614068838361460d565b60208301905092915050565b61407d81614e0c565b82525050565b61408c81614e0c565b82525050565b6140a361409e82614e0c565b614fcd565b82525050565b60006140b482614cb1565b6140be8185614cf7565b93506140c983614c7c565b8060005b838110156140fa5781516140e18882614044565b97506140ec83614cdd565b9250506001810190506140cd565b5085935050505092915050565b600061411282614cbc565b61411c8185614d08565b935061412783614c8c565b8060005b8381101561415857815161413f888261405c565b975061414a83614cea565b92505060018101905061412b565b5085935050505092915050565b61416e81614e1e565b82525050565b61417d81614e2a565b82525050565b61419461418f82614e2a565b614fdf565b82525050565b60006141a582614cc7565b6141af8185614d19565b93506141bf818560208601614eee565b6141c88161515f565b840191505092915050565b60006141de82614cc7565b6141e88185614d2a565b93506141f8818560208601614eee565b80840191505092915050565b61420d81614e97565b82525050565b61421c81614ea9565b82525050565b600061422d82614cd2565b6142378185614d35565b9350614247818560208601614eee565b6142508161515f565b840191505092915050565b600061426682614cd2565b6142708185614d46565b9350614280818560208601614eee565b80840191505092915050565b6000815461429981614f21565b6142a38186614d46565b945060018216600081146142be57600181146142cf57614302565b60ff19831686528186019350614302565b6142d885614c9c565b60005b838110156142fa578154818901526001820191506020810190506142db565b838801955050505b50505092915050565b6000614318602b83614d35565b91506143238261517d565b604082019050919050565b600061433b603283614d35565b9150614346826151cc565b604082019050919050565b600061435e602683614d35565b91506143698261521b565b604082019050919050565b6000614381601c83614d35565b915061438c8261526a565b602082019050919050565b60006143a4601083614d35565b91506143af82615293565b602082019050919050565b60006143c7601183614d35565b91506143d2826152bc565b602082019050919050565b60006143ea602483614d35565b91506143f5826152e5565b604082019050919050565b600061440d601983614d35565b915061441882615334565b602082019050919050565b6000614430602c83614d35565b915061443b8261535d565b604082019050919050565b6000614453603883614d35565b915061445e826153ac565b604082019050919050565b6000614476602a83614d35565b9150614481826153fb565b604082019050919050565b6000614499602983614d35565b91506144a48261544a565b604082019050919050565b60006144bc602083614d35565b91506144c782615499565b602082019050919050565b60006144df602c83614d35565b91506144ea826154c2565b604082019050919050565b6000614502602083614d35565b915061450d82615511565b602082019050919050565b6000614525602983614d35565b91506145308261553a565b604082019050919050565b6000614548602f83614d35565b915061455382615589565b604082019050919050565b600061456b602183614d35565b9150614576826155d8565b604082019050919050565b600061458e601783614d35565b915061459982615627565b602082019050919050565b60006145b1600083614d2a565b91506145bc82615650565b600082019050919050565b60006145d4603183614d35565b91506145df82615653565b604082019050919050565b60006145f7602c83614d35565b9150614602826156a2565b604082019050919050565b61461681614e80565b82525050565b61462581614e80565b82525050565b61463481614e8a565b82525050565b60006146468285614092565b6014820191506146568284614092565b6014820191508190509392505050565b600061467282856141d3565b915061467e8284614183565b6020820191508190509392505050565b600061469a828661425b565b91506146a6828561425b565b91506146b2828461428c565b9150819050949350505050565b60006146ca826145a4565b9150819050919050565b60006020820190506146e96000830184614083565b92915050565b60006060820190506147046000830186614083565b6147116020830185614083565b61471e604083018461461c565b949350505050565b600060808201905061473b6000830187614083565b6147486020830186614083565b614755604083018561461c565b8181036060830152614767818461419a565b905095945050505050565b60006040820190506147876000830185614083565b614794602083018461461c565b9392505050565b600060208201905081810360008301526147b58184614107565b905092915050565b60006020820190506147d26000830184614165565b92915050565b60006080820190506147ed6000830187614174565b6147fa602083018661462b565b6148076040830185614174565b6148146060830184614174565b95945050505050565b60006020820190506148326000830184614204565b92915050565b600060208201905081810360008301526148528184614222565b905092915050565b600060208201905081810360008301526148738161430b565b9050919050565b600060208201905081810360008301526148938161432e565b9050919050565b600060208201905081810360008301526148b381614351565b9050919050565b600060208201905081810360008301526148d381614374565b9050919050565b600060208201905081810360008301526148f381614397565b9050919050565b60006020820190508181036000830152614913816143ba565b9050919050565b60006020820190508181036000830152614933816143dd565b9050919050565b6000602082019050818103600083015261495381614400565b9050919050565b6000602082019050818103600083015261497381614423565b9050919050565b6000602082019050818103600083015261499381614446565b9050919050565b600060208201905081810360008301526149b381614469565b9050919050565b600060208201905081810360008301526149d38161448c565b9050919050565b600060208201905081810360008301526149f3816144af565b9050919050565b60006020820190508181036000830152614a13816144d2565b9050919050565b60006020820190508181036000830152614a33816144f5565b9050919050565b60006020820190508181036000830152614a5381614518565b9050919050565b60006020820190508181036000830152614a738161453b565b9050919050565b60006020820190508181036000830152614a938161455e565b9050919050565b60006020820190508181036000830152614ab381614581565b9050919050565b60006020820190508181036000830152614ad3816145c7565b9050919050565b60006020820190508181036000830152614af3816145ea565b9050919050565b6000602082019050614b0f600083018461461c565b92915050565b6000604082019050614b2a600083018561461c565b614b376020830184614083565b9392505050565b600060a082019050614b53600083018861461c565b614b606020830187614213565b8181036040830152614b7281866140a9565b9050614b816060830185614083565b614b8e608083018461461c565b9695505050505050565b6000606082019050614bad600083018661461c565b614bba602083018561461c565b614bc76040830184614083565b949350505050565b6000614bd9614bea565b9050614be58282614f53565b919050565b6000604051905090565b600067ffffffffffffffff821115614c0f57614c0e615117565b5b602082029050919050565b600067ffffffffffffffff821115614c3557614c34615117565b5b614c3e8261515f565b9050602081019050919050565b600067ffffffffffffffff821115614c6657614c65615117565b5b614c6f8261515f565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614d5c82614e80565b9150614d6783614e80565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d9c57614d9b61502c565b5b828201905092915050565b6000614db282614e80565b9150614dbd83614e80565b925082614dcd57614dcc61505b565b5b828204905092915050565b6000614de382614e80565b9150614dee83614e80565b925082821015614e0157614e0061502c565b5b828203905092915050565b6000614e1782614e60565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000614ea282614ebb565b9050919050565b6000614eb482614e80565b9050919050565b6000614ec682614ecd565b9050919050565b6000614ed882614e60565b9050919050565b82818337600083830152505050565b60005b83811015614f0c578082015181840152602081019050614ef1565b83811115614f1b576000848401525b50505050565b60006002820490506001821680614f3957607f821691505b60208210811415614f4d57614f4c61508a565b5b50919050565b614f5c8261515f565b810181811067ffffffffffffffff82111715614f7b57614f7a615117565b5b80604052505050565b6000614f8f82614e80565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614fc257614fc161502c565b5b600182019050919050565b6000614fd882614fe9565b9050919050565b6000819050919050565b6000614ff482615170565b9050919050565b600061500682614e80565b915061501183614e80565b9250826150215761502061505b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4e6f7420656e6f7567682066756e647300000000000000000000000000000000600082015250565b7f496e76616c6964206e6f64652074797065000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74696e67206e6f7720616c6c6f77656420796574000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6156fa81614e0c565b811461570557600080fd5b50565b61571181614e1e565b811461571c57600080fd5b50565b61572881614e2a565b811461573357600080fd5b50565b61573f81614e34565b811461574a57600080fd5b50565b61575681614e80565b811461576157600080fd5b50565b61576d81614e8a565b811461577857600080fd5b5056fea264697066735822122025ba9a6eb1c6f67ab0417a2aa0e0c97f5e1f57b5a3d37508bda7dac27687e76c64736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000be05c9775dbf9ecbbbd936999dd8750f7875505f0000000000000000000000000000000000000000000000000000000000000013506f6e7a6920506c756720496e75204e6f646500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000670704e6f646500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Ponzi Plug Inu Node
Arg [1] : _symbol (string): ppNode
Arg [2] : _initBaseURI (string):
Arg [3] : _revealTime (uint256): 0
Arg [4] : _xPpInuAddress (address): 0xbE05c9775dbF9ECbbbD936999Dd8750F7875505f

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 000000000000000000000000be05c9775dbf9ecbbbd936999dd8750f7875505f
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000013
Arg [6] : 506f6e7a6920506c756720496e75204e6f646500000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [8] : 70704e6f64650000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

54418:6351:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36476:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23640:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25333:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24856:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54738:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54880:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37279:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54661:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54833:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26392:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58524:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36860:343;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53759:613;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60574:192;;;:::i;:::-;;26839:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56950:390;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37469:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58253:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54987:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23247:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54801:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55681:83;;;;;;;;;;;;;:::i;:::-;;22890:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44554:94;;;;;;;;;;;;;:::i;:::-;;55888:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54695:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43903:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23809:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54962:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56353:580;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25713:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58008:235;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54766:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27095:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54575:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57348:652;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55999:78;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56218:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54619:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58365:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59220:590;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26111:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60329:235;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44803:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55772:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54519:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36476:300;36623:4;36680:35;36665:50;;;:11;:50;;;;:103;;;;36732:36;36756:11;36732:23;:36::i;:::-;36665:103;36645:123;;36476:300;;;:::o;23640:100::-;23694:13;23727:5;23720:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23640:100;:::o;25333:308::-;25454:7;25501:16;25509:7;25501;:16::i;:::-;25479:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;25609:15;:24;25625:7;25609:24;;;;;;;;;;;;;;;;;;;;;25602:31;;25333:308;;;:::o;24856:411::-;24937:13;24953:23;24968:7;24953:14;:23::i;:::-;24937:39;;25001:5;24995:11;;:2;:11;;;;24987:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;25095:5;25079:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;25104:37;25121:5;25128:12;:10;:12::i;:::-;25104:16;:37::i;:::-;25079:62;25057:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;25238:21;25247:2;25251:7;25238:8;:21::i;:::-;24926:341;24856:411;;:::o;54738:21::-;;;;;;;;;;;;;:::o;54880:41::-;;;;;;;;;;;;;:::o;37279:113::-;37340:7;37367:10;:17;;;;37360:24;;37279:113;:::o;54661:27::-;;;;:::o;54833:40::-;;;;;;;;;;;;;;;;;:::o;26392:376::-;26601:41;26620:12;:10;:12::i;:::-;26634:7;26601:18;:41::i;:::-;26579:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;26732:28;26742:4;26748:2;26752:7;26732:9;:28::i;:::-;26392:376;;;:::o;58524:87::-;44134:12;:10;:12::i;:::-;44123:23;;:7;:5;:7::i;:::-;:23;;;44115:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58597:6:::1;58586:8;;:17;;;;;;;;;;;;;;;;;;58524:87:::0;:::o;36860:343::-;37002:7;37057:23;37074:5;37057:16;:23::i;:::-;37049:5;:31;37027:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;37169:12;:19;37182:5;37169:19;;;;;;;;;;;;;;;:26;37189:5;37169:26;;;;;;;;;;;;37162:33;;36860:343;;;;:::o;53759:613::-;53919:4;53943:15;53996:4;54003;53971:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53961:48;;;;;;53943:66;;54022:19;:56;;;;;;;;;;;;;;;;;;;54089:20;54139:6;54147:7;54122:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54112:44;;;;;;54089:67;;54185:18;54206:35;54216:12;54230:2;54234;54238;54206:35;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54185:56;;54267:10;54256:21;;:7;:5;:7::i;:::-;:21;;;54252:86;;;54318:4;54311:11;;;;;;;;54252:86;54359:5;54352:12;;;;;;53759:613;;;;;;;:::o;60574:192::-;44134:12;:10;:12::i;:::-;44123:23;;:7;:5;:7::i;:::-;:23;;;44115:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60631:12:::1;60657:10;60649:24;;60695:21;60649:82;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60630:101;;;60750:7;60742:16;;;::::0;::::1;;60619:147;60574:192::o:0;26839:185::-;26977:39;26994:4;27000:2;27004:7;26977:39;;;;;;;;;;;;:16;:39::i;:::-;26839:185;;;:::o;56950:390::-;57037:16;57071:23;57097:17;57107:6;57097:9;:17::i;:::-;57071:43;;57125:25;57167:15;57153:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57125:58;;57199:9;57194:113;57214:15;57210:1;:19;57194:113;;;57265:30;57285:6;57293:1;57265:19;:30::i;:::-;57251:8;57260:1;57251:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;57231:3;;;;;:::i;:::-;;;;57194:113;;;;57324:8;57317:15;;;;56950:390;;;:::o;37469:320::-;37589:7;37644:30;:28;:30::i;:::-;37636:5;:38;37614:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;37764:10;37775:5;37764:17;;;;;;;;:::i;:::-;;;;;;;;;;37757:24;;37469:320;;;:::o;58253:104::-;44134:12;:10;:12::i;:::-;44123:23;;:7;:5;:7::i;:::-;:23;;;44115:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58338:11:::1;58328:7;:21;;;;;;;;;;;;:::i;:::-;;58253:104:::0;:::o;54987:40::-;;;;;;;;;;;;;;;;;;;;:::o;23247:326::-;23364:7;23389:13;23405:7;:16;23413:7;23405:16;;;;;;;;;;;;;;;;;;;;;23389:32;;23471:1;23454:19;;:5;:19;;;;23432:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;23560:5;23553:12;;;23247:326;;;:::o;54801:25::-;;;;;;;;;;;;;:::o;55681:83::-;44134:12;:10;:12::i;:::-;44123:23;;:7;:5;:7::i;:::-;:23;;;44115:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55748:8:::1;;;;;;;;;;;55747:9;55736:8;;:20;;;;;;;;;;;;;;;;;;55681:83::o:0;22890:295::-;23007:7;23071:1;23054:19;;:5;:19;;;;23032:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;23161:9;:16;23171:5;23161:16;;;;;;;;;;;;;;;;23154:23;;22890:295;;;:::o;44554:94::-;44134:12;:10;:12::i;:::-;44123:23;;:7;:5;:7::i;:::-;:23;;;44115:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44619:21:::1;44637:1;44619:9;:21::i;:::-;44554:94::o:0;55888:103::-;44134:12;:10;:12::i;:::-;44123:23;;:7;:5;:7::i;:::-;:23;;;44115:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55972:11:::1;55959:10;;:24;;;;;;;;;;;;;;;;;;55888:103:::0;:::o;54695:36::-;;;;:::o;43903:87::-;43949:7;43976:6;;;;;;;;;;;43969:13;;43903:87;:::o;23809:104::-;23865:13;23898:7;23891:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23809:104;:::o;54962:18::-;;;;:::o;56353:580::-;56446:17;;56427:15;:36;;56405:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;56539:1;56533:5;:7;:19;;;;;56551:1;56544:5;:8;;56533:19;56525:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;56585:13;56601:10;56618:1;56612:5;:7;;;;:::i;:::-;56601:19;;;;;;;:::i;:::-;;;;56585:35;;56631:14;56648:13;:11;:13::i;:::-;56631:30;;56693:5;56672:8;:18;56688:1;56681:6;:8;;;;:::i;:::-;56672:18;;;;;;;;;;;:26;;;;56724:6;;;;;;;;;;;56717:27;;;56745:10;56765:4;56772:5;56717:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56709:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;56819:8;;;;;;;;;;;56818:9;56810:18;;;;;;56861:9;;56856:1;56847:6;:10;;;;:::i;:::-;:23;;56839:32;;;;;;56892:33;56902:10;56923:1;56914:6;:10;;;;:::i;:::-;56892:9;:33::i;:::-;56394:539;;56353:580;:::o;25713:327::-;25860:12;:10;:12::i;:::-;25848:24;;:8;:24;;;;25840:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;25960:8;25915:18;:32;25934:12;:10;:12::i;:::-;25915:32;;;;;;;;;;;;;;;:42;25948:8;25915:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;26013:8;25984:48;;25999:12;:10;:12::i;:::-;25984:48;;;26023:8;25984:48;;;;;;:::i;:::-;;;;;;;;25713:327;;:::o;58008:235::-;58063:7;58105:17;;58087:15;:35;58083:153;;;58168:15;58147:17;;58146:37;;;;:::i;:::-;58139:44;;;;58083:153;58223:1;58216:8;;58008:235;;:::o;54766:28::-;;;;;;;;;;;;;:::o;27095:365::-;27284:41;27303:12;:10;:12::i;:::-;27317:7;27284:18;:41::i;:::-;27262:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;27413:39;27427:4;27433:2;27437:7;27446:5;27413:13;:39::i;:::-;27095:365;;;;:::o;54575:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57348:652::-;57466:13;57519:16;57527:7;57519;:16::i;:::-;57497:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;57623:28;57654:10;:8;:10::i;:::-;57623:41;;57726:1;57701:14;57695:28;:32;:297;;;;;;;;;;;;;;;;;57819:14;57860:28;:8;:17;57869:7;57860:17;;;;;;;;;;;;:26;:28::i;:::-;57915:13;57776:175;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57695:297;57675:317;;;57348:652;;;:::o;55999:78::-;44134:12;:10;:12::i;:::-;44123:23;;:7;:5;:7::i;:::-;:23;;;44115:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56065:4:::1;56059:3;:10;;;;55999:78:::0;:::o;56218:112::-;44134:12;:10;:12::i;:::-;44123:23;;:7;:5;:7::i;:::-;:23;;;44115:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56308:14:::1;56299:6;;:23;;;;;;;;;;;;;;;;;;56218:112:::0;:::o;54619:35::-;;;;:::o;58365:151::-;44134:12;:10;:12::i;:::-;44123:23;;:7;:5;:7::i;:::-;:23;;;44115:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58491:17:::1;58475:13;:33;;;;;;;;;;;;:::i;:::-;;58365:151:::0;:::o;59220:590::-;44134:12;:10;:12::i;:::-;44123:23;;:7;:5;:7::i;:::-;:23;;;44115:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59345:21:::1;59383:1;59369:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59345:40;;59406:6;;;;;;;;;;;59396:4;59401:1;59396:7;;;;;;;;:::i;:::-;;;;;;;:16;;;;;;;;;::::0;::::1;59433:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59423:4;59428:1;59423:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;::::0;::::1;59475:6;;;;;;;;;;;59468:22;;;59499:15;;;;;;;;;;;59517:11;59468:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;59568:15;;;;;;;;;;;:66;;;59649:11;59675:1;59719:4;59746;59766:15;59568:224;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;59272:538;59220:590:::0;:::o;26111:214::-;26253:4;26282:18;:25;26301:5;26282:25;;;;;;;;;;;;;;;:35;26308:8;26282:35;;;;;;;;;;;;;;;;;;;;;;;;;26275:42;;26111:214;;;;:::o;60329:235::-;60386:23;60412:21;60426:6;60412:13;:21::i;:::-;60386:47;;60449:9;60444:113;60464:6;:13;60460:1;:17;60444:113;;;60511:10;;;;;;;;;;;60499:35;;;60535:6;60542:1;60535:9;;;;;;;;:::i;:::-;;;;;;;;60499:46;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;60479:3;;;;;:::i;:::-;;;;60444:113;;;;60375:189;60329:235;:::o;44803:229::-;44134:12;:10;:12::i;:::-;44123:23;;:7;:5;:7::i;:::-;:23;;;44115:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44926:1:::1;44906:22;;:8;:22;;;;44884:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;45005:19;45015:8;45005:9;:19::i;:::-;44803:229:::0;:::o;55772:108::-;44134:12;:10;:12::i;:::-;44123:23;;:7;:5;:7::i;:::-;:23;;;44115:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55865:7:::1;55852:10;:20;;;;;;;:::i;:::-;;55772:108:::0;:::o;54519:28::-;;;;;;;;;;;;;:::o;22471:355::-;22618:4;22675:25;22660:40;;;:11;:40;;;;:105;;;;22732:33;22717:48;;;:11;:48;;;;22660:105;:158;;;;22782:36;22806:11;22782:23;:36::i;:::-;22660:158;22640:178;;22471:355;;;:::o;29007:127::-;29072:4;29124:1;29096:30;;:7;:16;29104:7;29096:16;;;;;;;;;;;;;;;;;;;;;:30;;;;29089:37;;29007:127;;;:::o;20945:98::-;20998:7;21025:10;21018:17;;20945:98;:::o;33130:174::-;33232:2;33205:15;:24;33221:7;33205:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33288:7;33284:2;33250:46;;33259:23;33274:7;33259:14;:23::i;:::-;33250:46;;;;;;;;;;;;33130:174;;:::o;29301:452::-;29430:4;29474:16;29482:7;29474;:16::i;:::-;29452:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;29573:13;29589:23;29604:7;29589:14;:23::i;:::-;29573:39;;29642:5;29631:16;;:7;:16;;;:64;;;;29688:7;29664:31;;:20;29676:7;29664:11;:20::i;:::-;:31;;;29631:64;:113;;;;29712:32;29729:5;29736:7;29712:16;:32::i;:::-;29631:113;29623:122;;;29301:452;;;;:::o;32397:615::-;32570:4;32543:31;;:23;32558:7;32543:14;:23::i;:::-;:31;;;32521:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;32676:1;32662:16;;:2;:16;;;;32654:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32732:39;32753:4;32759:2;32763:7;32732:20;:39::i;:::-;32836:29;32853:1;32857:7;32836:8;:29::i;:::-;32897:1;32878:9;:15;32888:4;32878:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32926:1;32909:9;:13;32919:2;32909:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32957:2;32938:7;:16;32946:7;32938:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32996:7;32992:2;32977:27;;32986:4;32977:27;;;;;;;;;;;;32397:615;;;:::o;45040:173::-;45096:16;45115:6;;;;;;;;;;;45096:25;;45141:8;45132:6;;:17;;;;;;;;;;;;;;;;;;45196:8;45165:40;;45186:8;45165:40;;;;;;;;;;;;45085:128;45040:173;:::o;30095:110::-;30171:26;30181:2;30185:7;30171:26;;;;;;;;;;;;:9;:26::i;:::-;30095:110;;:::o;28342:352::-;28499:28;28509:4;28515:2;28519:7;28499:9;:28::i;:::-;28560:48;28583:4;28589:2;28593:7;28602:5;28560:22;:48::i;:::-;28538:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;28342:352;;;;:::o;56102:108::-;56162:13;56195:7;56188:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56102:108;:::o;8290:723::-;8346:13;8576:1;8567:5;:10;8563:53;;;8594:10;;;;;;;;;;;;;;;;;;;;;8563:53;8626:12;8641:5;8626:20;;8657:14;8682:78;8697:1;8689:4;:9;8682:78;;8715:8;;;;;:::i;:::-;;;;8746:2;8738:10;;;;;:::i;:::-;;;8682:78;;;8770:19;8802:6;8792:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8770:39;;8820:154;8836:1;8827:5;:10;8820:154;;8864:1;8854:11;;;;;:::i;:::-;;;8931:2;8923:5;:10;;;;:::i;:::-;8910:2;:24;;;;:::i;:::-;8897:39;;8880:6;8887;8880:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;8960:2;8951:11;;;;;:::i;:::-;;;8820:154;;;8998:6;8984:21;;;;;8290:723;;;;:::o;7769:207::-;7899:4;7943:25;7928:40;;;:11;:40;;;;7921:47;;7769:207;;;:::o;59820:501::-;59964:45;59991:4;59997:2;60001:7;59964:26;:45::i;:::-;60040:1;60024:18;;:4;:18;;;60020:294;;;60071:10;;;;;;;;;;;60059:35;;;60095:7;60104:8;:17;60113:7;60104:17;;;;;;;;;;;;60123:2;60059:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;60020:294;;;60164:2;60156:10;;:4;:10;;;60152:162;;60195:10;;;;;;;;;;;60183:35;;;60219:7;60183:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;60262:10;;;;;;;;;;;60250:39;;;60290:7;60299:2;60250:52;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;60152:162;60020:294;59820:501;;;:::o;30432:321::-;30562:18;30568:2;30572:7;30562:5;:18::i;:::-;30613:54;30644:1;30648:2;30652:7;30661:5;30613:22;:54::i;:::-;30591:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;30432:321;;;:::o;33869:980::-;34024:4;34045:15;:2;:13;;;:15::i;:::-;34041:801;;;34114:2;34098:36;;;34157:12;:10;:12::i;:::-;34192:4;34219:7;34249:5;34098:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34077:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34473:1;34456:6;:13;:18;34452:320;;;34499:108;;;;;;;;;;:::i;:::-;;;;;;;;34452:320;34722:6;34716:13;34707:6;34703:2;34699:15;34692:38;34077:710;34347:41;;;34337:51;;;:6;:51;;;;34330:58;;;;;34041:801;34826:4;34819:11;;33869:980;;;;;;;:::o;38402:589::-;38546:45;38573:4;38579:2;38583:7;38546:26;:45::i;:::-;38624:1;38608:18;;:4;:18;;;38604:187;;;38643:40;38675:7;38643:31;:40::i;:::-;38604:187;;;38713:2;38705:10;;:4;:10;;;38701:90;;38732:47;38765:4;38771:7;38732:32;:47::i;:::-;38701:90;38604:187;38819:1;38805:16;;:2;:16;;;38801:183;;;38838:45;38875:7;38838:36;:45::i;:::-;38801:183;;;38911:4;38905:10;;:2;:10;;;38901:83;;38932:40;38960:2;38964:7;38932:27;:40::i;:::-;38901:83;38801:183;38402:589;;;:::o;31089:382::-;31183:1;31169:16;;:2;:16;;;;31161:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;31242:16;31250:7;31242;:16::i;:::-;31241:17;31233:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;31304:45;31333:1;31337:2;31341:7;31304:20;:45::i;:::-;31379:1;31362:9;:13;31372:2;31362:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31410:2;31391:7;:16;31399:7;31391:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31455:7;31451:2;31430:33;;31447:1;31430:33;;;;;;;;;;;;31089:382;;:::o;10843:387::-;10903:4;11111:12;11178:7;11166:20;11158:28;;11221:1;11214:4;:8;11207:15;;;10843:387;;;:::o;35421:126::-;;;;:::o;39714:164::-;39818:10;:17;;;;39791:15;:24;39807:7;39791:24;;;;;;;;;;;:44;;;;39846:10;39862:7;39846:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39714:164;:::o;40505:1002::-;40785:22;40835:1;40810:22;40827:4;40810:16;:22::i;:::-;:26;;;;:::i;:::-;40785:51;;40847:18;40868:17;:26;40886:7;40868:26;;;;;;;;;;;;40847:47;;41015:14;41001:10;:28;40997:328;;41046:19;41068:12;:18;41081:4;41068:18;;;;;;;;;;;;;;;:34;41087:14;41068:34;;;;;;;;;;;;41046:56;;41152:11;41119:12;:18;41132:4;41119:18;;;;;;;;;;;;;;;:30;41138:10;41119:30;;;;;;;;;;;:44;;;;41269:10;41236:17;:30;41254:11;41236:30;;;;;;;;;;;:43;;;;41031:294;40997:328;41421:17;:26;41439:7;41421:26;;;;;;;;;;;41414:33;;;41465:12;:18;41478:4;41465:18;;;;;;;;;;;;;;;:34;41484:14;41465:34;;;;;;;;;;;41458:41;;;40600:907;;40505:1002;;:::o;41802:1079::-;42055:22;42100:1;42080:10;:17;;;;:21;;;;:::i;:::-;42055:46;;42112:18;42133:15;:24;42149:7;42133:24;;;;;;;;;;;;42112:45;;42484:19;42506:10;42517:14;42506:26;;;;;;;;:::i;:::-;;;;;;;;;;42484:48;;42570:11;42545:10;42556;42545:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;42681:10;42650:15;:28;42666:11;42650:28;;;;;;;;;;;:41;;;;42822:15;:24;42838:7;42822:24;;;;;;;;;;;42815:31;;;42857:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41873:1008;;;41802:1079;:::o;39292:221::-;39377:14;39394:20;39411:2;39394:16;:20::i;:::-;39377:37;;39452:7;39425:12;:16;39438:2;39425:16;;;;;;;;;;;;;;;:24;39442:6;39425:24;;;;;;;;;;;:34;;;;39499:6;39470:17;:26;39488:7;39470:26;;;;;;;;;;;:35;;;;39366:147;39292:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;25:655:1:-;119:5;144:79;160:62;215:6;160:62;:::i;:::-;144:79;:::i;:::-;135:88;;243:5;269:6;319:3;311:4;303:6;299:17;294:3;290:27;287:36;284:143;;;338:79;;:::i;:::-;284:143;451:1;436:238;461:6;458:1;455:13;436:238;;;529:3;558:37;591:3;579:10;558:37;:::i;:::-;553:3;546:50;625:4;620:3;616:14;609:21;;659:4;654:3;650:14;643:21;;496:178;483:1;480;476:9;471:14;;436:238;;;440:14;125:555;;25:655;;;;;:::o;686:410::-;763:5;788:65;804:48;845:6;804:48;:::i;:::-;788:65;:::i;:::-;779:74;;876:6;869:5;862:21;914:4;907:5;903:16;952:3;943:6;938:3;934:16;931:25;928:112;;;959:79;;:::i;:::-;928:112;1049:41;1083:6;1078:3;1073;1049:41;:::i;:::-;769:327;686:410;;;;;:::o;1102:412::-;1180:5;1205:66;1221:49;1263:6;1221:49;:::i;:::-;1205:66;:::i;:::-;1196:75;;1294:6;1287:5;1280:21;1332:4;1325:5;1321:16;1370:3;1361:6;1356:3;1352:16;1349:25;1346:112;;;1377:79;;:::i;:::-;1346:112;1467:41;1501:6;1496:3;1491;1467:41;:::i;:::-;1186:328;1102:412;;;;;:::o;1520:139::-;1566:5;1604:6;1591:20;1582:29;;1620:33;1647:5;1620:33;:::i;:::-;1520:139;;;;:::o;1665:143::-;1722:5;1753:6;1747:13;1738:22;;1769:33;1796:5;1769:33;:::i;:::-;1665:143;;;;:::o;1832:339::-;1901:5;1950:3;1943:4;1935:6;1931:17;1927:27;1917:122;;1958:79;;:::i;:::-;1917:122;2062:4;2084:81;2161:3;2153:6;2145;2084:81;:::i;:::-;2075:90;;1907:264;1832:339;;;;:::o;2177:133::-;2220:5;2258:6;2245:20;2236:29;;2274:30;2298:5;2274:30;:::i;:::-;2177:133;;;;:::o;2316:137::-;2370:5;2401:6;2395:13;2386:22;;2417:30;2441:5;2417:30;:::i;:::-;2316:137;;;;:::o;2459:139::-;2505:5;2543:6;2530:20;2521:29;;2559:33;2586:5;2559:33;:::i;:::-;2459:139;;;;:::o;2604:137::-;2649:5;2687:6;2674:20;2665:29;;2703:32;2729:5;2703:32;:::i;:::-;2604:137;;;;:::o;2747:141::-;2803:5;2834:6;2828:13;2819:22;;2850:32;2876:5;2850:32;:::i;:::-;2747:141;;;;:::o;2907:338::-;2962:5;3011:3;3004:4;2996:6;2992:17;2988:27;2978:122;;3019:79;;:::i;:::-;2978:122;3136:6;3123:20;3161:78;3235:3;3227:6;3220:4;3212:6;3208:17;3161:78;:::i;:::-;3152:87;;2968:277;2907:338;;;;:::o;3265:340::-;3321:5;3370:3;3363:4;3355:6;3351:17;3347:27;3337:122;;3378:79;;:::i;:::-;3337:122;3495:6;3482:20;3520:79;3595:3;3587:6;3580:4;3572:6;3568:17;3520:79;:::i;:::-;3511:88;;3327:278;3265:340;;;;:::o;3611:139::-;3657:5;3695:6;3682:20;3673:29;;3711:33;3738:5;3711:33;:::i;:::-;3611:139;;;;:::o;3756:135::-;3800:5;3838:6;3825:20;3816:29;;3854:31;3879:5;3854:31;:::i;:::-;3756:135;;;;:::o;3897:329::-;3956:6;4005:2;3993:9;3984:7;3980:23;3976:32;3973:119;;;4011:79;;:::i;:::-;3973:119;4131:1;4156:53;4201:7;4192:6;4181:9;4177:22;4156:53;:::i;:::-;4146:63;;4102:117;3897:329;;;;:::o;4232:351::-;4302:6;4351:2;4339:9;4330:7;4326:23;4322:32;4319:119;;;4357:79;;:::i;:::-;4319:119;4477:1;4502:64;4558:7;4549:6;4538:9;4534:22;4502:64;:::i;:::-;4492:74;;4448:128;4232:351;;;;:::o;4589:474::-;4657:6;4665;4714:2;4702:9;4693:7;4689:23;4685:32;4682:119;;;4720:79;;:::i;:::-;4682:119;4840:1;4865:53;4910:7;4901:6;4890:9;4886:22;4865:53;:::i;:::-;4855:63;;4811:117;4967:2;4993:53;5038:7;5029:6;5018:9;5014:22;4993:53;:::i;:::-;4983:63;;4938:118;4589:474;;;;;:::o;5069:619::-;5146:6;5154;5162;5211:2;5199:9;5190:7;5186:23;5182:32;5179:119;;;5217:79;;:::i;:::-;5179:119;5337:1;5362:53;5407:7;5398:6;5387:9;5383:22;5362:53;:::i;:::-;5352:63;;5308:117;5464:2;5490:53;5535:7;5526:6;5515:9;5511:22;5490:53;:::i;:::-;5480:63;;5435:118;5592:2;5618:53;5663:7;5654:6;5643:9;5639:22;5618:53;:::i;:::-;5608:63;;5563:118;5069:619;;;;;:::o;5694:943::-;5789:6;5797;5805;5813;5862:3;5850:9;5841:7;5837:23;5833:33;5830:120;;;5869:79;;:::i;:::-;5830:120;5989:1;6014:53;6059:7;6050:6;6039:9;6035:22;6014:53;:::i;:::-;6004:63;;5960:117;6116:2;6142:53;6187:7;6178:6;6167:9;6163:22;6142:53;:::i;:::-;6132:63;;6087:118;6244:2;6270:53;6315:7;6306:6;6295:9;6291:22;6270:53;:::i;:::-;6260:63;;6215:118;6400:2;6389:9;6385:18;6372:32;6431:18;6423:6;6420:30;6417:117;;;6453:79;;:::i;:::-;6417:117;6558:62;6612:7;6603:6;6592:9;6588:22;6558:62;:::i;:::-;6548:72;;6343:287;5694:943;;;;;;;:::o;6643:468::-;6708:6;6716;6765:2;6753:9;6744:7;6740:23;6736:32;6733:119;;;6771:79;;:::i;:::-;6733:119;6891:1;6916:53;6961:7;6952:6;6941:9;6937:22;6916:53;:::i;:::-;6906:63;;6862:117;7018:2;7044:50;7086:7;7077:6;7066:9;7062:22;7044:50;:::i;:::-;7034:60;;6989:115;6643:468;;;;;:::o;7117:474::-;7185:6;7193;7242:2;7230:9;7221:7;7217:23;7213:32;7210:119;;;7248:79;;:::i;:::-;7210:119;7368:1;7393:53;7438:7;7429:6;7418:9;7414:22;7393:53;:::i;:::-;7383:63;;7339:117;7495:2;7521:53;7566:7;7557:6;7546:9;7542:22;7521:53;:::i;:::-;7511:63;;7466:118;7117:474;;;;;:::o;7597:761::-;7681:6;7689;7697;7705;7754:3;7742:9;7733:7;7729:23;7725:33;7722:120;;;7761:79;;:::i;:::-;7722:120;7881:1;7906:53;7951:7;7942:6;7931:9;7927:22;7906:53;:::i;:::-;7896:63;;7852:117;8008:2;8034:51;8077:7;8068:6;8057:9;8053:22;8034:51;:::i;:::-;8024:61;;7979:116;8134:2;8160:53;8205:7;8196:6;8185:9;8181:22;8160:53;:::i;:::-;8150:63;;8105:118;8262:2;8288:53;8333:7;8324:6;8313:9;8309:22;8288:53;:::i;:::-;8278:63;;8233:118;7597:761;;;;;;;:::o;8364:376::-;8446:6;8495:3;8483:9;8474:7;8470:23;8466:33;8463:120;;;8502:79;;:::i;:::-;8463:120;8622:1;8647:76;8715:7;8706:6;8695:9;8691:22;8647:76;:::i;:::-;8637:86;;8593:140;8364:376;;;;:::o;8746:323::-;8802:6;8851:2;8839:9;8830:7;8826:23;8822:32;8819:119;;;8857:79;;:::i;:::-;8819:119;8977:1;9002:50;9044:7;9035:6;9024:9;9020:22;9002:50;:::i;:::-;8992:60;;8948:114;8746:323;;;;:::o;9075:345::-;9142:6;9191:2;9179:9;9170:7;9166:23;9162:32;9159:119;;;9197:79;;:::i;:::-;9159:119;9317:1;9342:61;9395:7;9386:6;9375:9;9371:22;9342:61;:::i;:::-;9332:71;;9288:125;9075:345;;;;:::o;9426:327::-;9484:6;9533:2;9521:9;9512:7;9508:23;9504:32;9501:119;;;9539:79;;:::i;:::-;9501:119;9659:1;9684:52;9728:7;9719:6;9708:9;9704:22;9684:52;:::i;:::-;9674:62;;9630:116;9426:327;;;;:::o;9759:349::-;9828:6;9877:2;9865:9;9856:7;9852:23;9848:32;9845:119;;;9883:79;;:::i;:::-;9845:119;10003:1;10028:63;10083:7;10074:6;10063:9;10059:22;10028:63;:::i;:::-;10018:73;;9974:127;9759:349;;;;:::o;10114:509::-;10183:6;10232:2;10220:9;10211:7;10207:23;10203:32;10200:119;;;10238:79;;:::i;:::-;10200:119;10386:1;10375:9;10371:17;10358:31;10416:18;10408:6;10405:30;10402:117;;;10438:79;;:::i;:::-;10402:117;10543:63;10598:7;10589:6;10578:9;10574:22;10543:63;:::i;:::-;10533:73;;10329:287;10114:509;;;;:::o;10629:329::-;10688:6;10737:2;10725:9;10716:7;10712:23;10708:32;10705:119;;;10743:79;;:::i;:::-;10705:119;10863:1;10888:53;10933:7;10924:6;10913:9;10909:22;10888:53;:::i;:::-;10878:63;;10834:117;10629:329;;;;:::o;10964:179::-;11033:10;11054:46;11096:3;11088:6;11054:46;:::i;:::-;11132:4;11127:3;11123:14;11109:28;;10964:179;;;;:::o;11149:::-;11218:10;11239:46;11281:3;11273:6;11239:46;:::i;:::-;11317:4;11312:3;11308:14;11294:28;;11149:179;;;;:::o;11334:108::-;11411:24;11429:5;11411:24;:::i;:::-;11406:3;11399:37;11334:108;;:::o;11448:118::-;11535:24;11553:5;11535:24;:::i;:::-;11530:3;11523:37;11448:118;;:::o;11572:157::-;11677:45;11697:24;11715:5;11697:24;:::i;:::-;11677:45;:::i;:::-;11672:3;11665:58;11572:157;;:::o;11765:732::-;11884:3;11913:54;11961:5;11913:54;:::i;:::-;11983:86;12062:6;12057:3;11983:86;:::i;:::-;11976:93;;12093:56;12143:5;12093:56;:::i;:::-;12172:7;12203:1;12188:284;12213:6;12210:1;12207:13;12188:284;;;12289:6;12283:13;12316:63;12375:3;12360:13;12316:63;:::i;:::-;12309:70;;12402:60;12455:6;12402:60;:::i;:::-;12392:70;;12248:224;12235:1;12232;12228:9;12223:14;;12188:284;;;12192:14;12488:3;12481:10;;11889:608;;;11765:732;;;;:::o;12533:::-;12652:3;12681:54;12729:5;12681:54;:::i;:::-;12751:86;12830:6;12825:3;12751:86;:::i;:::-;12744:93;;12861:56;12911:5;12861:56;:::i;:::-;12940:7;12971:1;12956:284;12981:6;12978:1;12975:13;12956:284;;;13057:6;13051:13;13084:63;13143:3;13128:13;13084:63;:::i;:::-;13077:70;;13170:60;13223:6;13170:60;:::i;:::-;13160:70;;13016:224;13003:1;13000;12996:9;12991:14;;12956:284;;;12960:14;13256:3;13249:10;;12657:608;;;12533:732;;;;:::o;13271:109::-;13352:21;13367:5;13352:21;:::i;:::-;13347:3;13340:34;13271:109;;:::o;13386:118::-;13473:24;13491:5;13473:24;:::i;:::-;13468:3;13461:37;13386:118;;:::o;13510:157::-;13615:45;13635:24;13653:5;13635:24;:::i;:::-;13615:45;:::i;:::-;13610:3;13603:58;13510:157;;:::o;13673:360::-;13759:3;13787:38;13819:5;13787:38;:::i;:::-;13841:70;13904:6;13899:3;13841:70;:::i;:::-;13834:77;;13920:52;13965:6;13960:3;13953:4;13946:5;13942:16;13920:52;:::i;:::-;13997:29;14019:6;13997:29;:::i;:::-;13992:3;13988:39;13981:46;;13763:270;13673:360;;;;:::o;14039:373::-;14143:3;14171:38;14203:5;14171:38;:::i;:::-;14225:88;14306:6;14301:3;14225:88;:::i;:::-;14218:95;;14322:52;14367:6;14362:3;14355:4;14348:5;14344:16;14322:52;:::i;:::-;14399:6;14394:3;14390:16;14383:23;;14147:265;14039:373;;;;:::o;14418:185::-;14532:64;14590:5;14532:64;:::i;:::-;14527:3;14520:77;14418:185;;:::o;14609:147::-;14704:45;14743:5;14704:45;:::i;:::-;14699:3;14692:58;14609:147;;:::o;14762:364::-;14850:3;14878:39;14911:5;14878:39;:::i;:::-;14933:71;14997:6;14992:3;14933:71;:::i;:::-;14926:78;;15013:52;15058:6;15053:3;15046:4;15039:5;15035:16;15013:52;:::i;:::-;15090:29;15112:6;15090:29;:::i;:::-;15085:3;15081:39;15074:46;;14854:272;14762:364;;;;:::o;15132:377::-;15238:3;15266:39;15299:5;15266:39;:::i;:::-;15321:89;15403:6;15398:3;15321:89;:::i;:::-;15314:96;;15419:52;15464:6;15459:3;15452:4;15445:5;15441:16;15419:52;:::i;:::-;15496:6;15491:3;15487:16;15480:23;;15242:267;15132:377;;;;:::o;15539:845::-;15642:3;15679:5;15673:12;15708:36;15734:9;15708:36;:::i;:::-;15760:89;15842:6;15837:3;15760:89;:::i;:::-;15753:96;;15880:1;15869:9;15865:17;15896:1;15891:137;;;;16042:1;16037:341;;;;15858:520;;15891:137;15975:4;15971:9;15960;15956:25;15951:3;15944:38;16011:6;16006:3;16002:16;15995:23;;15891:137;;16037:341;16104:38;16136:5;16104:38;:::i;:::-;16164:1;16178:154;16192:6;16189:1;16186:13;16178:154;;;16266:7;16260:14;16256:1;16251:3;16247:11;16240:35;16316:1;16307:7;16303:15;16292:26;;16214:4;16211:1;16207:12;16202:17;;16178:154;;;16361:6;16356:3;16352:16;16345:23;;16044:334;;15858:520;;15646:738;;15539:845;;;;:::o;16390:366::-;16532:3;16553:67;16617:2;16612:3;16553:67;:::i;:::-;16546:74;;16629:93;16718:3;16629:93;:::i;:::-;16747:2;16742:3;16738:12;16731:19;;16390:366;;;:::o;16762:::-;16904:3;16925:67;16989:2;16984:3;16925:67;:::i;:::-;16918:74;;17001:93;17090:3;17001:93;:::i;:::-;17119:2;17114:3;17110:12;17103:19;;16762:366;;;:::o;17134:::-;17276:3;17297:67;17361:2;17356:3;17297:67;:::i;:::-;17290:74;;17373:93;17462:3;17373:93;:::i;:::-;17491:2;17486:3;17482:12;17475:19;;17134:366;;;:::o;17506:::-;17648:3;17669:67;17733:2;17728:3;17669:67;:::i;:::-;17662:74;;17745:93;17834:3;17745:93;:::i;:::-;17863:2;17858:3;17854:12;17847:19;;17506:366;;;:::o;17878:::-;18020:3;18041:67;18105:2;18100:3;18041:67;:::i;:::-;18034:74;;18117:93;18206:3;18117:93;:::i;:::-;18235:2;18230:3;18226:12;18219:19;;17878:366;;;:::o;18250:::-;18392:3;18413:67;18477:2;18472:3;18413:67;:::i;:::-;18406:74;;18489:93;18578:3;18489:93;:::i;:::-;18607:2;18602:3;18598:12;18591:19;;18250:366;;;:::o;18622:::-;18764:3;18785:67;18849:2;18844:3;18785:67;:::i;:::-;18778:74;;18861:93;18950:3;18861:93;:::i;:::-;18979:2;18974:3;18970:12;18963:19;;18622:366;;;:::o;18994:::-;19136:3;19157:67;19221:2;19216:3;19157:67;:::i;:::-;19150:74;;19233:93;19322:3;19233:93;:::i;:::-;19351:2;19346:3;19342:12;19335:19;;18994:366;;;:::o;19366:::-;19508:3;19529:67;19593:2;19588:3;19529:67;:::i;:::-;19522:74;;19605:93;19694:3;19605:93;:::i;:::-;19723:2;19718:3;19714:12;19707:19;;19366:366;;;:::o;19738:::-;19880:3;19901:67;19965:2;19960:3;19901:67;:::i;:::-;19894:74;;19977:93;20066:3;19977:93;:::i;:::-;20095:2;20090:3;20086:12;20079:19;;19738:366;;;:::o;20110:::-;20252:3;20273:67;20337:2;20332:3;20273:67;:::i;:::-;20266:74;;20349:93;20438:3;20349:93;:::i;:::-;20467:2;20462:3;20458:12;20451:19;;20110:366;;;:::o;20482:::-;20624:3;20645:67;20709:2;20704:3;20645:67;:::i;:::-;20638:74;;20721:93;20810:3;20721:93;:::i;:::-;20839:2;20834:3;20830:12;20823:19;;20482:366;;;:::o;20854:::-;20996:3;21017:67;21081:2;21076:3;21017:67;:::i;:::-;21010:74;;21093:93;21182:3;21093:93;:::i;:::-;21211:2;21206:3;21202:12;21195:19;;20854:366;;;:::o;21226:::-;21368:3;21389:67;21453:2;21448:3;21389:67;:::i;:::-;21382:74;;21465:93;21554:3;21465:93;:::i;:::-;21583:2;21578:3;21574:12;21567:19;;21226:366;;;:::o;21598:::-;21740:3;21761:67;21825:2;21820:3;21761:67;:::i;:::-;21754:74;;21837:93;21926:3;21837:93;:::i;:::-;21955:2;21950:3;21946:12;21939:19;;21598:366;;;:::o;21970:::-;22112:3;22133:67;22197:2;22192:3;22133:67;:::i;:::-;22126:74;;22209:93;22298:3;22209:93;:::i;:::-;22327:2;22322:3;22318:12;22311:19;;21970:366;;;:::o;22342:::-;22484:3;22505:67;22569:2;22564:3;22505:67;:::i;:::-;22498:74;;22581:93;22670:3;22581:93;:::i;:::-;22699:2;22694:3;22690:12;22683:19;;22342:366;;;:::o;22714:::-;22856:3;22877:67;22941:2;22936:3;22877:67;:::i;:::-;22870:74;;22953:93;23042:3;22953:93;:::i;:::-;23071:2;23066:3;23062:12;23055:19;;22714:366;;;:::o;23086:::-;23228:3;23249:67;23313:2;23308:3;23249:67;:::i;:::-;23242:74;;23325:93;23414:3;23325:93;:::i;:::-;23443:2;23438:3;23434:12;23427:19;;23086:366;;;:::o;23458:398::-;23617:3;23638:83;23719:1;23714:3;23638:83;:::i;:::-;23631:90;;23730:93;23819:3;23730:93;:::i;:::-;23848:1;23843:3;23839:11;23832:18;;23458:398;;;:::o;23862:366::-;24004:3;24025:67;24089:2;24084:3;24025:67;:::i;:::-;24018:74;;24101:93;24190:3;24101:93;:::i;:::-;24219:2;24214:3;24210:12;24203:19;;23862:366;;;:::o;24234:::-;24376:3;24397:67;24461:2;24456:3;24397:67;:::i;:::-;24390:74;;24473:93;24562:3;24473:93;:::i;:::-;24591:2;24586:3;24582:12;24575:19;;24234:366;;;:::o;24606:108::-;24683:24;24701:5;24683:24;:::i;:::-;24678:3;24671:37;24606:108;;:::o;24720:118::-;24807:24;24825:5;24807:24;:::i;:::-;24802:3;24795:37;24720:118;;:::o;24844:112::-;24927:22;24943:5;24927:22;:::i;:::-;24922:3;24915:35;24844:112;;:::o;24962:397::-;25102:3;25117:75;25188:3;25179:6;25117:75;:::i;:::-;25217:2;25212:3;25208:12;25201:19;;25230:75;25301:3;25292:6;25230:75;:::i;:::-;25330:2;25325:3;25321:12;25314:19;;25350:3;25343:10;;24962:397;;;;;:::o;25365:412::-;25523:3;25545:93;25634:3;25625:6;25545:93;:::i;:::-;25538:100;;25648:75;25719:3;25710:6;25648:75;:::i;:::-;25748:2;25743:3;25739:12;25732:19;;25768:3;25761:10;;25365:412;;;;;:::o;25783:589::-;26008:3;26030:95;26121:3;26112:6;26030:95;:::i;:::-;26023:102;;26142:95;26233:3;26224:6;26142:95;:::i;:::-;26135:102;;26254:92;26342:3;26333:6;26254:92;:::i;:::-;26247:99;;26363:3;26356:10;;25783:589;;;;;;:::o;26378:379::-;26562:3;26584:147;26727:3;26584:147;:::i;:::-;26577:154;;26748:3;26741:10;;26378:379;;;:::o;26763:222::-;26856:4;26894:2;26883:9;26879:18;26871:26;;26907:71;26975:1;26964:9;26960:17;26951:6;26907:71;:::i;:::-;26763:222;;;;:::o;26991:442::-;27140:4;27178:2;27167:9;27163:18;27155:26;;27191:71;27259:1;27248:9;27244:17;27235:6;27191:71;:::i;:::-;27272:72;27340:2;27329:9;27325:18;27316:6;27272:72;:::i;:::-;27354;27422:2;27411:9;27407:18;27398:6;27354:72;:::i;:::-;26991:442;;;;;;:::o;27439:640::-;27634:4;27672:3;27661:9;27657:19;27649:27;;27686:71;27754:1;27743:9;27739:17;27730:6;27686:71;:::i;:::-;27767:72;27835:2;27824:9;27820:18;27811:6;27767:72;:::i;:::-;27849;27917:2;27906:9;27902:18;27893:6;27849:72;:::i;:::-;27968:9;27962:4;27958:20;27953:2;27942:9;27938:18;27931:48;27996:76;28067:4;28058:6;27996:76;:::i;:::-;27988:84;;27439:640;;;;;;;:::o;28085:332::-;28206:4;28244:2;28233:9;28229:18;28221:26;;28257:71;28325:1;28314:9;28310:17;28301:6;28257:71;:::i;:::-;28338:72;28406:2;28395:9;28391:18;28382:6;28338:72;:::i;:::-;28085:332;;;;;:::o;28423:373::-;28566:4;28604:2;28593:9;28589:18;28581:26;;28653:9;28647:4;28643:20;28639:1;28628:9;28624:17;28617:47;28681:108;28784:4;28775:6;28681:108;:::i;:::-;28673:116;;28423:373;;;;:::o;28802:210::-;28889:4;28927:2;28916:9;28912:18;28904:26;;28940:65;29002:1;28991:9;28987:17;28978:6;28940:65;:::i;:::-;28802:210;;;;:::o;29018:545::-;29191:4;29229:3;29218:9;29214:19;29206:27;;29243:71;29311:1;29300:9;29296:17;29287:6;29243:71;:::i;:::-;29324:68;29388:2;29377:9;29373:18;29364:6;29324:68;:::i;:::-;29402:72;29470:2;29459:9;29455:18;29446:6;29402:72;:::i;:::-;29484;29552:2;29541:9;29537:18;29528:6;29484:72;:::i;:::-;29018:545;;;;;;;:::o;29569:276::-;29689:4;29727:2;29716:9;29712:18;29704:26;;29740:98;29835:1;29824:9;29820:17;29811:6;29740:98;:::i;:::-;29569:276;;;;:::o;29851:313::-;29964:4;30002:2;29991:9;29987:18;29979:26;;30051:9;30045:4;30041:20;30037:1;30026:9;30022:17;30015:47;30079:78;30152:4;30143:6;30079:78;:::i;:::-;30071:86;;29851:313;;;;:::o;30170:419::-;30336:4;30374:2;30363:9;30359:18;30351:26;;30423:9;30417:4;30413:20;30409:1;30398:9;30394:17;30387:47;30451:131;30577:4;30451:131;:::i;:::-;30443:139;;30170:419;;;:::o;30595:::-;30761:4;30799:2;30788:9;30784:18;30776:26;;30848:9;30842:4;30838:20;30834:1;30823:9;30819:17;30812:47;30876:131;31002:4;30876:131;:::i;:::-;30868:139;;30595:419;;;:::o;31020:::-;31186:4;31224:2;31213:9;31209:18;31201:26;;31273:9;31267:4;31263:20;31259:1;31248:9;31244:17;31237:47;31301:131;31427:4;31301:131;:::i;:::-;31293:139;;31020:419;;;:::o;31445:::-;31611:4;31649:2;31638:9;31634:18;31626:26;;31698:9;31692:4;31688:20;31684:1;31673:9;31669:17;31662:47;31726:131;31852:4;31726:131;:::i;:::-;31718:139;;31445:419;;;:::o;31870:::-;32036:4;32074:2;32063:9;32059:18;32051:26;;32123:9;32117:4;32113:20;32109:1;32098:9;32094:17;32087:47;32151:131;32277:4;32151:131;:::i;:::-;32143:139;;31870:419;;;:::o;32295:::-;32461:4;32499:2;32488:9;32484:18;32476:26;;32548:9;32542:4;32538:20;32534:1;32523:9;32519:17;32512:47;32576:131;32702:4;32576:131;:::i;:::-;32568:139;;32295:419;;;:::o;32720:::-;32886:4;32924:2;32913:9;32909:18;32901:26;;32973:9;32967:4;32963:20;32959:1;32948:9;32944:17;32937:47;33001:131;33127:4;33001:131;:::i;:::-;32993:139;;32720:419;;;:::o;33145:::-;33311:4;33349:2;33338:9;33334:18;33326:26;;33398:9;33392:4;33388:20;33384:1;33373:9;33369:17;33362:47;33426:131;33552:4;33426:131;:::i;:::-;33418:139;;33145:419;;;:::o;33570:::-;33736:4;33774:2;33763:9;33759:18;33751:26;;33823:9;33817:4;33813:20;33809:1;33798:9;33794:17;33787:47;33851:131;33977:4;33851:131;:::i;:::-;33843:139;;33570:419;;;:::o;33995:::-;34161:4;34199:2;34188:9;34184:18;34176:26;;34248:9;34242:4;34238:20;34234:1;34223:9;34219:17;34212:47;34276:131;34402:4;34276:131;:::i;:::-;34268:139;;33995:419;;;:::o;34420:::-;34586:4;34624:2;34613:9;34609:18;34601:26;;34673:9;34667:4;34663:20;34659:1;34648:9;34644:17;34637:47;34701:131;34827:4;34701:131;:::i;:::-;34693:139;;34420:419;;;:::o;34845:::-;35011:4;35049:2;35038:9;35034:18;35026:26;;35098:9;35092:4;35088:20;35084:1;35073:9;35069:17;35062:47;35126:131;35252:4;35126:131;:::i;:::-;35118:139;;34845:419;;;:::o;35270:::-;35436:4;35474:2;35463:9;35459:18;35451:26;;35523:9;35517:4;35513:20;35509:1;35498:9;35494:17;35487:47;35551:131;35677:4;35551:131;:::i;:::-;35543:139;;35270:419;;;:::o;35695:::-;35861:4;35899:2;35888:9;35884:18;35876:26;;35948:9;35942:4;35938:20;35934:1;35923:9;35919:17;35912:47;35976:131;36102:4;35976:131;:::i;:::-;35968:139;;35695:419;;;:::o;36120:::-;36286:4;36324:2;36313:9;36309:18;36301:26;;36373:9;36367:4;36363:20;36359:1;36348:9;36344:17;36337:47;36401:131;36527:4;36401:131;:::i;:::-;36393:139;;36120:419;;;:::o;36545:::-;36711:4;36749:2;36738:9;36734:18;36726:26;;36798:9;36792:4;36788:20;36784:1;36773:9;36769:17;36762:47;36826:131;36952:4;36826:131;:::i;:::-;36818:139;;36545:419;;;:::o;36970:::-;37136:4;37174:2;37163:9;37159:18;37151:26;;37223:9;37217:4;37213:20;37209:1;37198:9;37194:17;37187:47;37251:131;37377:4;37251:131;:::i;:::-;37243:139;;36970:419;;;:::o;37395:::-;37561:4;37599:2;37588:9;37584:18;37576:26;;37648:9;37642:4;37638:20;37634:1;37623:9;37619:17;37612:47;37676:131;37802:4;37676:131;:::i;:::-;37668:139;;37395:419;;;:::o;37820:::-;37986:4;38024:2;38013:9;38009:18;38001:26;;38073:9;38067:4;38063:20;38059:1;38048:9;38044:17;38037:47;38101:131;38227:4;38101:131;:::i;:::-;38093:139;;37820:419;;;:::o;38245:::-;38411:4;38449:2;38438:9;38434:18;38426:26;;38498:9;38492:4;38488:20;38484:1;38473:9;38469:17;38462:47;38526:131;38652:4;38526:131;:::i;:::-;38518:139;;38245:419;;;:::o;38670:::-;38836:4;38874:2;38863:9;38859:18;38851:26;;38923:9;38917:4;38913:20;38909:1;38898:9;38894:17;38887:47;38951:131;39077:4;38951:131;:::i;:::-;38943:139;;38670:419;;;:::o;39095:222::-;39188:4;39226:2;39215:9;39211:18;39203:26;;39239:71;39307:1;39296:9;39292:17;39283:6;39239:71;:::i;:::-;39095:222;;;;:::o;39323:332::-;39444:4;39482:2;39471:9;39467:18;39459:26;;39495:71;39563:1;39552:9;39548:17;39539:6;39495:71;:::i;:::-;39576:72;39644:2;39633:9;39629:18;39620:6;39576:72;:::i;:::-;39323:332;;;;;:::o;39661:831::-;39924:4;39962:3;39951:9;39947:19;39939:27;;39976:71;40044:1;40033:9;40029:17;40020:6;39976:71;:::i;:::-;40057:80;40133:2;40122:9;40118:18;40109:6;40057:80;:::i;:::-;40184:9;40178:4;40174:20;40169:2;40158:9;40154:18;40147:48;40212:108;40315:4;40306:6;40212:108;:::i;:::-;40204:116;;40330:72;40398:2;40387:9;40383:18;40374:6;40330:72;:::i;:::-;40412:73;40480:3;40469:9;40465:19;40456:6;40412:73;:::i;:::-;39661:831;;;;;;;;:::o;40498:442::-;40647:4;40685:2;40674:9;40670:18;40662:26;;40698:71;40766:1;40755:9;40751:17;40742:6;40698:71;:::i;:::-;40779:72;40847:2;40836:9;40832:18;40823:6;40779:72;:::i;:::-;40861;40929:2;40918:9;40914:18;40905:6;40861:72;:::i;:::-;40498:442;;;;;;:::o;40946:129::-;40980:6;41007:20;;:::i;:::-;40997:30;;41036:33;41064:4;41056:6;41036:33;:::i;:::-;40946:129;;;:::o;41081:75::-;41114:6;41147:2;41141:9;41131:19;;41081:75;:::o;41162:249::-;41237:4;41327:18;41319:6;41316:30;41313:56;;;41349:18;;:::i;:::-;41313:56;41399:4;41391:6;41387:17;41379:25;;41162:249;;;:::o;41417:307::-;41478:4;41568:18;41560:6;41557:30;41554:56;;;41590:18;;:::i;:::-;41554:56;41628:29;41650:6;41628:29;:::i;:::-;41620:37;;41712:4;41706;41702:15;41694:23;;41417:307;;;:::o;41730:308::-;41792:4;41882:18;41874:6;41871:30;41868:56;;;41904:18;;:::i;:::-;41868:56;41942:29;41964:6;41942:29;:::i;:::-;41934:37;;42026:4;42020;42016:15;42008:23;;41730:308;;;:::o;42044:132::-;42111:4;42134:3;42126:11;;42164:4;42159:3;42155:14;42147:22;;42044:132;;;:::o;42182:::-;42249:4;42272:3;42264:11;;42302:4;42297:3;42293:14;42285:22;;42182:132;;;:::o;42320:141::-;42369:4;42392:3;42384:11;;42415:3;42412:1;42405:14;42449:4;42446:1;42436:18;42428:26;;42320:141;;;:::o;42467:114::-;42534:6;42568:5;42562:12;42552:22;;42467:114;;;:::o;42587:::-;42654:6;42688:5;42682:12;42672:22;;42587:114;;;:::o;42707:98::-;42758:6;42792:5;42786:12;42776:22;;42707:98;;;:::o;42811:99::-;42863:6;42897:5;42891:12;42881:22;;42811:99;;;:::o;42916:113::-;42986:4;43018;43013:3;43009:14;43001:22;;42916:113;;;:::o;43035:::-;43105:4;43137;43132:3;43128:14;43120:22;;43035:113;;;:::o;43154:184::-;43253:11;43287:6;43282:3;43275:19;43327:4;43322:3;43318:14;43303:29;;43154:184;;;;:::o;43344:::-;43443:11;43477:6;43472:3;43465:19;43517:4;43512:3;43508:14;43493:29;;43344:184;;;;:::o;43534:168::-;43617:11;43651:6;43646:3;43639:19;43691:4;43686:3;43682:14;43667:29;;43534:168;;;;:::o;43708:147::-;43809:11;43846:3;43831:18;;43708:147;;;;:::o;43861:169::-;43945:11;43979:6;43974:3;43967:19;44019:4;44014:3;44010:14;43995:29;;43861:169;;;;:::o;44036:148::-;44138:11;44175:3;44160:18;;44036:148;;;;:::o;44190:305::-;44230:3;44249:20;44267:1;44249:20;:::i;:::-;44244:25;;44283:20;44301:1;44283:20;:::i;:::-;44278:25;;44437:1;44369:66;44365:74;44362:1;44359:81;44356:107;;;44443:18;;:::i;:::-;44356:107;44487:1;44484;44480:9;44473:16;;44190:305;;;;:::o;44501:185::-;44541:1;44558:20;44576:1;44558:20;:::i;:::-;44553:25;;44592:20;44610:1;44592:20;:::i;:::-;44587:25;;44631:1;44621:35;;44636:18;;:::i;:::-;44621:35;44678:1;44675;44671:9;44666:14;;44501:185;;;;:::o;44692:191::-;44732:4;44752:20;44770:1;44752:20;:::i;:::-;44747:25;;44786:20;44804:1;44786:20;:::i;:::-;44781:25;;44825:1;44822;44819:8;44816:34;;;44830:18;;:::i;:::-;44816:34;44875:1;44872;44868:9;44860:17;;44692:191;;;;:::o;44889:96::-;44926:7;44955:24;44973:5;44955:24;:::i;:::-;44944:35;;44889:96;;;:::o;44991:90::-;45025:7;45068:5;45061:13;45054:21;45043:32;;44991:90;;;:::o;45087:77::-;45124:7;45153:5;45142:16;;45087:77;;;:::o;45170:149::-;45206:7;45246:66;45239:5;45235:78;45224:89;;45170:149;;;:::o;45325:126::-;45362:7;45402:42;45395:5;45391:54;45380:65;;45325:126;;;:::o;45457:77::-;45494:7;45523:5;45512:16;;45457:77;;;:::o;45540:86::-;45575:7;45615:4;45608:5;45604:16;45593:27;;45540:86;;;:::o;45632:153::-;45709:9;45742:37;45773:5;45742:37;:::i;:::-;45729:50;;45632:153;;;:::o;45791:121::-;45849:9;45882:24;45900:5;45882:24;:::i;:::-;45869:37;;45791:121;;;:::o;45918:126::-;45968:9;46001:37;46032:5;46001:37;:::i;:::-;45988:50;;45918:126;;;:::o;46050:113::-;46100:9;46133:24;46151:5;46133:24;:::i;:::-;46120:37;;46050:113;;;:::o;46169:154::-;46253:6;46248:3;46243;46230:30;46315:1;46306:6;46301:3;46297:16;46290:27;46169:154;;;:::o;46329:307::-;46397:1;46407:113;46421:6;46418:1;46415:13;46407:113;;;46506:1;46501:3;46497:11;46491:18;46487:1;46482:3;46478:11;46471:39;46443:2;46440:1;46436:10;46431:15;;46407:113;;;46538:6;46535:1;46532:13;46529:101;;;46618:1;46609:6;46604:3;46600:16;46593:27;46529:101;46378:258;46329:307;;;:::o;46642:320::-;46686:6;46723:1;46717:4;46713:12;46703:22;;46770:1;46764:4;46760:12;46791:18;46781:81;;46847:4;46839:6;46835:17;46825:27;;46781:81;46909:2;46901:6;46898:14;46878:18;46875:38;46872:84;;;46928:18;;:::i;:::-;46872:84;46693:269;46642:320;;;:::o;46968:281::-;47051:27;47073:4;47051:27;:::i;:::-;47043:6;47039:40;47181:6;47169:10;47166:22;47145:18;47133:10;47130:34;47127:62;47124:88;;;47192:18;;:::i;:::-;47124:88;47232:10;47228:2;47221:22;47011:238;46968:281;;:::o;47255:233::-;47294:3;47317:24;47335:5;47317:24;:::i;:::-;47308:33;;47363:66;47356:5;47353:77;47350:103;;;47433:18;;:::i;:::-;47350:103;47480:1;47473:5;47469:13;47462:20;;47255:233;;;:::o;47494:100::-;47533:7;47562:26;47582:5;47562:26;:::i;:::-;47551:37;;47494:100;;;:::o;47600:79::-;47639:7;47668:5;47657:16;;47600:79;;;:::o;47685:94::-;47724:7;47753:20;47767:5;47753:20;:::i;:::-;47742:31;;47685:94;;;:::o;47785:176::-;47817:1;47834:20;47852:1;47834:20;:::i;:::-;47829:25;;47868:20;47886:1;47868:20;:::i;:::-;47863:25;;47907:1;47897:35;;47912:18;;:::i;:::-;47897:35;47953:1;47950;47946:9;47941:14;;47785:176;;;;:::o;47967:180::-;48015:77;48012:1;48005:88;48112:4;48109:1;48102:15;48136:4;48133:1;48126:15;48153:180;48201:77;48198:1;48191:88;48298:4;48295:1;48288:15;48322:4;48319:1;48312:15;48339:180;48387:77;48384:1;48377:88;48484:4;48481:1;48474:15;48508:4;48505:1;48498:15;48525:180;48573:77;48570:1;48563:88;48670:4;48667:1;48660:15;48694:4;48691:1;48684:15;48711:180;48759:77;48756:1;48749:88;48856:4;48853:1;48846:15;48880:4;48877:1;48870:15;48897:180;48945:77;48942:1;48935:88;49042:4;49039:1;49032:15;49066:4;49063:1;49056:15;49083:117;49192:1;49189;49182:12;49206:117;49315:1;49312;49305:12;49329:117;49438:1;49435;49428:12;49452:117;49561:1;49558;49551:12;49575:117;49684:1;49681;49674:12;49698:102;49739:6;49790:2;49786:7;49781:2;49774:5;49770:14;49766:28;49756:38;;49698:102;;;:::o;49806:94::-;49839:8;49887:5;49883:2;49879:14;49858:35;;49806:94;;;:::o;49906:230::-;50046:34;50042:1;50034:6;50030:14;50023:58;50115:13;50110:2;50102:6;50098:15;50091:38;49906:230;:::o;50142:237::-;50282:34;50278:1;50270:6;50266:14;50259:58;50351:20;50346:2;50338:6;50334:15;50327:45;50142:237;:::o;50385:225::-;50525:34;50521:1;50513:6;50509:14;50502:58;50594:8;50589:2;50581:6;50577:15;50570:33;50385:225;:::o;50616:178::-;50756:30;50752:1;50744:6;50740:14;50733:54;50616:178;:::o;50800:166::-;50940:18;50936:1;50928:6;50924:14;50917:42;50800:166;:::o;50972:167::-;51112:19;51108:1;51100:6;51096:14;51089:43;50972:167;:::o;51145:223::-;51285:34;51281:1;51273:6;51269:14;51262:58;51354:6;51349:2;51341:6;51337:15;51330:31;51145:223;:::o;51374:175::-;51514:27;51510:1;51502:6;51498:14;51491:51;51374:175;:::o;51555:231::-;51695:34;51691:1;51683:6;51679:14;51672:58;51764:14;51759:2;51751:6;51747:15;51740:39;51555:231;:::o;51792:243::-;51932:34;51928:1;51920:6;51916:14;51909:58;52001:26;51996:2;51988:6;51984:15;51977:51;51792:243;:::o;52041:229::-;52181:34;52177:1;52169:6;52165:14;52158:58;52250:12;52245:2;52237:6;52233:15;52226:37;52041:229;:::o;52276:228::-;52416:34;52412:1;52404:6;52400:14;52393:58;52485:11;52480:2;52472:6;52468:15;52461:36;52276:228;:::o;52510:182::-;52650:34;52646:1;52638:6;52634:14;52627:58;52510:182;:::o;52698:231::-;52838:34;52834:1;52826:6;52822:14;52815:58;52907:14;52902:2;52894:6;52890:15;52883:39;52698:231;:::o;52935:182::-;53075:34;53071:1;53063:6;53059:14;53052:58;52935:182;:::o;53123:228::-;53263:34;53259:1;53251:6;53247:14;53240:58;53332:11;53327:2;53319:6;53315:15;53308:36;53123:228;:::o;53357:234::-;53497:34;53493:1;53485:6;53481:14;53474:58;53566:17;53561:2;53553:6;53549:15;53542:42;53357:234;:::o;53597:220::-;53737:34;53733:1;53725:6;53721:14;53714:58;53806:3;53801:2;53793:6;53789:15;53782:28;53597:220;:::o;53823:173::-;53963:25;53959:1;53951:6;53947:14;53940:49;53823:173;:::o;54002:114::-;;:::o;54122:236::-;54262:34;54258:1;54250:6;54246:14;54239:58;54331:19;54326:2;54318:6;54314:15;54307:44;54122:236;:::o;54364:231::-;54504:34;54500:1;54492:6;54488:14;54481:58;54573:14;54568:2;54560:6;54556:15;54549:39;54364:231;:::o;54601:122::-;54674:24;54692:5;54674:24;:::i;:::-;54667:5;54664:35;54654:63;;54713:1;54710;54703:12;54654:63;54601:122;:::o;54729:116::-;54799:21;54814:5;54799:21;:::i;:::-;54792:5;54789:32;54779:60;;54835:1;54832;54825:12;54779:60;54729:116;:::o;54851:122::-;54924:24;54942:5;54924:24;:::i;:::-;54917:5;54914:35;54904:63;;54963:1;54960;54953:12;54904:63;54851:122;:::o;54979:120::-;55051:23;55068:5;55051:23;:::i;:::-;55044:5;55041:34;55031:62;;55089:1;55086;55079:12;55031:62;54979:120;:::o;55105:122::-;55178:24;55196:5;55178:24;:::i;:::-;55171:5;55168:35;55158:63;;55217:1;55214;55207:12;55158:63;55105:122;:::o;55233:118::-;55304:22;55320:5;55304:22;:::i;:::-;55297:5;55294:33;55284:61;;55341:1;55338;55331:12;55284:61;55233:118;:::o

Swarm Source

ipfs://25ba9a6eb1c6f67ab0417a2aa0e0c97f5e1f57b5a3d37508bda7dac27687e76c
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.