ETH Price: $3,864.87 (-0.85%)
Gas: 5.68 Gwei

Token

GURU Season Pass NFT (SeasonPass)
 

Overview

Max Total Supply

12,705 SeasonPass

Holders

12,374

Market

Volume (24H)

0.0025 ETH

Min Price (24H)

$9.66 @ 0.002500 ETH

Max Price (24H)

$9.66 @ 0.002500 ETH
Filtered by Token Holder
charalux.eth
Balance
1 SeasonPass
0x9cc20ecf4e944f34bdc670b8e7412b818fc91866
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:
DEXGuruPreDAONFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_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);

        _afterTokenTransfer(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);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        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);

        _afterTokenTransfer(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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
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 Returns the rebuilt hash obtained by traversing a Merklee 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++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// File: contracts/DEXGuruPreDAONFT.sol


pragma solidity ^0.8.7;



contract DEXGuruPreDAONFT is ERC721Enumerable {
    using Strings for uint256;
    using MerkleProof for bytes32[];

    /*
	 * Private Variables
     */               
    uint256 private constant MINTING_START_TIME = 1648656000;      // 03/30/2022 @ 9:00am (PST)
    uint256 private constant MINTING_END_TIME = 1648828800;     // 04/01/2022 @ 9:00am (PST)
    uint256 private constant NFT_PER_ADDRESS_LIMIT = 1;
    bytes32 private constant MERKLE_ROOT = 0x5e415461ec43bd5b7f1cf388e448ad2af72a11d9dc824967ab3c2b5a8e6f587b;

    string public baseURI;
    /*
	 * Public Variables
	 */
    mapping(address => uint256) public addressMintedBalance;

	/*
	 * Constructor
	 */
    constructor(
    ) ERC721('GURU Season Pass NFT', 'SeasonPass') {}

    /**
     * @dev Base URI for computing {tokenURI}. The resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Overriddes ERC721 implementation.
     */
    function _baseURI() internal view virtual override returns (string memory) {
        return "https://api.dex.guru/v1/assets/nft/pre-dao/";
    }


    /// Mint NFT with checking against whitelist
    /// @dev fn called externally, to verify account(msg.sender) eligibility/Mint/Check if max NFTs per account minted
	/// @param merkleProof Merkle proof
    function mint(bytes32[] memory merkleProof) public payable {
        uint256 supply = totalSupply();
        require(block.timestamp >= MINTING_START_TIME && block.timestamp <= MINTING_END_TIME);
        bool isUserWhitelisted = checkWhitelistUser(msg.sender, merkleProof);
        if (isUserWhitelisted) {
            uint256 ownerMintedCount = addressMintedBalance[msg.sender];
            require(ownerMintedCount + 1 <= NFT_PER_ADDRESS_LIMIT, "max NFT mints per account exceeded");
            _safeMint(msg.sender, supply + 1);
            addressMintedBalance[msg.sender]++;
        } else {
            revert("account is not eligable for minting");
        }
    }

    /// Check if account is able to Mint
	/// @dev fn called internaly and externally, to verify account eligibility to Mint
	/// @param account number of tokens to claim in transaction
	/// @param merkleProof Merkle proof
    function checkWhitelistUser(address account, bytes32[] memory merkleProof) public pure returns (bool) {
        if (merkleProof.length != 0) {
            bytes32 leaf = keccak256(abi.encodePacked(account));
            if (merkleProof.verify(MERKLE_ROOT, leaf) == true) {
                return true;
            }
        }
        return false;
    }
} // End of Contract

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"checkWhitelistUser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"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"}]

60806040523480156200001157600080fd5b506040518060400160405280601481526020017f4755525520536561736f6e2050617373204e46540000000000000000000000008152506040518060400160405280600a81526020017f536561736f6e5061737300000000000000000000000000000000000000000000815250816000908051906020019062000096929190620000b8565b508060019080519060200190620000af929190620000b8565b505050620001cd565b828054620000c69062000168565b90600052602060002090601f016020900481019282620000ea576000855562000136565b82601f106200010557805160ff191683800117855562000136565b8280016001018555821562000136579182015b828111156200013557825182559160200191906001019062000118565b5b50905062000145919062000149565b5090565b5b80821115620001645760008160009055506001016200014a565b5090565b600060028204905060018216806200018157607f821691505b602082108114156200019857620001976200019e565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61374580620001dd6000396000f3fe60806040526004361061011f5760003560e01c80634f6ccce7116100a0578063a22cb46511610064578063a22cb46514610433578063b77a147b1461045c578063b88d4fde14610478578063c87b56dd146104a1578063e985e9c5146104de5761011f565b80634f6ccce7146103265780636352211e146103635780636c0360eb146103a057806370a08231146103cb57806395d89b41146104085761011f565b806318160ddd116100e757806318160ddd1461022f57806318cae2691461025a57806323b872dd146102975780632f745c59146102c057806342842e0e146102fd5761011f565b806301ffc9a71461012457806306fdde0314610161578063081812fc1461018c578063095ea7b3146101c957806315fe554e146101f2575b600080fd5b34801561013057600080fd5b5061014b600480360381019061014691906125a1565b61051b565b6040516101589190612a2b565b60405180910390f35b34801561016d57600080fd5b50610176610595565b6040516101839190612a46565b60405180910390f35b34801561019857600080fd5b506101b360048036038101906101ae91906125fb565b610627565b6040516101c091906129c4565b60405180910390f35b3480156101d557600080fd5b506101f060048036038101906101eb9190612518565b6106ac565b005b3480156101fe57600080fd5b506102196004803603810190610214919061247c565b6107c4565b6040516102269190612a2b565b60405180910390f35b34801561023b57600080fd5b50610244610854565b6040516102519190612ca8565b60405180910390f35b34801561026657600080fd5b50610281600480360381019061027c9190612339565b610861565b60405161028e9190612ca8565b60405180910390f35b3480156102a357600080fd5b506102be60048036038101906102b991906123a6565b610879565b005b3480156102cc57600080fd5b506102e760048036038101906102e29190612518565b6108d9565b6040516102f49190612ca8565b60405180910390f35b34801561030957600080fd5b50610324600480360381019061031f91906123a6565b61097e565b005b34801561033257600080fd5b5061034d600480360381019061034891906125fb565b61099e565b60405161035a9190612ca8565b60405180910390f35b34801561036f57600080fd5b5061038a600480360381019061038591906125fb565b610a0f565b60405161039791906129c4565b60405180910390f35b3480156103ac57600080fd5b506103b5610ac1565b6040516103c29190612a46565b60405180910390f35b3480156103d757600080fd5b506103f260048036038101906103ed9190612339565b610b4f565b6040516103ff9190612ca8565b60405180910390f35b34801561041457600080fd5b5061041d610c07565b60405161042a9190612a46565b60405180910390f35b34801561043f57600080fd5b5061045a600480360381019061045591906124d8565b610c99565b005b61047660048036038101906104719190612558565b610caf565b005b34801561048457600080fd5b5061049f600480360381019061049a91906123f9565b610e34565b005b3480156104ad57600080fd5b506104c860048036038101906104c391906125fb565b610e96565b6040516104d59190612a46565b60405180910390f35b3480156104ea57600080fd5b5061050560048036038101906105009190612366565b610f3d565b6040516105129190612a2b565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061058e575061058d82610fd1565b5b9050919050565b6060600080546105a490612f03565b80601f01602080910402602001604051908101604052809291908181526020018280546105d090612f03565b801561061d5780601f106105f25761010080835404028352916020019161061d565b820191906000526020600020905b81548152906001019060200180831161060057829003601f168201915b5050505050905090565b6000610632826110b3565b610671576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066890612c08565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106b782610a0f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071f90612c48565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661074761111f565b73ffffffffffffffffffffffffffffffffffffffff16148061077657506107758161077061111f565b610f3d565b5b6107b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ac90612b88565b60405180910390fd5b6107bf8383611127565b505050565b600080825114610849576000836040516020016107e19190612985565b604051602081830303815290604052805190602001209050600115156108357f5e415461ec43bd5b7f1cf388e448ad2af72a11d9dc824967ab3c2b5a8e6f587b60001b83866111e09092919063ffffffff16565b1515141561084757600191505061084e565b505b600090505b92915050565b6000600880549050905090565b600b6020528060005260406000206000915090505481565b61088a61088461111f565b826111f7565b6108c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c090612c68565b60405180910390fd5b6108d48383836112d5565b505050565b60006108e483610b4f565b8210610925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091c90612a68565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61099983838360405180602001604052806000815250610e34565b505050565b60006109a8610854565b82106109e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e090612c88565b60405180910390fd5b600882815481106109fd576109fc6130c0565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ab8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aaf90612bc8565b60405180910390fd5b80915050919050565b600a8054610ace90612f03565b80601f0160208091040260200160405190810160405280929190818152602001828054610afa90612f03565b8015610b475780601f10610b1c57610100808354040283529160200191610b47565b820191906000526020600020905b815481529060010190602001808311610b2a57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb790612ba8565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606060018054610c1690612f03565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4290612f03565b8015610c8f5780601f10610c6457610100808354040283529160200191610c8f565b820191906000526020600020905b815481529060010190602001808311610c7257829003601f168201915b5050505050905090565b610cab610ca461111f565b838361153c565b5050565b6000610cb9610854565b90506362447e804210158015610cd3575063624721804211155b610cdc57600080fd5b6000610ce833846107c4565b90508015610df4576000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060018082610d429190612d88565b1115610d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7a90612ac8565b60405180910390fd5b610d9933600185610d949190612d88565b6116a9565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610de990612f66565b919050555050610e2f565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2690612b68565b60405180910390fd5b505050565b610e45610e3f61111f565b836111f7565b610e84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7b90612c68565b60405180910390fd5b610e90848484846116c7565b50505050565b6060610ea1826110b3565b610ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed790612c28565b60405180910390fd5b6000610eea611723565b90506000815111610f0a5760405180602001604052806000815250610f35565b80610f1484611743565b604051602001610f259291906129a0565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061109c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806110ac57506110ab826118a4565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661119a83610a0f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000826111ed858461190e565b1490509392505050565b6000611202826110b3565b611241576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123890612b48565b60405180910390fd5b600061124c83610a0f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806112bb57508373ffffffffffffffffffffffffffffffffffffffff166112a384610627565b73ffffffffffffffffffffffffffffffffffffffff16145b806112cc57506112cb8185610f3d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166112f582610a0f565b73ffffffffffffffffffffffffffffffffffffffff161461134b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134290612aa8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b290612b08565b60405180910390fd5b6113c6838383611983565b6113d1600082611127565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114219190612e0f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114789190612d88565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611537838383611a97565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156115ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a290612b28565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161169c9190612a2b565b60405180910390a3505050565b6116c3828260405180602001604052806000815250611a9c565b5050565b6116d28484846112d5565b6116de84848484611af7565b61171d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171490612a88565b60405180910390fd5b50505050565b60606040518060600160405280602b81526020016136e5602b9139905090565b6060600082141561178b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061189f565b600082905060005b600082146117bd5780806117a690612f66565b915050600a826117b69190612dde565b9150611793565b60008167ffffffffffffffff8111156117d9576117d86130ef565b5b6040519080825280601f01601f19166020018201604052801561180b5781602001600182028036833780820191505090505b5090505b60008514611898576001826118249190612e0f565b9150600a856118339190612fd3565b603061183f9190612d88565b60f81b818381518110611855576118546130c0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856118919190612dde565b945061180f565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008082905060005b8451811015611978576000858281518110611935576119346130c0565b5b60200260200101519050808311611957576119508382611c8e565b9250611964565b6119618184611c8e565b92505b50808061197090612f66565b915050611917565b508091505092915050565b61198e838383611ca5565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156119d1576119cc81611caa565b611a10565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611a0f57611a0e8382611cf3565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a5357611a4e81611e60565b611a92565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611a9157611a908282611f31565b5b5b505050565b505050565b611aa68383611fb0565b611ab36000848484611af7565b611af2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae990612a88565b60405180910390fd5b505050565b6000611b188473ffffffffffffffffffffffffffffffffffffffff1661218a565b15611c81578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b4161111f565b8786866040518563ffffffff1660e01b8152600401611b6394939291906129df565b602060405180830381600087803b158015611b7d57600080fd5b505af1925050508015611bae57506040513d601f19601f82011682018060405250810190611bab91906125ce565b60015b611c31573d8060008114611bde576040519150601f19603f3d011682016040523d82523d6000602084013e611be3565b606091505b50600081511415611c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2090612a88565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611c86565b600190505b949350505050565b600082600052816020526040600020905092915050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001611d0084610b4f565b611d0a9190612e0f565b9050600060076000848152602001908152602001600020549050818114611def576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050611e749190612e0f565b9050600060096000848152602001908152602001600020549050600060088381548110611ea457611ea36130c0565b5b906000526020600020015490508060088381548110611ec657611ec56130c0565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480611f1557611f14613091565b5b6001900381819060005260206000200160009055905550505050565b6000611f3c83610b4f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612020576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201790612be8565b60405180910390fd5b612029816110b3565b15612069576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206090612ae8565b60405180910390fd5b61207560008383611983565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120c59190612d88565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461218660008383611a97565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60006121c06121bb84612ce8565b612cc3565b905080838252602082019050828560208602820111156121e3576121e2613123565b5b60005b8581101561221357816121f988826122b7565b8452602084019350602083019250506001810190506121e6565b5050509392505050565b600061223061222b84612d14565b612cc3565b90508281526020810184848401111561224c5761224b613128565b5b612257848285612ec1565b509392505050565b60008135905061226e81613671565b92915050565b600082601f8301126122895761228861311e565b5b81356122998482602086016121ad565b91505092915050565b6000813590506122b181613688565b92915050565b6000813590506122c68161369f565b92915050565b6000813590506122db816136b6565b92915050565b6000815190506122f0816136b6565b92915050565b600082601f83011261230b5761230a61311e565b5b813561231b84826020860161221d565b91505092915050565b600081359050612333816136cd565b92915050565b60006020828403121561234f5761234e613132565b5b600061235d8482850161225f565b91505092915050565b6000806040838503121561237d5761237c613132565b5b600061238b8582860161225f565b925050602061239c8582860161225f565b9150509250929050565b6000806000606084860312156123bf576123be613132565b5b60006123cd8682870161225f565b93505060206123de8682870161225f565b92505060406123ef86828701612324565b9150509250925092565b6000806000806080858703121561241357612412613132565b5b60006124218782880161225f565b94505060206124328782880161225f565b935050604061244387828801612324565b925050606085013567ffffffffffffffff8111156124645761246361312d565b5b612470878288016122f6565b91505092959194509250565b6000806040838503121561249357612492613132565b5b60006124a18582860161225f565b925050602083013567ffffffffffffffff8111156124c2576124c161312d565b5b6124ce85828601612274565b9150509250929050565b600080604083850312156124ef576124ee613132565b5b60006124fd8582860161225f565b925050602061250e858286016122a2565b9150509250929050565b6000806040838503121561252f5761252e613132565b5b600061253d8582860161225f565b925050602061254e85828601612324565b9150509250929050565b60006020828403121561256e5761256d613132565b5b600082013567ffffffffffffffff81111561258c5761258b61312d565b5b61259884828501612274565b91505092915050565b6000602082840312156125b7576125b6613132565b5b60006125c5848285016122cc565b91505092915050565b6000602082840312156125e4576125e3613132565b5b60006125f2848285016122e1565b91505092915050565b60006020828403121561261157612610613132565b5b600061261f84828501612324565b91505092915050565b61263181612e43565b82525050565b61264861264382612e43565b612faf565b82525050565b61265781612e55565b82525050565b600061266882612d45565b6126728185612d5b565b9350612682818560208601612ed0565b61268b81613137565b840191505092915050565b60006126a182612d50565b6126ab8185612d6c565b93506126bb818560208601612ed0565b6126c481613137565b840191505092915050565b60006126da82612d50565b6126e48185612d7d565b93506126f4818560208601612ed0565b80840191505092915050565b600061270d602b83612d6c565b915061271882613155565b604082019050919050565b6000612730603283612d6c565b915061273b826131a4565b604082019050919050565b6000612753602583612d6c565b915061275e826131f3565b604082019050919050565b6000612776602283612d6c565b915061278182613242565b604082019050919050565b6000612799601c83612d6c565b91506127a482613291565b602082019050919050565b60006127bc602483612d6c565b91506127c7826132ba565b604082019050919050565b60006127df601983612d6c565b91506127ea82613309565b602082019050919050565b6000612802602c83612d6c565b915061280d82613332565b604082019050919050565b6000612825602383612d6c565b915061283082613381565b604082019050919050565b6000612848603883612d6c565b9150612853826133d0565b604082019050919050565b600061286b602a83612d6c565b91506128768261341f565b604082019050919050565b600061288e602983612d6c565b91506128998261346e565b604082019050919050565b60006128b1602083612d6c565b91506128bc826134bd565b602082019050919050565b60006128d4602c83612d6c565b91506128df826134e6565b604082019050919050565b60006128f7602f83612d6c565b915061290282613535565b604082019050919050565b600061291a602183612d6c565b915061292582613584565b604082019050919050565b600061293d603183612d6c565b9150612948826135d3565b604082019050919050565b6000612960602c83612d6c565b915061296b82613622565b604082019050919050565b61297f81612eb7565b82525050565b60006129918284612637565b60148201915081905092915050565b60006129ac82856126cf565b91506129b882846126cf565b91508190509392505050565b60006020820190506129d96000830184612628565b92915050565b60006080820190506129f46000830187612628565b612a016020830186612628565b612a0e6040830185612976565b8181036060830152612a20818461265d565b905095945050505050565b6000602082019050612a40600083018461264e565b92915050565b60006020820190508181036000830152612a608184612696565b905092915050565b60006020820190508181036000830152612a8181612700565b9050919050565b60006020820190508181036000830152612aa181612723565b9050919050565b60006020820190508181036000830152612ac181612746565b9050919050565b60006020820190508181036000830152612ae181612769565b9050919050565b60006020820190508181036000830152612b018161278c565b9050919050565b60006020820190508181036000830152612b21816127af565b9050919050565b60006020820190508181036000830152612b41816127d2565b9050919050565b60006020820190508181036000830152612b61816127f5565b9050919050565b60006020820190508181036000830152612b8181612818565b9050919050565b60006020820190508181036000830152612ba18161283b565b9050919050565b60006020820190508181036000830152612bc18161285e565b9050919050565b60006020820190508181036000830152612be181612881565b9050919050565b60006020820190508181036000830152612c01816128a4565b9050919050565b60006020820190508181036000830152612c21816128c7565b9050919050565b60006020820190508181036000830152612c41816128ea565b9050919050565b60006020820190508181036000830152612c618161290d565b9050919050565b60006020820190508181036000830152612c8181612930565b9050919050565b60006020820190508181036000830152612ca181612953565b9050919050565b6000602082019050612cbd6000830184612976565b92915050565b6000612ccd612cde565b9050612cd98282612f35565b919050565b6000604051905090565b600067ffffffffffffffff821115612d0357612d026130ef565b5b602082029050602081019050919050565b600067ffffffffffffffff821115612d2f57612d2e6130ef565b5b612d3882613137565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612d9382612eb7565b9150612d9e83612eb7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612dd357612dd2613004565b5b828201905092915050565b6000612de982612eb7565b9150612df483612eb7565b925082612e0457612e03613033565b5b828204905092915050565b6000612e1a82612eb7565b9150612e2583612eb7565b925082821015612e3857612e37613004565b5b828203905092915050565b6000612e4e82612e97565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612eee578082015181840152602081019050612ed3565b83811115612efd576000848401525b50505050565b60006002820490506001821680612f1b57607f821691505b60208210811415612f2f57612f2e613062565b5b50919050565b612f3e82613137565b810181811067ffffffffffffffff82111715612f5d57612f5c6130ef565b5b80604052505050565b6000612f7182612eb7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612fa457612fa3613004565b5b600182019050919050565b6000612fba82612fc1565b9050919050565b6000612fcc82613148565b9050919050565b6000612fde82612eb7565b9150612fe983612eb7565b925082612ff957612ff8613033565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f6d6178204e4654206d696e747320706572206163636f756e742065786365656460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f6163636f756e74206973206e6f7420656c696761626c6520666f72206d696e7460008201527f696e670000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61367a81612e43565b811461368557600080fd5b50565b61369181612e55565b811461369c57600080fd5b50565b6136a881612e61565b81146136b357600080fd5b50565b6136bf81612e6b565b81146136ca57600080fd5b50565b6136d681612eb7565b81146136e157600080fd5b5056fe68747470733a2f2f6170692e6465782e677572752f76312f6173736574732f6e66742f7072652d64616f2fa2646970667358221220e510e8527042419903eba3abc5042606a0b534294f56ba0fa3bb1e571702eec464736f6c63430008070033

Deployed Bytecode

0x60806040526004361061011f5760003560e01c80634f6ccce7116100a0578063a22cb46511610064578063a22cb46514610433578063b77a147b1461045c578063b88d4fde14610478578063c87b56dd146104a1578063e985e9c5146104de5761011f565b80634f6ccce7146103265780636352211e146103635780636c0360eb146103a057806370a08231146103cb57806395d89b41146104085761011f565b806318160ddd116100e757806318160ddd1461022f57806318cae2691461025a57806323b872dd146102975780632f745c59146102c057806342842e0e146102fd5761011f565b806301ffc9a71461012457806306fdde0314610161578063081812fc1461018c578063095ea7b3146101c957806315fe554e146101f2575b600080fd5b34801561013057600080fd5b5061014b600480360381019061014691906125a1565b61051b565b6040516101589190612a2b565b60405180910390f35b34801561016d57600080fd5b50610176610595565b6040516101839190612a46565b60405180910390f35b34801561019857600080fd5b506101b360048036038101906101ae91906125fb565b610627565b6040516101c091906129c4565b60405180910390f35b3480156101d557600080fd5b506101f060048036038101906101eb9190612518565b6106ac565b005b3480156101fe57600080fd5b506102196004803603810190610214919061247c565b6107c4565b6040516102269190612a2b565b60405180910390f35b34801561023b57600080fd5b50610244610854565b6040516102519190612ca8565b60405180910390f35b34801561026657600080fd5b50610281600480360381019061027c9190612339565b610861565b60405161028e9190612ca8565b60405180910390f35b3480156102a357600080fd5b506102be60048036038101906102b991906123a6565b610879565b005b3480156102cc57600080fd5b506102e760048036038101906102e29190612518565b6108d9565b6040516102f49190612ca8565b60405180910390f35b34801561030957600080fd5b50610324600480360381019061031f91906123a6565b61097e565b005b34801561033257600080fd5b5061034d600480360381019061034891906125fb565b61099e565b60405161035a9190612ca8565b60405180910390f35b34801561036f57600080fd5b5061038a600480360381019061038591906125fb565b610a0f565b60405161039791906129c4565b60405180910390f35b3480156103ac57600080fd5b506103b5610ac1565b6040516103c29190612a46565b60405180910390f35b3480156103d757600080fd5b506103f260048036038101906103ed9190612339565b610b4f565b6040516103ff9190612ca8565b60405180910390f35b34801561041457600080fd5b5061041d610c07565b60405161042a9190612a46565b60405180910390f35b34801561043f57600080fd5b5061045a600480360381019061045591906124d8565b610c99565b005b61047660048036038101906104719190612558565b610caf565b005b34801561048457600080fd5b5061049f600480360381019061049a91906123f9565b610e34565b005b3480156104ad57600080fd5b506104c860048036038101906104c391906125fb565b610e96565b6040516104d59190612a46565b60405180910390f35b3480156104ea57600080fd5b5061050560048036038101906105009190612366565b610f3d565b6040516105129190612a2b565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061058e575061058d82610fd1565b5b9050919050565b6060600080546105a490612f03565b80601f01602080910402602001604051908101604052809291908181526020018280546105d090612f03565b801561061d5780601f106105f25761010080835404028352916020019161061d565b820191906000526020600020905b81548152906001019060200180831161060057829003601f168201915b5050505050905090565b6000610632826110b3565b610671576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066890612c08565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106b782610a0f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071f90612c48565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661074761111f565b73ffffffffffffffffffffffffffffffffffffffff16148061077657506107758161077061111f565b610f3d565b5b6107b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ac90612b88565b60405180910390fd5b6107bf8383611127565b505050565b600080825114610849576000836040516020016107e19190612985565b604051602081830303815290604052805190602001209050600115156108357f5e415461ec43bd5b7f1cf388e448ad2af72a11d9dc824967ab3c2b5a8e6f587b60001b83866111e09092919063ffffffff16565b1515141561084757600191505061084e565b505b600090505b92915050565b6000600880549050905090565b600b6020528060005260406000206000915090505481565b61088a61088461111f565b826111f7565b6108c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c090612c68565b60405180910390fd5b6108d48383836112d5565b505050565b60006108e483610b4f565b8210610925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091c90612a68565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61099983838360405180602001604052806000815250610e34565b505050565b60006109a8610854565b82106109e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e090612c88565b60405180910390fd5b600882815481106109fd576109fc6130c0565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ab8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aaf90612bc8565b60405180910390fd5b80915050919050565b600a8054610ace90612f03565b80601f0160208091040260200160405190810160405280929190818152602001828054610afa90612f03565b8015610b475780601f10610b1c57610100808354040283529160200191610b47565b820191906000526020600020905b815481529060010190602001808311610b2a57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb790612ba8565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606060018054610c1690612f03565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4290612f03565b8015610c8f5780601f10610c6457610100808354040283529160200191610c8f565b820191906000526020600020905b815481529060010190602001808311610c7257829003601f168201915b5050505050905090565b610cab610ca461111f565b838361153c565b5050565b6000610cb9610854565b90506362447e804210158015610cd3575063624721804211155b610cdc57600080fd5b6000610ce833846107c4565b90508015610df4576000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060018082610d429190612d88565b1115610d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7a90612ac8565b60405180910390fd5b610d9933600185610d949190612d88565b6116a9565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610de990612f66565b919050555050610e2f565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2690612b68565b60405180910390fd5b505050565b610e45610e3f61111f565b836111f7565b610e84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7b90612c68565b60405180910390fd5b610e90848484846116c7565b50505050565b6060610ea1826110b3565b610ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed790612c28565b60405180910390fd5b6000610eea611723565b90506000815111610f0a5760405180602001604052806000815250610f35565b80610f1484611743565b604051602001610f259291906129a0565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061109c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806110ac57506110ab826118a4565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661119a83610a0f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000826111ed858461190e565b1490509392505050565b6000611202826110b3565b611241576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123890612b48565b60405180910390fd5b600061124c83610a0f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806112bb57508373ffffffffffffffffffffffffffffffffffffffff166112a384610627565b73ffffffffffffffffffffffffffffffffffffffff16145b806112cc57506112cb8185610f3d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166112f582610a0f565b73ffffffffffffffffffffffffffffffffffffffff161461134b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134290612aa8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b290612b08565b60405180910390fd5b6113c6838383611983565b6113d1600082611127565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114219190612e0f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114789190612d88565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611537838383611a97565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156115ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a290612b28565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161169c9190612a2b565b60405180910390a3505050565b6116c3828260405180602001604052806000815250611a9c565b5050565b6116d28484846112d5565b6116de84848484611af7565b61171d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171490612a88565b60405180910390fd5b50505050565b60606040518060600160405280602b81526020016136e5602b9139905090565b6060600082141561178b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061189f565b600082905060005b600082146117bd5780806117a690612f66565b915050600a826117b69190612dde565b9150611793565b60008167ffffffffffffffff8111156117d9576117d86130ef565b5b6040519080825280601f01601f19166020018201604052801561180b5781602001600182028036833780820191505090505b5090505b60008514611898576001826118249190612e0f565b9150600a856118339190612fd3565b603061183f9190612d88565b60f81b818381518110611855576118546130c0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856118919190612dde565b945061180f565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008082905060005b8451811015611978576000858281518110611935576119346130c0565b5b60200260200101519050808311611957576119508382611c8e565b9250611964565b6119618184611c8e565b92505b50808061197090612f66565b915050611917565b508091505092915050565b61198e838383611ca5565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156119d1576119cc81611caa565b611a10565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611a0f57611a0e8382611cf3565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a5357611a4e81611e60565b611a92565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611a9157611a908282611f31565b5b5b505050565b505050565b611aa68383611fb0565b611ab36000848484611af7565b611af2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae990612a88565b60405180910390fd5b505050565b6000611b188473ffffffffffffffffffffffffffffffffffffffff1661218a565b15611c81578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b4161111f565b8786866040518563ffffffff1660e01b8152600401611b6394939291906129df565b602060405180830381600087803b158015611b7d57600080fd5b505af1925050508015611bae57506040513d601f19601f82011682018060405250810190611bab91906125ce565b60015b611c31573d8060008114611bde576040519150601f19603f3d011682016040523d82523d6000602084013e611be3565b606091505b50600081511415611c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2090612a88565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611c86565b600190505b949350505050565b600082600052816020526040600020905092915050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001611d0084610b4f565b611d0a9190612e0f565b9050600060076000848152602001908152602001600020549050818114611def576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050611e749190612e0f565b9050600060096000848152602001908152602001600020549050600060088381548110611ea457611ea36130c0565b5b906000526020600020015490508060088381548110611ec657611ec56130c0565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480611f1557611f14613091565b5b6001900381819060005260206000200160009055905550505050565b6000611f3c83610b4f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612020576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201790612be8565b60405180910390fd5b612029816110b3565b15612069576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206090612ae8565b60405180910390fd5b61207560008383611983565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120c59190612d88565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461218660008383611a97565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60006121c06121bb84612ce8565b612cc3565b905080838252602082019050828560208602820111156121e3576121e2613123565b5b60005b8581101561221357816121f988826122b7565b8452602084019350602083019250506001810190506121e6565b5050509392505050565b600061223061222b84612d14565b612cc3565b90508281526020810184848401111561224c5761224b613128565b5b612257848285612ec1565b509392505050565b60008135905061226e81613671565b92915050565b600082601f8301126122895761228861311e565b5b81356122998482602086016121ad565b91505092915050565b6000813590506122b181613688565b92915050565b6000813590506122c68161369f565b92915050565b6000813590506122db816136b6565b92915050565b6000815190506122f0816136b6565b92915050565b600082601f83011261230b5761230a61311e565b5b813561231b84826020860161221d565b91505092915050565b600081359050612333816136cd565b92915050565b60006020828403121561234f5761234e613132565b5b600061235d8482850161225f565b91505092915050565b6000806040838503121561237d5761237c613132565b5b600061238b8582860161225f565b925050602061239c8582860161225f565b9150509250929050565b6000806000606084860312156123bf576123be613132565b5b60006123cd8682870161225f565b93505060206123de8682870161225f565b92505060406123ef86828701612324565b9150509250925092565b6000806000806080858703121561241357612412613132565b5b60006124218782880161225f565b94505060206124328782880161225f565b935050604061244387828801612324565b925050606085013567ffffffffffffffff8111156124645761246361312d565b5b612470878288016122f6565b91505092959194509250565b6000806040838503121561249357612492613132565b5b60006124a18582860161225f565b925050602083013567ffffffffffffffff8111156124c2576124c161312d565b5b6124ce85828601612274565b9150509250929050565b600080604083850312156124ef576124ee613132565b5b60006124fd8582860161225f565b925050602061250e858286016122a2565b9150509250929050565b6000806040838503121561252f5761252e613132565b5b600061253d8582860161225f565b925050602061254e85828601612324565b9150509250929050565b60006020828403121561256e5761256d613132565b5b600082013567ffffffffffffffff81111561258c5761258b61312d565b5b61259884828501612274565b91505092915050565b6000602082840312156125b7576125b6613132565b5b60006125c5848285016122cc565b91505092915050565b6000602082840312156125e4576125e3613132565b5b60006125f2848285016122e1565b91505092915050565b60006020828403121561261157612610613132565b5b600061261f84828501612324565b91505092915050565b61263181612e43565b82525050565b61264861264382612e43565b612faf565b82525050565b61265781612e55565b82525050565b600061266882612d45565b6126728185612d5b565b9350612682818560208601612ed0565b61268b81613137565b840191505092915050565b60006126a182612d50565b6126ab8185612d6c565b93506126bb818560208601612ed0565b6126c481613137565b840191505092915050565b60006126da82612d50565b6126e48185612d7d565b93506126f4818560208601612ed0565b80840191505092915050565b600061270d602b83612d6c565b915061271882613155565b604082019050919050565b6000612730603283612d6c565b915061273b826131a4565b604082019050919050565b6000612753602583612d6c565b915061275e826131f3565b604082019050919050565b6000612776602283612d6c565b915061278182613242565b604082019050919050565b6000612799601c83612d6c565b91506127a482613291565b602082019050919050565b60006127bc602483612d6c565b91506127c7826132ba565b604082019050919050565b60006127df601983612d6c565b91506127ea82613309565b602082019050919050565b6000612802602c83612d6c565b915061280d82613332565b604082019050919050565b6000612825602383612d6c565b915061283082613381565b604082019050919050565b6000612848603883612d6c565b9150612853826133d0565b604082019050919050565b600061286b602a83612d6c565b91506128768261341f565b604082019050919050565b600061288e602983612d6c565b91506128998261346e565b604082019050919050565b60006128b1602083612d6c565b91506128bc826134bd565b602082019050919050565b60006128d4602c83612d6c565b91506128df826134e6565b604082019050919050565b60006128f7602f83612d6c565b915061290282613535565b604082019050919050565b600061291a602183612d6c565b915061292582613584565b604082019050919050565b600061293d603183612d6c565b9150612948826135d3565b604082019050919050565b6000612960602c83612d6c565b915061296b82613622565b604082019050919050565b61297f81612eb7565b82525050565b60006129918284612637565b60148201915081905092915050565b60006129ac82856126cf565b91506129b882846126cf565b91508190509392505050565b60006020820190506129d96000830184612628565b92915050565b60006080820190506129f46000830187612628565b612a016020830186612628565b612a0e6040830185612976565b8181036060830152612a20818461265d565b905095945050505050565b6000602082019050612a40600083018461264e565b92915050565b60006020820190508181036000830152612a608184612696565b905092915050565b60006020820190508181036000830152612a8181612700565b9050919050565b60006020820190508181036000830152612aa181612723565b9050919050565b60006020820190508181036000830152612ac181612746565b9050919050565b60006020820190508181036000830152612ae181612769565b9050919050565b60006020820190508181036000830152612b018161278c565b9050919050565b60006020820190508181036000830152612b21816127af565b9050919050565b60006020820190508181036000830152612b41816127d2565b9050919050565b60006020820190508181036000830152612b61816127f5565b9050919050565b60006020820190508181036000830152612b8181612818565b9050919050565b60006020820190508181036000830152612ba18161283b565b9050919050565b60006020820190508181036000830152612bc18161285e565b9050919050565b60006020820190508181036000830152612be181612881565b9050919050565b60006020820190508181036000830152612c01816128a4565b9050919050565b60006020820190508181036000830152612c21816128c7565b9050919050565b60006020820190508181036000830152612c41816128ea565b9050919050565b60006020820190508181036000830152612c618161290d565b9050919050565b60006020820190508181036000830152612c8181612930565b9050919050565b60006020820190508181036000830152612ca181612953565b9050919050565b6000602082019050612cbd6000830184612976565b92915050565b6000612ccd612cde565b9050612cd98282612f35565b919050565b6000604051905090565b600067ffffffffffffffff821115612d0357612d026130ef565b5b602082029050602081019050919050565b600067ffffffffffffffff821115612d2f57612d2e6130ef565b5b612d3882613137565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612d9382612eb7565b9150612d9e83612eb7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612dd357612dd2613004565b5b828201905092915050565b6000612de982612eb7565b9150612df483612eb7565b925082612e0457612e03613033565b5b828204905092915050565b6000612e1a82612eb7565b9150612e2583612eb7565b925082821015612e3857612e37613004565b5b828203905092915050565b6000612e4e82612e97565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612eee578082015181840152602081019050612ed3565b83811115612efd576000848401525b50505050565b60006002820490506001821680612f1b57607f821691505b60208210811415612f2f57612f2e613062565b5b50919050565b612f3e82613137565b810181811067ffffffffffffffff82111715612f5d57612f5c6130ef565b5b80604052505050565b6000612f7182612eb7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612fa457612fa3613004565b5b600182019050919050565b6000612fba82612fc1565b9050919050565b6000612fcc82613148565b9050919050565b6000612fde82612eb7565b9150612fe983612eb7565b925082612ff957612ff8613033565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f6d6178204e4654206d696e747320706572206163636f756e742065786365656460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f6163636f756e74206973206e6f7420656c696761626c6520666f72206d696e7460008201527f696e670000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61367a81612e43565b811461368557600080fd5b50565b61369181612e55565b811461369c57600080fd5b50565b6136a881612e61565b81146136b357600080fd5b50565b6136bf81612e6b565b81146136ca57600080fd5b50565b6136d681612eb7565b81146136e157600080fd5b5056fe68747470733a2f2f6170692e6465782e677572752f76312f6173736574732f6e66742f7072652d64616f2fa2646970667358221220e510e8527042419903eba3abc5042606a0b534294f56ba0fa3bb1e571702eec464736f6c63430008070033

Deployed Bytecode Sourcemap

45397:2623:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36784:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23604:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25163:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24686:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47656:361;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37424:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46003:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25913:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37092:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26323:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37614:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23298:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45939:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23028:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23773:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25456:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46737:684;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26579:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23948:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25682:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36784:224;36886:4;36925:35;36910:50;;;:11;:50;;;;:90;;;;36964:36;36988:11;36964:23;:36::i;:::-;36910:90;36903:97;;36784:224;;;:::o;23604:100::-;23658:13;23691:5;23684:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23604:100;:::o;25163:221::-;25239:7;25267:16;25275:7;25267;:16::i;:::-;25259:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25352:15;:24;25368:7;25352:24;;;;;;;;;;;;;;;;;;;;;25345:31;;25163:221;;;:::o;24686:411::-;24767:13;24783:23;24798:7;24783:14;:23::i;:::-;24767:39;;24831:5;24825:11;;:2;:11;;;;24817:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24925:5;24909:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24934:37;24951:5;24958:12;:10;:12::i;:::-;24934:16;:37::i;:::-;24909:62;24887:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;25068:21;25077:2;25081:7;25068:8;:21::i;:::-;24756:341;24686:411;;:::o;47656:361::-;47752:4;47795:1;47773:11;:18;:23;47769:218;;47813:12;47855:7;47838:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;47828:36;;;;;;47813:51;;47924:4;47883:45;;:37;45864:66;47902:11;;47915:4;47883:11;:18;;:37;;;;;:::i;:::-;:45;;;47879:97;;;47956:4;47949:11;;;;;47879:97;47798:189;47769:218;48004:5;47997:12;;47656:361;;;;;:::o;37424:113::-;37485:7;37512:10;:17;;;;37505:24;;37424:113;:::o;46003:55::-;;;;;;;;;;;;;;;;;:::o;25913:339::-;26108:41;26127:12;:10;:12::i;:::-;26141:7;26108:18;:41::i;:::-;26100:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26216:28;26226:4;26232:2;26236:7;26216:9;:28::i;:::-;25913:339;;;:::o;37092:256::-;37189:7;37225:23;37242:5;37225:16;:23::i;:::-;37217:5;:31;37209:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;37314:12;:19;37327:5;37314:19;;;;;;;;;;;;;;;:26;37334:5;37314:26;;;;;;;;;;;;37307:33;;37092:256;;;;:::o;26323:185::-;26461:39;26478:4;26484:2;26488:7;26461:39;;;;;;;;;;;;:16;:39::i;:::-;26323:185;;;:::o;37614:233::-;37689:7;37725:30;:28;:30::i;:::-;37717:5;:38;37709:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;37822:10;37833:5;37822:17;;;;;;;;:::i;:::-;;;;;;;;;;37815:24;;37614:233;;;:::o;23298:239::-;23370:7;23390:13;23406:7;:16;23414:7;23406:16;;;;;;;;;;;;;;;;;;;;;23390:32;;23458:1;23441:19;;:5;:19;;;;23433:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23524:5;23517:12;;;23298:239;;;:::o;45939:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23028:208::-;23100:7;23145:1;23128:19;;:5;:19;;;;23120:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;23212:9;:16;23222:5;23212:16;;;;;;;;;;;;;;;;23205:23;;23028:208;;;:::o;23773:104::-;23829:13;23862:7;23855:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23773:104;:::o;25456:155::-;25551:52;25570:12;:10;:12::i;:::-;25584:8;25594;25551:18;:52::i;:::-;25456:155;;:::o;46737:684::-;46807:14;46824:13;:11;:13::i;:::-;46807:30;;45623:10;46856:15;:37;;:76;;;;;45718:10;46897:15;:35;;46856:76;46848:85;;;;;;46944:22;46969:43;46988:10;47000:11;46969:18;:43::i;:::-;46944:68;;47027:17;47023:391;;;47061:24;47088:20;:32;47109:10;47088:32;;;;;;;;;;;;;;;;47061:59;;45817:1;47162;47143:16;:20;;;;:::i;:::-;:45;;47135:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;47242:33;47252:10;47273:1;47264:6;:10;;;;:::i;:::-;47242:9;:33::i;:::-;47290:20;:32;47311:10;47290:32;;;;;;;;;;;;;;;;:34;;;;;;;;;:::i;:::-;;;;;;47046:290;47023:391;;;47357:45;;;;;;;;;;:::i;:::-;;;;;;;;47023:391;46796:625;;46737:684;:::o;26579:328::-;26754:41;26773:12;:10;:12::i;:::-;26787:7;26754:18;:41::i;:::-;26746:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26860:39;26874:4;26880:2;26884:7;26893:5;26860:13;:39::i;:::-;26579:328;;;;:::o;23948:334::-;24021:13;24055:16;24063:7;24055;:16::i;:::-;24047:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;24136:21;24160:10;:8;:10::i;:::-;24136:34;;24212:1;24194:7;24188:21;:25;:86;;;;;;;;;;;;;;;;;24240:7;24249:18;:7;:16;:18::i;:::-;24223:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24188:86;24181:93;;;23948:334;;;:::o;25682:164::-;25779:4;25803:18;:25;25822:5;25803:25;;;;;;;;;;;;;;;:35;25829:8;25803:35;;;;;;;;;;;;;;;;;;;;;;;;;25796:42;;25682:164;;;;:::o;22659:305::-;22761:4;22813:25;22798:40;;;:11;:40;;;;:105;;;;22870:33;22855:48;;;:11;:48;;;;22798:105;:158;;;;22920:36;22944:11;22920:23;:36::i;:::-;22798:158;22778:178;;22659:305;;;:::o;28417:127::-;28482:4;28534:1;28506:30;;:7;:16;28514:7;28506:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28499:37;;28417:127;;;:::o;2803:98::-;2856:7;2883:10;2876:17;;2803:98;:::o;32563:174::-;32665:2;32638:15;:24;32654:7;32638:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32721:7;32717:2;32683:46;;32692:23;32707:7;32692:14;:23::i;:::-;32683:46;;;;;;;;;;;;32563:174;;:::o;43855:190::-;43980:4;44033;44004:25;44017:5;44024:4;44004:12;:25::i;:::-;:33;43997:40;;43855:190;;;;;:::o;28711:348::-;28804:4;28829:16;28837:7;28829;:16::i;:::-;28821:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28905:13;28921:23;28936:7;28921:14;:23::i;:::-;28905:39;;28974:5;28963:16;;:7;:16;;;:51;;;;29007:7;28983:31;;:20;28995:7;28983:11;:20::i;:::-;:31;;;28963:51;:87;;;;29018:32;29035:5;29042:7;29018:16;:32::i;:::-;28963:87;28955:96;;;28711:348;;;;:::o;31820:625::-;31979:4;31952:31;;:23;31967:7;31952:14;:23::i;:::-;:31;;;31944:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;32058:1;32044:16;;:2;:16;;;;32036:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32114:39;32135:4;32141:2;32145:7;32114:20;:39::i;:::-;32218:29;32235:1;32239:7;32218:8;:29::i;:::-;32279:1;32260:9;:15;32270:4;32260:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32308:1;32291:9;:13;32301:2;32291:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32339:2;32320:7;:16;32328:7;32320:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32378:7;32374:2;32359:27;;32368:4;32359:27;;;;;;;;;;;;32399:38;32419:4;32425:2;32429:7;32399:19;:38::i;:::-;31820:625;;;:::o;32879:315::-;33034:8;33025:17;;:5;:17;;;;33017:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;33121:8;33083:18;:25;33102:5;33083:25;;;;;;;;;;;;;;;:35;33109:8;33083:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;33167:8;33145:41;;33160:5;33145:41;;;33177:8;33145:41;;;;;;:::i;:::-;;;;;;;;32879:315;;;:::o;29401:110::-;29477:26;29487:2;29491:7;29477:26;;;;;;;;;;;;:9;:26::i;:::-;29401:110;;:::o;27789:315::-;27946:28;27956:4;27962:2;27966:7;27946:9;:28::i;:::-;27993:48;28016:4;28022:2;28026:7;28035:5;27993:22;:48::i;:::-;27985:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;27789:315;;;;:::o;46373:146::-;46433:13;46459:52;;;;;;;;;;;;;;;;;;;46373:146;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;14333:157::-;14418:4;14457:25;14442:40;;;:11;:40;;;;14435:47;;14333:157;;;:::o;44407:675::-;44490:7;44510:20;44533:4;44510:27;;44553:9;44548:497;44572:5;:12;44568:1;:16;44548:497;;;44606:20;44629:5;44635:1;44629:8;;;;;;;;:::i;:::-;;;;;;;;44606:31;;44672:12;44656;:28;44652:382;;44799:42;44814:12;44828;44799:14;:42::i;:::-;44784:57;;44652:382;;;44976:42;44991:12;45005;44976:14;:42::i;:::-;44961:57;;44652:382;44591:454;44586:3;;;;;:::i;:::-;;;;44548:497;;;;45062:12;45055:19;;;44407:675;;;;:::o;38460:589::-;38604:45;38631:4;38637:2;38641:7;38604:26;:45::i;:::-;38682:1;38666:18;;:4;:18;;;38662:187;;;38701:40;38733:7;38701:31;:40::i;:::-;38662:187;;;38771:2;38763:10;;:4;:10;;;38759:90;;38790:47;38823:4;38829:7;38790:32;:47::i;:::-;38759:90;38662:187;38877:1;38863:16;;:2;:16;;;38859:183;;;38896:45;38933:7;38896:36;:45::i;:::-;38859:183;;;38969:4;38963:10;;:2;:10;;;38959:83;;38990:40;39018:2;39022:7;38990:27;:40::i;:::-;38959:83;38859:183;38460:589;;;:::o;35641:125::-;;;;:::o;29738:321::-;29868:18;29874:2;29878:7;29868:5;:18::i;:::-;29919:54;29950:1;29954:2;29958:7;29967:5;29919:22;:54::i;:::-;29897:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;29738:321;;;:::o;33759:799::-;33914:4;33935:15;:2;:13;;;:15::i;:::-;33931:620;;;33987:2;33971:36;;;34008:12;:10;:12::i;:::-;34022:4;34028:7;34037:5;33971:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33967:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34230:1;34213:6;:13;:18;34209:272;;;34256:60;;;;;;;;;;:::i;:::-;;;;;;;;34209:272;34431:6;34425:13;34416:6;34412:2;34408:15;34401:38;33967:529;34104:41;;;34094:51;;;:6;:51;;;;34087:58;;;;;33931:620;34535:4;34528:11;;33759:799;;;;;;;:::o;45090:224::-;45158:13;45221:1;45215:4;45208:15;45250:1;45244:4;45237:15;45291:4;45285;45275:21;45266:30;;45090:224;;;;:::o;35130:126::-;;;;:::o;39772:164::-;39876:10;:17;;;;39849:15;:24;39865:7;39849:24;;;;;;;;;;;:44;;;;39904:10;39920:7;39904:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39772:164;:::o;40563:988::-;40829:22;40879:1;40854:22;40871:4;40854:16;:22::i;:::-;:26;;;;:::i;:::-;40829:51;;40891:18;40912:17;:26;40930:7;40912:26;;;;;;;;;;;;40891:47;;41059:14;41045:10;:28;41041:328;;41090:19;41112:12;:18;41125:4;41112:18;;;;;;;;;;;;;;;:34;41131:14;41112:34;;;;;;;;;;;;41090:56;;41196:11;41163:12;:18;41176:4;41163:18;;;;;;;;;;;;;;;:30;41182:10;41163:30;;;;;;;;;;;:44;;;;41313:10;41280:17;:30;41298:11;41280:30;;;;;;;;;;;:43;;;;41075:294;41041:328;41465:17;:26;41483:7;41465:26;;;;;;;;;;;41458:33;;;41509:12;:18;41522:4;41509:18;;;;;;;;;;;;;;;:34;41528:14;41509:34;;;;;;;;;;;41502:41;;;40644:907;;40563:988;;:::o;41846:1079::-;42099:22;42144:1;42124:10;:17;;;;:21;;;;:::i;:::-;42099:46;;42156:18;42177:15;:24;42193:7;42177:24;;;;;;;;;;;;42156:45;;42528:19;42550:10;42561:14;42550:26;;;;;;;;:::i;:::-;;;;;;;;;;42528:48;;42614:11;42589:10;42600;42589:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;42725:10;42694:15;:28;42710:11;42694:28;;;;;;;;;;;:41;;;;42866:15;:24;42882:7;42866:24;;;;;;;;;;;42859:31;;;42901:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41917:1008;;;41846:1079;:::o;39350:221::-;39435:14;39452:20;39469:2;39452:16;:20::i;:::-;39435:37;;39510:7;39483:12;:16;39496:2;39483:16;;;;;;;;;;;;;;;:24;39500:6;39483:24;;;;;;;;;;;:34;;;;39557:6;39528:17;:26;39546:7;39528:26;;;;;;;;;;;:35;;;;39424:147;39350:221;;:::o;30395:439::-;30489:1;30475:16;;:2;:16;;;;30467:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30548:16;30556:7;30548;:16::i;:::-;30547:17;30539:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30610:45;30639:1;30643:2;30647:7;30610:20;:45::i;:::-;30685:1;30668:9;:13;30678:2;30668:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30716:2;30697:7;:16;30705:7;30697:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30761:7;30757:2;30736:33;;30753:1;30736:33;;;;;;;;;;;;30782:44;30810:1;30814:2;30818:7;30782:19;:44::i;:::-;30395:439;;:::o;4250:326::-;4310:4;4567:1;4545:7;:19;;;:23;4538:30;;4250:326;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:139::-;1214:5;1252:6;1239:20;1230:29;;1268:33;1295:5;1268:33;:::i;:::-;1168:139;;;;:::o;1330:370::-;1401:5;1450:3;1443:4;1435:6;1431:17;1427:27;1417:122;;1458:79;;:::i;:::-;1417:122;1575:6;1562:20;1600:94;1690:3;1682:6;1675:4;1667:6;1663:17;1600:94;:::i;:::-;1591:103;;1407:293;1330:370;;;;:::o;1706:133::-;1749:5;1787:6;1774:20;1765:29;;1803:30;1827:5;1803:30;:::i;:::-;1706:133;;;;:::o;1845:139::-;1891:5;1929:6;1916:20;1907:29;;1945:33;1972:5;1945:33;:::i;:::-;1845:139;;;;:::o;1990:137::-;2035:5;2073:6;2060:20;2051:29;;2089:32;2115:5;2089:32;:::i;:::-;1990:137;;;;:::o;2133:141::-;2189:5;2220:6;2214:13;2205:22;;2236:32;2262:5;2236:32;:::i;:::-;2133:141;;;;:::o;2293:338::-;2348:5;2397:3;2390:4;2382:6;2378:17;2374:27;2364:122;;2405:79;;:::i;:::-;2364:122;2522:6;2509:20;2547:78;2621:3;2613:6;2606:4;2598:6;2594:17;2547:78;:::i;:::-;2538:87;;2354:277;2293:338;;;;:::o;2637:139::-;2683:5;2721:6;2708:20;2699:29;;2737:33;2764:5;2737:33;:::i;:::-;2637:139;;;;:::o;2782:329::-;2841:6;2890:2;2878:9;2869:7;2865:23;2861:32;2858:119;;;2896:79;;:::i;:::-;2858:119;3016:1;3041:53;3086:7;3077:6;3066:9;3062:22;3041:53;:::i;:::-;3031:63;;2987:117;2782:329;;;;:::o;3117:474::-;3185:6;3193;3242:2;3230:9;3221:7;3217:23;3213:32;3210:119;;;3248:79;;:::i;:::-;3210:119;3368:1;3393:53;3438:7;3429:6;3418:9;3414:22;3393:53;:::i;:::-;3383:63;;3339:117;3495:2;3521:53;3566:7;3557:6;3546:9;3542:22;3521:53;:::i;:::-;3511:63;;3466:118;3117:474;;;;;:::o;3597:619::-;3674:6;3682;3690;3739:2;3727:9;3718:7;3714:23;3710:32;3707:119;;;3745:79;;:::i;:::-;3707:119;3865:1;3890:53;3935:7;3926:6;3915:9;3911:22;3890:53;:::i;:::-;3880:63;;3836:117;3992:2;4018:53;4063:7;4054:6;4043:9;4039:22;4018:53;:::i;:::-;4008:63;;3963:118;4120:2;4146:53;4191:7;4182:6;4171:9;4167:22;4146:53;:::i;:::-;4136:63;;4091:118;3597:619;;;;;:::o;4222:943::-;4317:6;4325;4333;4341;4390:3;4378:9;4369:7;4365:23;4361:33;4358:120;;;4397:79;;:::i;:::-;4358:120;4517:1;4542:53;4587:7;4578:6;4567:9;4563:22;4542:53;:::i;:::-;4532:63;;4488:117;4644:2;4670:53;4715:7;4706:6;4695:9;4691:22;4670:53;:::i;:::-;4660:63;;4615:118;4772:2;4798:53;4843:7;4834:6;4823:9;4819:22;4798:53;:::i;:::-;4788:63;;4743:118;4928:2;4917:9;4913:18;4900:32;4959:18;4951:6;4948:30;4945:117;;;4981:79;;:::i;:::-;4945:117;5086:62;5140:7;5131:6;5120:9;5116:22;5086:62;:::i;:::-;5076:72;;4871:287;4222:943;;;;;;;:::o;5171:684::-;5264:6;5272;5321:2;5309:9;5300:7;5296:23;5292:32;5289:119;;;5327:79;;:::i;:::-;5289:119;5447:1;5472:53;5517:7;5508:6;5497:9;5493:22;5472:53;:::i;:::-;5462:63;;5418:117;5602:2;5591:9;5587:18;5574:32;5633:18;5625:6;5622:30;5619:117;;;5655:79;;:::i;:::-;5619:117;5760:78;5830:7;5821:6;5810:9;5806:22;5760:78;:::i;:::-;5750:88;;5545:303;5171:684;;;;;:::o;5861:468::-;5926:6;5934;5983:2;5971:9;5962:7;5958:23;5954:32;5951:119;;;5989:79;;:::i;:::-;5951:119;6109:1;6134:53;6179:7;6170:6;6159:9;6155:22;6134:53;:::i;:::-;6124:63;;6080:117;6236:2;6262:50;6304:7;6295:6;6284:9;6280:22;6262:50;:::i;:::-;6252:60;;6207:115;5861:468;;;;;:::o;6335:474::-;6403:6;6411;6460:2;6448:9;6439:7;6435:23;6431:32;6428:119;;;6466:79;;:::i;:::-;6428:119;6586:1;6611:53;6656:7;6647:6;6636:9;6632:22;6611:53;:::i;:::-;6601:63;;6557:117;6713:2;6739:53;6784:7;6775:6;6764:9;6760:22;6739:53;:::i;:::-;6729:63;;6684:118;6335:474;;;;;:::o;6815:539::-;6899:6;6948:2;6936:9;6927:7;6923:23;6919:32;6916:119;;;6954:79;;:::i;:::-;6916:119;7102:1;7091:9;7087:17;7074:31;7132:18;7124:6;7121:30;7118:117;;;7154:79;;:::i;:::-;7118:117;7259:78;7329:7;7320:6;7309:9;7305:22;7259:78;:::i;:::-;7249:88;;7045:302;6815:539;;;;:::o;7360:327::-;7418:6;7467:2;7455:9;7446:7;7442:23;7438:32;7435:119;;;7473:79;;:::i;:::-;7435:119;7593:1;7618:52;7662:7;7653:6;7642:9;7638:22;7618:52;:::i;:::-;7608:62;;7564:116;7360:327;;;;:::o;7693:349::-;7762:6;7811:2;7799:9;7790:7;7786:23;7782:32;7779:119;;;7817:79;;:::i;:::-;7779:119;7937:1;7962:63;8017:7;8008:6;7997:9;7993:22;7962:63;:::i;:::-;7952:73;;7908:127;7693:349;;;;:::o;8048:329::-;8107:6;8156:2;8144:9;8135:7;8131:23;8127:32;8124:119;;;8162:79;;:::i;:::-;8124:119;8282:1;8307:53;8352:7;8343:6;8332:9;8328:22;8307:53;:::i;:::-;8297:63;;8253:117;8048:329;;;;:::o;8383:118::-;8470:24;8488:5;8470:24;:::i;:::-;8465:3;8458:37;8383:118;;:::o;8507:157::-;8612:45;8632:24;8650:5;8632:24;:::i;:::-;8612:45;:::i;:::-;8607:3;8600:58;8507:157;;:::o;8670:109::-;8751:21;8766:5;8751:21;:::i;:::-;8746:3;8739:34;8670:109;;:::o;8785:360::-;8871:3;8899:38;8931:5;8899:38;:::i;:::-;8953:70;9016:6;9011:3;8953:70;:::i;:::-;8946:77;;9032:52;9077:6;9072:3;9065:4;9058:5;9054:16;9032:52;:::i;:::-;9109:29;9131:6;9109:29;:::i;:::-;9104:3;9100:39;9093:46;;8875:270;8785:360;;;;:::o;9151:364::-;9239:3;9267:39;9300:5;9267:39;:::i;:::-;9322:71;9386:6;9381:3;9322:71;:::i;:::-;9315:78;;9402:52;9447:6;9442:3;9435:4;9428:5;9424:16;9402:52;:::i;:::-;9479:29;9501:6;9479:29;:::i;:::-;9474:3;9470:39;9463:46;;9243:272;9151:364;;;;:::o;9521:377::-;9627:3;9655:39;9688:5;9655:39;:::i;:::-;9710:89;9792:6;9787:3;9710:89;:::i;:::-;9703:96;;9808:52;9853:6;9848:3;9841:4;9834:5;9830:16;9808:52;:::i;:::-;9885:6;9880:3;9876:16;9869:23;;9631:267;9521:377;;;;:::o;9904:366::-;10046:3;10067:67;10131:2;10126:3;10067:67;:::i;:::-;10060:74;;10143:93;10232:3;10143:93;:::i;:::-;10261:2;10256:3;10252:12;10245:19;;9904:366;;;:::o;10276:::-;10418:3;10439:67;10503:2;10498:3;10439:67;:::i;:::-;10432:74;;10515:93;10604:3;10515:93;:::i;:::-;10633:2;10628:3;10624:12;10617:19;;10276:366;;;:::o;10648:::-;10790:3;10811:67;10875:2;10870:3;10811:67;:::i;:::-;10804:74;;10887:93;10976:3;10887:93;:::i;:::-;11005:2;11000:3;10996:12;10989:19;;10648:366;;;:::o;11020:::-;11162:3;11183:67;11247:2;11242:3;11183:67;:::i;:::-;11176:74;;11259:93;11348:3;11259:93;:::i;:::-;11377:2;11372:3;11368:12;11361:19;;11020:366;;;:::o;11392:::-;11534:3;11555:67;11619:2;11614:3;11555:67;:::i;:::-;11548:74;;11631:93;11720:3;11631:93;:::i;:::-;11749:2;11744:3;11740:12;11733:19;;11392:366;;;:::o;11764:::-;11906:3;11927:67;11991:2;11986:3;11927:67;:::i;:::-;11920:74;;12003:93;12092:3;12003:93;:::i;:::-;12121:2;12116:3;12112:12;12105:19;;11764:366;;;:::o;12136:::-;12278:3;12299:67;12363:2;12358:3;12299:67;:::i;:::-;12292:74;;12375:93;12464:3;12375:93;:::i;:::-;12493:2;12488:3;12484:12;12477:19;;12136:366;;;:::o;12508:::-;12650:3;12671:67;12735:2;12730:3;12671:67;:::i;:::-;12664:74;;12747:93;12836:3;12747:93;:::i;:::-;12865:2;12860:3;12856:12;12849:19;;12508:366;;;:::o;12880:::-;13022:3;13043:67;13107:2;13102:3;13043:67;:::i;:::-;13036:74;;13119:93;13208:3;13119:93;:::i;:::-;13237:2;13232:3;13228:12;13221:19;;12880:366;;;:::o;13252:::-;13394:3;13415:67;13479:2;13474:3;13415:67;:::i;:::-;13408:74;;13491:93;13580:3;13491:93;:::i;:::-;13609:2;13604:3;13600:12;13593:19;;13252:366;;;:::o;13624:::-;13766:3;13787:67;13851:2;13846:3;13787:67;:::i;:::-;13780:74;;13863:93;13952:3;13863:93;:::i;:::-;13981:2;13976:3;13972:12;13965:19;;13624:366;;;:::o;13996:::-;14138:3;14159:67;14223:2;14218:3;14159:67;:::i;:::-;14152:74;;14235:93;14324:3;14235:93;:::i;:::-;14353:2;14348:3;14344:12;14337:19;;13996:366;;;:::o;14368:::-;14510:3;14531:67;14595:2;14590:3;14531:67;:::i;:::-;14524:74;;14607:93;14696:3;14607:93;:::i;:::-;14725:2;14720:3;14716:12;14709:19;;14368:366;;;:::o;14740:::-;14882:3;14903:67;14967:2;14962:3;14903:67;:::i;:::-;14896:74;;14979:93;15068:3;14979:93;:::i;:::-;15097:2;15092:3;15088:12;15081:19;;14740:366;;;:::o;15112:::-;15254:3;15275:67;15339:2;15334:3;15275:67;:::i;:::-;15268:74;;15351:93;15440:3;15351:93;:::i;:::-;15469:2;15464:3;15460:12;15453:19;;15112:366;;;:::o;15484:::-;15626:3;15647:67;15711:2;15706:3;15647:67;:::i;:::-;15640:74;;15723:93;15812:3;15723:93;:::i;:::-;15841:2;15836:3;15832:12;15825:19;;15484:366;;;:::o;15856:::-;15998:3;16019:67;16083:2;16078:3;16019:67;:::i;:::-;16012:74;;16095:93;16184:3;16095:93;:::i;:::-;16213:2;16208:3;16204:12;16197:19;;15856:366;;;:::o;16228:::-;16370:3;16391:67;16455:2;16450:3;16391:67;:::i;:::-;16384:74;;16467:93;16556:3;16467:93;:::i;:::-;16585:2;16580:3;16576:12;16569:19;;16228:366;;;:::o;16600:118::-;16687:24;16705:5;16687:24;:::i;:::-;16682:3;16675:37;16600:118;;:::o;16724:256::-;16836:3;16851:75;16922:3;16913:6;16851:75;:::i;:::-;16951:2;16946:3;16942:12;16935:19;;16971:3;16964:10;;16724:256;;;;:::o;16986:435::-;17166:3;17188:95;17279:3;17270:6;17188:95;:::i;:::-;17181:102;;17300:95;17391:3;17382:6;17300:95;:::i;:::-;17293:102;;17412:3;17405:10;;16986:435;;;;;:::o;17427:222::-;17520:4;17558:2;17547:9;17543:18;17535:26;;17571:71;17639:1;17628:9;17624:17;17615:6;17571:71;:::i;:::-;17427:222;;;;:::o;17655:640::-;17850:4;17888:3;17877:9;17873:19;17865:27;;17902:71;17970:1;17959:9;17955:17;17946:6;17902:71;:::i;:::-;17983:72;18051:2;18040:9;18036:18;18027:6;17983:72;:::i;:::-;18065;18133:2;18122:9;18118:18;18109:6;18065:72;:::i;:::-;18184:9;18178:4;18174:20;18169:2;18158:9;18154:18;18147:48;18212:76;18283:4;18274:6;18212:76;:::i;:::-;18204:84;;17655:640;;;;;;;:::o;18301:210::-;18388:4;18426:2;18415:9;18411:18;18403:26;;18439:65;18501:1;18490:9;18486:17;18477:6;18439:65;:::i;:::-;18301:210;;;;:::o;18517:313::-;18630:4;18668:2;18657:9;18653:18;18645:26;;18717:9;18711:4;18707:20;18703:1;18692:9;18688:17;18681:47;18745:78;18818:4;18809:6;18745:78;:::i;:::-;18737:86;;18517:313;;;;:::o;18836:419::-;19002:4;19040:2;19029:9;19025:18;19017:26;;19089:9;19083:4;19079:20;19075:1;19064:9;19060:17;19053:47;19117:131;19243:4;19117:131;:::i;:::-;19109:139;;18836:419;;;:::o;19261:::-;19427:4;19465:2;19454:9;19450:18;19442:26;;19514:9;19508:4;19504:20;19500:1;19489:9;19485:17;19478:47;19542:131;19668:4;19542:131;:::i;:::-;19534:139;;19261:419;;;:::o;19686:::-;19852:4;19890:2;19879:9;19875:18;19867:26;;19939:9;19933:4;19929:20;19925:1;19914:9;19910:17;19903:47;19967:131;20093:4;19967:131;:::i;:::-;19959:139;;19686:419;;;:::o;20111:::-;20277:4;20315:2;20304:9;20300:18;20292:26;;20364:9;20358:4;20354:20;20350:1;20339:9;20335:17;20328:47;20392:131;20518:4;20392:131;:::i;:::-;20384:139;;20111:419;;;:::o;20536:::-;20702:4;20740:2;20729:9;20725:18;20717:26;;20789:9;20783:4;20779:20;20775:1;20764:9;20760:17;20753:47;20817:131;20943:4;20817:131;:::i;:::-;20809:139;;20536:419;;;:::o;20961:::-;21127:4;21165:2;21154:9;21150:18;21142:26;;21214:9;21208:4;21204:20;21200:1;21189:9;21185:17;21178:47;21242:131;21368:4;21242:131;:::i;:::-;21234:139;;20961:419;;;:::o;21386:::-;21552:4;21590:2;21579:9;21575:18;21567:26;;21639:9;21633:4;21629:20;21625:1;21614:9;21610:17;21603:47;21667:131;21793:4;21667:131;:::i;:::-;21659:139;;21386:419;;;:::o;21811:::-;21977:4;22015:2;22004:9;22000:18;21992:26;;22064:9;22058:4;22054:20;22050:1;22039:9;22035:17;22028:47;22092:131;22218:4;22092:131;:::i;:::-;22084:139;;21811:419;;;:::o;22236:::-;22402:4;22440:2;22429:9;22425:18;22417:26;;22489:9;22483:4;22479:20;22475:1;22464:9;22460:17;22453:47;22517:131;22643:4;22517:131;:::i;:::-;22509:139;;22236:419;;;:::o;22661:::-;22827:4;22865:2;22854:9;22850:18;22842:26;;22914:9;22908:4;22904:20;22900:1;22889:9;22885:17;22878:47;22942:131;23068:4;22942:131;:::i;:::-;22934:139;;22661:419;;;:::o;23086:::-;23252:4;23290:2;23279:9;23275:18;23267:26;;23339:9;23333:4;23329:20;23325:1;23314:9;23310:17;23303:47;23367:131;23493:4;23367:131;:::i;:::-;23359:139;;23086:419;;;:::o;23511:::-;23677:4;23715:2;23704:9;23700:18;23692:26;;23764:9;23758:4;23754:20;23750:1;23739:9;23735:17;23728:47;23792:131;23918:4;23792:131;:::i;:::-;23784:139;;23511:419;;;:::o;23936:::-;24102:4;24140:2;24129:9;24125:18;24117:26;;24189:9;24183:4;24179:20;24175:1;24164:9;24160:17;24153:47;24217:131;24343:4;24217:131;:::i;:::-;24209:139;;23936:419;;;:::o;24361:::-;24527:4;24565:2;24554:9;24550:18;24542:26;;24614:9;24608:4;24604:20;24600:1;24589:9;24585:17;24578:47;24642:131;24768:4;24642:131;:::i;:::-;24634:139;;24361:419;;;:::o;24786:::-;24952:4;24990:2;24979:9;24975:18;24967:26;;25039:9;25033:4;25029:20;25025:1;25014:9;25010:17;25003:47;25067:131;25193:4;25067:131;:::i;:::-;25059:139;;24786:419;;;:::o;25211:::-;25377:4;25415:2;25404:9;25400:18;25392:26;;25464:9;25458:4;25454:20;25450:1;25439:9;25435:17;25428:47;25492:131;25618:4;25492:131;:::i;:::-;25484:139;;25211:419;;;:::o;25636:::-;25802:4;25840:2;25829:9;25825:18;25817:26;;25889:9;25883:4;25879:20;25875:1;25864:9;25860:17;25853:47;25917:131;26043:4;25917:131;:::i;:::-;25909:139;;25636:419;;;:::o;26061:::-;26227:4;26265:2;26254:9;26250:18;26242:26;;26314:9;26308:4;26304:20;26300:1;26289:9;26285:17;26278:47;26342:131;26468:4;26342:131;:::i;:::-;26334:139;;26061:419;;;:::o;26486:222::-;26579:4;26617:2;26606:9;26602:18;26594:26;;26630:71;26698:1;26687:9;26683:17;26674:6;26630:71;:::i;:::-;26486:222;;;;:::o;26714:129::-;26748:6;26775:20;;:::i;:::-;26765:30;;26804:33;26832:4;26824:6;26804:33;:::i;:::-;26714:129;;;:::o;26849:75::-;26882:6;26915:2;26909:9;26899:19;;26849:75;:::o;26930:311::-;27007:4;27097:18;27089:6;27086:30;27083:56;;;27119:18;;:::i;:::-;27083:56;27169:4;27161:6;27157:17;27149:25;;27229:4;27223;27219:15;27211:23;;26930:311;;;:::o;27247:307::-;27308:4;27398:18;27390:6;27387:30;27384:56;;;27420:18;;:::i;:::-;27384:56;27458:29;27480:6;27458:29;:::i;:::-;27450:37;;27542:4;27536;27532:15;27524:23;;27247:307;;;:::o;27560:98::-;27611:6;27645:5;27639:12;27629:22;;27560:98;;;:::o;27664:99::-;27716:6;27750:5;27744:12;27734:22;;27664:99;;;:::o;27769:168::-;27852:11;27886:6;27881:3;27874:19;27926:4;27921:3;27917:14;27902:29;;27769:168;;;;:::o;27943:169::-;28027:11;28061:6;28056:3;28049:19;28101:4;28096:3;28092:14;28077:29;;27943:169;;;;:::o;28118:148::-;28220:11;28257:3;28242:18;;28118:148;;;;:::o;28272:305::-;28312:3;28331:20;28349:1;28331:20;:::i;:::-;28326:25;;28365:20;28383:1;28365:20;:::i;:::-;28360:25;;28519:1;28451:66;28447:74;28444:1;28441:81;28438:107;;;28525:18;;:::i;:::-;28438:107;28569:1;28566;28562:9;28555:16;;28272:305;;;;:::o;28583:185::-;28623:1;28640:20;28658:1;28640:20;:::i;:::-;28635:25;;28674:20;28692:1;28674:20;:::i;:::-;28669:25;;28713:1;28703:35;;28718:18;;:::i;:::-;28703:35;28760:1;28757;28753:9;28748:14;;28583:185;;;;:::o;28774:191::-;28814:4;28834:20;28852:1;28834:20;:::i;:::-;28829:25;;28868:20;28886:1;28868:20;:::i;:::-;28863:25;;28907:1;28904;28901:8;28898:34;;;28912:18;;:::i;:::-;28898:34;28957:1;28954;28950:9;28942:17;;28774:191;;;;:::o;28971:96::-;29008:7;29037:24;29055:5;29037:24;:::i;:::-;29026:35;;28971:96;;;:::o;29073:90::-;29107:7;29150:5;29143:13;29136:21;29125:32;;29073:90;;;:::o;29169:77::-;29206:7;29235:5;29224:16;;29169:77;;;:::o;29252:149::-;29288:7;29328:66;29321:5;29317:78;29306:89;;29252:149;;;:::o;29407:126::-;29444:7;29484:42;29477:5;29473:54;29462:65;;29407:126;;;:::o;29539:77::-;29576:7;29605:5;29594:16;;29539:77;;;:::o;29622:154::-;29706:6;29701:3;29696;29683:30;29768:1;29759:6;29754:3;29750:16;29743:27;29622:154;;;:::o;29782:307::-;29850:1;29860:113;29874:6;29871:1;29868:13;29860:113;;;29959:1;29954:3;29950:11;29944:18;29940:1;29935:3;29931:11;29924:39;29896:2;29893:1;29889:10;29884:15;;29860:113;;;29991:6;29988:1;29985:13;29982:101;;;30071:1;30062:6;30057:3;30053:16;30046:27;29982:101;29831:258;29782:307;;;:::o;30095:320::-;30139:6;30176:1;30170:4;30166:12;30156:22;;30223:1;30217:4;30213:12;30244:18;30234:81;;30300:4;30292:6;30288:17;30278:27;;30234:81;30362:2;30354:6;30351:14;30331:18;30328:38;30325:84;;;30381:18;;:::i;:::-;30325:84;30146:269;30095:320;;;:::o;30421:281::-;30504:27;30526:4;30504:27;:::i;:::-;30496:6;30492:40;30634:6;30622:10;30619:22;30598:18;30586:10;30583:34;30580:62;30577:88;;;30645:18;;:::i;:::-;30577:88;30685:10;30681:2;30674:22;30464:238;30421:281;;:::o;30708:233::-;30747:3;30770:24;30788:5;30770:24;:::i;:::-;30761:33;;30816:66;30809:5;30806:77;30803:103;;;30886:18;;:::i;:::-;30803:103;30933:1;30926:5;30922:13;30915:20;;30708:233;;;:::o;30947:100::-;30986:7;31015:26;31035:5;31015:26;:::i;:::-;31004:37;;30947:100;;;:::o;31053:94::-;31092:7;31121:20;31135:5;31121:20;:::i;:::-;31110:31;;31053:94;;;:::o;31153:176::-;31185:1;31202:20;31220:1;31202:20;:::i;:::-;31197:25;;31236:20;31254:1;31236:20;:::i;:::-;31231:25;;31275:1;31265:35;;31280:18;;:::i;:::-;31265:35;31321:1;31318;31314:9;31309:14;;31153:176;;;;:::o;31335:180::-;31383:77;31380:1;31373:88;31480:4;31477:1;31470:15;31504:4;31501:1;31494:15;31521:180;31569:77;31566:1;31559:88;31666:4;31663:1;31656:15;31690:4;31687:1;31680:15;31707:180;31755:77;31752:1;31745:88;31852:4;31849:1;31842:15;31876:4;31873:1;31866:15;31893:180;31941:77;31938:1;31931:88;32038:4;32035:1;32028:15;32062:4;32059:1;32052:15;32079:180;32127:77;32124:1;32117:88;32224:4;32221:1;32214:15;32248:4;32245:1;32238:15;32265:180;32313:77;32310:1;32303:88;32410:4;32407:1;32400:15;32434:4;32431:1;32424:15;32451:117;32560:1;32557;32550:12;32574:117;32683:1;32680;32673:12;32697:117;32806:1;32803;32796:12;32820:117;32929:1;32926;32919:12;32943:117;33052:1;33049;33042:12;33066:102;33107:6;33158:2;33154:7;33149:2;33142:5;33138:14;33134:28;33124:38;;33066:102;;;:::o;33174:94::-;33207:8;33255:5;33251:2;33247:14;33226:35;;33174:94;;;:::o;33274:230::-;33414:34;33410:1;33402:6;33398:14;33391:58;33483:13;33478:2;33470:6;33466:15;33459:38;33274:230;:::o;33510:237::-;33650:34;33646:1;33638:6;33634:14;33627:58;33719:20;33714:2;33706:6;33702:15;33695:45;33510:237;:::o;33753:224::-;33893:34;33889:1;33881:6;33877:14;33870:58;33962:7;33957:2;33949:6;33945:15;33938:32;33753:224;:::o;33983:221::-;34123:34;34119:1;34111:6;34107:14;34100:58;34192:4;34187:2;34179:6;34175:15;34168:29;33983:221;:::o;34210:178::-;34350:30;34346:1;34338:6;34334:14;34327:54;34210:178;:::o;34394:223::-;34534:34;34530:1;34522:6;34518:14;34511:58;34603:6;34598:2;34590:6;34586:15;34579:31;34394:223;:::o;34623:175::-;34763:27;34759:1;34751:6;34747:14;34740:51;34623:175;:::o;34804:231::-;34944:34;34940:1;34932:6;34928:14;34921:58;35013:14;35008:2;35000:6;34996:15;34989:39;34804:231;:::o;35041:222::-;35181:34;35177:1;35169:6;35165:14;35158:58;35250:5;35245:2;35237:6;35233:15;35226:30;35041:222;:::o;35269:243::-;35409:34;35405:1;35397:6;35393:14;35386:58;35478:26;35473:2;35465:6;35461:15;35454:51;35269:243;:::o;35518:229::-;35658:34;35654:1;35646:6;35642:14;35635:58;35727:12;35722:2;35714:6;35710:15;35703:37;35518:229;:::o;35753:228::-;35893:34;35889:1;35881:6;35877:14;35870:58;35962:11;35957:2;35949:6;35945:15;35938:36;35753:228;:::o;35987:182::-;36127:34;36123:1;36115:6;36111:14;36104:58;35987:182;:::o;36175:231::-;36315:34;36311:1;36303:6;36299:14;36292:58;36384:14;36379:2;36371:6;36367:15;36360:39;36175:231;:::o;36412:234::-;36552:34;36548:1;36540:6;36536:14;36529:58;36621:17;36616:2;36608:6;36604:15;36597:42;36412:234;:::o;36652:220::-;36792:34;36788:1;36780:6;36776:14;36769:58;36861:3;36856:2;36848:6;36844:15;36837:28;36652:220;:::o;36878:236::-;37018:34;37014:1;37006:6;37002:14;36995:58;37087:19;37082:2;37074:6;37070:15;37063:44;36878:236;:::o;37120:231::-;37260:34;37256:1;37248:6;37244:14;37237:58;37329:14;37324:2;37316:6;37312:15;37305:39;37120:231;:::o;37357:122::-;37430:24;37448:5;37430:24;:::i;:::-;37423:5;37420:35;37410:63;;37469:1;37466;37459:12;37410:63;37357:122;:::o;37485:116::-;37555:21;37570:5;37555:21;:::i;:::-;37548:5;37545:32;37535:60;;37591:1;37588;37581:12;37535:60;37485:116;:::o;37607:122::-;37680:24;37698:5;37680:24;:::i;:::-;37673:5;37670:35;37660:63;;37719:1;37716;37709:12;37660:63;37607:122;:::o;37735:120::-;37807:23;37824:5;37807:23;:::i;:::-;37800:5;37797:34;37787:62;;37845:1;37842;37835:12;37787:62;37735:120;:::o;37861:122::-;37934:24;37952:5;37934:24;:::i;:::-;37927:5;37924:35;37914:63;;37973:1;37970;37963:12;37914:63;37861:122;:::o

Swarm Source

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