ETH Price: $3,301.37 (-3.24%)
Gas: 20 Gwei

Token

Lucky Tickat (LKTKT)
 

Overview

Max Total Supply

875 LKTKT

Holders

482

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 LKTKT
0x62d35fb79e1003fc179a92b88e278bcdc1ae4e15
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:
LuckyTickat

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

/**
 * This smart contract was developed by https://github.com/chattertechno
*/

// SPDX-License-Identifier: NONE

pragma solidity 0.8.9;



// Part: Address

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

// Part: Context

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

// Part: IERC165

// SAFE MATH CONTRACTS 


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

// Part: IERC721Receiver

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

// Part: Strings

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

// Part: ERC165

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

// Part: IERC721

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

// Part: Ownable

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

// Part: IERC721Enumerable

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

// Part: IERC721Metadata

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

// Part: ERC721

/**
 * @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;
     // Optional mapping for token URIs
    mapping (uint256 => string) private _tokenURIs;

    // 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();
        string memory _tokenURI = _tokenURIs[tokenId];
        if (bytes(baseURI).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(baseURI, _tokenURI));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return 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 Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }


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

// Part: ERC721Enumerable

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

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 * OpenZeppelin's JavaScript library generates merkle trees that are safe
 * against this attack out of the box.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

contract LuckyTickat is ERC721Enumerable, Ownable {
  using Strings for uint256;

  string public baseURI;
  string public baseExtension = ".json";
  uint256 public cost = 0.06 ether;
  uint256 public whitelistCost = 0.045 ether;
  uint256 public maxSupply = 5625;
  uint256 public maxMintAmount = 6;
  bool public paused = false;
  bool public revealed = false;
  string public notRevealedUri;
  bytes32 public rootHash;

  constructor(
    string memory _initNotRevealedUri,
    bytes32  _rootHash
  ) ERC721('Lucky Tickat', 'LKTKT') {
    rootHash = _rootHash;
    setNotRevealedURI(_initNotRevealedUri);
  }
  // internal
  function _baseURI() internal view virtual override returns (string memory) {
    return baseURI;
  }

  // public
  function whitelistMint(address _to, uint256 _mintAmount, bytes32[] calldata _merkleProof) public payable {
    uint256 supply = totalSupply();
    require(!paused);
    require(_mintAmount > 0);
    require(_mintAmount <= maxMintAmount);
    require(supply + _mintAmount <= maxSupply);
    bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
    require(MerkleProof.verify(_merkleProof, rootHash, leaf), "Incorrect Proof");

    require(msg.value >= whitelistCost * _mintAmount, "Insufficient Funds to Mint");
        

    for (uint256 i = 1; i <= _mintAmount; i++) {
      _safeMint(_to, supply + i);
    }
  }
  function publicMint(address _to, uint256 _mintAmount) public payable {
    uint256 supply = totalSupply();
    require(!paused);
    require(_mintAmount > 0);
    require(_mintAmount <= maxMintAmount);
    require(supply + _mintAmount <= maxSupply);

    require(msg.value >= cost * _mintAmount, "Insufficient Funds to Mint");
    for (uint256 i = 1; i <= _mintAmount; i++) {
      _safeMint(_to, supply + i);
    }
  }
  function updateRootHash(bytes32 _newRoot) public onlyOwner {
    rootHash = _newRoot;
  }


  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"
    );
    
    if(revealed == false) {
        return notRevealedUri;
    }

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

  //only owner
  function reveal() public onlyOwner {
      revealed = true;
  }
  
  function setCost(uint256 _newCost) public onlyOwner {
    cost = _newCost;
  }
  function setWhitelistCost(uint256 _newWhitecost) public onlyOwner {
    whitelistCost = _newWhitecost;
  }

  function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner {
    maxMintAmount = _newmaxMintAmount;
  }
  
  function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
    notRevealedUri = _notRevealedURI;
  }

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

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

  function pause(bool _state) public onlyOwner {
    paused = _state;
  }
 


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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initNotRevealedUri","type":"string"},{"internalType":"bytes32","name":"_rootHash","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rootHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newWhitecost","type":"uint256"}],"name":"setWhitelistCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_newRoot","type":"bytes32"}],"name":"updateRootHash","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":"whitelistCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d9080519060200190620000519291906200035f565b5066d529ae9e860000600e55669fdf42f6e48000600f556115f960105560066011556000601260006101000a81548160ff0219169083151502179055506000601260016101000a81548160ff021916908315150217905550348015620000b657600080fd5b50604051620052f1380380620052f18339818101604052810190620000dc9190620005e7565b6040518060400160405280600c81526020017f4c75636b79205469636b617400000000000000000000000000000000000000008152506040518060400160405280600581526020017f4c4b544b540000000000000000000000000000000000000000000000000000008152508160009080519060200190620001609291906200035f565b508060019080519060200190620001799291906200035f565b5050506200019c62000190620001bc60201b60201c565b620001c460201b60201c565b80601481905550620001b4826200028a60201b60201c565b505062000735565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200029a620001bc60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002c06200033560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000319576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200031090620006ae565b60405180910390fd5b8060139080519060200190620003319291906200035f565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200036d90620006ff565b90600052602060002090601f016020900481019282620003915760008555620003dd565b82601f10620003ac57805160ff1916838001178555620003dd565b82800160010185558215620003dd579182015b82811115620003dc578251825591602001919060010190620003bf565b5b509050620003ec9190620003f0565b5090565b5b808211156200040b576000816000905550600101620003f1565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000478826200042d565b810181811067ffffffffffffffff821117156200049a57620004996200043e565b5b80604052505050565b6000620004af6200040f565b9050620004bd82826200046d565b919050565b600067ffffffffffffffff821115620004e057620004df6200043e565b5b620004eb826200042d565b9050602081019050919050565b60005b8381101562000518578082015181840152602081019050620004fb565b8381111562000528576000848401525b50505050565b6000620005456200053f84620004c2565b620004a3565b90508281526020810184848401111562000564576200056362000428565b5b62000571848285620004f8565b509392505050565b600082601f83011262000591576200059062000423565b5b8151620005a38482602086016200052e565b91505092915050565b6000819050919050565b620005c181620005ac565b8114620005cd57600080fd5b50565b600081519050620005e181620005b6565b92915050565b6000806040838503121562000601576200060062000419565b5b600083015167ffffffffffffffff8111156200062257620006216200041e565b5b620006308582860162000579565b92505060206200064385828601620005d0565b9150509250929050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620006966020836200064d565b9150620006a3826200065e565b602082019050919050565b60006020820190508181036000830152620006c98162000687565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200071857607f821691505b602082108114156200072f576200072e620006d0565b5b50919050565b614bac80620007456000396000f3fe6080604052600436106102515760003560e01c80635c975abb11610139578063b88d4fde116100b6578063d5abeb011161007a578063d5abeb0114610875578063da3ef23f146108a0578063e7b99ec7146108c9578063e985e9c5146108f4578063f2c4ce1e14610931578063f2fde38b1461095a57610251565b8063b88d4fde1461079f578063c6682862146107c8578063c87b56dd146107f3578063ce6df2b914610830578063d49479eb1461084c57610251565b80637f00c7a6116100fd5780637f00c7a6146106e05780638da5cb5b1461070957806395d89b4114610734578063a22cb4651461075f578063a475b5dd1461078857610251565b80635c975abb146105f95780636352211e146106245780636c0360eb1461066157806370a082311461068c578063715018a6146106c957610251565b806323b872dd116101d257806344a0d68a1161019657806344a0d68a146104fa5780634b11faaf146105235780634f6ccce71461053f578063518302271461057c57806355f804b3146105a757806359ada08e146105d057610251565b806323b872dd146104245780632f745c591461044d5780633ccfd60b1461048a57806342842e0e14610494578063438b6300146104bd57610251565b8063095ea7b311610219578063095ea7b31461034f57806313faede61461037857806318160ddd146103a35780631d80009a146103ce578063239c70ae146103f957610251565b806301ffc9a71461025657806302329a291461029357806306fdde03146102bc578063081812fc146102e7578063081c8c4414610324575b600080fd5b34801561026257600080fd5b5061027d6004803603810190610278919061330a565b610983565b60405161028a9190613352565b60405180910390f35b34801561029f57600080fd5b506102ba60048036038101906102b59190613399565b6109fd565b005b3480156102c857600080fd5b506102d1610a96565b6040516102de919061345f565b60405180910390f35b3480156102f357600080fd5b5061030e600480360381019061030991906134b7565b610b28565b60405161031b9190613525565b60405180910390f35b34801561033057600080fd5b50610339610bad565b604051610346919061345f565b60405180910390f35b34801561035b57600080fd5b506103766004803603810190610371919061356c565b610c3b565b005b34801561038457600080fd5b5061038d610d53565b60405161039a91906135bb565b60405180910390f35b3480156103af57600080fd5b506103b8610d59565b6040516103c591906135bb565b60405180910390f35b3480156103da57600080fd5b506103e3610d66565b6040516103f091906135ef565b60405180910390f35b34801561040557600080fd5b5061040e610d6c565b60405161041b91906135bb565b60405180910390f35b34801561043057600080fd5b5061044b6004803603810190610446919061360a565b610d72565b005b34801561045957600080fd5b50610474600480360381019061046f919061356c565b610dd2565b60405161048191906135bb565b60405180910390f35b610492610e77565b005b3480156104a057600080fd5b506104bb60048036038101906104b6919061360a565b610f73565b005b3480156104c957600080fd5b506104e460048036038101906104df919061365d565b610f93565b6040516104f19190613748565b60405180910390f35b34801561050657600080fd5b50610521600480360381019061051c91906134b7565b611041565b005b61053d600480360381019061053891906137cf565b6110c7565b005b34801561054b57600080fd5b50610566600480360381019061056191906134b7565b61126a565b60405161057391906135bb565b60405180910390f35b34801561058857600080fd5b506105916112db565b60405161059e9190613352565b60405180910390f35b3480156105b357600080fd5b506105ce60048036038101906105c99190613973565b6112ee565b005b3480156105dc57600080fd5b506105f760048036038101906105f291906139e8565b611384565b005b34801561060557600080fd5b5061060e61140a565b60405161061b9190613352565b60405180910390f35b34801561063057600080fd5b5061064b600480360381019061064691906134b7565b61141d565b6040516106589190613525565b60405180910390f35b34801561066d57600080fd5b506106766114cf565b604051610683919061345f565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae919061365d565b61155d565b6040516106c091906135bb565b60405180910390f35b3480156106d557600080fd5b506106de611615565b005b3480156106ec57600080fd5b50610707600480360381019061070291906134b7565b61169d565b005b34801561071557600080fd5b5061071e611723565b60405161072b9190613525565b60405180910390f35b34801561074057600080fd5b5061074961174d565b604051610756919061345f565b60405180910390f35b34801561076b57600080fd5b5061078660048036038101906107819190613a15565b6117df565b005b34801561079457600080fd5b5061079d611960565b005b3480156107ab57600080fd5b506107c660048036038101906107c19190613af6565b6119f9565b005b3480156107d457600080fd5b506107dd611a5b565b6040516107ea919061345f565b60405180910390f35b3480156107ff57600080fd5b5061081a600480360381019061081591906134b7565b611ae9565b604051610827919061345f565b60405180910390f35b61084a6004803603810190610845919061356c565b611c42565b005b34801561085857600080fd5b50610873600480360381019061086e91906134b7565b611d2a565b005b34801561088157600080fd5b5061088a611db0565b60405161089791906135bb565b60405180910390f35b3480156108ac57600080fd5b506108c760048036038101906108c29190613973565b611db6565b005b3480156108d557600080fd5b506108de611e4c565b6040516108eb91906135bb565b60405180910390f35b34801561090057600080fd5b5061091b60048036038101906109169190613b79565b611e52565b6040516109289190613352565b60405180910390f35b34801561093d57600080fd5b5061095860048036038101906109539190613973565b611ee6565b005b34801561096657600080fd5b50610981600480360381019061097c919061365d565b611f7c565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109f657506109f582612074565b5b9050919050565b610a05612156565b73ffffffffffffffffffffffffffffffffffffffff16610a23611723565b73ffffffffffffffffffffffffffffffffffffffff1614610a79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7090613c05565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b606060008054610aa590613c54565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad190613c54565b8015610b1e5780601f10610af357610100808354040283529160200191610b1e565b820191906000526020600020905b815481529060010190602001808311610b0157829003601f168201915b5050505050905090565b6000610b338261215e565b610b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6990613cf8565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60138054610bba90613c54565b80601f0160208091040260200160405190810160405280929190818152602001828054610be690613c54565b8015610c335780601f10610c0857610100808354040283529160200191610c33565b820191906000526020600020905b815481529060010190602001808311610c1657829003601f168201915b505050505081565b6000610c468261141d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cae90613d8a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cd6612156565b73ffffffffffffffffffffffffffffffffffffffff161480610d055750610d0481610cff612156565b611e52565b5b610d44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3b90613e1c565b60405180910390fd5b610d4e83836121ca565b505050565b600e5481565b6000600980549050905090565b60145481565b60115481565b610d83610d7d612156565b82612283565b610dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db990613eae565b60405180910390fd5b610dcd838383612361565b505050565b6000610ddd8361155d565b8210610e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1590613f40565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e7f612156565b73ffffffffffffffffffffffffffffffffffffffff16610e9d611723565b73ffffffffffffffffffffffffffffffffffffffff1614610ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eea90613c05565b60405180910390fd5b6000610efd611723565b73ffffffffffffffffffffffffffffffffffffffff1647604051610f2090613f91565b60006040518083038185875af1925050503d8060008114610f5d576040519150601f19603f3d011682016040523d82523d6000602084013e610f62565b606091505b5050905080610f7057600080fd5b50565b610f8e838383604051806020016040528060008152506119f9565b505050565b60606000610fa08361155d565b905060008167ffffffffffffffff811115610fbe57610fbd613848565b5b604051908082528060200260200182016040528015610fec5781602001602082028036833780820191505090505b50905060005b82811015611036576110048582610dd2565b82828151811061101757611016613fa6565b5b602002602001018181525050808061102e90614004565b915050610ff2565b508092505050919050565b611049612156565b73ffffffffffffffffffffffffffffffffffffffff16611067611723565b73ffffffffffffffffffffffffffffffffffffffff16146110bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b490613c05565b60405180910390fd5b80600e8190555050565b60006110d1610d59565b9050601260009054906101000a900460ff16156110ed57600080fd5b600084116110fa57600080fd5b60115484111561110957600080fd5b6010548482611118919061404d565b111561112357600080fd5b60003360405160200161113691906140eb565b60405160208183030381529060405280519060200120905061119c848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601454836125bd565b6111db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d290614152565b60405180910390fd5b84600f546111e99190614172565b34101561122b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122290614218565b60405180910390fd5b6000600190505b8581116112615761124e878285611249919061404d565b6125d4565b808061125990614004565b915050611232565b50505050505050565b6000611274610d59565b82106112b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ac906142aa565b60405180910390fd5b600982815481106112c9576112c8613fa6565b5b90600052602060002001549050919050565b601260019054906101000a900460ff1681565b6112f6612156565b73ffffffffffffffffffffffffffffffffffffffff16611314611723565b73ffffffffffffffffffffffffffffffffffffffff161461136a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136190613c05565b60405180910390fd5b80600c90805190602001906113809291906131fb565b5050565b61138c612156565b73ffffffffffffffffffffffffffffffffffffffff166113aa611723565b73ffffffffffffffffffffffffffffffffffffffff1614611400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f790613c05565b60405180910390fd5b8060148190555050565b601260009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bd9061433c565b60405180910390fd5b80915050919050565b600c80546114dc90613c54565b80601f016020809104026020016040519081016040528092919081815260200182805461150890613c54565b80156115555780601f1061152a57610100808354040283529160200191611555565b820191906000526020600020905b81548152906001019060200180831161153857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c5906143ce565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61161d612156565b73ffffffffffffffffffffffffffffffffffffffff1661163b611723565b73ffffffffffffffffffffffffffffffffffffffff1614611691576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168890613c05565b60405180910390fd5b61169b60006125f2565b565b6116a5612156565b73ffffffffffffffffffffffffffffffffffffffff166116c3611723565b73ffffffffffffffffffffffffffffffffffffffff1614611719576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171090613c05565b60405180910390fd5b8060118190555050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461175c90613c54565b80601f016020809104026020016040519081016040528092919081815260200182805461178890613c54565b80156117d55780601f106117aa576101008083540402835291602001916117d5565b820191906000526020600020905b8154815290600101906020018083116117b857829003601f168201915b5050505050905090565b6117e7612156565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184c9061443a565b60405180910390fd5b8060066000611862612156565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661190f612156565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119549190613352565b60405180910390a35050565b611968612156565b73ffffffffffffffffffffffffffffffffffffffff16611986611723565b73ffffffffffffffffffffffffffffffffffffffff16146119dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d390613c05565b60405180910390fd5b6001601260016101000a81548160ff021916908315150217905550565b611a0a611a04612156565b83612283565b611a49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4090613eae565b60405180910390fd5b611a55848484846126b8565b50505050565b600d8054611a6890613c54565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9490613c54565b8015611ae15780601f10611ab657610100808354040283529160200191611ae1565b820191906000526020600020905b815481529060010190602001808311611ac457829003601f168201915b505050505081565b6060611af48261215e565b611b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2a906144cc565b60405180910390fd5b60001515601260019054906101000a900460ff1615151415611be15760138054611b5c90613c54565b80601f0160208091040260200160405190810160405280929190818152602001828054611b8890613c54565b8015611bd55780601f10611baa57610100808354040283529160200191611bd5565b820191906000526020600020905b815481529060010190602001808311611bb857829003601f168201915b50505050509050611c3d565b6000611beb612714565b90506000815111611c0b5760405180602001604052806000815250611c39565b80611c15846127a6565b600d604051602001611c29939291906145bc565b6040516020818303038152906040525b9150505b919050565b6000611c4c610d59565b9050601260009054906101000a900460ff1615611c6857600080fd5b60008211611c7557600080fd5b601154821115611c8457600080fd5b6010548282611c93919061404d565b1115611c9e57600080fd5b81600e54611cac9190614172565b341015611cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce590614218565b60405180910390fd5b6000600190505b828111611d2457611d11848284611d0c919061404d565b6125d4565b8080611d1c90614004565b915050611cf5565b50505050565b611d32612156565b73ffffffffffffffffffffffffffffffffffffffff16611d50611723565b73ffffffffffffffffffffffffffffffffffffffff1614611da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9d90613c05565b60405180910390fd5b80600f8190555050565b60105481565b611dbe612156565b73ffffffffffffffffffffffffffffffffffffffff16611ddc611723565b73ffffffffffffffffffffffffffffffffffffffff1614611e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2990613c05565b60405180910390fd5b80600d9080519060200190611e489291906131fb565b5050565b600f5481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611eee612156565b73ffffffffffffffffffffffffffffffffffffffff16611f0c611723565b73ffffffffffffffffffffffffffffffffffffffff1614611f62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5990613c05565b60405180910390fd5b8060139080519060200190611f789291906131fb565b5050565b611f84612156565b73ffffffffffffffffffffffffffffffffffffffff16611fa2611723565b73ffffffffffffffffffffffffffffffffffffffff1614611ff8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fef90613c05565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205f9061465f565b60405180910390fd5b612071816125f2565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061213f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061214f575061214e82612907565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661223d8361141d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061228e8261215e565b6122cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c4906146f1565b60405180910390fd5b60006122d88361141d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061234757508373ffffffffffffffffffffffffffffffffffffffff1661232f84610b28565b73ffffffffffffffffffffffffffffffffffffffff16145b8061235857506123578185611e52565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123818261141d565b73ffffffffffffffffffffffffffffffffffffffff16146123d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ce90614783565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243e90614815565b60405180910390fd5b612452838383612971565b61245d6000826121ca565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124ad9190614835565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612504919061404d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000826125ca8584612a85565b1490509392505050565b6125ee828260405180602001604052806000815250612adb565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6126c3848484612361565b6126cf84848484612b36565b61270e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612705906148db565b60405180910390fd5b50505050565b6060600c805461272390613c54565b80601f016020809104026020016040519081016040528092919081815260200182805461274f90613c54565b801561279c5780601f106127715761010080835404028352916020019161279c565b820191906000526020600020905b81548152906001019060200180831161277f57829003601f168201915b5050505050905090565b606060008214156127ee576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612902565b600082905060005b6000821461282057808061280990614004565b915050600a82612819919061492a565b91506127f6565b60008167ffffffffffffffff81111561283c5761283b613848565b5b6040519080825280601f01601f19166020018201604052801561286e5781602001600182028036833780820191505090505b5090505b600085146128fb576001826128879190614835565b9150600a85612896919061495b565b60306128a2919061404d565b60f81b8183815181106128b8576128b7613fa6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128f4919061492a565b9450612872565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61297c838383612ccd565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129bf576129ba81612cd2565b6129fe565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146129fd576129fc8382612d1b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a4157612a3c81612e88565b612a80565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612a7f57612a7e8282612f59565b5b5b505050565b60008082905060005b8451811015612ad057612abb82868381518110612aae57612aad613fa6565b5b6020026020010151612fd8565b91508080612ac890614004565b915050612a8e565b508091505092915050565b612ae58383613003565b612af26000848484612b36565b612b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b28906148db565b60405180910390fd5b505050565b6000612b578473ffffffffffffffffffffffffffffffffffffffff166131d1565b15612cc0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b80612156565b8786866040518563ffffffff1660e01b8152600401612ba294939291906149e1565b602060405180830381600087803b158015612bbc57600080fd5b505af1925050508015612bed57506040513d601f19601f82011682018060405250810190612bea9190614a42565b60015b612c70573d8060008114612c1d576040519150601f19603f3d011682016040523d82523d6000602084013e612c22565b606091505b50600081511415612c68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5f906148db565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612cc5565b600190505b949350505050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612d288461155d565b612d329190614835565b9050600060086000848152602001908152602001600020549050818114612e17576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050612e9c9190614835565b90506000600a6000848152602001908152602001600020549050600060098381548110612ecc57612ecb613fa6565b5b906000526020600020015490508060098381548110612eee57612eed613fa6565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480612f3d57612f3c614a6f565b5b6001900381819060005260206000200160009055905550505050565b6000612f648361155d565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b6000818310612ff057612feb82846131e4565b612ffb565b612ffa83836131e4565b5b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306a90614aea565b60405180910390fd5b61307c8161215e565b156130bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b390614b56565b60405180910390fd5b6130c860008383612971565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613118919061404d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b600082600052816020526040600020905092915050565b82805461320790613c54565b90600052602060002090601f0160209004810192826132295760008555613270565b82601f1061324257805160ff1916838001178555613270565b82800160010185558215613270579182015b8281111561326f578251825591602001919060010190613254565b5b50905061327d9190613281565b5090565b5b8082111561329a576000816000905550600101613282565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132e7816132b2565b81146132f257600080fd5b50565b600081359050613304816132de565b92915050565b6000602082840312156133205761331f6132a8565b5b600061332e848285016132f5565b91505092915050565b60008115159050919050565b61334c81613337565b82525050565b60006020820190506133676000830184613343565b92915050565b61337681613337565b811461338157600080fd5b50565b6000813590506133938161336d565b92915050565b6000602082840312156133af576133ae6132a8565b5b60006133bd84828501613384565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156134005780820151818401526020810190506133e5565b8381111561340f576000848401525b50505050565b6000601f19601f8301169050919050565b6000613431826133c6565b61343b81856133d1565b935061344b8185602086016133e2565b61345481613415565b840191505092915050565b600060208201905081810360008301526134798184613426565b905092915050565b6000819050919050565b61349481613481565b811461349f57600080fd5b50565b6000813590506134b18161348b565b92915050565b6000602082840312156134cd576134cc6132a8565b5b60006134db848285016134a2565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061350f826134e4565b9050919050565b61351f81613504565b82525050565b600060208201905061353a6000830184613516565b92915050565b61354981613504565b811461355457600080fd5b50565b60008135905061356681613540565b92915050565b60008060408385031215613583576135826132a8565b5b600061359185828601613557565b92505060206135a2858286016134a2565b9150509250929050565b6135b581613481565b82525050565b60006020820190506135d060008301846135ac565b92915050565b6000819050919050565b6135e9816135d6565b82525050565b600060208201905061360460008301846135e0565b92915050565b600080600060608486031215613623576136226132a8565b5b600061363186828701613557565b935050602061364286828701613557565b9250506040613653868287016134a2565b9150509250925092565b600060208284031215613673576136726132a8565b5b600061368184828501613557565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6136bf81613481565b82525050565b60006136d183836136b6565b60208301905092915050565b6000602082019050919050565b60006136f58261368a565b6136ff8185613695565b935061370a836136a6565b8060005b8381101561373b57815161372288826136c5565b975061372d836136dd565b92505060018101905061370e565b5085935050505092915050565b6000602082019050818103600083015261376281846136ea565b905092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261378f5761378e61376a565b5b8235905067ffffffffffffffff8111156137ac576137ab61376f565b5b6020830191508360208202830111156137c8576137c7613774565b5b9250929050565b600080600080606085870312156137e9576137e86132a8565b5b60006137f787828801613557565b9450506020613808878288016134a2565b935050604085013567ffffffffffffffff811115613829576138286132ad565b5b61383587828801613779565b925092505092959194509250565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61388082613415565b810181811067ffffffffffffffff8211171561389f5761389e613848565b5b80604052505050565b60006138b261329e565b90506138be8282613877565b919050565b600067ffffffffffffffff8211156138de576138dd613848565b5b6138e782613415565b9050602081019050919050565b82818337600083830152505050565b6000613916613911846138c3565b6138a8565b90508281526020810184848401111561393257613931613843565b5b61393d8482856138f4565b509392505050565b600082601f83011261395a5761395961376a565b5b813561396a848260208601613903565b91505092915050565b600060208284031215613989576139886132a8565b5b600082013567ffffffffffffffff8111156139a7576139a66132ad565b5b6139b384828501613945565b91505092915050565b6139c5816135d6565b81146139d057600080fd5b50565b6000813590506139e2816139bc565b92915050565b6000602082840312156139fe576139fd6132a8565b5b6000613a0c848285016139d3565b91505092915050565b60008060408385031215613a2c57613a2b6132a8565b5b6000613a3a85828601613557565b9250506020613a4b85828601613384565b9150509250929050565b600067ffffffffffffffff821115613a7057613a6f613848565b5b613a7982613415565b9050602081019050919050565b6000613a99613a9484613a55565b6138a8565b905082815260208101848484011115613ab557613ab4613843565b5b613ac08482856138f4565b509392505050565b600082601f830112613add57613adc61376a565b5b8135613aed848260208601613a86565b91505092915050565b60008060008060808587031215613b1057613b0f6132a8565b5b6000613b1e87828801613557565b9450506020613b2f87828801613557565b9350506040613b40878288016134a2565b925050606085013567ffffffffffffffff811115613b6157613b606132ad565b5b613b6d87828801613ac8565b91505092959194509250565b60008060408385031215613b9057613b8f6132a8565b5b6000613b9e85828601613557565b9250506020613baf85828601613557565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613bef6020836133d1565b9150613bfa82613bb9565b602082019050919050565b60006020820190508181036000830152613c1e81613be2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c6c57607f821691505b60208210811415613c8057613c7f613c25565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613ce2602c836133d1565b9150613ced82613c86565b604082019050919050565b60006020820190508181036000830152613d1181613cd5565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d746021836133d1565b9150613d7f82613d18565b604082019050919050565b60006020820190508181036000830152613da381613d67565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613e066038836133d1565b9150613e1182613daa565b604082019050919050565b60006020820190508181036000830152613e3581613df9565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613e986031836133d1565b9150613ea382613e3c565b604082019050919050565b60006020820190508181036000830152613ec781613e8b565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613f2a602b836133d1565b9150613f3582613ece565b604082019050919050565b60006020820190508181036000830152613f5981613f1d565b9050919050565b600081905092915050565b50565b6000613f7b600083613f60565b9150613f8682613f6b565b600082019050919050565b6000613f9c82613f6e565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061400f82613481565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561404257614041613fd5565b5b600182019050919050565b600061405882613481565b915061406383613481565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561409857614097613fd5565b5b828201905092915050565b60008160601b9050919050565b60006140bb826140a3565b9050919050565b60006140cd826140b0565b9050919050565b6140e56140e082613504565b6140c2565b82525050565b60006140f782846140d4565b60148201915081905092915050565b7f496e636f72726563742050726f6f660000000000000000000000000000000000600082015250565b600061413c600f836133d1565b915061414782614106565b602082019050919050565b6000602082019050818103600083015261416b8161412f565b9050919050565b600061417d82613481565b915061418883613481565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141c1576141c0613fd5565b5b828202905092915050565b7f496e73756666696369656e742046756e647320746f204d696e74000000000000600082015250565b6000614202601a836133d1565b915061420d826141cc565b602082019050919050565b60006020820190508181036000830152614231816141f5565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614294602c836133d1565b915061429f82614238565b604082019050919050565b600060208201905081810360008301526142c381614287565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006143266029836133d1565b9150614331826142ca565b604082019050919050565b6000602082019050818103600083015261435581614319565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006143b8602a836133d1565b91506143c38261435c565b604082019050919050565b600060208201905081810360008301526143e7816143ab565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006144246019836133d1565b915061442f826143ee565b602082019050919050565b6000602082019050818103600083015261445381614417565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006144b6602f836133d1565b91506144c18261445a565b604082019050919050565b600060208201905081810360008301526144e5816144a9565b9050919050565b600081905092915050565b6000614502826133c6565b61450c81856144ec565b935061451c8185602086016133e2565b80840191505092915050565b60008190508160005260206000209050919050565b6000815461454a81613c54565b61455481866144ec565b9450600182166000811461456f5760018114614580576145b3565b60ff198316865281860193506145b3565b61458985614528565b60005b838110156145ab5781548189015260018201915060208101905061458c565b838801955050505b50505092915050565b60006145c882866144f7565b91506145d482856144f7565b91506145e0828461453d565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006146496026836133d1565b9150614654826145ed565b604082019050919050565b600060208201905081810360008301526146788161463c565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006146db602c836133d1565b91506146e68261467f565b604082019050919050565b6000602082019050818103600083015261470a816146ce565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b600061476d6029836133d1565b915061477882614711565b604082019050919050565b6000602082019050818103600083015261479c81614760565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006147ff6024836133d1565b915061480a826147a3565b604082019050919050565b6000602082019050818103600083015261482e816147f2565b9050919050565b600061484082613481565b915061484b83613481565b92508282101561485e5761485d613fd5565b5b828203905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006148c56032836133d1565b91506148d082614869565b604082019050919050565b600060208201905081810360008301526148f4816148b8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061493582613481565b915061494083613481565b9250826149505761494f6148fb565b5b828204905092915050565b600061496682613481565b915061497183613481565b925082614981576149806148fb565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006149b38261498c565b6149bd8185614997565b93506149cd8185602086016133e2565b6149d681613415565b840191505092915050565b60006080820190506149f66000830187613516565b614a036020830186613516565b614a1060408301856135ac565b8181036060830152614a2281846149a8565b905095945050505050565b600081519050614a3c816132de565b92915050565b600060208284031215614a5857614a576132a8565b5b6000614a6684828501614a2d565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614ad46020836133d1565b9150614adf82614a9e565b602082019050919050565b60006020820190508181036000830152614b0381614ac7565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614b40601c836133d1565b9150614b4b82614b0a565b602082019050919050565b60006020820190508181036000830152614b6f81614b33565b905091905056fea26469706673582212202221ad5d16e7b7cc09bf09159399cb366da70cfc68cde62c51f6e79dbfbfd3d764736f6c63430008090033000000000000000000000000000000000000000000000000000000000000004034fc1cf9f39122ee4fd78a569531bd39aed398840a782f715ae677e6649496f7000000000000000000000000000000000000000000000000000000000000004368747470733a2f2f697066732e696f2f697066732f516d5a6e4e67534a477553624b6e386b45734747476935556e465a6e64377053487566594d3538656466507834410000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102515760003560e01c80635c975abb11610139578063b88d4fde116100b6578063d5abeb011161007a578063d5abeb0114610875578063da3ef23f146108a0578063e7b99ec7146108c9578063e985e9c5146108f4578063f2c4ce1e14610931578063f2fde38b1461095a57610251565b8063b88d4fde1461079f578063c6682862146107c8578063c87b56dd146107f3578063ce6df2b914610830578063d49479eb1461084c57610251565b80637f00c7a6116100fd5780637f00c7a6146106e05780638da5cb5b1461070957806395d89b4114610734578063a22cb4651461075f578063a475b5dd1461078857610251565b80635c975abb146105f95780636352211e146106245780636c0360eb1461066157806370a082311461068c578063715018a6146106c957610251565b806323b872dd116101d257806344a0d68a1161019657806344a0d68a146104fa5780634b11faaf146105235780634f6ccce71461053f578063518302271461057c57806355f804b3146105a757806359ada08e146105d057610251565b806323b872dd146104245780632f745c591461044d5780633ccfd60b1461048a57806342842e0e14610494578063438b6300146104bd57610251565b8063095ea7b311610219578063095ea7b31461034f57806313faede61461037857806318160ddd146103a35780631d80009a146103ce578063239c70ae146103f957610251565b806301ffc9a71461025657806302329a291461029357806306fdde03146102bc578063081812fc146102e7578063081c8c4414610324575b600080fd5b34801561026257600080fd5b5061027d6004803603810190610278919061330a565b610983565b60405161028a9190613352565b60405180910390f35b34801561029f57600080fd5b506102ba60048036038101906102b59190613399565b6109fd565b005b3480156102c857600080fd5b506102d1610a96565b6040516102de919061345f565b60405180910390f35b3480156102f357600080fd5b5061030e600480360381019061030991906134b7565b610b28565b60405161031b9190613525565b60405180910390f35b34801561033057600080fd5b50610339610bad565b604051610346919061345f565b60405180910390f35b34801561035b57600080fd5b506103766004803603810190610371919061356c565b610c3b565b005b34801561038457600080fd5b5061038d610d53565b60405161039a91906135bb565b60405180910390f35b3480156103af57600080fd5b506103b8610d59565b6040516103c591906135bb565b60405180910390f35b3480156103da57600080fd5b506103e3610d66565b6040516103f091906135ef565b60405180910390f35b34801561040557600080fd5b5061040e610d6c565b60405161041b91906135bb565b60405180910390f35b34801561043057600080fd5b5061044b6004803603810190610446919061360a565b610d72565b005b34801561045957600080fd5b50610474600480360381019061046f919061356c565b610dd2565b60405161048191906135bb565b60405180910390f35b610492610e77565b005b3480156104a057600080fd5b506104bb60048036038101906104b6919061360a565b610f73565b005b3480156104c957600080fd5b506104e460048036038101906104df919061365d565b610f93565b6040516104f19190613748565b60405180910390f35b34801561050657600080fd5b50610521600480360381019061051c91906134b7565b611041565b005b61053d600480360381019061053891906137cf565b6110c7565b005b34801561054b57600080fd5b50610566600480360381019061056191906134b7565b61126a565b60405161057391906135bb565b60405180910390f35b34801561058857600080fd5b506105916112db565b60405161059e9190613352565b60405180910390f35b3480156105b357600080fd5b506105ce60048036038101906105c99190613973565b6112ee565b005b3480156105dc57600080fd5b506105f760048036038101906105f291906139e8565b611384565b005b34801561060557600080fd5b5061060e61140a565b60405161061b9190613352565b60405180910390f35b34801561063057600080fd5b5061064b600480360381019061064691906134b7565b61141d565b6040516106589190613525565b60405180910390f35b34801561066d57600080fd5b506106766114cf565b604051610683919061345f565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae919061365d565b61155d565b6040516106c091906135bb565b60405180910390f35b3480156106d557600080fd5b506106de611615565b005b3480156106ec57600080fd5b50610707600480360381019061070291906134b7565b61169d565b005b34801561071557600080fd5b5061071e611723565b60405161072b9190613525565b60405180910390f35b34801561074057600080fd5b5061074961174d565b604051610756919061345f565b60405180910390f35b34801561076b57600080fd5b5061078660048036038101906107819190613a15565b6117df565b005b34801561079457600080fd5b5061079d611960565b005b3480156107ab57600080fd5b506107c660048036038101906107c19190613af6565b6119f9565b005b3480156107d457600080fd5b506107dd611a5b565b6040516107ea919061345f565b60405180910390f35b3480156107ff57600080fd5b5061081a600480360381019061081591906134b7565b611ae9565b604051610827919061345f565b60405180910390f35b61084a6004803603810190610845919061356c565b611c42565b005b34801561085857600080fd5b50610873600480360381019061086e91906134b7565b611d2a565b005b34801561088157600080fd5b5061088a611db0565b60405161089791906135bb565b60405180910390f35b3480156108ac57600080fd5b506108c760048036038101906108c29190613973565b611db6565b005b3480156108d557600080fd5b506108de611e4c565b6040516108eb91906135bb565b60405180910390f35b34801561090057600080fd5b5061091b60048036038101906109169190613b79565b611e52565b6040516109289190613352565b60405180910390f35b34801561093d57600080fd5b5061095860048036038101906109539190613973565b611ee6565b005b34801561096657600080fd5b50610981600480360381019061097c919061365d565b611f7c565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109f657506109f582612074565b5b9050919050565b610a05612156565b73ffffffffffffffffffffffffffffffffffffffff16610a23611723565b73ffffffffffffffffffffffffffffffffffffffff1614610a79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7090613c05565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b606060008054610aa590613c54565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad190613c54565b8015610b1e5780601f10610af357610100808354040283529160200191610b1e565b820191906000526020600020905b815481529060010190602001808311610b0157829003601f168201915b5050505050905090565b6000610b338261215e565b610b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6990613cf8565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60138054610bba90613c54565b80601f0160208091040260200160405190810160405280929190818152602001828054610be690613c54565b8015610c335780601f10610c0857610100808354040283529160200191610c33565b820191906000526020600020905b815481529060010190602001808311610c1657829003601f168201915b505050505081565b6000610c468261141d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cae90613d8a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cd6612156565b73ffffffffffffffffffffffffffffffffffffffff161480610d055750610d0481610cff612156565b611e52565b5b610d44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3b90613e1c565b60405180910390fd5b610d4e83836121ca565b505050565b600e5481565b6000600980549050905090565b60145481565b60115481565b610d83610d7d612156565b82612283565b610dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db990613eae565b60405180910390fd5b610dcd838383612361565b505050565b6000610ddd8361155d565b8210610e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1590613f40565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e7f612156565b73ffffffffffffffffffffffffffffffffffffffff16610e9d611723565b73ffffffffffffffffffffffffffffffffffffffff1614610ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eea90613c05565b60405180910390fd5b6000610efd611723565b73ffffffffffffffffffffffffffffffffffffffff1647604051610f2090613f91565b60006040518083038185875af1925050503d8060008114610f5d576040519150601f19603f3d011682016040523d82523d6000602084013e610f62565b606091505b5050905080610f7057600080fd5b50565b610f8e838383604051806020016040528060008152506119f9565b505050565b60606000610fa08361155d565b905060008167ffffffffffffffff811115610fbe57610fbd613848565b5b604051908082528060200260200182016040528015610fec5781602001602082028036833780820191505090505b50905060005b82811015611036576110048582610dd2565b82828151811061101757611016613fa6565b5b602002602001018181525050808061102e90614004565b915050610ff2565b508092505050919050565b611049612156565b73ffffffffffffffffffffffffffffffffffffffff16611067611723565b73ffffffffffffffffffffffffffffffffffffffff16146110bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b490613c05565b60405180910390fd5b80600e8190555050565b60006110d1610d59565b9050601260009054906101000a900460ff16156110ed57600080fd5b600084116110fa57600080fd5b60115484111561110957600080fd5b6010548482611118919061404d565b111561112357600080fd5b60003360405160200161113691906140eb565b60405160208183030381529060405280519060200120905061119c848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601454836125bd565b6111db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d290614152565b60405180910390fd5b84600f546111e99190614172565b34101561122b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122290614218565b60405180910390fd5b6000600190505b8581116112615761124e878285611249919061404d565b6125d4565b808061125990614004565b915050611232565b50505050505050565b6000611274610d59565b82106112b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ac906142aa565b60405180910390fd5b600982815481106112c9576112c8613fa6565b5b90600052602060002001549050919050565b601260019054906101000a900460ff1681565b6112f6612156565b73ffffffffffffffffffffffffffffffffffffffff16611314611723565b73ffffffffffffffffffffffffffffffffffffffff161461136a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136190613c05565b60405180910390fd5b80600c90805190602001906113809291906131fb565b5050565b61138c612156565b73ffffffffffffffffffffffffffffffffffffffff166113aa611723565b73ffffffffffffffffffffffffffffffffffffffff1614611400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f790613c05565b60405180910390fd5b8060148190555050565b601260009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bd9061433c565b60405180910390fd5b80915050919050565b600c80546114dc90613c54565b80601f016020809104026020016040519081016040528092919081815260200182805461150890613c54565b80156115555780601f1061152a57610100808354040283529160200191611555565b820191906000526020600020905b81548152906001019060200180831161153857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c5906143ce565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61161d612156565b73ffffffffffffffffffffffffffffffffffffffff1661163b611723565b73ffffffffffffffffffffffffffffffffffffffff1614611691576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168890613c05565b60405180910390fd5b61169b60006125f2565b565b6116a5612156565b73ffffffffffffffffffffffffffffffffffffffff166116c3611723565b73ffffffffffffffffffffffffffffffffffffffff1614611719576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171090613c05565b60405180910390fd5b8060118190555050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461175c90613c54565b80601f016020809104026020016040519081016040528092919081815260200182805461178890613c54565b80156117d55780601f106117aa576101008083540402835291602001916117d5565b820191906000526020600020905b8154815290600101906020018083116117b857829003601f168201915b5050505050905090565b6117e7612156565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184c9061443a565b60405180910390fd5b8060066000611862612156565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661190f612156565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119549190613352565b60405180910390a35050565b611968612156565b73ffffffffffffffffffffffffffffffffffffffff16611986611723565b73ffffffffffffffffffffffffffffffffffffffff16146119dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d390613c05565b60405180910390fd5b6001601260016101000a81548160ff021916908315150217905550565b611a0a611a04612156565b83612283565b611a49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4090613eae565b60405180910390fd5b611a55848484846126b8565b50505050565b600d8054611a6890613c54565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9490613c54565b8015611ae15780601f10611ab657610100808354040283529160200191611ae1565b820191906000526020600020905b815481529060010190602001808311611ac457829003601f168201915b505050505081565b6060611af48261215e565b611b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2a906144cc565b60405180910390fd5b60001515601260019054906101000a900460ff1615151415611be15760138054611b5c90613c54565b80601f0160208091040260200160405190810160405280929190818152602001828054611b8890613c54565b8015611bd55780601f10611baa57610100808354040283529160200191611bd5565b820191906000526020600020905b815481529060010190602001808311611bb857829003601f168201915b50505050509050611c3d565b6000611beb612714565b90506000815111611c0b5760405180602001604052806000815250611c39565b80611c15846127a6565b600d604051602001611c29939291906145bc565b6040516020818303038152906040525b9150505b919050565b6000611c4c610d59565b9050601260009054906101000a900460ff1615611c6857600080fd5b60008211611c7557600080fd5b601154821115611c8457600080fd5b6010548282611c93919061404d565b1115611c9e57600080fd5b81600e54611cac9190614172565b341015611cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce590614218565b60405180910390fd5b6000600190505b828111611d2457611d11848284611d0c919061404d565b6125d4565b8080611d1c90614004565b915050611cf5565b50505050565b611d32612156565b73ffffffffffffffffffffffffffffffffffffffff16611d50611723565b73ffffffffffffffffffffffffffffffffffffffff1614611da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9d90613c05565b60405180910390fd5b80600f8190555050565b60105481565b611dbe612156565b73ffffffffffffffffffffffffffffffffffffffff16611ddc611723565b73ffffffffffffffffffffffffffffffffffffffff1614611e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2990613c05565b60405180910390fd5b80600d9080519060200190611e489291906131fb565b5050565b600f5481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611eee612156565b73ffffffffffffffffffffffffffffffffffffffff16611f0c611723565b73ffffffffffffffffffffffffffffffffffffffff1614611f62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5990613c05565b60405180910390fd5b8060139080519060200190611f789291906131fb565b5050565b611f84612156565b73ffffffffffffffffffffffffffffffffffffffff16611fa2611723565b73ffffffffffffffffffffffffffffffffffffffff1614611ff8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fef90613c05565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205f9061465f565b60405180910390fd5b612071816125f2565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061213f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061214f575061214e82612907565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661223d8361141d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061228e8261215e565b6122cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c4906146f1565b60405180910390fd5b60006122d88361141d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061234757508373ffffffffffffffffffffffffffffffffffffffff1661232f84610b28565b73ffffffffffffffffffffffffffffffffffffffff16145b8061235857506123578185611e52565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123818261141d565b73ffffffffffffffffffffffffffffffffffffffff16146123d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ce90614783565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243e90614815565b60405180910390fd5b612452838383612971565b61245d6000826121ca565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124ad9190614835565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612504919061404d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000826125ca8584612a85565b1490509392505050565b6125ee828260405180602001604052806000815250612adb565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6126c3848484612361565b6126cf84848484612b36565b61270e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612705906148db565b60405180910390fd5b50505050565b6060600c805461272390613c54565b80601f016020809104026020016040519081016040528092919081815260200182805461274f90613c54565b801561279c5780601f106127715761010080835404028352916020019161279c565b820191906000526020600020905b81548152906001019060200180831161277f57829003601f168201915b5050505050905090565b606060008214156127ee576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612902565b600082905060005b6000821461282057808061280990614004565b915050600a82612819919061492a565b91506127f6565b60008167ffffffffffffffff81111561283c5761283b613848565b5b6040519080825280601f01601f19166020018201604052801561286e5781602001600182028036833780820191505090505b5090505b600085146128fb576001826128879190614835565b9150600a85612896919061495b565b60306128a2919061404d565b60f81b8183815181106128b8576128b7613fa6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128f4919061492a565b9450612872565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61297c838383612ccd565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129bf576129ba81612cd2565b6129fe565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146129fd576129fc8382612d1b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a4157612a3c81612e88565b612a80565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612a7f57612a7e8282612f59565b5b5b505050565b60008082905060005b8451811015612ad057612abb82868381518110612aae57612aad613fa6565b5b6020026020010151612fd8565b91508080612ac890614004565b915050612a8e565b508091505092915050565b612ae58383613003565b612af26000848484612b36565b612b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b28906148db565b60405180910390fd5b505050565b6000612b578473ffffffffffffffffffffffffffffffffffffffff166131d1565b15612cc0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b80612156565b8786866040518563ffffffff1660e01b8152600401612ba294939291906149e1565b602060405180830381600087803b158015612bbc57600080fd5b505af1925050508015612bed57506040513d601f19601f82011682018060405250810190612bea9190614a42565b60015b612c70573d8060008114612c1d576040519150601f19603f3d011682016040523d82523d6000602084013e612c22565b606091505b50600081511415612c68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5f906148db565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612cc5565b600190505b949350505050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612d288461155d565b612d329190614835565b9050600060086000848152602001908152602001600020549050818114612e17576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050612e9c9190614835565b90506000600a6000848152602001908152602001600020549050600060098381548110612ecc57612ecb613fa6565b5b906000526020600020015490508060098381548110612eee57612eed613fa6565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480612f3d57612f3c614a6f565b5b6001900381819060005260206000200160009055905550505050565b6000612f648361155d565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b6000818310612ff057612feb82846131e4565b612ffb565b612ffa83836131e4565b5b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306a90614aea565b60405180910390fd5b61307c8161215e565b156130bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b390614b56565b60405180910390fd5b6130c860008383612971565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613118919061404d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b600082600052816020526040600020905092915050565b82805461320790613c54565b90600052602060002090601f0160209004810192826132295760008555613270565b82601f1061324257805160ff1916838001178555613270565b82800160010185558215613270579182015b8281111561326f578251825591602001919060010190613254565b5b50905061327d9190613281565b5090565b5b8082111561329a576000816000905550600101613282565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132e7816132b2565b81146132f257600080fd5b50565b600081359050613304816132de565b92915050565b6000602082840312156133205761331f6132a8565b5b600061332e848285016132f5565b91505092915050565b60008115159050919050565b61334c81613337565b82525050565b60006020820190506133676000830184613343565b92915050565b61337681613337565b811461338157600080fd5b50565b6000813590506133938161336d565b92915050565b6000602082840312156133af576133ae6132a8565b5b60006133bd84828501613384565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156134005780820151818401526020810190506133e5565b8381111561340f576000848401525b50505050565b6000601f19601f8301169050919050565b6000613431826133c6565b61343b81856133d1565b935061344b8185602086016133e2565b61345481613415565b840191505092915050565b600060208201905081810360008301526134798184613426565b905092915050565b6000819050919050565b61349481613481565b811461349f57600080fd5b50565b6000813590506134b18161348b565b92915050565b6000602082840312156134cd576134cc6132a8565b5b60006134db848285016134a2565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061350f826134e4565b9050919050565b61351f81613504565b82525050565b600060208201905061353a6000830184613516565b92915050565b61354981613504565b811461355457600080fd5b50565b60008135905061356681613540565b92915050565b60008060408385031215613583576135826132a8565b5b600061359185828601613557565b92505060206135a2858286016134a2565b9150509250929050565b6135b581613481565b82525050565b60006020820190506135d060008301846135ac565b92915050565b6000819050919050565b6135e9816135d6565b82525050565b600060208201905061360460008301846135e0565b92915050565b600080600060608486031215613623576136226132a8565b5b600061363186828701613557565b935050602061364286828701613557565b9250506040613653868287016134a2565b9150509250925092565b600060208284031215613673576136726132a8565b5b600061368184828501613557565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6136bf81613481565b82525050565b60006136d183836136b6565b60208301905092915050565b6000602082019050919050565b60006136f58261368a565b6136ff8185613695565b935061370a836136a6565b8060005b8381101561373b57815161372288826136c5565b975061372d836136dd565b92505060018101905061370e565b5085935050505092915050565b6000602082019050818103600083015261376281846136ea565b905092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261378f5761378e61376a565b5b8235905067ffffffffffffffff8111156137ac576137ab61376f565b5b6020830191508360208202830111156137c8576137c7613774565b5b9250929050565b600080600080606085870312156137e9576137e86132a8565b5b60006137f787828801613557565b9450506020613808878288016134a2565b935050604085013567ffffffffffffffff811115613829576138286132ad565b5b61383587828801613779565b925092505092959194509250565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61388082613415565b810181811067ffffffffffffffff8211171561389f5761389e613848565b5b80604052505050565b60006138b261329e565b90506138be8282613877565b919050565b600067ffffffffffffffff8211156138de576138dd613848565b5b6138e782613415565b9050602081019050919050565b82818337600083830152505050565b6000613916613911846138c3565b6138a8565b90508281526020810184848401111561393257613931613843565b5b61393d8482856138f4565b509392505050565b600082601f83011261395a5761395961376a565b5b813561396a848260208601613903565b91505092915050565b600060208284031215613989576139886132a8565b5b600082013567ffffffffffffffff8111156139a7576139a66132ad565b5b6139b384828501613945565b91505092915050565b6139c5816135d6565b81146139d057600080fd5b50565b6000813590506139e2816139bc565b92915050565b6000602082840312156139fe576139fd6132a8565b5b6000613a0c848285016139d3565b91505092915050565b60008060408385031215613a2c57613a2b6132a8565b5b6000613a3a85828601613557565b9250506020613a4b85828601613384565b9150509250929050565b600067ffffffffffffffff821115613a7057613a6f613848565b5b613a7982613415565b9050602081019050919050565b6000613a99613a9484613a55565b6138a8565b905082815260208101848484011115613ab557613ab4613843565b5b613ac08482856138f4565b509392505050565b600082601f830112613add57613adc61376a565b5b8135613aed848260208601613a86565b91505092915050565b60008060008060808587031215613b1057613b0f6132a8565b5b6000613b1e87828801613557565b9450506020613b2f87828801613557565b9350506040613b40878288016134a2565b925050606085013567ffffffffffffffff811115613b6157613b606132ad565b5b613b6d87828801613ac8565b91505092959194509250565b60008060408385031215613b9057613b8f6132a8565b5b6000613b9e85828601613557565b9250506020613baf85828601613557565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613bef6020836133d1565b9150613bfa82613bb9565b602082019050919050565b60006020820190508181036000830152613c1e81613be2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c6c57607f821691505b60208210811415613c8057613c7f613c25565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613ce2602c836133d1565b9150613ced82613c86565b604082019050919050565b60006020820190508181036000830152613d1181613cd5565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d746021836133d1565b9150613d7f82613d18565b604082019050919050565b60006020820190508181036000830152613da381613d67565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613e066038836133d1565b9150613e1182613daa565b604082019050919050565b60006020820190508181036000830152613e3581613df9565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613e986031836133d1565b9150613ea382613e3c565b604082019050919050565b60006020820190508181036000830152613ec781613e8b565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613f2a602b836133d1565b9150613f3582613ece565b604082019050919050565b60006020820190508181036000830152613f5981613f1d565b9050919050565b600081905092915050565b50565b6000613f7b600083613f60565b9150613f8682613f6b565b600082019050919050565b6000613f9c82613f6e565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061400f82613481565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561404257614041613fd5565b5b600182019050919050565b600061405882613481565b915061406383613481565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561409857614097613fd5565b5b828201905092915050565b60008160601b9050919050565b60006140bb826140a3565b9050919050565b60006140cd826140b0565b9050919050565b6140e56140e082613504565b6140c2565b82525050565b60006140f782846140d4565b60148201915081905092915050565b7f496e636f72726563742050726f6f660000000000000000000000000000000000600082015250565b600061413c600f836133d1565b915061414782614106565b602082019050919050565b6000602082019050818103600083015261416b8161412f565b9050919050565b600061417d82613481565b915061418883613481565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141c1576141c0613fd5565b5b828202905092915050565b7f496e73756666696369656e742046756e647320746f204d696e74000000000000600082015250565b6000614202601a836133d1565b915061420d826141cc565b602082019050919050565b60006020820190508181036000830152614231816141f5565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614294602c836133d1565b915061429f82614238565b604082019050919050565b600060208201905081810360008301526142c381614287565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006143266029836133d1565b9150614331826142ca565b604082019050919050565b6000602082019050818103600083015261435581614319565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006143b8602a836133d1565b91506143c38261435c565b604082019050919050565b600060208201905081810360008301526143e7816143ab565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006144246019836133d1565b915061442f826143ee565b602082019050919050565b6000602082019050818103600083015261445381614417565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006144b6602f836133d1565b91506144c18261445a565b604082019050919050565b600060208201905081810360008301526144e5816144a9565b9050919050565b600081905092915050565b6000614502826133c6565b61450c81856144ec565b935061451c8185602086016133e2565b80840191505092915050565b60008190508160005260206000209050919050565b6000815461454a81613c54565b61455481866144ec565b9450600182166000811461456f5760018114614580576145b3565b60ff198316865281860193506145b3565b61458985614528565b60005b838110156145ab5781548189015260018201915060208101905061458c565b838801955050505b50505092915050565b60006145c882866144f7565b91506145d482856144f7565b91506145e0828461453d565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006146496026836133d1565b9150614654826145ed565b604082019050919050565b600060208201905081810360008301526146788161463c565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006146db602c836133d1565b91506146e68261467f565b604082019050919050565b6000602082019050818103600083015261470a816146ce565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b600061476d6029836133d1565b915061477882614711565b604082019050919050565b6000602082019050818103600083015261479c81614760565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006147ff6024836133d1565b915061480a826147a3565b604082019050919050565b6000602082019050818103600083015261482e816147f2565b9050919050565b600061484082613481565b915061484b83613481565b92508282101561485e5761485d613fd5565b5b828203905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006148c56032836133d1565b91506148d082614869565b604082019050919050565b600060208201905081810360008301526148f4816148b8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061493582613481565b915061494083613481565b9250826149505761494f6148fb565b5b828204905092915050565b600061496682613481565b915061497183613481565b925082614981576149806148fb565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006149b38261498c565b6149bd8185614997565b93506149cd8185602086016133e2565b6149d681613415565b840191505092915050565b60006080820190506149f66000830187613516565b614a036020830186613516565b614a1060408301856135ac565b8181036060830152614a2281846149a8565b905095945050505050565b600081519050614a3c816132de565b92915050565b600060208284031215614a5857614a576132a8565b5b6000614a6684828501614a2d565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614ad46020836133d1565b9150614adf82614a9e565b602082019050919050565b60006020820190508181036000830152614b0381614ac7565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614b40601c836133d1565b9150614b4b82614b0a565b602082019050919050565b60006020820190508181036000830152614b6f81614b33565b905091905056fea26469706673582212202221ad5d16e7b7cc09bf09159399cb366da70cfc68cde62c51f6e79dbfbfd3d764736f6c63430008090033

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

000000000000000000000000000000000000000000000000000000000000004034fc1cf9f39122ee4fd78a569531bd39aed398840a782f715ae677e6649496f7000000000000000000000000000000000000000000000000000000000000004368747470733a2f2f697066732e696f2f697066732f516d5a6e4e67534a477553624b6e386b45734747476935556e465a6e64377053487566594d3538656466507834410000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _initNotRevealedUri (string): https://ipfs.io/ipfs/QmZnNgSJGuSbKn8kEsGGGi5UnFZnd7pSHufYM58edfPx4A
Arg [1] : _rootHash (bytes32): 0x34fc1cf9f39122ee4fd78a569531bd39aed398840a782f715ae677e6649496f7

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 34fc1cf9f39122ee4fd78a569531bd39aed398840a782f715ae677e6649496f7
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [3] : 68747470733a2f2f697066732e696f2f697066732f516d5a6e4e67534a477553
Arg [4] : 624b6e386b45734747476935556e465a6e64377053487566594d353865646650
Arg [5] : 7834410000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

52731:3797:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37111:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56296:73;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24308:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26277:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53107:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25800:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52886:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37751:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53140:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53006:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27167:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37419:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56380:145;;;:::i;:::-;;27577:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54670:348;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55616:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53502:631;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37941:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53074:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56064:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54571:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53043:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24002:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52818:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23732:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19840:94;;;;;;;;;;;;;:::i;:::-;;55814:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19189:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24477:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26570:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55543:65;;;;;;;;;;;;;:::i;:::-;;27833:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52844:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55024:497;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54137:430;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55700:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52970:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56168:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52923:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26936:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55938:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20089:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37111:224;37213:4;37252:35;37237:50;;;:11;:50;;;;:90;;;;37291:36;37315:11;37291:23;:36::i;:::-;37237:90;37230:97;;37111:224;;;:::o;56296:73::-;19420:12;:10;:12::i;:::-;19409:23;;:7;:5;:7::i;:::-;:23;;;19401:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56357:6:::1;56348;;:15;;;;;;;;;;;;;;;;;;56296:73:::0;:::o;24308:100::-;24362:13;24395:5;24388:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24308:100;:::o;26277:221::-;26353:7;26381:16;26389:7;26381;:16::i;:::-;26373:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26466:15;:24;26482:7;26466:24;;;;;;;;;;;;;;;;;;;;;26459:31;;26277:221;;;:::o;53107:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25800:411::-;25881:13;25897:23;25912:7;25897:14;:23::i;:::-;25881:39;;25945:5;25939:11;;:2;:11;;;;25931:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26039:5;26023:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26048:37;26065:5;26072:12;:10;:12::i;:::-;26048:16;:37::i;:::-;26023:62;26001:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26182:21;26191:2;26195:7;26182:8;:21::i;:::-;25870:341;25800:411;;:::o;52886:32::-;;;;:::o;37751:113::-;37812:7;37839:10;:17;;;;37832:24;;37751:113;:::o;53140:23::-;;;;:::o;53006:32::-;;;;:::o;27167:339::-;27362:41;27381:12;:10;:12::i;:::-;27395:7;27362:18;:41::i;:::-;27354:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27470:28;27480:4;27486:2;27490:7;27470:9;:28::i;:::-;27167:339;;;:::o;37419:256::-;37516:7;37552:23;37569:5;37552:16;:23::i;:::-;37544:5;:31;37536:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;37641:12;:19;37654:5;37641:19;;;;;;;;;;;;;;;:26;37661:5;37641:26;;;;;;;;;;;;37634:33;;37419:256;;;;:::o;56380:145::-;19420:12;:10;:12::i;:::-;19409:23;;:7;:5;:7::i;:::-;:23;;;19401:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56433:7:::1;56454;:5;:7::i;:::-;56446:21;;56475;56446:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56432:69;;;56516:2;56508:11;;;::::0;::::1;;56425:100;56380:145::o:0;27577:185::-;27715:39;27732:4;27738:2;27742:7;27715:39;;;;;;;;;;;;:16;:39::i;:::-;27577:185;;;:::o;54670:348::-;54745:16;54773:23;54799:17;54809:6;54799:9;:17::i;:::-;54773:43;;54823:25;54865:15;54851:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54823:58;;54893:9;54888:103;54908:15;54904:1;:19;54888:103;;;54953:30;54973:6;54981:1;54953:19;:30::i;:::-;54939:8;54948:1;54939:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;54925:3;;;;;:::i;:::-;;;;54888:103;;;;55004:8;54997:15;;;;54670:348;;;:::o;55616:80::-;19420:12;:10;:12::i;:::-;19409:23;;:7;:5;:7::i;:::-;:23;;;19401:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55682:8:::1;55675:4;:15;;;;55616:80:::0;:::o;53502:631::-;53614:14;53631:13;:11;:13::i;:::-;53614:30;;53660:6;;;;;;;;;;;53659:7;53651:16;;;;;;53696:1;53682:11;:15;53674:24;;;;;;53728:13;;53713:11;:28;;53705:37;;;;;;53781:9;;53766:11;53757:6;:20;;;;:::i;:::-;:33;;53749:42;;;;;;53798:12;53840:10;53823:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;53813:39;;;;;;53798:54;;53867:48;53886:12;;53867:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53900:8;;53910:4;53867:18;:48::i;:::-;53859:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;53981:11;53965:13;;:27;;;;:::i;:::-;53952:9;:40;;53944:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;54047:9;54059:1;54047:13;;54042:86;54067:11;54062:1;:16;54042:86;;54094:26;54104:3;54118:1;54109:6;:10;;;;:::i;:::-;54094:9;:26::i;:::-;54080:3;;;;;:::i;:::-;;;;54042:86;;;;53607:526;;53502:631;;;;:::o;37941:233::-;38016:7;38052:30;:28;:30::i;:::-;38044:5;:38;38036:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;38149:10;38160:5;38149:17;;;;;;;;:::i;:::-;;;;;;;;;;38142:24;;37941:233;;;:::o;53074:28::-;;;;;;;;;;;;;:::o;56064:98::-;19420:12;:10;:12::i;:::-;19409:23;;:7;:5;:7::i;:::-;:23;;;19401:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56145:11:::1;56135:7;:21;;;;;;;;;;;;:::i;:::-;;56064:98:::0;:::o;54571:91::-;19420:12;:10;:12::i;:::-;19409:23;;:7;:5;:7::i;:::-;:23;;;19401:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54648:8:::1;54637;:19;;;;54571:91:::0;:::o;53043:26::-;;;;;;;;;;;;;:::o;24002:239::-;24074:7;24094:13;24110:7;:16;24118:7;24110:16;;;;;;;;;;;;;;;;;;;;;24094:32;;24162:1;24145:19;;:5;:19;;;;24137:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24228:5;24221:12;;;24002:239;;;:::o;52818:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23732:208::-;23804:7;23849:1;23832:19;;:5;:19;;;;23824:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;23916:9;:16;23926:5;23916:16;;;;;;;;;;;;;;;;23909:23;;23732:208;;;:::o;19840:94::-;19420:12;:10;:12::i;:::-;19409:23;;:7;:5;:7::i;:::-;:23;;;19401:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19905:21:::1;19923:1;19905:9;:21::i;:::-;19840:94::o:0;55814:116::-;19420:12;:10;:12::i;:::-;19409:23;;:7;:5;:7::i;:::-;:23;;;19401:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55907:17:::1;55891:13;:33;;;;55814:116:::0;:::o;19189:87::-;19235:7;19262:6;;;;;;;;;;;19255:13;;19189:87;:::o;24477:104::-;24533:13;24566:7;24559:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24477:104;:::o;26570:295::-;26685:12;:10;:12::i;:::-;26673:24;;:8;:24;;;;26665:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;26785:8;26740:18;:32;26759:12;:10;:12::i;:::-;26740:32;;;;;;;;;;;;;;;:42;26773:8;26740:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;26838:8;26809:48;;26824:12;:10;:12::i;:::-;26809:48;;;26848:8;26809:48;;;;;;:::i;:::-;;;;;;;;26570:295;;:::o;55543:65::-;19420:12;:10;:12::i;:::-;19409:23;;:7;:5;:7::i;:::-;:23;;;19401:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55598:4:::1;55587:8;;:15;;;;;;;;;;;;;;;;;;55543:65::o:0;27833:328::-;28008:41;28027:12;:10;:12::i;:::-;28041:7;28008:18;:41::i;:::-;28000:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28114:39;28128:4;28134:2;28138:7;28147:5;28114:13;:39::i;:::-;27833:328;;;;:::o;52844:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55024:497::-;55122:13;55163:16;55171:7;55163;:16::i;:::-;55147:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;55272:5;55260:17;;:8;;;;;;;;;;;:17;;;55257:62;;;55297:14;55290:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55257:62;55327:28;55358:10;:8;:10::i;:::-;55327:41;;55413:1;55388:14;55382:28;:32;:133;;;;;;;;;;;;;;;;;55450:14;55466:18;:7;:16;:18::i;:::-;55486:13;55433:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55382:133;55375:140;;;55024:497;;;;:::o;54137:430::-;54213:14;54230:13;:11;:13::i;:::-;54213:30;;54259:6;;;;;;;;;;;54258:7;54250:16;;;;;;54295:1;54281:11;:15;54273:24;;;;;;54327:13;;54312:11;:28;;54304:37;;;;;;54380:9;;54365:11;54356:6;:20;;;;:::i;:::-;:33;;54348:42;;;;;;54427:11;54420:4;;:18;;;;:::i;:::-;54407:9;:31;;54399:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;54481:9;54493:1;54481:13;;54476:86;54501:11;54496:1;:16;54476:86;;54528:26;54538:3;54552:1;54543:6;:10;;;;:::i;:::-;54528:9;:26::i;:::-;54514:3;;;;;:::i;:::-;;;;54476:86;;;;54206:361;54137:430;;:::o;55700:108::-;19420:12;:10;:12::i;:::-;19409:23;;:7;:5;:7::i;:::-;:23;;;19401:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55789:13:::1;55773;:29;;;;55700:108:::0;:::o;52970:31::-;;;;:::o;56168:122::-;19420:12;:10;:12::i;:::-;19409:23;;:7;:5;:7::i;:::-;:23;;;19401:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56267:17:::1;56251:13;:33;;;;;;;;;;;;:::i;:::-;;56168:122:::0;:::o;52923:42::-;;;;:::o;26936:164::-;27033:4;27057:18;:25;27076:5;27057:25;;;;;;;;;;;;;;;:35;27083:8;27057:35;;;;;;;;;;;;;;;;;;;;;;;;;27050:42;;26936:164;;;;:::o;55938:120::-;19420:12;:10;:12::i;:::-;19409:23;;:7;:5;:7::i;:::-;:23;;;19401:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56037:15:::1;56020:14;:32;;;;;;;;;;;;:::i;:::-;;55938:120:::0;:::o;20089:192::-;19420:12;:10;:12::i;:::-;19409:23;;:7;:5;:7::i;:::-;:23;;;19401:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20198:1:::1;20178:22;;:8;:22;;;;20170:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20254:19;20264:8;20254:9;:19::i;:::-;20089:192:::0;:::o;23363:305::-;23465:4;23517:25;23502:40;;;:11;:40;;;;:105;;;;23574:33;23559:48;;;:11;:48;;;;23502:105;:158;;;;23624:36;23648:11;23624:23;:36::i;:::-;23502:158;23482:178;;23363:305;;;:::o;8743:98::-;8796:7;8823:10;8816:17;;8743:98;:::o;29671:127::-;29736:4;29788:1;29760:30;;:7;:16;29768:7;29760:16;;;;;;;;;;;;;;;;;;;;;:30;;;;29753:37;;29671:127;;;:::o;34025:174::-;34127:2;34100:15;:24;34116:7;34100:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34183:7;34179:2;34145:46;;34154:23;34169:7;34154:14;:23::i;:::-;34145:46;;;;;;;;;;;;34025:174;;:::o;29965:348::-;30058:4;30083:16;30091:7;30083;:16::i;:::-;30075:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30159:13;30175:23;30190:7;30175:14;:23::i;:::-;30159:39;;30228:5;30217:16;;:7;:16;;;:51;;;;30261:7;30237:31;;:20;30249:7;30237:11;:20::i;:::-;:31;;;30217:51;:87;;;;30272:32;30289:5;30296:7;30272:16;:32::i;:::-;30217:87;30209:96;;;29965:348;;;;:::o;33329:578::-;33488:4;33461:31;;:23;33476:7;33461:14;:23::i;:::-;:31;;;33453:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33571:1;33557:16;;:2;:16;;;;33549:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33627:39;33648:4;33654:2;33658:7;33627:20;:39::i;:::-;33731:29;33748:1;33752:7;33731:8;:29::i;:::-;33792:1;33773:9;:15;33783:4;33773:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;33821:1;33804:9;:13;33814:2;33804:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33852:2;33833:7;:16;33841:7;33833:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33891:7;33887:2;33872:27;;33881:4;33872:27;;;;;;;;;;;;33329:578;;;:::o;44318:190::-;44443:4;44496;44467:25;44480:5;44487:4;44467:12;:25::i;:::-;:33;44460:40;;44318:190;;;;;:::o;30655:110::-;30731:26;30741:2;30745:7;30731:26;;;;;;;;;;;;:9;:26::i;:::-;30655:110;;:::o;20289:173::-;20345:16;20364:6;;;;;;;;;;;20345:25;;20390:8;20381:6;;:17;;;;;;;;;;;;;;;;;;20445:8;20414:40;;20435:8;20414:40;;;;;;;;;;;;20334:128;20289:173;:::o;29043:315::-;29200:28;29210:4;29216:2;29220:7;29200:9;:28::i;:::-;29247:48;29270:4;29276:2;29280:7;29289:5;29247:22;:48::i;:::-;29239:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29043:315;;;;:::o;53381:102::-;53441:13;53470:7;53463:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53381:102;:::o;10892:723::-;10948:13;11178:1;11169:5;:10;11165:53;;;11196:10;;;;;;;;;;;;;;;;;;;;;11165:53;11228:12;11243:5;11228:20;;11259:14;11284:78;11299:1;11291:4;:9;11284:78;;11317:8;;;;;:::i;:::-;;;;11348:2;11340:10;;;;;:::i;:::-;;;11284:78;;;11372:19;11404:6;11394:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11372:39;;11422:154;11438:1;11429:5;:10;11422:154;;11466:1;11456:11;;;;;:::i;:::-;;;11533:2;11525:5;:10;;;;:::i;:::-;11512:2;:24;;;;:::i;:::-;11499:39;;11482:6;11489;11482:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;11562:2;11553:11;;;;;:::i;:::-;;;11422:154;;;11600:6;11586:21;;;;;10892:723;;;;:::o;13368:157::-;13453:4;13492:25;13477:40;;;:11;:40;;;;13470:47;;13368:157;;;:::o;38787:589::-;38931:45;38958:4;38964:2;38968:7;38931:26;:45::i;:::-;39009:1;38993:18;;:4;:18;;;38989:187;;;39028:40;39060:7;39028:31;:40::i;:::-;38989:187;;;39098:2;39090:10;;:4;:10;;;39086:90;;39117:47;39150:4;39156:7;39117:32;:47::i;:::-;39086:90;38989:187;39204:1;39190:16;;:2;:16;;;39186:183;;;39223:45;39260:7;39223:36;:45::i;:::-;39186:183;;;39296:4;39290:10;;:2;:10;;;39286:83;;39317:40;39345:2;39349:7;39317:27;:40::i;:::-;39286:83;39186:183;38787:589;;;:::o;45185:296::-;45268:7;45288:20;45311:4;45288:27;;45331:9;45326:118;45350:5;:12;45346:1;:16;45326:118;;;45399:33;45409:12;45423:5;45429:1;45423:8;;;;;;;;:::i;:::-;;;;;;;;45399:9;:33::i;:::-;45384:48;;45364:3;;;;;:::i;:::-;;;;45326:118;;;;45461:12;45454:19;;;45185:296;;;;:::o;30992:321::-;31122:18;31128:2;31132:7;31122:5;:18::i;:::-;31173:54;31204:1;31208:2;31212:7;31221:5;31173:22;:54::i;:::-;31151:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;30992:321;;;:::o;34764:799::-;34919:4;34940:15;:2;:13;;;:15::i;:::-;34936:620;;;34992:2;34976:36;;;35013:12;:10;:12::i;:::-;35027:4;35033:7;35042:5;34976:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34972:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35235:1;35218:6;:13;:18;35214:272;;;35261:60;;;;;;;;;;:::i;:::-;;;;;;;;35214:272;35436:6;35430:13;35421:6;35417:2;35413:15;35406:38;34972:529;35109:41;;;35099:51;;;:6;:51;;;;35092:58;;;;;34936:620;35540:4;35533:11;;34764:799;;;;;;;:::o;36135:126::-;;;;:::o;40099:164::-;40203:10;:17;;;;40176:15;:24;40192:7;40176:24;;;;;;;;;;;:44;;;;40231:10;40247:7;40231:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40099:164;:::o;40890:988::-;41156:22;41206:1;41181:22;41198:4;41181:16;:22::i;:::-;:26;;;;:::i;:::-;41156:51;;41218:18;41239:17;:26;41257:7;41239:26;;;;;;;;;;;;41218:47;;41386:14;41372:10;:28;41368:328;;41417:19;41439:12;:18;41452:4;41439:18;;;;;;;;;;;;;;;:34;41458:14;41439:34;;;;;;;;;;;;41417:56;;41523:11;41490:12;:18;41503:4;41490:18;;;;;;;;;;;;;;;:30;41509:10;41490:30;;;;;;;;;;;:44;;;;41640:10;41607:17;:30;41625:11;41607:30;;;;;;;;;;;:43;;;;41402:294;41368:328;41792:17;:26;41810:7;41792:26;;;;;;;;;;;41785:33;;;41836:12;:18;41849:4;41836:18;;;;;;;;;;;;;;;:34;41855:14;41836:34;;;;;;;;;;;41829:41;;;40971:907;;40890:988;;:::o;42173:1079::-;42426:22;42471:1;42451:10;:17;;;;:21;;;;:::i;:::-;42426:46;;42483:18;42504:15;:24;42520:7;42504:24;;;;;;;;;;;;42483:45;;42855:19;42877:10;42888:14;42877:26;;;;;;;;:::i;:::-;;;;;;;;;;42855:48;;42941:11;42916:10;42927;42916:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;43052:10;43021:15;:28;43037:11;43021:28;;;;;;;;;;;:41;;;;43193:15;:24;43209:7;43193:24;;;;;;;;;;;43186:31;;;43228:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42244:1008;;;42173:1079;:::o;39677:221::-;39762:14;39779:20;39796:2;39779:16;:20::i;:::-;39762:37;;39837:7;39810:12;:16;39823:2;39810:16;;;;;;;;;;;;;;;:24;39827:6;39810:24;;;;;;;;;;;:34;;;;39884:6;39855:17;:26;39873:7;39855:26;;;;;;;;;;;:35;;;;39751:147;39677:221;;:::o;52299:149::-;52362:7;52393:1;52389;:5;:51;;52420:20;52435:1;52438;52420:14;:20::i;:::-;52389:51;;;52397:20;52412:1;52415;52397:14;:20::i;:::-;52389:51;52382:58;;52299:149;;;;:::o;31649:382::-;31743:1;31729:16;;:2;:16;;;;31721:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;31802:16;31810:7;31802;:16::i;:::-;31801:17;31793:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;31864:45;31893:1;31897:2;31901:7;31864:20;:45::i;:::-;31939:1;31922:9;:13;31932:2;31922:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31970:2;31951:7;:16;31959:7;31951:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32015:7;32011:2;31990:33;;32007:1;31990:33;;;;;;;;;;;;31649:382;;:::o;852:387::-;912:4;1120:12;1187:7;1175:20;1167:28;;1230:1;1223:4;:8;1216:15;;;852:387;;;:::o;52456:268::-;52524:13;52631:1;52625:4;52618:15;52660:1;52654:4;52647:15;52701:4;52695;52685:21;52676:30;;52456:268;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:116::-;1588:21;1603:5;1588:21;:::i;:::-;1581:5;1578:32;1568:60;;1624:1;1621;1614:12;1568:60;1518:116;:::o;1640:133::-;1683:5;1721:6;1708:20;1699:29;;1737:30;1761:5;1737:30;:::i;:::-;1640:133;;;;:::o;1779:323::-;1835:6;1884:2;1872:9;1863:7;1859:23;1855:32;1852:119;;;1890:79;;:::i;:::-;1852:119;2010:1;2035:50;2077:7;2068:6;2057:9;2053:22;2035:50;:::i;:::-;2025:60;;1981:114;1779:323;;;;:::o;2108:99::-;2160:6;2194:5;2188:12;2178:22;;2108:99;;;:::o;2213:169::-;2297:11;2331:6;2326:3;2319:19;2371:4;2366:3;2362:14;2347:29;;2213:169;;;;:::o;2388:307::-;2456:1;2466:113;2480:6;2477:1;2474:13;2466:113;;;2565:1;2560:3;2556:11;2550:18;2546:1;2541:3;2537:11;2530:39;2502:2;2499:1;2495:10;2490:15;;2466:113;;;2597:6;2594:1;2591:13;2588:101;;;2677:1;2668:6;2663:3;2659:16;2652:27;2588:101;2437:258;2388:307;;;:::o;2701:102::-;2742:6;2793:2;2789:7;2784:2;2777:5;2773:14;2769:28;2759:38;;2701:102;;;:::o;2809:364::-;2897:3;2925:39;2958:5;2925:39;:::i;:::-;2980:71;3044:6;3039:3;2980:71;:::i;:::-;2973:78;;3060:52;3105:6;3100:3;3093:4;3086:5;3082:16;3060:52;:::i;:::-;3137:29;3159:6;3137:29;:::i;:::-;3132:3;3128:39;3121:46;;2901:272;2809:364;;;;:::o;3179:313::-;3292:4;3330:2;3319:9;3315:18;3307:26;;3379:9;3373:4;3369:20;3365:1;3354:9;3350:17;3343:47;3407:78;3480:4;3471:6;3407:78;:::i;:::-;3399:86;;3179:313;;;;:::o;3498:77::-;3535:7;3564:5;3553:16;;3498:77;;;:::o;3581:122::-;3654:24;3672:5;3654:24;:::i;:::-;3647:5;3644:35;3634:63;;3693:1;3690;3683:12;3634:63;3581:122;:::o;3709:139::-;3755:5;3793:6;3780:20;3771:29;;3809:33;3836:5;3809:33;:::i;:::-;3709:139;;;;:::o;3854:329::-;3913:6;3962:2;3950:9;3941:7;3937:23;3933:32;3930:119;;;3968:79;;:::i;:::-;3930:119;4088:1;4113:53;4158:7;4149:6;4138:9;4134:22;4113:53;:::i;:::-;4103:63;;4059:117;3854:329;;;;:::o;4189:126::-;4226:7;4266:42;4259:5;4255:54;4244:65;;4189:126;;;:::o;4321:96::-;4358:7;4387:24;4405:5;4387:24;:::i;:::-;4376:35;;4321:96;;;:::o;4423:118::-;4510:24;4528:5;4510:24;:::i;:::-;4505:3;4498:37;4423:118;;:::o;4547:222::-;4640:4;4678:2;4667:9;4663:18;4655:26;;4691:71;4759:1;4748:9;4744:17;4735:6;4691:71;:::i;:::-;4547:222;;;;:::o;4775:122::-;4848:24;4866:5;4848:24;:::i;:::-;4841:5;4838:35;4828:63;;4887:1;4884;4877:12;4828:63;4775:122;:::o;4903:139::-;4949:5;4987:6;4974:20;4965:29;;5003:33;5030:5;5003:33;:::i;:::-;4903:139;;;;:::o;5048:474::-;5116:6;5124;5173:2;5161:9;5152:7;5148:23;5144:32;5141:119;;;5179:79;;:::i;:::-;5141:119;5299:1;5324:53;5369:7;5360:6;5349:9;5345:22;5324:53;:::i;:::-;5314:63;;5270:117;5426:2;5452:53;5497:7;5488:6;5477:9;5473:22;5452:53;:::i;:::-;5442:63;;5397:118;5048:474;;;;;:::o;5528:118::-;5615:24;5633:5;5615:24;:::i;:::-;5610:3;5603:37;5528:118;;:::o;5652:222::-;5745:4;5783:2;5772:9;5768:18;5760:26;;5796:71;5864:1;5853:9;5849:17;5840:6;5796:71;:::i;:::-;5652:222;;;;:::o;5880:77::-;5917:7;5946:5;5935:16;;5880:77;;;:::o;5963:118::-;6050:24;6068:5;6050:24;:::i;:::-;6045:3;6038:37;5963:118;;:::o;6087:222::-;6180:4;6218:2;6207:9;6203:18;6195:26;;6231:71;6299:1;6288:9;6284:17;6275:6;6231:71;:::i;:::-;6087:222;;;;:::o;6315:619::-;6392:6;6400;6408;6457:2;6445:9;6436:7;6432:23;6428:32;6425:119;;;6463:79;;:::i;:::-;6425:119;6583:1;6608:53;6653:7;6644:6;6633:9;6629:22;6608:53;:::i;:::-;6598:63;;6554:117;6710:2;6736:53;6781:7;6772:6;6761:9;6757:22;6736:53;:::i;:::-;6726:63;;6681:118;6838:2;6864:53;6909:7;6900:6;6889:9;6885:22;6864:53;:::i;:::-;6854:63;;6809:118;6315:619;;;;;:::o;6940:329::-;6999:6;7048:2;7036:9;7027:7;7023:23;7019:32;7016:119;;;7054:79;;:::i;:::-;7016:119;7174:1;7199:53;7244:7;7235:6;7224:9;7220:22;7199:53;:::i;:::-;7189:63;;7145:117;6940:329;;;;:::o;7275:114::-;7342:6;7376:5;7370:12;7360:22;;7275:114;;;:::o;7395:184::-;7494:11;7528:6;7523:3;7516:19;7568:4;7563:3;7559:14;7544:29;;7395:184;;;;:::o;7585:132::-;7652:4;7675:3;7667:11;;7705:4;7700:3;7696:14;7688:22;;7585:132;;;:::o;7723:108::-;7800:24;7818:5;7800:24;:::i;:::-;7795:3;7788:37;7723:108;;:::o;7837:179::-;7906:10;7927:46;7969:3;7961:6;7927:46;:::i;:::-;8005:4;8000:3;7996:14;7982:28;;7837:179;;;;:::o;8022:113::-;8092:4;8124;8119:3;8115:14;8107:22;;8022:113;;;:::o;8171:732::-;8290:3;8319:54;8367:5;8319:54;:::i;:::-;8389:86;8468:6;8463:3;8389:86;:::i;:::-;8382:93;;8499:56;8549:5;8499:56;:::i;:::-;8578:7;8609:1;8594:284;8619:6;8616:1;8613:13;8594:284;;;8695:6;8689:13;8722:63;8781:3;8766:13;8722:63;:::i;:::-;8715:70;;8808:60;8861:6;8808:60;:::i;:::-;8798:70;;8654:224;8641:1;8638;8634:9;8629:14;;8594:284;;;8598:14;8894:3;8887:10;;8295:608;;;8171:732;;;;:::o;8909:373::-;9052:4;9090:2;9079:9;9075:18;9067:26;;9139:9;9133:4;9129:20;9125:1;9114:9;9110:17;9103:47;9167:108;9270:4;9261:6;9167:108;:::i;:::-;9159:116;;8909:373;;;;:::o;9288:117::-;9397:1;9394;9387:12;9411:117;9520:1;9517;9510:12;9534:117;9643:1;9640;9633:12;9674:568;9747:8;9757:6;9807:3;9800:4;9792:6;9788:17;9784:27;9774:122;;9815:79;;:::i;:::-;9774:122;9928:6;9915:20;9905:30;;9958:18;9950:6;9947:30;9944:117;;;9980:79;;:::i;:::-;9944:117;10094:4;10086:6;10082:17;10070:29;;10148:3;10140:4;10132:6;10128:17;10118:8;10114:32;10111:41;10108:128;;;10155:79;;:::i;:::-;10108:128;9674:568;;;;;:::o;10248:849::-;10352:6;10360;10368;10376;10425:2;10413:9;10404:7;10400:23;10396:32;10393:119;;;10431:79;;:::i;:::-;10393:119;10551:1;10576:53;10621:7;10612:6;10601:9;10597:22;10576:53;:::i;:::-;10566:63;;10522:117;10678:2;10704:53;10749:7;10740:6;10729:9;10725:22;10704:53;:::i;:::-;10694:63;;10649:118;10834:2;10823:9;10819:18;10806:32;10865:18;10857:6;10854:30;10851:117;;;10887:79;;:::i;:::-;10851:117;11000:80;11072:7;11063:6;11052:9;11048:22;11000:80;:::i;:::-;10982:98;;;;10777:313;10248:849;;;;;;;:::o;11103:117::-;11212:1;11209;11202:12;11226:180;11274:77;11271:1;11264:88;11371:4;11368:1;11361:15;11395:4;11392:1;11385:15;11412:281;11495:27;11517:4;11495:27;:::i;:::-;11487:6;11483:40;11625:6;11613:10;11610:22;11589:18;11577:10;11574:34;11571:62;11568:88;;;11636:18;;:::i;:::-;11568:88;11676:10;11672:2;11665:22;11455:238;11412:281;;:::o;11699:129::-;11733:6;11760:20;;:::i;:::-;11750:30;;11789:33;11817:4;11809:6;11789:33;:::i;:::-;11699:129;;;:::o;11834:308::-;11896:4;11986:18;11978:6;11975:30;11972:56;;;12008:18;;:::i;:::-;11972:56;12046:29;12068:6;12046:29;:::i;:::-;12038:37;;12130:4;12124;12120:15;12112:23;;11834:308;;;:::o;12148:154::-;12232:6;12227:3;12222;12209:30;12294:1;12285:6;12280:3;12276:16;12269:27;12148:154;;;:::o;12308:412::-;12386:5;12411:66;12427:49;12469:6;12427:49;:::i;:::-;12411:66;:::i;:::-;12402:75;;12500:6;12493:5;12486:21;12538:4;12531:5;12527:16;12576:3;12567:6;12562:3;12558:16;12555:25;12552:112;;;12583:79;;:::i;:::-;12552:112;12673:41;12707:6;12702:3;12697;12673:41;:::i;:::-;12392:328;12308:412;;;;;:::o;12740:340::-;12796:5;12845:3;12838:4;12830:6;12826:17;12822:27;12812:122;;12853:79;;:::i;:::-;12812:122;12970:6;12957:20;12995:79;13070:3;13062:6;13055:4;13047:6;13043:17;12995:79;:::i;:::-;12986:88;;12802:278;12740:340;;;;:::o;13086:509::-;13155:6;13204:2;13192:9;13183:7;13179:23;13175:32;13172:119;;;13210:79;;:::i;:::-;13172:119;13358:1;13347:9;13343:17;13330:31;13388:18;13380:6;13377:30;13374:117;;;13410:79;;:::i;:::-;13374:117;13515:63;13570:7;13561:6;13550:9;13546:22;13515:63;:::i;:::-;13505:73;;13301:287;13086:509;;;;:::o;13601:122::-;13674:24;13692:5;13674:24;:::i;:::-;13667:5;13664:35;13654:63;;13713:1;13710;13703:12;13654:63;13601:122;:::o;13729:139::-;13775:5;13813:6;13800:20;13791:29;;13829:33;13856:5;13829:33;:::i;:::-;13729:139;;;;:::o;13874:329::-;13933:6;13982:2;13970:9;13961:7;13957:23;13953:32;13950:119;;;13988:79;;:::i;:::-;13950:119;14108:1;14133:53;14178:7;14169:6;14158:9;14154:22;14133:53;:::i;:::-;14123:63;;14079:117;13874:329;;;;:::o;14209:468::-;14274:6;14282;14331:2;14319:9;14310:7;14306:23;14302:32;14299:119;;;14337:79;;:::i;:::-;14299:119;14457:1;14482:53;14527:7;14518:6;14507:9;14503:22;14482:53;:::i;:::-;14472:63;;14428:117;14584:2;14610:50;14652:7;14643:6;14632:9;14628:22;14610:50;:::i;:::-;14600:60;;14555:115;14209:468;;;;;:::o;14683:307::-;14744:4;14834:18;14826:6;14823:30;14820:56;;;14856:18;;:::i;:::-;14820:56;14894:29;14916:6;14894:29;:::i;:::-;14886:37;;14978:4;14972;14968:15;14960:23;;14683:307;;;:::o;14996:410::-;15073:5;15098:65;15114:48;15155:6;15114:48;:::i;:::-;15098:65;:::i;:::-;15089:74;;15186:6;15179:5;15172:21;15224:4;15217:5;15213:16;15262:3;15253:6;15248:3;15244:16;15241:25;15238:112;;;15269:79;;:::i;:::-;15238:112;15359:41;15393:6;15388:3;15383;15359:41;:::i;:::-;15079:327;14996:410;;;;;:::o;15425:338::-;15480:5;15529:3;15522:4;15514:6;15510:17;15506:27;15496:122;;15537:79;;:::i;:::-;15496:122;15654:6;15641:20;15679:78;15753:3;15745:6;15738:4;15730:6;15726:17;15679:78;:::i;:::-;15670:87;;15486:277;15425:338;;;;:::o;15769:943::-;15864:6;15872;15880;15888;15937:3;15925:9;15916:7;15912:23;15908:33;15905:120;;;15944:79;;:::i;:::-;15905:120;16064:1;16089:53;16134:7;16125:6;16114:9;16110:22;16089:53;:::i;:::-;16079:63;;16035:117;16191:2;16217:53;16262:7;16253:6;16242:9;16238:22;16217:53;:::i;:::-;16207:63;;16162:118;16319:2;16345:53;16390:7;16381:6;16370:9;16366:22;16345:53;:::i;:::-;16335:63;;16290:118;16475:2;16464:9;16460:18;16447:32;16506:18;16498:6;16495:30;16492:117;;;16528:79;;:::i;:::-;16492:117;16633:62;16687:7;16678:6;16667:9;16663:22;16633:62;:::i;:::-;16623:72;;16418:287;15769:943;;;;;;;:::o;16718:474::-;16786:6;16794;16843:2;16831:9;16822:7;16818:23;16814:32;16811:119;;;16849:79;;:::i;:::-;16811:119;16969:1;16994:53;17039:7;17030:6;17019:9;17015:22;16994:53;:::i;:::-;16984:63;;16940:117;17096:2;17122:53;17167:7;17158:6;17147:9;17143:22;17122:53;:::i;:::-;17112:63;;17067:118;16718:474;;;;;:::o;17198:182::-;17338:34;17334:1;17326:6;17322:14;17315:58;17198:182;:::o;17386:366::-;17528:3;17549:67;17613:2;17608:3;17549:67;:::i;:::-;17542:74;;17625:93;17714:3;17625:93;:::i;:::-;17743:2;17738:3;17734:12;17727:19;;17386:366;;;:::o;17758:419::-;17924:4;17962:2;17951:9;17947:18;17939:26;;18011:9;18005:4;18001:20;17997:1;17986:9;17982:17;17975:47;18039:131;18165:4;18039:131;:::i;:::-;18031:139;;17758:419;;;:::o;18183:180::-;18231:77;18228:1;18221:88;18328:4;18325:1;18318:15;18352:4;18349:1;18342:15;18369:320;18413:6;18450:1;18444:4;18440:12;18430:22;;18497:1;18491:4;18487:12;18518:18;18508:81;;18574:4;18566:6;18562:17;18552:27;;18508:81;18636:2;18628:6;18625:14;18605:18;18602:38;18599:84;;;18655:18;;:::i;:::-;18599:84;18420:269;18369:320;;;:::o;18695:231::-;18835:34;18831:1;18823:6;18819:14;18812:58;18904:14;18899:2;18891:6;18887:15;18880:39;18695:231;:::o;18932:366::-;19074:3;19095:67;19159:2;19154:3;19095:67;:::i;:::-;19088:74;;19171:93;19260:3;19171:93;:::i;:::-;19289:2;19284:3;19280:12;19273:19;;18932:366;;;:::o;19304:419::-;19470:4;19508:2;19497:9;19493:18;19485:26;;19557:9;19551:4;19547:20;19543:1;19532:9;19528:17;19521:47;19585:131;19711:4;19585:131;:::i;:::-;19577:139;;19304:419;;;:::o;19729:220::-;19869:34;19865:1;19857:6;19853:14;19846:58;19938:3;19933:2;19925:6;19921:15;19914:28;19729:220;:::o;19955:366::-;20097:3;20118:67;20182:2;20177:3;20118:67;:::i;:::-;20111:74;;20194:93;20283:3;20194:93;:::i;:::-;20312:2;20307:3;20303:12;20296:19;;19955:366;;;:::o;20327:419::-;20493:4;20531:2;20520:9;20516:18;20508:26;;20580:9;20574:4;20570:20;20566:1;20555:9;20551:17;20544:47;20608:131;20734:4;20608:131;:::i;:::-;20600:139;;20327:419;;;:::o;20752:243::-;20892:34;20888:1;20880:6;20876:14;20869:58;20961:26;20956:2;20948:6;20944:15;20937:51;20752:243;:::o;21001:366::-;21143:3;21164:67;21228:2;21223:3;21164:67;:::i;:::-;21157:74;;21240:93;21329:3;21240:93;:::i;:::-;21358:2;21353:3;21349:12;21342:19;;21001:366;;;:::o;21373:419::-;21539:4;21577:2;21566:9;21562:18;21554:26;;21626:9;21620:4;21616:20;21612:1;21601:9;21597:17;21590:47;21654:131;21780:4;21654:131;:::i;:::-;21646:139;;21373:419;;;:::o;21798:236::-;21938:34;21934:1;21926:6;21922:14;21915:58;22007:19;22002:2;21994:6;21990:15;21983:44;21798:236;:::o;22040:366::-;22182:3;22203:67;22267:2;22262:3;22203:67;:::i;:::-;22196:74;;22279:93;22368:3;22279:93;:::i;:::-;22397:2;22392:3;22388:12;22381:19;;22040:366;;;:::o;22412:419::-;22578:4;22616:2;22605:9;22601:18;22593:26;;22665:9;22659:4;22655:20;22651:1;22640:9;22636:17;22629:47;22693:131;22819:4;22693:131;:::i;:::-;22685:139;;22412:419;;;:::o;22837:230::-;22977:34;22973:1;22965:6;22961:14;22954:58;23046:13;23041:2;23033:6;23029:15;23022:38;22837:230;:::o;23073:366::-;23215:3;23236:67;23300:2;23295:3;23236:67;:::i;:::-;23229:74;;23312:93;23401:3;23312:93;:::i;:::-;23430:2;23425:3;23421:12;23414:19;;23073:366;;;:::o;23445:419::-;23611:4;23649:2;23638:9;23634:18;23626:26;;23698:9;23692:4;23688:20;23684:1;23673:9;23669:17;23662:47;23726:131;23852:4;23726:131;:::i;:::-;23718:139;;23445:419;;;:::o;23870:147::-;23971:11;24008:3;23993:18;;23870:147;;;;:::o;24023:114::-;;:::o;24143:398::-;24302:3;24323:83;24404:1;24399:3;24323:83;:::i;:::-;24316:90;;24415:93;24504:3;24415:93;:::i;:::-;24533:1;24528:3;24524:11;24517:18;;24143:398;;;:::o;24547:379::-;24731:3;24753:147;24896:3;24753:147;:::i;:::-;24746:154;;24917:3;24910:10;;24547:379;;;:::o;24932:180::-;24980:77;24977:1;24970:88;25077:4;25074:1;25067:15;25101:4;25098:1;25091:15;25118:180;25166:77;25163:1;25156:88;25263:4;25260:1;25253:15;25287:4;25284:1;25277:15;25304:233;25343:3;25366:24;25384:5;25366:24;:::i;:::-;25357:33;;25412:66;25405:5;25402:77;25399:103;;;25482:18;;:::i;:::-;25399:103;25529:1;25522:5;25518:13;25511:20;;25304:233;;;:::o;25543:305::-;25583:3;25602:20;25620:1;25602:20;:::i;:::-;25597:25;;25636:20;25654:1;25636:20;:::i;:::-;25631:25;;25790:1;25722:66;25718:74;25715:1;25712:81;25709:107;;;25796:18;;:::i;:::-;25709:107;25840:1;25837;25833:9;25826:16;;25543:305;;;;:::o;25854:94::-;25887:8;25935:5;25931:2;25927:14;25906:35;;25854:94;;;:::o;25954:::-;25993:7;26022:20;26036:5;26022:20;:::i;:::-;26011:31;;25954:94;;;:::o;26054:100::-;26093:7;26122:26;26142:5;26122:26;:::i;:::-;26111:37;;26054:100;;;:::o;26160:157::-;26265:45;26285:24;26303:5;26285:24;:::i;:::-;26265:45;:::i;:::-;26260:3;26253:58;26160:157;;:::o;26323:256::-;26435:3;26450:75;26521:3;26512:6;26450:75;:::i;:::-;26550:2;26545:3;26541:12;26534:19;;26570:3;26563:10;;26323:256;;;;:::o;26585:165::-;26725:17;26721:1;26713:6;26709:14;26702:41;26585:165;:::o;26756:366::-;26898:3;26919:67;26983:2;26978:3;26919:67;:::i;:::-;26912:74;;26995:93;27084:3;26995:93;:::i;:::-;27113:2;27108:3;27104:12;27097:19;;26756:366;;;:::o;27128:419::-;27294:4;27332:2;27321:9;27317:18;27309:26;;27381:9;27375:4;27371:20;27367:1;27356:9;27352:17;27345:47;27409:131;27535:4;27409:131;:::i;:::-;27401:139;;27128:419;;;:::o;27553:348::-;27593:7;27616:20;27634:1;27616:20;:::i;:::-;27611:25;;27650:20;27668:1;27650:20;:::i;:::-;27645:25;;27838:1;27770:66;27766:74;27763:1;27760:81;27755:1;27748:9;27741:17;27737:105;27734:131;;;27845:18;;:::i;:::-;27734:131;27893:1;27890;27886:9;27875:20;;27553:348;;;;:::o;27907:176::-;28047:28;28043:1;28035:6;28031:14;28024:52;27907:176;:::o;28089:366::-;28231:3;28252:67;28316:2;28311:3;28252:67;:::i;:::-;28245:74;;28328:93;28417:3;28328:93;:::i;:::-;28446:2;28441:3;28437:12;28430:19;;28089:366;;;:::o;28461:419::-;28627:4;28665:2;28654:9;28650:18;28642:26;;28714:9;28708:4;28704:20;28700:1;28689:9;28685:17;28678:47;28742:131;28868:4;28742:131;:::i;:::-;28734:139;;28461:419;;;:::o;28886:231::-;29026:34;29022:1;29014:6;29010:14;29003:58;29095:14;29090:2;29082:6;29078:15;29071:39;28886:231;:::o;29123:366::-;29265:3;29286:67;29350:2;29345:3;29286:67;:::i;:::-;29279:74;;29362:93;29451:3;29362:93;:::i;:::-;29480:2;29475:3;29471:12;29464:19;;29123:366;;;:::o;29495:419::-;29661:4;29699:2;29688:9;29684:18;29676:26;;29748:9;29742:4;29738:20;29734:1;29723:9;29719:17;29712:47;29776:131;29902:4;29776:131;:::i;:::-;29768:139;;29495:419;;;:::o;29920:228::-;30060:34;30056:1;30048:6;30044:14;30037:58;30129:11;30124:2;30116:6;30112:15;30105:36;29920:228;:::o;30154:366::-;30296:3;30317:67;30381:2;30376:3;30317:67;:::i;:::-;30310:74;;30393:93;30482:3;30393:93;:::i;:::-;30511:2;30506:3;30502:12;30495:19;;30154:366;;;:::o;30526:419::-;30692:4;30730:2;30719:9;30715:18;30707:26;;30779:9;30773:4;30769:20;30765:1;30754:9;30750:17;30743:47;30807:131;30933:4;30807:131;:::i;:::-;30799:139;;30526:419;;;:::o;30951:229::-;31091:34;31087:1;31079:6;31075:14;31068:58;31160:12;31155:2;31147:6;31143:15;31136:37;30951:229;:::o;31186:366::-;31328:3;31349:67;31413:2;31408:3;31349:67;:::i;:::-;31342:74;;31425:93;31514:3;31425:93;:::i;:::-;31543:2;31538:3;31534:12;31527:19;;31186:366;;;:::o;31558:419::-;31724:4;31762:2;31751:9;31747:18;31739:26;;31811:9;31805:4;31801:20;31797:1;31786:9;31782:17;31775:47;31839:131;31965:4;31839:131;:::i;:::-;31831:139;;31558:419;;;:::o;31983:175::-;32123:27;32119:1;32111:6;32107:14;32100:51;31983:175;:::o;32164:366::-;32306:3;32327:67;32391:2;32386:3;32327:67;:::i;:::-;32320:74;;32403:93;32492:3;32403:93;:::i;:::-;32521:2;32516:3;32512:12;32505:19;;32164:366;;;:::o;32536:419::-;32702:4;32740:2;32729:9;32725:18;32717:26;;32789:9;32783:4;32779:20;32775:1;32764:9;32760:17;32753:47;32817:131;32943:4;32817:131;:::i;:::-;32809:139;;32536:419;;;:::o;32961:234::-;33101:34;33097:1;33089:6;33085:14;33078:58;33170:17;33165:2;33157:6;33153:15;33146:42;32961:234;:::o;33201:366::-;33343:3;33364:67;33428:2;33423:3;33364:67;:::i;:::-;33357:74;;33440:93;33529:3;33440:93;:::i;:::-;33558:2;33553:3;33549:12;33542:19;;33201:366;;;:::o;33573:419::-;33739:4;33777:2;33766:9;33762:18;33754:26;;33826:9;33820:4;33816:20;33812:1;33801:9;33797:17;33790:47;33854:131;33980:4;33854:131;:::i;:::-;33846:139;;33573:419;;;:::o;33998:148::-;34100:11;34137:3;34122:18;;33998:148;;;;:::o;34152:377::-;34258:3;34286:39;34319:5;34286:39;:::i;:::-;34341:89;34423:6;34418:3;34341:89;:::i;:::-;34334:96;;34439:52;34484:6;34479:3;34472:4;34465:5;34461:16;34439:52;:::i;:::-;34516:6;34511:3;34507:16;34500:23;;34262:267;34152:377;;;;:::o;34535:141::-;34584:4;34607:3;34599:11;;34630:3;34627:1;34620:14;34664:4;34661:1;34651:18;34643:26;;34535:141;;;:::o;34706:845::-;34809:3;34846:5;34840:12;34875:36;34901:9;34875:36;:::i;:::-;34927:89;35009:6;35004:3;34927:89;:::i;:::-;34920:96;;35047:1;35036:9;35032:17;35063:1;35058:137;;;;35209:1;35204:341;;;;35025:520;;35058:137;35142:4;35138:9;35127;35123:25;35118:3;35111:38;35178:6;35173:3;35169:16;35162:23;;35058:137;;35204:341;35271:38;35303:5;35271:38;:::i;:::-;35331:1;35345:154;35359:6;35356:1;35353:13;35345:154;;;35433:7;35427:14;35423:1;35418:3;35414:11;35407:35;35483:1;35474:7;35470:15;35459:26;;35381:4;35378:1;35374:12;35369:17;;35345:154;;;35528:6;35523:3;35519:16;35512:23;;35211:334;;35025:520;;34813:738;;34706:845;;;;:::o;35557:589::-;35782:3;35804:95;35895:3;35886:6;35804:95;:::i;:::-;35797:102;;35916:95;36007:3;35998:6;35916:95;:::i;:::-;35909:102;;36028:92;36116:3;36107:6;36028:92;:::i;:::-;36021:99;;36137:3;36130:10;;35557:589;;;;;;:::o;36152:225::-;36292:34;36288:1;36280:6;36276:14;36269:58;36361:8;36356:2;36348:6;36344:15;36337:33;36152:225;:::o;36383:366::-;36525:3;36546:67;36610:2;36605:3;36546:67;:::i;:::-;36539:74;;36622:93;36711:3;36622:93;:::i;:::-;36740:2;36735:3;36731:12;36724:19;;36383:366;;;:::o;36755:419::-;36921:4;36959:2;36948:9;36944:18;36936:26;;37008:9;37002:4;36998:20;36994:1;36983:9;36979:17;36972:47;37036:131;37162:4;37036:131;:::i;:::-;37028:139;;36755:419;;;:::o;37180:231::-;37320:34;37316:1;37308:6;37304:14;37297:58;37389:14;37384:2;37376:6;37372:15;37365:39;37180:231;:::o;37417:366::-;37559:3;37580:67;37644:2;37639:3;37580:67;:::i;:::-;37573:74;;37656:93;37745:3;37656:93;:::i;:::-;37774:2;37769:3;37765:12;37758:19;;37417:366;;;:::o;37789:419::-;37955:4;37993:2;37982:9;37978:18;37970:26;;38042:9;38036:4;38032:20;38028:1;38017:9;38013:17;38006:47;38070:131;38196:4;38070:131;:::i;:::-;38062:139;;37789:419;;;:::o;38214:228::-;38354:34;38350:1;38342:6;38338:14;38331:58;38423:11;38418:2;38410:6;38406:15;38399:36;38214:228;:::o;38448:366::-;38590:3;38611:67;38675:2;38670:3;38611:67;:::i;:::-;38604:74;;38687:93;38776:3;38687:93;:::i;:::-;38805:2;38800:3;38796:12;38789:19;;38448:366;;;:::o;38820:419::-;38986:4;39024:2;39013:9;39009:18;39001:26;;39073:9;39067:4;39063:20;39059:1;39048:9;39044:17;39037:47;39101:131;39227:4;39101:131;:::i;:::-;39093:139;;38820:419;;;:::o;39245:223::-;39385:34;39381:1;39373:6;39369:14;39362:58;39454:6;39449:2;39441:6;39437:15;39430:31;39245:223;:::o;39474:366::-;39616:3;39637:67;39701:2;39696:3;39637:67;:::i;:::-;39630:74;;39713:93;39802:3;39713:93;:::i;:::-;39831:2;39826:3;39822:12;39815:19;;39474:366;;;:::o;39846:419::-;40012:4;40050:2;40039:9;40035:18;40027:26;;40099:9;40093:4;40089:20;40085:1;40074:9;40070:17;40063:47;40127:131;40253:4;40127:131;:::i;:::-;40119:139;;39846:419;;;:::o;40271:191::-;40311:4;40331:20;40349:1;40331:20;:::i;:::-;40326:25;;40365:20;40383:1;40365:20;:::i;:::-;40360:25;;40404:1;40401;40398:8;40395:34;;;40409:18;;:::i;:::-;40395:34;40454:1;40451;40447:9;40439:17;;40271:191;;;;:::o;40468:237::-;40608:34;40604:1;40596:6;40592:14;40585:58;40677:20;40672:2;40664:6;40660:15;40653:45;40468:237;:::o;40711:366::-;40853:3;40874:67;40938:2;40933:3;40874:67;:::i;:::-;40867:74;;40950:93;41039:3;40950:93;:::i;:::-;41068:2;41063:3;41059:12;41052:19;;40711:366;;;:::o;41083:419::-;41249:4;41287:2;41276:9;41272:18;41264:26;;41336:9;41330:4;41326:20;41322:1;41311:9;41307:17;41300:47;41364:131;41490:4;41364:131;:::i;:::-;41356:139;;41083:419;;;:::o;41508:180::-;41556:77;41553:1;41546:88;41653:4;41650:1;41643:15;41677:4;41674:1;41667:15;41694:185;41734:1;41751:20;41769:1;41751:20;:::i;:::-;41746:25;;41785:20;41803:1;41785:20;:::i;:::-;41780:25;;41824:1;41814:35;;41829:18;;:::i;:::-;41814:35;41871:1;41868;41864:9;41859:14;;41694:185;;;;:::o;41885:176::-;41917:1;41934:20;41952:1;41934:20;:::i;:::-;41929:25;;41968:20;41986:1;41968:20;:::i;:::-;41963:25;;42007:1;41997:35;;42012:18;;:::i;:::-;41997:35;42053:1;42050;42046:9;42041:14;;41885:176;;;;:::o;42067:98::-;42118:6;42152:5;42146:12;42136:22;;42067:98;;;:::o;42171:168::-;42254:11;42288:6;42283:3;42276:19;42328:4;42323:3;42319:14;42304:29;;42171:168;;;;:::o;42345:360::-;42431:3;42459:38;42491:5;42459:38;:::i;:::-;42513:70;42576:6;42571:3;42513:70;:::i;:::-;42506:77;;42592:52;42637:6;42632:3;42625:4;42618:5;42614:16;42592:52;:::i;:::-;42669:29;42691:6;42669:29;:::i;:::-;42664:3;42660:39;42653:46;;42435:270;42345:360;;;;:::o;42711:640::-;42906:4;42944:3;42933:9;42929:19;42921:27;;42958:71;43026:1;43015:9;43011:17;43002:6;42958:71;:::i;:::-;43039:72;43107:2;43096:9;43092:18;43083:6;43039:72;:::i;:::-;43121;43189:2;43178:9;43174:18;43165:6;43121:72;:::i;:::-;43240:9;43234:4;43230:20;43225:2;43214:9;43210:18;43203:48;43268:76;43339:4;43330:6;43268:76;:::i;:::-;43260:84;;42711:640;;;;;;;:::o;43357:141::-;43413:5;43444:6;43438:13;43429:22;;43460:32;43486:5;43460:32;:::i;:::-;43357:141;;;;:::o;43504:349::-;43573:6;43622:2;43610:9;43601:7;43597:23;43593:32;43590:119;;;43628:79;;:::i;:::-;43590:119;43748:1;43773:63;43828:7;43819:6;43808:9;43804:22;43773:63;:::i;:::-;43763:73;;43719:127;43504:349;;;;:::o;43859:180::-;43907:77;43904:1;43897:88;44004:4;44001:1;43994:15;44028:4;44025:1;44018:15;44045:182;44185:34;44181:1;44173:6;44169:14;44162:58;44045:182;:::o;44233:366::-;44375:3;44396:67;44460:2;44455:3;44396:67;:::i;:::-;44389:74;;44472:93;44561:3;44472:93;:::i;:::-;44590:2;44585:3;44581:12;44574:19;;44233:366;;;:::o;44605:419::-;44771:4;44809:2;44798:9;44794:18;44786:26;;44858:9;44852:4;44848:20;44844:1;44833:9;44829:17;44822:47;44886:131;45012:4;44886:131;:::i;:::-;44878:139;;44605:419;;;:::o;45030:178::-;45170:30;45166:1;45158:6;45154:14;45147:54;45030:178;:::o;45214:366::-;45356:3;45377:67;45441:2;45436:3;45377:67;:::i;:::-;45370:74;;45453:93;45542:3;45453:93;:::i;:::-;45571:2;45566:3;45562:12;45555:19;;45214:366;;;:::o;45586:419::-;45752:4;45790:2;45779:9;45775:18;45767:26;;45839:9;45833:4;45829:20;45825:1;45814:9;45810:17;45803:47;45867:131;45993:4;45867:131;:::i;:::-;45859:139;;45586:419;;;:::o

Swarm Source

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