Token Ganland

 

Overview [ERC-721]

Max Total Supply:
222 GAN

Holders:
164
Contract:
0x8887aeae3b19c38705ecb1c63aefdd1964beeb6b0x8887aeaE3b19c38705ECb1c63AefDd1964beeb6b

Social Profiles:
Not Available, Update ?

Balance
1 GAN
0x43930ff04d18a5b59805151c1eb403c55870641e
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
QuixoticLaunchpadERC721

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 optimistic.etherscan.io on 2022-05-13
*/

// Sources flattened with hardhat v2.8.4 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]

// SPDX-License-Identifier: MIT
// 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/token/ERC721/[email protected]

// 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/[email protected]

// 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/token/ERC721/extensions/[email protected]

// 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/utils/[email protected]

// 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/utils/[email protected]

// 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/[email protected]

// 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/introspection/[email protected]

// 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/[email protected]

// 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/access/[email protected]

// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

// 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/[email protected]

// 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/[email protected]

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

pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

// File Contracts/LaunchpadNFT.sol

pragma solidity ^0.8.1;



contract QuixoticLaunchpadERC721 is ERC721("Ganland", "GAN"), ERC721Enumerable, Ownable {

    string private _baseURIextended;
    string private _baseURISuffix = "";
    bool public frozenMetadata = false;
    uint256 public MAX_TOKENS = 222;
    uint256 public constant maxMintPerTxn = 1;
    bool public saleIsActive = false;
    
    
    

    bool private _baseUriIncludeTokenId = true;

    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC721Enumerable) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    
    function flipSaleState() public onlyOwner {
            saleIsActive = !saleIsActive;
    }


    

    function setBaseURI(string memory baseURI_, bool includeTokenId, string memory suffix) external onlyOwner() {
        require(!frozenMetadata, "The metadata URI is frozen. You can no longer set the baseURI");
        _baseUriIncludeTokenId = includeTokenId;
        _baseURIextended = baseURI_;
        _baseURISuffix = suffix;
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return _baseURIextended;
    }
    
    function freezeMetadata() external onlyOwner {
        frozenMetadata = true;
    }
    
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
    
        string memory baseURI = _baseURI();
        if (_baseUriIncludeTokenId) {
            return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, Strings.toString(tokenId), _baseURISuffix)) : "";        
        } else {
            return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI)) : "";
        }
    }

    
    function mintToken(uint numberOfTokens) public payable {
        require(saleIsActive, "Sale must be active to mint Tokens");
        require(numberOfTokens <= maxMintPerTxn, "Exceeded max mint per transaction");
        require(totalSupply() + numberOfTokens <= MAX_TOKENS, "Purchase would exceed max supply of tokens");
        require(0 * numberOfTokens <= msg.value, "Ether value sent is not correct");

        for (uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = totalSupply();
            if (totalSupply() < MAX_TOKENS) {
                _safeMint(_msgSender(), mintIndex);
            }
        }
    }


    

    

}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_TOKENS","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":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freezeMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"frozenMetadata","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerTxn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"bool","name":"includeTokenId","type":"bool"},{"internalType":"string","name":"suffix","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600c90805190602001906200002b92919062000224565b506000600d60006101000a81548160ff02191690831515021790555060de600e556000600f60006101000a81548160ff0219169083151502179055506001600f60016101000a81548160ff0219169083151502179055503480156200008f57600080fd5b506040518060400160405280600781526020017f47616e6c616e64000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f47414e000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200011492919062000224565b5080600190805190602001906200012d92919062000224565b50505062000150620001446200015660201b60201c565b6200015e60201b60201c565b62000339565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200023290620002d4565b90600052602060002090601f016020900481019282620002565760008555620002a2565b82601f106200027157805160ff1916838001178555620002a2565b82800160010185558215620002a2579182015b82811115620002a157825182559160200191906001019062000284565b5b509050620002b19190620002b5565b5090565b5b80821115620002d0576000816000905550600101620002b6565b5090565b60006002820490506001821680620002ed57607f821691505b602082108114156200030457620003036200030a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613fde80620003496000396000f3fe60806040526004361061019c5760003560e01c80638529ccad116100ec578063c87b56dd1161008a578063e985e9c511610064578063e985e9c5146105a5578063eb8d2444146105e2578063f2fde38b1461060d578063f47c84c5146106365761019c565b8063c87b56dd14610526578063caa8078f14610563578063d111515d1461058e5761019c565b806395d89b41116100c657806395d89b411461048d578063a22cb465146104b8578063b88d4fde146104e1578063c634d0321461050a5761019c565b80638529ccad1461040e5780638da5cb5b1461043957806393b15295146104645761019c565b80632f745c59116101595780634f6ccce7116101335780634f6ccce7146103405780636352211e1461037d57806370a08231146103ba578063715018a6146103f75761019c565b80632f745c59146102c357806334918dfd1461030057806342842e0e146103175761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc14610209578063095ea7b31461024657806318160ddd1461026f57806323b872dd1461029a575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190612abe565b610661565b6040516101d591906130f3565b60405180910390f35b3480156101ea57600080fd5b506101f3610673565b604051610200919061310e565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b9190612ba3565b610705565b60405161023d919061308c565b60405180910390f35b34801561025257600080fd5b5061026d60048036038101906102689190612a7e565b61078a565b005b34801561027b57600080fd5b506102846108a2565b6040516102919190613410565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc9190612968565b6108af565b005b3480156102cf57600080fd5b506102ea60048036038101906102e59190612a7e565b61090f565b6040516102f79190613410565b60405180910390f35b34801561030c57600080fd5b506103156109b4565b005b34801561032357600080fd5b5061033e60048036038101906103399190612968565b610a5c565b005b34801561034c57600080fd5b5061036760048036038101906103629190612ba3565b610a7c565b6040516103749190613410565b60405180910390f35b34801561038957600080fd5b506103a4600480360381019061039f9190612ba3565b610aed565b6040516103b1919061308c565b60405180910390f35b3480156103c657600080fd5b506103e160048036038101906103dc91906128fb565b610b9f565b6040516103ee9190613410565b60405180910390f35b34801561040357600080fd5b5061040c610c57565b005b34801561041a57600080fd5b50610423610cdf565b60405161043091906130f3565b60405180910390f35b34801561044557600080fd5b5061044e610cf2565b60405161045b919061308c565b60405180910390f35b34801561047057600080fd5b5061048b60048036038101906104869190612b18565b610d1c565b005b34801561049957600080fd5b506104a2610e35565b6040516104af919061310e565b60405180910390f35b3480156104c457600080fd5b506104df60048036038101906104da9190612a3e565b610ec7565b005b3480156104ed57600080fd5b50610508600480360381019061050391906129bb565b610edd565b005b610524600480360381019061051f9190612ba3565b610f3f565b005b34801561053257600080fd5b5061054d60048036038101906105489190612ba3565b6110ca565b60405161055a919061310e565b60405180910390f35b34801561056f57600080fd5b506105786111d1565b6040516105859190613410565b60405180910390f35b34801561059a57600080fd5b506105a36111d6565b005b3480156105b157600080fd5b506105cc60048036038101906105c79190612928565b61126f565b6040516105d991906130f3565b60405180910390f35b3480156105ee57600080fd5b506105f7611303565b60405161060491906130f3565b60405180910390f35b34801561061957600080fd5b50610634600480360381019061062f91906128fb565b611316565b005b34801561064257600080fd5b5061064b61140e565b6040516106589190613410565b60405180910390f35b600061066c82611414565b9050919050565b606060008054610682906136d5565b80601f01602080910402602001604051908101604052809291908181526020018280546106ae906136d5565b80156106fb5780601f106106d0576101008083540402835291602001916106fb565b820191906000526020600020905b8154815290600101906020018083116106de57829003601f168201915b5050505050905090565b60006107108261148e565b61074f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074690613330565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061079582610aed565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610806576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fd906133b0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108256114fa565b73ffffffffffffffffffffffffffffffffffffffff16148061085457506108538161084e6114fa565b61126f565b5b610893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088a90613270565b60405180910390fd5b61089d8383611502565b505050565b6000600880549050905090565b6108c06108ba6114fa565b826115bb565b6108ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f6906133d0565b60405180910390fd5b61090a838383611699565b505050565b600061091a83610b9f565b821061095b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095290613130565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6109bc6114fa565b73ffffffffffffffffffffffffffffffffffffffff166109da610cf2565b73ffffffffffffffffffffffffffffffffffffffff1614610a30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2790613350565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b610a7783838360405180602001604052806000815250610edd565b505050565b6000610a866108a2565b8210610ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abe906133f0565b60405180910390fd5b60088281548110610adb57610ada61386e565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8d906132b0565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0790613290565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c5f6114fa565b73ffffffffffffffffffffffffffffffffffffffff16610c7d610cf2565b73ffffffffffffffffffffffffffffffffffffffff1614610cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cca90613350565b60405180910390fd5b610cdd6000611900565b565b600d60009054906101000a900460ff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610d246114fa565b73ffffffffffffffffffffffffffffffffffffffff16610d42610cf2565b73ffffffffffffffffffffffffffffffffffffffff1614610d98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8f90613350565b60405180910390fd5b600d60009054906101000a900460ff1615610de8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddf90613310565b60405180910390fd5b81600f60016101000a81548160ff02191690831515021790555082600b9080519060200190610e1892919061270f565b5080600c9080519060200190610e2f92919061270f565b50505050565b606060018054610e44906136d5565b80601f0160208091040260200160405190810160405280929190818152602001828054610e70906136d5565b8015610ebd5780601f10610e9257610100808354040283529160200191610ebd565b820191906000526020600020905b815481529060010190602001808311610ea057829003601f168201915b5050505050905090565b610ed9610ed26114fa565b83836119c6565b5050565b610eee610ee86114fa565b836115bb565b610f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f24906133d0565b60405180910390fd5b610f3984848484611b33565b50505050565b600f60009054906101000a900460ff16610f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8590613230565b60405180910390fd5b6001811115610fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc990613370565b60405180910390fd5b600e5481610fde6108a2565b610fe8919061350a565b1115611029576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611020906132d0565b60405180910390fd5b348160006110379190613591565b1115611078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106f90613210565b60405180910390fd5b60005b818110156110c657600061108d6108a2565b9050600e5461109a6108a2565b10156110b2576110b16110ab6114fa565b82611b8f565b5b5080806110be90613738565b91505061107b565b5050565b60606110d58261148e565b611114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110b90613390565b60405180910390fd5b600061111e611bad565b9050600f60019054906101000a900460ff16156111895760008151116111535760405180602001604052806000815250611181565b8061115d84611c3f565b600c6040516020016111719392919061305b565b6040516020818303038152906040525b9150506111cc565b60008151116111a757604051806020016040528060008152506111c8565b806040516020016111b89190613044565b6040516020818303038152906040525b9150505b919050565b600181565b6111de6114fa565b73ffffffffffffffffffffffffffffffffffffffff166111fc610cf2565b73ffffffffffffffffffffffffffffffffffffffff1614611252576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124990613350565b60405180910390fd5b6001600d60006101000a81548160ff021916908315150217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f60009054906101000a900460ff1681565b61131e6114fa565b73ffffffffffffffffffffffffffffffffffffffff1661133c610cf2565b73ffffffffffffffffffffffffffffffffffffffff1614611392576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138990613350565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f990613170565b60405180910390fd5b61140b81611900565b50565b600e5481565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611487575061148682611da0565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661157583610aed565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006115c68261148e565b611605576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fc90613250565b60405180910390fd5b600061161083610aed565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061167f57508373ffffffffffffffffffffffffffffffffffffffff1661166784610705565b73ffffffffffffffffffffffffffffffffffffffff16145b80611690575061168f818561126f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166116b982610aed565b73ffffffffffffffffffffffffffffffffffffffff161461170f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170690613190565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561177f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611776906131d0565b60405180910390fd5b61178a838383611e82565b611795600082611502565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117e591906135eb565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461183c919061350a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46118fb838383611e92565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2c906131f0565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b2691906130f3565b60405180910390a3505050565b611b3e848484611699565b611b4a84848484611e97565b611b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8090613150565b60405180910390fd5b50505050565b611ba982826040518060200160405280600081525061202e565b5050565b6060600b8054611bbc906136d5565b80601f0160208091040260200160405190810160405280929190818152602001828054611be8906136d5565b8015611c355780601f10611c0a57610100808354040283529160200191611c35565b820191906000526020600020905b815481529060010190602001808311611c1857829003601f168201915b5050505050905090565b60606000821415611c87576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611d9b565b600082905060005b60008214611cb9578080611ca290613738565b915050600a82611cb29190613560565b9150611c8f565b60008167ffffffffffffffff811115611cd557611cd461389d565b5b6040519080825280601f01601f191660200182016040528015611d075781602001600182028036833780820191505090505b5090505b60008514611d9457600182611d2091906135eb565b9150600a85611d2f9190613781565b6030611d3b919061350a565b60f81b818381518110611d5157611d5061386e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611d8d9190613560565b9450611d0b565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e6b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611e7b5750611e7a82612089565b5b9050919050565b611e8d8383836120f3565b505050565b505050565b6000611eb88473ffffffffffffffffffffffffffffffffffffffff16612207565b15612021578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ee16114fa565b8786866040518563ffffffff1660e01b8152600401611f0394939291906130a7565b602060405180830381600087803b158015611f1d57600080fd5b505af1925050508015611f4e57506040513d601f19601f82011682018060405250810190611f4b9190612aeb565b60015b611fd1573d8060008114611f7e576040519150601f19603f3d011682016040523d82523d6000602084013e611f83565b606091505b50600081511415611fc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc090613150565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612026565b600190505b949350505050565b612038838361222a565b6120456000848484611e97565b612084576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207b90613150565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6120fe838383612404565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121415761213c81612409565b612180565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461217f5761217e8382612452565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121c3576121be816125bf565b612202565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612201576122008282612690565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561229a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612291906132f0565b60405180910390fd5b6122a38161148e565b156122e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122da906131b0565b60405180910390fd5b6122ef60008383611e82565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461233f919061350a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461240060008383611e92565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161245f84610b9f565b61246991906135eb565b905060006007600084815260200190815260200160002054905081811461254e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506125d391906135eb565b90506000600960008481526020019081526020016000205490506000600883815481106126035761260261386e565b5b9060005260206000200154905080600883815481106126255761262461386e565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806126745761267361383f565b5b6001900381819060005260206000200160009055905550505050565b600061269b83610b9f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461271b906136d5565b90600052602060002090601f01602090048101928261273d5760008555612784565b82601f1061275657805160ff1916838001178555612784565b82800160010185558215612784579182015b82811115612783578251825591602001919060010190612768565b5b5090506127919190612795565b5090565b5b808211156127ae576000816000905550600101612796565b5090565b60006127c56127c084613450565b61342b565b9050828152602081018484840111156127e1576127e06138d1565b5b6127ec848285613693565b509392505050565b600061280761280284613481565b61342b565b905082815260208101848484011115612823576128226138d1565b5b61282e848285613693565b509392505050565b60008135905061284581613f4c565b92915050565b60008135905061285a81613f63565b92915050565b60008135905061286f81613f7a565b92915050565b60008151905061288481613f7a565b92915050565b600082601f83011261289f5761289e6138cc565b5b81356128af8482602086016127b2565b91505092915050565b600082601f8301126128cd576128cc6138cc565b5b81356128dd8482602086016127f4565b91505092915050565b6000813590506128f581613f91565b92915050565b600060208284031215612911576129106138db565b5b600061291f84828501612836565b91505092915050565b6000806040838503121561293f5761293e6138db565b5b600061294d85828601612836565b925050602061295e85828601612836565b9150509250929050565b600080600060608486031215612981576129806138db565b5b600061298f86828701612836565b93505060206129a086828701612836565b92505060406129b1868287016128e6565b9150509250925092565b600080600080608085870312156129d5576129d46138db565b5b60006129e387828801612836565b94505060206129f487828801612836565b9350506040612a05878288016128e6565b925050606085013567ffffffffffffffff811115612a2657612a256138d6565b5b612a328782880161288a565b91505092959194509250565b60008060408385031215612a5557612a546138db565b5b6000612a6385828601612836565b9250506020612a748582860161284b565b9150509250929050565b60008060408385031215612a9557612a946138db565b5b6000612aa385828601612836565b9250506020612ab4858286016128e6565b9150509250929050565b600060208284031215612ad457612ad36138db565b5b6000612ae284828501612860565b91505092915050565b600060208284031215612b0157612b006138db565b5b6000612b0f84828501612875565b91505092915050565b600080600060608486031215612b3157612b306138db565b5b600084013567ffffffffffffffff811115612b4f57612b4e6138d6565b5b612b5b868287016128b8565b9350506020612b6c8682870161284b565b925050604084013567ffffffffffffffff811115612b8d57612b8c6138d6565b5b612b99868287016128b8565b9150509250925092565b600060208284031215612bb957612bb86138db565b5b6000612bc7848285016128e6565b91505092915050565b612bd98161361f565b82525050565b612be881613631565b82525050565b6000612bf9826134c7565b612c0381856134dd565b9350612c138185602086016136a2565b612c1c816138e0565b840191505092915050565b6000612c32826134d2565b612c3c81856134ee565b9350612c4c8185602086016136a2565b612c55816138e0565b840191505092915050565b6000612c6b826134d2565b612c7581856134ff565b9350612c858185602086016136a2565b80840191505092915050565b60008154612c9e816136d5565b612ca881866134ff565b94506001821660008114612cc35760018114612cd457612d07565b60ff19831686528186019350612d07565b612cdd856134b2565b60005b83811015612cff57815481890152600182019150602081019050612ce0565b838801955050505b50505092915050565b6000612d1d602b836134ee565b9150612d28826138f1565b604082019050919050565b6000612d406032836134ee565b9150612d4b82613940565b604082019050919050565b6000612d636026836134ee565b9150612d6e8261398f565b604082019050919050565b6000612d866025836134ee565b9150612d91826139de565b604082019050919050565b6000612da9601c836134ee565b9150612db482613a2d565b602082019050919050565b6000612dcc6024836134ee565b9150612dd782613a56565b604082019050919050565b6000612def6019836134ee565b9150612dfa82613aa5565b602082019050919050565b6000612e12601f836134ee565b9150612e1d82613ace565b602082019050919050565b6000612e356022836134ee565b9150612e4082613af7565b604082019050919050565b6000612e58602c836134ee565b9150612e6382613b46565b604082019050919050565b6000612e7b6038836134ee565b9150612e8682613b95565b604082019050919050565b6000612e9e602a836134ee565b9150612ea982613be4565b604082019050919050565b6000612ec16029836134ee565b9150612ecc82613c33565b604082019050919050565b6000612ee4602a836134ee565b9150612eef82613c82565b604082019050919050565b6000612f076020836134ee565b9150612f1282613cd1565b602082019050919050565b6000612f2a603d836134ee565b9150612f3582613cfa565b604082019050919050565b6000612f4d602c836134ee565b9150612f5882613d49565b604082019050919050565b6000612f706020836134ee565b9150612f7b82613d98565b602082019050919050565b6000612f936021836134ee565b9150612f9e82613dc1565b604082019050919050565b6000612fb6602f836134ee565b9150612fc182613e10565b604082019050919050565b6000612fd96021836134ee565b9150612fe482613e5f565b604082019050919050565b6000612ffc6031836134ee565b915061300782613eae565b604082019050919050565b600061301f602c836134ee565b915061302a82613efd565b604082019050919050565b61303e81613689565b82525050565b60006130508284612c60565b915081905092915050565b60006130678286612c60565b91506130738285612c60565b915061307f8284612c91565b9150819050949350505050565b60006020820190506130a16000830184612bd0565b92915050565b60006080820190506130bc6000830187612bd0565b6130c96020830186612bd0565b6130d66040830185613035565b81810360608301526130e88184612bee565b905095945050505050565b60006020820190506131086000830184612bdf565b92915050565b600060208201905081810360008301526131288184612c27565b905092915050565b6000602082019050818103600083015261314981612d10565b9050919050565b6000602082019050818103600083015261316981612d33565b9050919050565b6000602082019050818103600083015261318981612d56565b9050919050565b600060208201905081810360008301526131a981612d79565b9050919050565b600060208201905081810360008301526131c981612d9c565b9050919050565b600060208201905081810360008301526131e981612dbf565b9050919050565b6000602082019050818103600083015261320981612de2565b9050919050565b6000602082019050818103600083015261322981612e05565b9050919050565b6000602082019050818103600083015261324981612e28565b9050919050565b6000602082019050818103600083015261326981612e4b565b9050919050565b6000602082019050818103600083015261328981612e6e565b9050919050565b600060208201905081810360008301526132a981612e91565b9050919050565b600060208201905081810360008301526132c981612eb4565b9050919050565b600060208201905081810360008301526132e981612ed7565b9050919050565b6000602082019050818103600083015261330981612efa565b9050919050565b6000602082019050818103600083015261332981612f1d565b9050919050565b6000602082019050818103600083015261334981612f40565b9050919050565b6000602082019050818103600083015261336981612f63565b9050919050565b6000602082019050818103600083015261338981612f86565b9050919050565b600060208201905081810360008301526133a981612fa9565b9050919050565b600060208201905081810360008301526133c981612fcc565b9050919050565b600060208201905081810360008301526133e981612fef565b9050919050565b6000602082019050818103600083015261340981613012565b9050919050565b60006020820190506134256000830184613035565b92915050565b6000613435613446565b90506134418282613707565b919050565b6000604051905090565b600067ffffffffffffffff82111561346b5761346a61389d565b5b613474826138e0565b9050602081019050919050565b600067ffffffffffffffff82111561349c5761349b61389d565b5b6134a5826138e0565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061351582613689565b915061352083613689565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613555576135546137b2565b5b828201905092915050565b600061356b82613689565b915061357683613689565b925082613586576135856137e1565b5b828204905092915050565b600061359c82613689565b91506135a783613689565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156135e0576135df6137b2565b5b828202905092915050565b60006135f682613689565b915061360183613689565b925082821015613614576136136137b2565b5b828203905092915050565b600061362a82613669565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156136c05780820151818401526020810190506136a5565b838111156136cf576000848401525b50505050565b600060028204905060018216806136ed57607f821691505b6020821081141561370157613700613810565b5b50919050565b613710826138e0565b810181811067ffffffffffffffff8211171561372f5761372e61389d565b5b80604052505050565b600061374382613689565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613776576137756137b2565b5b600182019050919050565b600061378c82613689565b915061379783613689565b9250826137a7576137a66137e1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f53616c65206d7573742062652061637469766520746f206d696e7420546f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620746f6b656e7300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f546865206d65746164617461205552492069732066726f7a656e2e20596f752060008201527f63616e206e6f206c6f6e67657220736574207468652062617365555249000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4578636565646564206d6178206d696e7420706572207472616e73616374696f60008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b613f558161361f565b8114613f6057600080fd5b50565b613f6c81613631565b8114613f7757600080fd5b50565b613f838161363d565b8114613f8e57600080fd5b50565b613f9a81613689565b8114613fa557600080fd5b5056fea26469706673582212201ccfd124a6c057ce6166d7f6128b1c5e9d01b3f04687012112ed3349870f124764736f6c63430008070033

Deployed Bytecode

0x60806040526004361061019c5760003560e01c80638529ccad116100ec578063c87b56dd1161008a578063e985e9c511610064578063e985e9c5146105a5578063eb8d2444146105e2578063f2fde38b1461060d578063f47c84c5146106365761019c565b8063c87b56dd14610526578063caa8078f14610563578063d111515d1461058e5761019c565b806395d89b41116100c657806395d89b411461048d578063a22cb465146104b8578063b88d4fde146104e1578063c634d0321461050a5761019c565b80638529ccad1461040e5780638da5cb5b1461043957806393b15295146104645761019c565b80632f745c59116101595780634f6ccce7116101335780634f6ccce7146103405780636352211e1461037d57806370a08231146103ba578063715018a6146103f75761019c565b80632f745c59146102c357806334918dfd1461030057806342842e0e146103175761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc14610209578063095ea7b31461024657806318160ddd1461026f57806323b872dd1461029a575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190612abe565b610661565b6040516101d591906130f3565b60405180910390f35b3480156101ea57600080fd5b506101f3610673565b604051610200919061310e565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b9190612ba3565b610705565b60405161023d919061308c565b60405180910390f35b34801561025257600080fd5b5061026d60048036038101906102689190612a7e565b61078a565b005b34801561027b57600080fd5b506102846108a2565b6040516102919190613410565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc9190612968565b6108af565b005b3480156102cf57600080fd5b506102ea60048036038101906102e59190612a7e565b61090f565b6040516102f79190613410565b60405180910390f35b34801561030c57600080fd5b506103156109b4565b005b34801561032357600080fd5b5061033e60048036038101906103399190612968565b610a5c565b005b34801561034c57600080fd5b5061036760048036038101906103629190612ba3565b610a7c565b6040516103749190613410565b60405180910390f35b34801561038957600080fd5b506103a4600480360381019061039f9190612ba3565b610aed565b6040516103b1919061308c565b60405180910390f35b3480156103c657600080fd5b506103e160048036038101906103dc91906128fb565b610b9f565b6040516103ee9190613410565b60405180910390f35b34801561040357600080fd5b5061040c610c57565b005b34801561041a57600080fd5b50610423610cdf565b60405161043091906130f3565b60405180910390f35b34801561044557600080fd5b5061044e610cf2565b60405161045b919061308c565b60405180910390f35b34801561047057600080fd5b5061048b60048036038101906104869190612b18565b610d1c565b005b34801561049957600080fd5b506104a2610e35565b6040516104af919061310e565b60405180910390f35b3480156104c457600080fd5b506104df60048036038101906104da9190612a3e565b610ec7565b005b3480156104ed57600080fd5b50610508600480360381019061050391906129bb565b610edd565b005b610524600480360381019061051f9190612ba3565b610f3f565b005b34801561053257600080fd5b5061054d60048036038101906105489190612ba3565b6110ca565b60405161055a919061310e565b60405180910390f35b34801561056f57600080fd5b506105786111d1565b6040516105859190613410565b60405180910390f35b34801561059a57600080fd5b506105a36111d6565b005b3480156105b157600080fd5b506105cc60048036038101906105c79190612928565b61126f565b6040516105d991906130f3565b60405180910390f35b3480156105ee57600080fd5b506105f7611303565b60405161060491906130f3565b60405180910390f35b34801561061957600080fd5b50610634600480360381019061062f91906128fb565b611316565b005b34801561064257600080fd5b5061064b61140e565b6040516106589190613410565b60405180910390f35b600061066c82611414565b9050919050565b606060008054610682906136d5565b80601f01602080910402602001604051908101604052809291908181526020018280546106ae906136d5565b80156106fb5780601f106106d0576101008083540402835291602001916106fb565b820191906000526020600020905b8154815290600101906020018083116106de57829003601f168201915b5050505050905090565b60006107108261148e565b61074f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074690613330565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061079582610aed565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610806576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fd906133b0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108256114fa565b73ffffffffffffffffffffffffffffffffffffffff16148061085457506108538161084e6114fa565b61126f565b5b610893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088a90613270565b60405180910390fd5b61089d8383611502565b505050565b6000600880549050905090565b6108c06108ba6114fa565b826115bb565b6108ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f6906133d0565b60405180910390fd5b61090a838383611699565b505050565b600061091a83610b9f565b821061095b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095290613130565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6109bc6114fa565b73ffffffffffffffffffffffffffffffffffffffff166109da610cf2565b73ffffffffffffffffffffffffffffffffffffffff1614610a30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2790613350565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b610a7783838360405180602001604052806000815250610edd565b505050565b6000610a866108a2565b8210610ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abe906133f0565b60405180910390fd5b60088281548110610adb57610ada61386e565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8d906132b0565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0790613290565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c5f6114fa565b73ffffffffffffffffffffffffffffffffffffffff16610c7d610cf2565b73ffffffffffffffffffffffffffffffffffffffff1614610cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cca90613350565b60405180910390fd5b610cdd6000611900565b565b600d60009054906101000a900460ff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610d246114fa565b73ffffffffffffffffffffffffffffffffffffffff16610d42610cf2565b73ffffffffffffffffffffffffffffffffffffffff1614610d98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8f90613350565b60405180910390fd5b600d60009054906101000a900460ff1615610de8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddf90613310565b60405180910390fd5b81600f60016101000a81548160ff02191690831515021790555082600b9080519060200190610e1892919061270f565b5080600c9080519060200190610e2f92919061270f565b50505050565b606060018054610e44906136d5565b80601f0160208091040260200160405190810160405280929190818152602001828054610e70906136d5565b8015610ebd5780601f10610e9257610100808354040283529160200191610ebd565b820191906000526020600020905b815481529060010190602001808311610ea057829003601f168201915b5050505050905090565b610ed9610ed26114fa565b83836119c6565b5050565b610eee610ee86114fa565b836115bb565b610f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f24906133d0565b60405180910390fd5b610f3984848484611b33565b50505050565b600f60009054906101000a900460ff16610f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8590613230565b60405180910390fd5b6001811115610fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc990613370565b60405180910390fd5b600e5481610fde6108a2565b610fe8919061350a565b1115611029576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611020906132d0565b60405180910390fd5b348160006110379190613591565b1115611078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106f90613210565b60405180910390fd5b60005b818110156110c657600061108d6108a2565b9050600e5461109a6108a2565b10156110b2576110b16110ab6114fa565b82611b8f565b5b5080806110be90613738565b91505061107b565b5050565b60606110d58261148e565b611114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110b90613390565b60405180910390fd5b600061111e611bad565b9050600f60019054906101000a900460ff16156111895760008151116111535760405180602001604052806000815250611181565b8061115d84611c3f565b600c6040516020016111719392919061305b565b6040516020818303038152906040525b9150506111cc565b60008151116111a757604051806020016040528060008152506111c8565b806040516020016111b89190613044565b6040516020818303038152906040525b9150505b919050565b600181565b6111de6114fa565b73ffffffffffffffffffffffffffffffffffffffff166111fc610cf2565b73ffffffffffffffffffffffffffffffffffffffff1614611252576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124990613350565b60405180910390fd5b6001600d60006101000a81548160ff021916908315150217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f60009054906101000a900460ff1681565b61131e6114fa565b73ffffffffffffffffffffffffffffffffffffffff1661133c610cf2565b73ffffffffffffffffffffffffffffffffffffffff1614611392576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138990613350565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f990613170565b60405180910390fd5b61140b81611900565b50565b600e5481565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611487575061148682611da0565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661157583610aed565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006115c68261148e565b611605576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fc90613250565b60405180910390fd5b600061161083610aed565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061167f57508373ffffffffffffffffffffffffffffffffffffffff1661166784610705565b73ffffffffffffffffffffffffffffffffffffffff16145b80611690575061168f818561126f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166116b982610aed565b73ffffffffffffffffffffffffffffffffffffffff161461170f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170690613190565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561177f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611776906131d0565b60405180910390fd5b61178a838383611e82565b611795600082611502565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117e591906135eb565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461183c919061350a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46118fb838383611e92565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2c906131f0565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b2691906130f3565b60405180910390a3505050565b611b3e848484611699565b611b4a84848484611e97565b611b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8090613150565b60405180910390fd5b50505050565b611ba982826040518060200160405280600081525061202e565b5050565b6060600b8054611bbc906136d5565b80601f0160208091040260200160405190810160405280929190818152602001828054611be8906136d5565b8015611c355780601f10611c0a57610100808354040283529160200191611c35565b820191906000526020600020905b815481529060010190602001808311611c1857829003601f168201915b5050505050905090565b60606000821415611c87576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611d9b565b600082905060005b60008214611cb9578080611ca290613738565b915050600a82611cb29190613560565b9150611c8f565b60008167ffffffffffffffff811115611cd557611cd461389d565b5b6040519080825280601f01601f191660200182016040528015611d075781602001600182028036833780820191505090505b5090505b60008514611d9457600182611d2091906135eb565b9150600a85611d2f9190613781565b6030611d3b919061350a565b60f81b818381518110611d5157611d5061386e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611d8d9190613560565b9450611d0b565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e6b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611e7b5750611e7a82612089565b5b9050919050565b611e8d8383836120f3565b505050565b505050565b6000611eb88473ffffffffffffffffffffffffffffffffffffffff16612207565b15612021578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ee16114fa565b8786866040518563ffffffff1660e01b8152600401611f0394939291906130a7565b602060405180830381600087803b158015611f1d57600080fd5b505af1925050508015611f4e57506040513d601f19601f82011682018060405250810190611f4b9190612aeb565b60015b611fd1573d8060008114611f7e576040519150601f19603f3d011682016040523d82523d6000602084013e611f83565b606091505b50600081511415611fc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc090613150565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612026565b600190505b949350505050565b612038838361222a565b6120456000848484611e97565b612084576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207b90613150565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6120fe838383612404565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121415761213c81612409565b612180565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461217f5761217e8382612452565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121c3576121be816125bf565b612202565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612201576122008282612690565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561229a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612291906132f0565b60405180910390fd5b6122a38161148e565b156122e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122da906131b0565b60405180910390fd5b6122ef60008383611e82565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461233f919061350a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461240060008383611e92565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161245f84610b9f565b61246991906135eb565b905060006007600084815260200190815260200160002054905081811461254e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506125d391906135eb565b90506000600960008481526020019081526020016000205490506000600883815481106126035761260261386e565b5b9060005260206000200154905080600883815481106126255761262461386e565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806126745761267361383f565b5b6001900381819060005260206000200160009055905550505050565b600061269b83610b9f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461271b906136d5565b90600052602060002090601f01602090048101928261273d5760008555612784565b82601f1061275657805160ff1916838001178555612784565b82800160010185558215612784579182015b82811115612783578251825591602001919060010190612768565b5b5090506127919190612795565b5090565b5b808211156127ae576000816000905550600101612796565b5090565b60006127c56127c084613450565b61342b565b9050828152602081018484840111156127e1576127e06138d1565b5b6127ec848285613693565b509392505050565b600061280761280284613481565b61342b565b905082815260208101848484011115612823576128226138d1565b5b61282e848285613693565b509392505050565b60008135905061284581613f4c565b92915050565b60008135905061285a81613f63565b92915050565b60008135905061286f81613f7a565b92915050565b60008151905061288481613f7a565b92915050565b600082601f83011261289f5761289e6138cc565b5b81356128af8482602086016127b2565b91505092915050565b600082601f8301126128cd576128cc6138cc565b5b81356128dd8482602086016127f4565b91505092915050565b6000813590506128f581613f91565b92915050565b600060208284031215612911576129106138db565b5b600061291f84828501612836565b91505092915050565b6000806040838503121561293f5761293e6138db565b5b600061294d85828601612836565b925050602061295e85828601612836565b9150509250929050565b600080600060608486031215612981576129806138db565b5b600061298f86828701612836565b93505060206129a086828701612836565b92505060406129b1868287016128e6565b9150509250925092565b600080600080608085870312156129d5576129d46138db565b5b60006129e387828801612836565b94505060206129f487828801612836565b9350506040612a05878288016128e6565b925050606085013567ffffffffffffffff811115612a2657612a256138d6565b5b612a328782880161288a565b91505092959194509250565b60008060408385031215612a5557612a546138db565b5b6000612a6385828601612836565b9250506020612a748582860161284b565b9150509250929050565b60008060408385031215612a9557612a946138db565b5b6000612aa385828601612836565b9250506020612ab4858286016128e6565b9150509250929050565b600060208284031215612ad457612ad36138db565b5b6000612ae284828501612860565b91505092915050565b600060208284031215612b0157612b006138db565b5b6000612b0f84828501612875565b91505092915050565b600080600060608486031215612b3157612b306138db565b5b600084013567ffffffffffffffff811115612b4f57612b4e6138d6565b5b612b5b868287016128b8565b9350506020612b6c8682870161284b565b925050604084013567ffffffffffffffff811115612b8d57612b8c6138d6565b5b612b99868287016128b8565b9150509250925092565b600060208284031215612bb957612bb86138db565b5b6000612bc7848285016128e6565b91505092915050565b612bd98161361f565b82525050565b612be881613631565b82525050565b6000612bf9826134c7565b612c0381856134dd565b9350612c138185602086016136a2565b612c1c816138e0565b840191505092915050565b6000612c32826134d2565b612c3c81856134ee565b9350612c4c8185602086016136a2565b612c55816138e0565b840191505092915050565b6000612c6b826134d2565b612c7581856134ff565b9350612c858185602086016136a2565b80840191505092915050565b60008154612c9e816136d5565b612ca881866134ff565b94506001821660008114612cc35760018114612cd457612d07565b60ff19831686528186019350612d07565b612cdd856134b2565b60005b83811015612cff57815481890152600182019150602081019050612ce0565b838801955050505b50505092915050565b6000612d1d602b836134ee565b9150612d28826138f1565b604082019050919050565b6000612d406032836134ee565b9150612d4b82613940565b604082019050919050565b6000612d636026836134ee565b9150612d6e8261398f565b604082019050919050565b6000612d866025836134ee565b9150612d91826139de565b604082019050919050565b6000612da9601c836134ee565b9150612db482613a2d565b602082019050919050565b6000612dcc6024836134ee565b9150612dd782613a56565b604082019050919050565b6000612def6019836134ee565b9150612dfa82613aa5565b602082019050919050565b6000612e12601f836134ee565b9150612e1d82613ace565b602082019050919050565b6000612e356022836134ee565b9150612e4082613af7565b604082019050919050565b6000612e58602c836134ee565b9150612e6382613b46565b604082019050919050565b6000612e7b6038836134ee565b9150612e8682613b95565b604082019050919050565b6000612e9e602a836134ee565b9150612ea982613be4565b604082019050919050565b6000612ec16029836134ee565b9150612ecc82613c33565b604082019050919050565b6000612ee4602a836134ee565b9150612eef82613c82565b604082019050919050565b6000612f076020836134ee565b9150612f1282613cd1565b602082019050919050565b6000612f2a603d836134ee565b9150612f3582613cfa565b604082019050919050565b6000612f4d602c836134ee565b9150612f5882613d49565b604082019050919050565b6000612f706020836134ee565b9150612f7b82613d98565b602082019050919050565b6000612f936021836134ee565b9150612f9e82613dc1565b604082019050919050565b6000612fb6602f836134ee565b9150612fc182613e10565b604082019050919050565b6000612fd96021836134ee565b9150612fe482613e5f565b604082019050919050565b6000612ffc6031836134ee565b915061300782613eae565b604082019050919050565b600061301f602c836134ee565b915061302a82613efd565b604082019050919050565b61303e81613689565b82525050565b60006130508284612c60565b915081905092915050565b60006130678286612c60565b91506130738285612c60565b915061307f8284612c91565b9150819050949350505050565b60006020820190506130a16000830184612bd0565b92915050565b60006080820190506130bc6000830187612bd0565b6130c96020830186612bd0565b6130d66040830185613035565b81810360608301526130e88184612bee565b905095945050505050565b60006020820190506131086000830184612bdf565b92915050565b600060208201905081810360008301526131288184612c27565b905092915050565b6000602082019050818103600083015261314981612d10565b9050919050565b6000602082019050818103600083015261316981612d33565b9050919050565b6000602082019050818103600083015261318981612d56565b9050919050565b600060208201905081810360008301526131a981612d79565b9050919050565b600060208201905081810360008301526131c981612d9c565b9050919050565b600060208201905081810360008301526131e981612dbf565b9050919050565b6000602082019050818103600083015261320981612de2565b9050919050565b6000602082019050818103600083015261322981612e05565b9050919050565b6000602082019050818103600083015261324981612e28565b9050919050565b6000602082019050818103600083015261326981612e4b565b9050919050565b6000602082019050818103600083015261328981612e6e565b9050919050565b600060208201905081810360008301526132a981612e91565b9050919050565b600060208201905081810360008301526132c981612eb4565b9050919050565b600060208201905081810360008301526132e981612ed7565b9050919050565b6000602082019050818103600083015261330981612efa565b9050919050565b6000602082019050818103600083015261332981612f1d565b9050919050565b6000602082019050818103600083015261334981612f40565b9050919050565b6000602082019050818103600083015261336981612f63565b9050919050565b6000602082019050818103600083015261338981612f86565b9050919050565b600060208201905081810360008301526133a981612fa9565b9050919050565b600060208201905081810360008301526133c981612fcc565b9050919050565b600060208201905081810360008301526133e981612fef565b9050919050565b6000602082019050818103600083015261340981613012565b9050919050565b60006020820190506134256000830184613035565b92915050565b6000613435613446565b90506134418282613707565b919050565b6000604051905090565b600067ffffffffffffffff82111561346b5761346a61389d565b5b613474826138e0565b9050602081019050919050565b600067ffffffffffffffff82111561349c5761349b61389d565b5b6134a5826138e0565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061351582613689565b915061352083613689565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613555576135546137b2565b5b828201905092915050565b600061356b82613689565b915061357683613689565b925082613586576135856137e1565b5b828204905092915050565b600061359c82613689565b91506135a783613689565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156135e0576135df6137b2565b5b828202905092915050565b60006135f682613689565b915061360183613689565b925082821015613614576136136137b2565b5b828203905092915050565b600061362a82613669565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156136c05780820151818401526020810190506136a5565b838111156136cf576000848401525b50505050565b600060028204905060018216806136ed57607f821691505b6020821081141561370157613700613810565b5b50919050565b613710826138e0565b810181811067ffffffffffffffff8211171561372f5761372e61389d565b5b80604052505050565b600061374382613689565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613776576137756137b2565b5b600182019050919050565b600061378c82613689565b915061379783613689565b9250826137a7576137a66137e1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f53616c65206d7573742062652061637469766520746f206d696e7420546f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620746f6b656e7300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f546865206d65746164617461205552492069732066726f7a656e2e20596f752060008201527f63616e206e6f206c6f6e67657220736574207468652062617365555249000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4578636565646564206d6178206d696e7420706572207472616e73616374696f60008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b613f558161361f565b8114613f6057600080fd5b50565b613f6c81613631565b8114613f7757600080fd5b50565b613f838161363d565b8114613f8e57600080fd5b50565b613f9a81613689565b8114613fa557600080fd5b5056fea26469706673582212201ccfd124a6c057ce6166d7f6128b1c5e9d01b3f04687012112ed3349870f124764736f6c63430008070033

Deployed ByteCode Sourcemap

55222:2687:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55824:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22665:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24224:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23747:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40107:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24974:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39775:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56017:93;;;;;;;;;;;;;:::i;:::-;;25384:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40297:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22359:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22089:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36551:103;;;;;;;;;;;;;:::i;:::-;;55398:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35900:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56128:338;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22834:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24517:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25640:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57243:643;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56700:529;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55477:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56603:85;;;;;;;;;;;;;:::i;:::-;;24743:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55525:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36809:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55439:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55824:179;55935:4;55959:36;55983:11;55959:23;:36::i;:::-;55952:43;;55824:179;;;:::o;22665:100::-;22719:13;22752:5;22745:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22665:100;:::o;24224:221::-;24300:7;24328:16;24336:7;24328;:16::i;:::-;24320:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24413:15;:24;24429:7;24413:24;;;;;;;;;;;;;;;;;;;;;24406:31;;24224:221;;;:::o;23747:411::-;23828:13;23844:23;23859:7;23844:14;:23::i;:::-;23828:39;;23892:5;23886:11;;:2;:11;;;;23878:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23986:5;23970:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23995:37;24012:5;24019:12;:10;:12::i;:::-;23995:16;:37::i;:::-;23970:62;23948:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24129:21;24138:2;24142:7;24129:8;:21::i;:::-;23817:341;23747:411;;:::o;40107:113::-;40168:7;40195:10;:17;;;;40188:24;;40107:113;:::o;24974:339::-;25169:41;25188:12;:10;:12::i;:::-;25202:7;25169:18;:41::i;:::-;25161:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25277:28;25287:4;25293:2;25297:7;25277:9;:28::i;:::-;24974:339;;;:::o;39775:256::-;39872:7;39908:23;39925:5;39908:16;:23::i;:::-;39900:5;:31;39892:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;39997:12;:19;40010:5;39997:19;;;;;;;;;;;;;;;:26;40017:5;39997:26;;;;;;;;;;;;39990:33;;39775:256;;;;:::o;56017:93::-;36131:12;:10;:12::i;:::-;36120:23;;:7;:5;:7::i;:::-;:23;;;36112:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56090:12:::1;;;;;;;;;;;56089:13;56074:12;;:28;;;;;;;;;;;;;;;;;;56017:93::o:0;25384:185::-;25522:39;25539:4;25545:2;25549:7;25522:39;;;;;;;;;;;;:16;:39::i;:::-;25384:185;;;:::o;40297:233::-;40372:7;40408:30;:28;:30::i;:::-;40400:5;:38;40392:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;40505:10;40516:5;40505:17;;;;;;;;:::i;:::-;;;;;;;;;;40498:24;;40297:233;;;:::o;22359:239::-;22431:7;22451:13;22467:7;:16;22475:7;22467:16;;;;;;;;;;;;;;;;;;;;;22451:32;;22519:1;22502:19;;:5;:19;;;;22494:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22585:5;22578:12;;;22359:239;;;:::o;22089:208::-;22161:7;22206:1;22189:19;;:5;:19;;;;22181:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22273:9;:16;22283:5;22273:16;;;;;;;;;;;;;;;;22266:23;;22089:208;;;:::o;36551:103::-;36131:12;:10;:12::i;:::-;36120:23;;:7;:5;:7::i;:::-;:23;;;36112:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36616:30:::1;36643:1;36616:18;:30::i;:::-;36551:103::o:0;55398:34::-;;;;;;;;;;;;;:::o;35900:87::-;35946:7;35973:6;;;;;;;;;;;35966:13;;35900:87;:::o;56128:338::-;36131:12;:10;:12::i;:::-;36120:23;;:7;:5;:7::i;:::-;:23;;;36112:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56256:14:::1;;;;;;;;;;;56255:15;56247:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;56372:14;56347:22;;:39;;;;;;;;;;;;;;;;;;56416:8;56397:16;:27;;;;;;;;;;;;:::i;:::-;;56452:6;56435:14;:23;;;;;;;;;;;;:::i;:::-;;56128:338:::0;;;:::o;22834:104::-;22890:13;22923:7;22916:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22834:104;:::o;24517:155::-;24612:52;24631:12;:10;:12::i;:::-;24645:8;24655;24612:18;:52::i;:::-;24517:155;;:::o;25640:328::-;25815:41;25834:12;:10;:12::i;:::-;25848:7;25815:18;:41::i;:::-;25807:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25921:39;25935:4;25941:2;25945:7;25954:5;25921:13;:39::i;:::-;25640:328;;;;:::o;57243:643::-;57317:12;;;;;;;;;;;57309:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;55517:1;57387:14;:31;;57379:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;57509:10;;57491:14;57475:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:44;;57467:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;57607:9;57589:14;57585:1;:18;;;;:::i;:::-;:31;;57577:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;57670:6;57665:214;57686:14;57682:1;:18;57665:214;;;57722:14;57739:13;:11;:13::i;:::-;57722:30;;57787:10;;57771:13;:11;:13::i;:::-;:26;57767:101;;;57818:34;57828:12;:10;:12::i;:::-;57842:9;57818;:34::i;:::-;57767:101;57707:172;57702:3;;;;;:::i;:::-;;;;57665:214;;;;57243:643;:::o;56700:529::-;56773:13;56807:16;56815:7;56807;:16::i;:::-;56799:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;56892:21;56916:10;:8;:10::i;:::-;56892:34;;56941:22;;;;;;;;;;;56937:285;;;57011:1;56993:7;56987:21;:25;:109;;;;;;;;;;;;;;;;;57039:7;57048:25;57065:7;57048:16;:25::i;:::-;57075:14;57022:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56987:109;56980:116;;;;;56937:285;57168:1;57150:7;57144:21;:25;:66;;;;;;;;;;;;;;;;;57196:7;57179:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;57144:66;57137:73;;;56700:529;;;;:::o;55477:41::-;55517:1;55477:41;:::o;56603:85::-;36131:12;:10;:12::i;:::-;36120:23;;:7;:5;:7::i;:::-;:23;;;36112:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56676:4:::1;56659:14;;:21;;;;;;;;;;;;;;;;;;56603:85::o:0;24743:164::-;24840:4;24864:18;:25;24883:5;24864:25;;;;;;;;;;;;;;;:35;24890:8;24864:35;;;;;;;;;;;;;;;;;;;;;;;;;24857:42;;24743:164;;;;:::o;55525:32::-;;;;;;;;;;;;;:::o;36809:201::-;36131:12;:10;:12::i;:::-;36120:23;;:7;:5;:7::i;:::-;:23;;;36112:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36918:1:::1;36898:22;;:8;:22;;;;36890:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36974:28;36993:8;36974:18;:28::i;:::-;36809:201:::0;:::o;55439:31::-;;;;:::o;39467:224::-;39569:4;39608:35;39593:50;;;:11;:50;;;;:90;;;;39647:36;39671:11;39647:23;:36::i;:::-;39593:90;39586:97;;39467:224;;;:::o;27478:127::-;27543:4;27595:1;27567:30;;:7;:16;27575:7;27567:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27560:37;;27478:127;;;:::o;16932:98::-;16985:7;17012:10;17005:17;;16932:98;:::o;31624:174::-;31726:2;31699:15;:24;31715:7;31699:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31782:7;31778:2;31744:46;;31753:23;31768:7;31753:14;:23::i;:::-;31744:46;;;;;;;;;;;;31624:174;;:::o;27772:348::-;27865:4;27890:16;27898:7;27890;:16::i;:::-;27882:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27966:13;27982:23;27997:7;27982:14;:23::i;:::-;27966:39;;28035:5;28024:16;;:7;:16;;;:51;;;;28068:7;28044:31;;:20;28056:7;28044:11;:20::i;:::-;:31;;;28024:51;:87;;;;28079:32;28096:5;28103:7;28079:16;:32::i;:::-;28024:87;28016:96;;;27772:348;;;;:::o;30881:625::-;31040:4;31013:31;;:23;31028:7;31013:14;:23::i;:::-;:31;;;31005:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;31119:1;31105:16;;:2;:16;;;;31097:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31175:39;31196:4;31202:2;31206:7;31175:20;:39::i;:::-;31279:29;31296:1;31300:7;31279:8;:29::i;:::-;31340:1;31321:9;:15;31331:4;31321:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31369:1;31352:9;:13;31362:2;31352:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31400:2;31381:7;:16;31389:7;31381:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31439:7;31435:2;31420:27;;31429:4;31420:27;;;;;;;;;;;;31460:38;31480:4;31486:2;31490:7;31460:19;:38::i;:::-;30881:625;;;:::o;37170:191::-;37244:16;37263:6;;;;;;;;;;;37244:25;;37289:8;37280:6;;:17;;;;;;;;;;;;;;;;;;37344:8;37313:40;;37334:8;37313:40;;;;;;;;;;;;37233:128;37170:191;:::o;31940:315::-;32095:8;32086:17;;:5;:17;;;;32078:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32182:8;32144:18;:25;32163:5;32144:25;;;;;;;;;;;;;;;:35;32170:8;32144:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;32228:8;32206:41;;32221:5;32206:41;;;32238:8;32206:41;;;;;;:::i;:::-;;;;;;;;31940:315;;;:::o;26850:::-;27007:28;27017:4;27023:2;27027:7;27007:9;:28::i;:::-;27054:48;27077:4;27083:2;27087:7;27096:5;27054:22;:48::i;:::-;27046:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26850:315;;;;:::o;28462:110::-;28538:26;28548:2;28552:7;28538:26;;;;;;;;;;;;:9;:26::i;:::-;28462:110;;:::o;56474:117::-;56534:13;56567:16;56560:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56474:117;:::o;17517:723::-;17573:13;17803:1;17794:5;:10;17790:53;;;17821:10;;;;;;;;;;;;;;;;;;;;;17790:53;17853:12;17868:5;17853:20;;17884:14;17909:78;17924:1;17916:4;:9;17909:78;;17942:8;;;;;:::i;:::-;;;;17973:2;17965:10;;;;;:::i;:::-;;;17909:78;;;17997:19;18029:6;18019:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17997:39;;18047:154;18063:1;18054:5;:10;18047:154;;18091:1;18081:11;;;;;:::i;:::-;;;18158:2;18150:5;:10;;;;:::i;:::-;18137:2;:24;;;;:::i;:::-;18124:39;;18107:6;18114;18107:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18187:2;18178:11;;;;;:::i;:::-;;;18047:154;;;18225:6;18211:21;;;;;17517:723;;;;:::o;21720:305::-;21822:4;21874:25;21859:40;;;:11;:40;;;;:105;;;;21931:33;21916:48;;;:11;:48;;;;21859:105;:158;;;;21981:36;22005:11;21981:23;:36::i;:::-;21859:158;21839:178;;21720:305;;;:::o;55635:181::-;55763:45;55790:4;55796:2;55800:7;55763:26;:45::i;:::-;55635:181;;;:::o;34702:125::-;;;;:::o;32820:799::-;32975:4;32996:15;:2;:13;;;:15::i;:::-;32992:620;;;33048:2;33032:36;;;33069:12;:10;:12::i;:::-;33083:4;33089:7;33098:5;33032:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33028:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33291:1;33274:6;:13;:18;33270:272;;;33317:60;;;;;;;;;;:::i;:::-;;;;;;;;33270:272;33492:6;33486:13;33477:6;33473:2;33469:15;33462:38;33028:529;33165:41;;;33155:51;;;:6;:51;;;;33148:58;;;;;32992:620;33596:4;33589:11;;32820:799;;;;;;;:::o;28799:321::-;28929:18;28935:2;28939:7;28929:5;:18::i;:::-;28980:54;29011:1;29015:2;29019:7;29028:5;28980:22;:54::i;:::-;28958:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28799:321;;;:::o;20145:157::-;20230:4;20269:25;20254:40;;;:11;:40;;;;20247:47;;20145:157;;;:::o;41143:589::-;41287:45;41314:4;41320:2;41324:7;41287:26;:45::i;:::-;41365:1;41349:18;;:4;:18;;;41345:187;;;41384:40;41416:7;41384:31;:40::i;:::-;41345:187;;;41454:2;41446:10;;:4;:10;;;41442:90;;41473:47;41506:4;41512:7;41473:32;:47::i;:::-;41442:90;41345:187;41560:1;41546:16;;:2;:16;;;41542:183;;;41579:45;41616:7;41579:36;:45::i;:::-;41542:183;;;41652:4;41646:10;;:2;:10;;;41642:83;;41673:40;41701:2;41705:7;41673:27;:40::i;:::-;41642:83;41542:183;41143:589;;;:::o;8977:326::-;9037:4;9294:1;9272:7;:19;;;:23;9265:30;;8977:326;;;:::o;29456:439::-;29550:1;29536:16;;:2;:16;;;;29528:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29609:16;29617:7;29609;:16::i;:::-;29608:17;29600:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29671:45;29700:1;29704:2;29708:7;29671:20;:45::i;:::-;29746:1;29729:9;:13;29739:2;29729:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29777:2;29758:7;:16;29766:7;29758:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29822:7;29818:2;29797:33;;29814:1;29797:33;;;;;;;;;;;;29843:44;29871:1;29875:2;29879:7;29843:19;:44::i;:::-;29456:439;;:::o;34191:126::-;;;;:::o;42455:164::-;42559:10;:17;;;;42532:15;:24;42548:7;42532:24;;;;;;;;;;;:44;;;;42587:10;42603:7;42587:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42455:164;:::o;43246:988::-;43512:22;43562:1;43537:22;43554:4;43537:16;:22::i;:::-;:26;;;;:::i;:::-;43512:51;;43574:18;43595:17;:26;43613:7;43595:26;;;;;;;;;;;;43574:47;;43742:14;43728:10;:28;43724:328;;43773:19;43795:12;:18;43808:4;43795:18;;;;;;;;;;;;;;;:34;43814:14;43795:34;;;;;;;;;;;;43773:56;;43879:11;43846:12;:18;43859:4;43846:18;;;;;;;;;;;;;;;:30;43865:10;43846:30;;;;;;;;;;;:44;;;;43996:10;43963:17;:30;43981:11;43963:30;;;;;;;;;;;:43;;;;43758:294;43724:328;44148:17;:26;44166:7;44148:26;;;;;;;;;;;44141:33;;;44192:12;:18;44205:4;44192:18;;;;;;;;;;;;;;;:34;44211:14;44192:34;;;;;;;;;;;44185:41;;;43327:907;;43246:988;;:::o;44529:1079::-;44782:22;44827:1;44807:10;:17;;;;:21;;;;:::i;:::-;44782:46;;44839:18;44860:15;:24;44876:7;44860:24;;;;;;;;;;;;44839:45;;45211:19;45233:10;45244:14;45233:26;;;;;;;;:::i;:::-;;;;;;;;;;45211:48;;45297:11;45272:10;45283;45272:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;45408:10;45377:15;:28;45393:11;45377:28;;;;;;;;;;;:41;;;;45549:15;:24;45565:7;45549:24;;;;;;;;;;;45542:31;;;45584:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44600:1008;;;44529:1079;:::o;42033:221::-;42118:14;42135:20;42152:2;42135:16;:20::i;:::-;42118:37;;42193:7;42166:12;:16;42179:2;42166:16;;;;;;;;;;;;;;;:24;42183:6;42166:24;;;;;;;;;;;:34;;;;42240:6;42211:17;:26;42229:7;42211:26;;;;;;;;;;;:35;;;;42107:147;42033:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:973::-;6402:6;6410;6418;6467:2;6455:9;6446:7;6442:23;6438:32;6435:119;;;6473:79;;:::i;:::-;6435:119;6621:1;6610:9;6606:17;6593:31;6651:18;6643:6;6640:30;6637:117;;;6673:79;;:::i;:::-;6637:117;6778:63;6833:7;6824:6;6813:9;6809:22;6778:63;:::i;:::-;6768:73;;6564:287;6890:2;6916:50;6958:7;6949:6;6938:9;6934:22;6916:50;:::i;:::-;6906:60;;6861:115;7043:2;7032:9;7028:18;7015:32;7074:18;7066:6;7063:30;7060:117;;;7096:79;;:::i;:::-;7060:117;7201:63;7256:7;7247:6;7236:9;7232:22;7201:63;:::i;:::-;7191:73;;6986:288;6308:973;;;;;:::o;7287:329::-;7346:6;7395:2;7383:9;7374:7;7370:23;7366:32;7363:119;;;7401:79;;:::i;:::-;7363:119;7521:1;7546:53;7591:7;7582:6;7571:9;7567:22;7546:53;:::i;:::-;7536:63;;7492:117;7287:329;;;;:::o;7622:118::-;7709:24;7727:5;7709:24;:::i;:::-;7704:3;7697:37;7622:118;;:::o;7746:109::-;7827:21;7842:5;7827:21;:::i;:::-;7822:3;7815:34;7746:109;;:::o;7861:360::-;7947:3;7975:38;8007:5;7975:38;:::i;:::-;8029:70;8092:6;8087:3;8029:70;:::i;:::-;8022:77;;8108:52;8153:6;8148:3;8141:4;8134:5;8130:16;8108:52;:::i;:::-;8185:29;8207:6;8185:29;:::i;:::-;8180:3;8176:39;8169:46;;7951:270;7861:360;;;;:::o;8227:364::-;8315:3;8343:39;8376:5;8343:39;:::i;:::-;8398:71;8462:6;8457:3;8398:71;:::i;:::-;8391:78;;8478:52;8523:6;8518:3;8511:4;8504:5;8500:16;8478:52;:::i;:::-;8555:29;8577:6;8555:29;:::i;:::-;8550:3;8546:39;8539:46;;8319:272;8227:364;;;;:::o;8597:377::-;8703:3;8731:39;8764:5;8731:39;:::i;:::-;8786:89;8868:6;8863:3;8786:89;:::i;:::-;8779:96;;8884:52;8929:6;8924:3;8917:4;8910:5;8906:16;8884:52;:::i;:::-;8961:6;8956:3;8952:16;8945:23;;8707:267;8597:377;;;;:::o;9004:845::-;9107:3;9144:5;9138:12;9173:36;9199:9;9173:36;:::i;:::-;9225:89;9307:6;9302:3;9225:89;:::i;:::-;9218:96;;9345:1;9334:9;9330:17;9361:1;9356:137;;;;9507:1;9502:341;;;;9323:520;;9356:137;9440:4;9436:9;9425;9421:25;9416:3;9409:38;9476:6;9471:3;9467:16;9460:23;;9356:137;;9502:341;9569:38;9601:5;9569:38;:::i;:::-;9629:1;9643:154;9657:6;9654:1;9651:13;9643:154;;;9731:7;9725:14;9721:1;9716:3;9712:11;9705:35;9781:1;9772:7;9768:15;9757:26;;9679:4;9676:1;9672:12;9667:17;;9643:154;;;9826:6;9821:3;9817:16;9810:23;;9509:334;;9323:520;;9111:738;;9004:845;;;;:::o;9855:366::-;9997:3;10018:67;10082:2;10077:3;10018:67;:::i;:::-;10011:74;;10094:93;10183:3;10094:93;:::i;:::-;10212:2;10207:3;10203:12;10196:19;;9855:366;;;:::o;10227:::-;10369:3;10390:67;10454:2;10449:3;10390:67;:::i;:::-;10383:74;;10466:93;10555:3;10466:93;:::i;:::-;10584:2;10579:3;10575:12;10568:19;;10227:366;;;:::o;10599:::-;10741:3;10762:67;10826:2;10821:3;10762:67;:::i;:::-;10755:74;;10838:93;10927:3;10838:93;:::i;:::-;10956:2;10951:3;10947:12;10940:19;;10599:366;;;:::o;10971:::-;11113:3;11134:67;11198:2;11193:3;11134:67;:::i;:::-;11127:74;;11210:93;11299:3;11210:93;:::i;:::-;11328:2;11323:3;11319:12;11312:19;;10971:366;;;:::o;11343:::-;11485:3;11506:67;11570:2;11565:3;11506:67;:::i;:::-;11499:74;;11582:93;11671:3;11582:93;:::i;:::-;11700:2;11695:3;11691:12;11684:19;;11343:366;;;:::o;11715:::-;11857:3;11878:67;11942:2;11937:3;11878:67;:::i;:::-;11871:74;;11954:93;12043:3;11954:93;:::i;:::-;12072:2;12067:3;12063:12;12056:19;;11715:366;;;:::o;12087:::-;12229:3;12250:67;12314:2;12309:3;12250:67;:::i;:::-;12243:74;;12326:93;12415:3;12326:93;:::i;:::-;12444:2;12439:3;12435:12;12428:19;;12087:366;;;:::o;12459:::-;12601:3;12622:67;12686:2;12681:3;12622:67;:::i;:::-;12615:74;;12698:93;12787:3;12698:93;:::i;:::-;12816:2;12811:3;12807:12;12800:19;;12459:366;;;:::o;12831:::-;12973:3;12994:67;13058:2;13053:3;12994:67;:::i;:::-;12987:74;;13070:93;13159:3;13070:93;:::i;:::-;13188:2;13183:3;13179:12;13172:19;;12831:366;;;:::o;13203:::-;13345:3;13366:67;13430:2;13425:3;13366:67;:::i;:::-;13359:74;;13442:93;13531:3;13442:93;:::i;:::-;13560:2;13555:3;13551:12;13544:19;;13203:366;;;:::o;13575:::-;13717:3;13738:67;13802:2;13797:3;13738:67;:::i;:::-;13731:74;;13814:93;13903:3;13814:93;:::i;:::-;13932:2;13927:3;13923:12;13916:19;;13575:366;;;:::o;13947:::-;14089:3;14110:67;14174:2;14169:3;14110:67;:::i;:::-;14103:74;;14186:93;14275:3;14186:93;:::i;:::-;14304:2;14299:3;14295:12;14288:19;;13947:366;;;:::o;14319:::-;14461:3;14482:67;14546:2;14541:3;14482:67;:::i;:::-;14475:74;;14558:93;14647:3;14558:93;:::i;:::-;14676:2;14671:3;14667:12;14660:19;;14319:366;;;:::o;14691:::-;14833:3;14854:67;14918:2;14913:3;14854:67;:::i;:::-;14847:74;;14930:93;15019:3;14930:93;:::i;:::-;15048:2;15043:3;15039:12;15032:19;;14691:366;;;:::o;15063:::-;15205:3;15226:67;15290:2;15285:3;15226:67;:::i;:::-;15219:74;;15302:93;15391:3;15302:93;:::i;:::-;15420:2;15415:3;15411:12;15404:19;;15063:366;;;:::o;15435:::-;15577:3;15598:67;15662:2;15657:3;15598:67;:::i;:::-;15591:74;;15674:93;15763:3;15674:93;:::i;:::-;15792:2;15787:3;15783:12;15776:19;;15435:366;;;:::o;15807:::-;15949:3;15970:67;16034:2;16029:3;15970:67;:::i;:::-;15963:74;;16046:93;16135:3;16046:93;:::i;:::-;16164:2;16159:3;16155:12;16148:19;;15807:366;;;:::o;16179:::-;16321:3;16342:67;16406:2;16401:3;16342:67;:::i;:::-;16335:74;;16418:93;16507:3;16418:93;:::i;:::-;16536:2;16531:3;16527:12;16520:19;;16179:366;;;:::o;16551:::-;16693:3;16714:67;16778:2;16773:3;16714:67;:::i;:::-;16707:74;;16790:93;16879:3;16790:93;:::i;:::-;16908:2;16903:3;16899:12;16892:19;;16551:366;;;:::o;16923:::-;17065:3;17086:67;17150:2;17145:3;17086:67;:::i;:::-;17079:74;;17162:93;17251:3;17162:93;:::i;:::-;17280:2;17275:3;17271:12;17264:19;;16923:366;;;:::o;17295:::-;17437:3;17458:67;17522:2;17517:3;17458:67;:::i;:::-;17451:74;;17534:93;17623:3;17534:93;:::i;:::-;17652:2;17647:3;17643:12;17636:19;;17295:366;;;:::o;17667:::-;17809:3;17830:67;17894:2;17889:3;17830:67;:::i;:::-;17823:74;;17906:93;17995:3;17906:93;:::i;:::-;18024:2;18019:3;18015:12;18008:19;;17667:366;;;:::o;18039:::-;18181:3;18202:67;18266:2;18261:3;18202:67;:::i;:::-;18195:74;;18278:93;18367:3;18278:93;:::i;:::-;18396:2;18391:3;18387:12;18380:19;;18039:366;;;:::o;18411:118::-;18498:24;18516:5;18498:24;:::i;:::-;18493:3;18486:37;18411:118;;:::o;18535:275::-;18667:3;18689:95;18780:3;18771:6;18689:95;:::i;:::-;18682:102;;18801:3;18794:10;;18535:275;;;;:::o;18816:589::-;19041:3;19063:95;19154:3;19145:6;19063:95;:::i;:::-;19056:102;;19175:95;19266:3;19257:6;19175:95;:::i;:::-;19168:102;;19287:92;19375:3;19366:6;19287:92;:::i;:::-;19280:99;;19396:3;19389:10;;18816:589;;;;;;:::o;19411:222::-;19504:4;19542:2;19531:9;19527:18;19519:26;;19555:71;19623:1;19612:9;19608:17;19599:6;19555:71;:::i;:::-;19411:222;;;;:::o;19639:640::-;19834:4;19872:3;19861:9;19857:19;19849:27;;19886:71;19954:1;19943:9;19939:17;19930:6;19886:71;:::i;:::-;19967:72;20035:2;20024:9;20020:18;20011:6;19967:72;:::i;:::-;20049;20117:2;20106:9;20102:18;20093:6;20049:72;:::i;:::-;20168:9;20162:4;20158:20;20153:2;20142:9;20138:18;20131:48;20196:76;20267:4;20258:6;20196:76;:::i;:::-;20188:84;;19639:640;;;;;;;:::o;20285:210::-;20372:4;20410:2;20399:9;20395:18;20387:26;;20423:65;20485:1;20474:9;20470:17;20461:6;20423:65;:::i;:::-;20285:210;;;;:::o;20501:313::-;20614:4;20652:2;20641:9;20637:18;20629:26;;20701:9;20695:4;20691:20;20687:1;20676:9;20672:17;20665:47;20729:78;20802:4;20793:6;20729:78;:::i;:::-;20721:86;;20501:313;;;;:::o;20820:419::-;20986:4;21024:2;21013:9;21009:18;21001:26;;21073:9;21067:4;21063:20;21059:1;21048:9;21044:17;21037:47;21101:131;21227:4;21101:131;:::i;:::-;21093:139;;20820:419;;;:::o;21245:::-;21411:4;21449:2;21438:9;21434:18;21426:26;;21498:9;21492:4;21488:20;21484:1;21473:9;21469:17;21462:47;21526:131;21652:4;21526:131;:::i;:::-;21518:139;;21245:419;;;:::o;21670:::-;21836:4;21874:2;21863:9;21859:18;21851:26;;21923:9;21917:4;21913:20;21909:1;21898:9;21894:17;21887:47;21951:131;22077:4;21951:131;:::i;:::-;21943:139;;21670:419;;;:::o;22095:::-;22261:4;22299:2;22288:9;22284:18;22276:26;;22348:9;22342:4;22338:20;22334:1;22323:9;22319:17;22312:47;22376:131;22502:4;22376:131;:::i;:::-;22368:139;;22095:419;;;:::o;22520:::-;22686:4;22724:2;22713:9;22709:18;22701:26;;22773:9;22767:4;22763:20;22759:1;22748:9;22744:17;22737:47;22801:131;22927:4;22801:131;:::i;:::-;22793:139;;22520:419;;;:::o;22945:::-;23111:4;23149:2;23138:9;23134:18;23126:26;;23198:9;23192:4;23188:20;23184:1;23173:9;23169:17;23162:47;23226:131;23352:4;23226:131;:::i;:::-;23218:139;;22945:419;;;:::o;23370:::-;23536:4;23574:2;23563:9;23559:18;23551:26;;23623:9;23617:4;23613:20;23609:1;23598:9;23594:17;23587:47;23651:131;23777:4;23651:131;:::i;:::-;23643:139;;23370:419;;;:::o;23795:::-;23961:4;23999:2;23988:9;23984:18;23976:26;;24048:9;24042:4;24038:20;24034:1;24023:9;24019:17;24012:47;24076:131;24202:4;24076:131;:::i;:::-;24068:139;;23795:419;;;:::o;24220:::-;24386:4;24424:2;24413:9;24409:18;24401:26;;24473:9;24467:4;24463:20;24459:1;24448:9;24444:17;24437:47;24501:131;24627:4;24501:131;:::i;:::-;24493:139;;24220:419;;;:::o;24645:::-;24811:4;24849:2;24838:9;24834:18;24826:26;;24898:9;24892:4;24888:20;24884:1;24873:9;24869:17;24862:47;24926:131;25052:4;24926:131;:::i;:::-;24918:139;;24645:419;;;:::o;25070:::-;25236:4;25274:2;25263:9;25259:18;25251:26;;25323:9;25317:4;25313:20;25309:1;25298:9;25294:17;25287:47;25351:131;25477:4;25351:131;:::i;:::-;25343:139;;25070:419;;;:::o;25495:::-;25661:4;25699:2;25688:9;25684:18;25676:26;;25748:9;25742:4;25738:20;25734:1;25723:9;25719:17;25712:47;25776:131;25902:4;25776:131;:::i;:::-;25768:139;;25495:419;;;:::o;25920:::-;26086:4;26124:2;26113:9;26109:18;26101:26;;26173:9;26167:4;26163:20;26159:1;26148:9;26144:17;26137:47;26201:131;26327:4;26201:131;:::i;:::-;26193:139;;25920:419;;;:::o;26345:::-;26511:4;26549:2;26538:9;26534:18;26526:26;;26598:9;26592:4;26588:20;26584:1;26573:9;26569:17;26562:47;26626:131;26752:4;26626:131;:::i;:::-;26618:139;;26345:419;;;:::o;26770:::-;26936:4;26974:2;26963:9;26959:18;26951:26;;27023:9;27017:4;27013:20;27009:1;26998:9;26994:17;26987:47;27051:131;27177:4;27051:131;:::i;:::-;27043:139;;26770:419;;;:::o;27195:::-;27361:4;27399:2;27388:9;27384:18;27376:26;;27448:9;27442:4;27438:20;27434:1;27423:9;27419:17;27412:47;27476:131;27602:4;27476:131;:::i;:::-;27468:139;;27195:419;;;:::o;27620:::-;27786:4;27824:2;27813:9;27809:18;27801:26;;27873:9;27867:4;27863:20;27859:1;27848:9;27844:17;27837:47;27901:131;28027:4;27901:131;:::i;:::-;27893:139;;27620:419;;;:::o;28045:::-;28211:4;28249:2;28238:9;28234:18;28226:26;;28298:9;28292:4;28288:20;28284:1;28273:9;28269:17;28262:47;28326:131;28452:4;28326:131;:::i;:::-;28318:139;;28045:419;;;:::o;28470:::-;28636:4;28674:2;28663:9;28659:18;28651:26;;28723:9;28717:4;28713:20;28709:1;28698:9;28694:17;28687:47;28751:131;28877:4;28751:131;:::i;:::-;28743:139;;28470:419;;;:::o;28895:::-;29061:4;29099:2;29088:9;29084:18;29076:26;;29148:9;29142:4;29138:20;29134:1;29123:9;29119:17;29112:47;29176:131;29302:4;29176:131;:::i;:::-;29168:139;;28895:419;;;:::o;29320:::-;29486:4;29524:2;29513:9;29509:18;29501:26;;29573:9;29567:4;29563:20;29559:1;29548:9;29544:17;29537:47;29601:131;29727:4;29601:131;:::i;:::-;29593:139;;29320:419;;;:::o;29745:::-;29911:4;29949:2;29938:9;29934:18;29926:26;;29998:9;29992:4;29988:20;29984:1;29973:9;29969:17;29962:47;30026:131;30152:4;30026:131;:::i;:::-;30018:139;;29745:419;;;:::o;30170:::-;30336:4;30374:2;30363:9;30359:18;30351:26;;30423:9;30417:4;30413:20;30409:1;30398:9;30394:17;30387:47;30451:131;30577:4;30451:131;:::i;:::-;30443:139;;30170:419;;;:::o;30595:222::-;30688:4;30726:2;30715:9;30711:18;30703:26;;30739:71;30807:1;30796:9;30792:17;30783:6;30739:71;:::i;:::-;30595:222;;;;:::o;30823:129::-;30857:6;30884:20;;:::i;:::-;30874:30;;30913:33;30941:4;30933:6;30913:33;:::i;:::-;30823:129;;;:::o;30958:75::-;30991:6;31024:2;31018:9;31008:19;;30958:75;:::o;31039:307::-;31100:4;31190:18;31182:6;31179:30;31176:56;;;31212:18;;:::i;:::-;31176:56;31250:29;31272:6;31250:29;:::i;:::-;31242:37;;31334:4;31328;31324:15;31316:23;;31039:307;;;:::o;31352:308::-;31414:4;31504:18;31496:6;31493:30;31490:56;;;31526:18;;:::i;:::-;31490:56;31564:29;31586:6;31564:29;:::i;:::-;31556:37;;31648:4;31642;31638:15;31630:23;;31352:308;;;:::o;31666:141::-;31715:4;31738:3;31730:11;;31761:3;31758:1;31751:14;31795:4;31792:1;31782:18;31774:26;;31666:141;;;:::o;31813:98::-;31864:6;31898:5;31892:12;31882:22;;31813:98;;;:::o;31917:99::-;31969:6;32003:5;31997:12;31987:22;;31917:99;;;:::o;32022:168::-;32105:11;32139:6;32134:3;32127:19;32179:4;32174:3;32170:14;32155:29;;32022:168;;;;:::o;32196:169::-;32280:11;32314:6;32309:3;32302:19;32354:4;32349:3;32345:14;32330:29;;32196:169;;;;:::o;32371:148::-;32473:11;32510:3;32495:18;;32371:148;;;;:::o;32525:305::-;32565:3;32584:20;32602:1;32584:20;:::i;:::-;32579:25;;32618:20;32636:1;32618:20;:::i;:::-;32613:25;;32772:1;32704:66;32700:74;32697:1;32694:81;32691:107;;;32778:18;;:::i;:::-;32691:107;32822:1;32819;32815:9;32808:16;;32525:305;;;;:::o;32836:185::-;32876:1;32893:20;32911:1;32893:20;:::i;:::-;32888:25;;32927:20;32945:1;32927:20;:::i;:::-;32922:25;;32966:1;32956:35;;32971:18;;:::i;:::-;32956:35;33013:1;33010;33006:9;33001:14;;32836:185;;;;:::o;33027:348::-;33067:7;33090:20;33108:1;33090:20;:::i;:::-;33085:25;;33124:20;33142:1;33124:20;:::i;:::-;33119:25;;33312:1;33244:66;33240:74;33237:1;33234:81;33229:1;33222:9;33215:17;33211:105;33208:131;;;33319:18;;:::i;:::-;33208:131;33367:1;33364;33360:9;33349:20;;33027:348;;;;:::o;33381:191::-;33421:4;33441:20;33459:1;33441:20;:::i;:::-;33436:25;;33475:20;33493:1;33475:20;:::i;:::-;33470:25;;33514:1;33511;33508:8;33505:34;;;33519:18;;:::i;:::-;33505:34;33564:1;33561;33557:9;33549:17;;33381:191;;;;:::o;33578:96::-;33615:7;33644:24;33662:5;33644:24;:::i;:::-;33633:35;;33578:96;;;:::o;33680:90::-;33714:7;33757:5;33750:13;33743:21;33732:32;;33680:90;;;:::o;33776:149::-;33812:7;33852:66;33845:5;33841:78;33830:89;;33776:149;;;:::o;33931:126::-;33968:7;34008:42;34001:5;33997:54;33986:65;;33931:126;;;:::o;34063:77::-;34100:7;34129:5;34118:16;;34063:77;;;:::o;34146:154::-;34230:6;34225:3;34220;34207:30;34292:1;34283:6;34278:3;34274:16;34267:27;34146:154;;;:::o;34306:307::-;34374:1;34384:113;34398:6;34395:1;34392:13;34384:113;;;34483:1;34478:3;34474:11;34468:18;34464:1;34459:3;34455:11;34448:39;34420:2;34417:1;34413:10;34408:15;;34384:113;;;34515:6;34512:1;34509:13;34506:101;;;34595:1;34586:6;34581:3;34577:16;34570:27;34506:101;34355:258;34306:307;;;:::o;34619:320::-;34663:6;34700:1;34694:4;34690:12;34680:22;;34747:1;34741:4;34737:12;34768:18;34758:81;;34824:4;34816:6;34812:17;34802:27;;34758:81;34886:2;34878:6;34875:14;34855:18;34852:38;34849:84;;;34905:18;;:::i;:::-;34849:84;34670:269;34619:320;;;:::o;34945:281::-;35028:27;35050:4;35028:27;:::i;:::-;35020:6;35016:40;35158:6;35146:10;35143:22;35122:18;35110:10;35107:34;35104:62;35101:88;;;35169:18;;:::i;:::-;35101:88;35209:10;35205:2;35198:22;34988:238;34945:281;;:::o;35232:233::-;35271:3;35294:24;35312:5;35294:24;:::i;:::-;35285:33;;35340:66;35333:5;35330:77;35327:103;;;35410:18;;:::i;:::-;35327:103;35457:1;35450:5;35446:13;35439:20;;35232:233;;;:::o;35471:176::-;35503:1;35520:20;35538:1;35520:20;:::i;:::-;35515:25;;35554:20;35572:1;35554:20;:::i;:::-;35549:25;;35593:1;35583:35;;35598:18;;:::i;:::-;35583:35;35639:1;35636;35632:9;35627:14;;35471:176;;;;:::o;35653:180::-;35701:77;35698:1;35691:88;35798:4;35795:1;35788:15;35822:4;35819:1;35812:15;35839:180;35887:77;35884:1;35877:88;35984:4;35981:1;35974:15;36008:4;36005:1;35998:15;36025:180;36073:77;36070:1;36063:88;36170:4;36167:1;36160:15;36194:4;36191:1;36184:15;36211:180;36259:77;36256:1;36249:88;36356:4;36353:1;36346:15;36380:4;36377:1;36370:15;36397:180;36445:77;36442:1;36435:88;36542:4;36539:1;36532:15;36566:4;36563:1;36556:15;36583:180;36631:77;36628:1;36621:88;36728:4;36725:1;36718:15;36752:4;36749:1;36742:15;36769:117;36878:1;36875;36868:12;36892:117;37001:1;36998;36991:12;37015:117;37124:1;37121;37114:12;37138:117;37247:1;37244;37237:12;37261:102;37302:6;37353:2;37349:7;37344:2;37337:5;37333:14;37329:28;37319:38;;37261:102;;;:::o;37369:230::-;37509:34;37505:1;37497:6;37493:14;37486:58;37578:13;37573:2;37565:6;37561:15;37554:38;37369:230;:::o;37605:237::-;37745:34;37741:1;37733:6;37729:14;37722:58;37814:20;37809:2;37801:6;37797:15;37790:45;37605:237;:::o;37848:225::-;37988:34;37984:1;37976:6;37972:14;37965:58;38057:8;38052:2;38044:6;38040:15;38033:33;37848:225;:::o;38079:224::-;38219:34;38215:1;38207:6;38203:14;38196:58;38288:7;38283:2;38275:6;38271:15;38264:32;38079:224;:::o;38309:178::-;38449:30;38445:1;38437:6;38433:14;38426:54;38309:178;:::o;38493:223::-;38633:34;38629:1;38621:6;38617:14;38610:58;38702:6;38697:2;38689:6;38685:15;38678:31;38493:223;:::o;38722:175::-;38862:27;38858:1;38850:6;38846:14;38839:51;38722:175;:::o;38903:181::-;39043:33;39039:1;39031:6;39027:14;39020:57;38903:181;:::o;39090:221::-;39230:34;39226:1;39218:6;39214:14;39207:58;39299:4;39294:2;39286:6;39282:15;39275:29;39090:221;:::o;39317:231::-;39457:34;39453:1;39445:6;39441:14;39434:58;39526:14;39521:2;39513:6;39509:15;39502:39;39317:231;:::o;39554:243::-;39694:34;39690:1;39682:6;39678:14;39671:58;39763:26;39758:2;39750:6;39746:15;39739:51;39554:243;:::o;39803:229::-;39943:34;39939:1;39931:6;39927:14;39920:58;40012:12;40007:2;39999:6;39995:15;39988:37;39803:229;:::o;40038:228::-;40178:34;40174:1;40166:6;40162:14;40155:58;40247:11;40242:2;40234:6;40230:15;40223:36;40038:228;:::o;40272:229::-;40412:34;40408:1;40400:6;40396:14;40389:58;40481:12;40476:2;40468:6;40464:15;40457:37;40272:229;:::o;40507:182::-;40647:34;40643:1;40635:6;40631:14;40624:58;40507:182;:::o;40695:248::-;40835:34;40831:1;40823:6;40819:14;40812:58;40904:31;40899:2;40891:6;40887:15;40880:56;40695:248;:::o;40949:231::-;41089:34;41085:1;41077:6;41073:14;41066:58;41158:14;41153:2;41145:6;41141:15;41134:39;40949:231;:::o;41186:182::-;41326:34;41322:1;41314:6;41310:14;41303:58;41186:182;:::o;41374:220::-;41514:34;41510:1;41502:6;41498:14;41491:58;41583:3;41578:2;41570:6;41566:15;41559:28;41374:220;:::o;41600:234::-;41740:34;41736:1;41728:6;41724:14;41717:58;41809:17;41804:2;41796:6;41792:15;41785:42;41600:234;:::o;41840:220::-;41980:34;41976:1;41968:6;41964:14;41957:58;42049:3;42044:2;42036:6;42032:15;42025:28;41840:220;:::o;42066:236::-;42206:34;42202:1;42194:6;42190:14;42183:58;42275:19;42270:2;42262:6;42258:15;42251:44;42066:236;:::o;42308:231::-;42448:34;42444:1;42436:6;42432:14;42425:58;42517:14;42512:2;42504:6;42500:15;42493:39;42308:231;:::o;42545:122::-;42618:24;42636:5;42618:24;:::i;:::-;42611:5;42608:35;42598:63;;42657:1;42654;42647:12;42598:63;42545:122;:::o;42673:116::-;42743:21;42758:5;42743:21;:::i;:::-;42736:5;42733:32;42723:60;;42779:1;42776;42769:12;42723:60;42673:116;:::o;42795:120::-;42867:23;42884:5;42867:23;:::i;:::-;42860:5;42857:34;42847:62;;42905:1;42902;42895:12;42847:62;42795:120;:::o;42921:122::-;42994:24;43012:5;42994:24;:::i;:::-;42987:5;42984:35;42974:63;;43033:1;43030;43023:12;42974:63;42921:122;:::o

Swarm Source

ipfs://1ccfd124a6c057ce6166d7f6128b1c5e9d01b3f04687012112ed3349870f1247
Loading