Token LazyGopher

Overview CRC721

Total Supply:
6,102 Gopher

Holders:
73 addresses
Balance
10 Gopher
0x6fa9fec3196b0f7dd116eca768d33865ed2db648
Loading
[ Download CSV Export  ] 
Loading
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
LazyGopherNFT

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: GPL-3.0
// File: @openzeppelin/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


// 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: @openzeppelin/contracts/utils/Address.sol


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

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: SMSC.sol



pragma solidity ^0.8.4;

interface IERC20 {
    function totalSupply() external view returns (uint256);

    function decimals() external view returns (uint8);

    function symbol() external view returns (string memory);

    function name() external view returns (string memory);

    function getOwner() external view returns (address);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address recipient, uint256 amount) external returns (bool);

    function allowance(address _owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);
}



error TransferToNonERC721ReceiverImplementer();

contract Ownable {
    address public owner;

    constructor() {
        owner = msg.sender;
    }

    // ownership
    modifier onlyOwner() {
        require(msg.sender == owner, "ERROR! Access denied");
        _;
    }

    function transferOwnership(address _newOwner) external onlyOwner {
        owner = _newOwner;
    }

    function renounceOwnership() external onlyOwner {
        owner = address(0);
    }
}

contract LazyGopherNFT is IERC721, Ownable {
    using Address for address;
    using Strings for uint256;

    string private _name = "LazyGopher";
    string private _symbol = "Gopher";

    uint16 public devSupply = 500;
    uint16 public pubsaleSupply = 5600;
    uint16 public pubsaledAmount;
    uint16 public totalSupply;
    uint8 public limitPerAddress = 100;

    bool public revealed;

    bool public pubsaleOpen;

    uint256 public cost = 300 ether;
    uint256 internal _currentIndex = 1;

    mapping(address => uint256) private _balances;
    mapping(uint256 => address) public ownership;
    mapping(address => uint256) public addressMints;

    string public baseURI;
    string public norevealedURI;
    string public baseExtension;

    mapping(uint256 => address) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    modifier onlyTokenOwner(uint256 tokenId) {
        require(
            ownerOf(tokenId) == msg.sender,
            "ERROR! You must be the token owner"
        );
        _;
    }

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

    function getApproved(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        require(
            tokenId <= totalSupply,
            "ERC721: approved query for nonexistent token"
        );

        return _tokenApprovals[tokenId];
    }

    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        _setApprovalForAll(msg.sender, operator, approved);
    }

    function isApprovedForAll(address owner, address operator)
        public
        view
        virtual
        override
        returns (bool)
    {
        return _operatorApprovals[owner][operator];
    }

    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ownerOf(tokenId), to, tokenId);
    }

    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);
    }

    function setCost(uint256 _cost) external onlyOwner {
        cost = _cost;
    }

    function setLimitPerAddress(uint8 _limit) external onlyOwner {
        limitPerAddress = _limit;
    }

    function startPubsale() external onlyOwner {
        pubsaleOpen = true;
    }

    function endPubsale() external onlyOwner {
        pubsaleOpen = false;
    }

    function balanceOf(address owner) public view override returns (uint256) {
        return _balances[owner];
    }

    function ownerOf(uint256 tokenId) public view override returns (address) {
        if (tokenId >= _currentIndex) {
            return address(0);
        }

        uint256 id = tokenId;
        while (id > 1 && ownership[id] == address(0)) {
            id -= 1;
        }
        return ownership[id];
    }

    function premint(address to, uint amount)
        external
        payable
        onlyOwner
    {
        for (uint256 i = 0; i < amount; i += 1) {
            emit Transfer(address(0), to, _currentIndex + i);
        }

        ownership[_currentIndex] = to;
        _mint(to, amount);

        totalSupply += uint16(amount);
    }

    function mint(uint256 amount) external payable {
        require(
            addressMints[msg.sender] + amount <= limitPerAddress,
            "ERROR: NFT limit"
        );
        require(pubsaledAmount + amount <= pubsaleSupply, "Invalid amount");
        require(pubsaleOpen, "Pubsale is not open");

        uint256 totalCost = cost * amount;
        require(msg.value >= totalCost, "Insufficient payment");

        if (msg.value > totalCost) {
            payable(msg.sender).transfer(msg.value - totalCost);
        }

        for (uint256 i = 0; i < amount; i += 1) {
            emit Transfer(address(0), msg.sender, _currentIndex + i);
        }

        ownership[_currentIndex] = msg.sender;
        _mint(msg.sender, amount);

        pubsaledAmount += uint8(amount);
        totalSupply += uint8(amount);
    }

    function _mint(address to, uint256 amount) internal {
        _balances[to] += amount;
        addressMints[to] += amount;
        _currentIndex += amount;
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        safeTransferFrom(from, to, tokenId, "");
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);

        if (!_checkOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    function migrate(uint[] memory ids_, address[] memory owners_, uint max_) external onlyOwner {
        uint tokenId = ids_[0];
        uint i = 0;

        uint amount = max_ - tokenId + 1;
        _currentIndex += uint16(amount);
        totalSupply += uint16(amount);

        while (i < ids_.length && tokenId <= max_) {
            ownership[tokenId] = owners_[i];
            emit Transfer(address(0), owners_[i], tokenId);
            tokenId += 1;

            _balances[owners_[i]] += 1;
            addressMints[owners_[i]] += 1;

            if (i + 1 < ids_.length && tokenId >= ids_[i + 1]) {
                i += 1;
            }
        }
    }

    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal {
        address preOwner = ownerOf(tokenId);

        require(from != to, "You cannot transfer to yourself");
        require(from == preOwner, "Invalid from address");
        require(
            msg.sender == preOwner ||
                isApprovedForAll(preOwner, msg.sender) ||
                getApproved(tokenId) == msg.sender,
            "Access denied"
        );

        _approve(address(0), tokenId);

        ownership[tokenId] = to;

        uint256 nextId = tokenId + 1;

        if (ownership[nextId] == address(0) && nextId < _currentIndex) {
            ownership[nextId] = preOwner;
        }

        _balances[preOwner] -= 1;
        _balances[to] += 1;

        emit Transfer(from, to, tokenId);
    }

    function tokenURI(uint256 tokenId) public view returns (string memory) {
        require(
            tokenId <= totalSupply,
            "ERC721Metadata: URI query for nonexistent token"
        );

        if (revealed == false) {
            return norevealedURI;
        }

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

    function setBaseURI(string memory _baseURI) external onlyOwner {
        baseURI = _baseURI;
    }

    function setUnrevealedURI(string memory _uri) external onlyOwner {
        norevealedURI = _uri;
    }

    function setBaseExtension(string memory _ext) external onlyOwner {
        baseExtension = _ext;
    }

    function setPubsaleSupply(uint16 _amount) external onlyOwner {
        pubsaleSupply = _amount;
    }

    function setDevSupply(uint16 _amount) external onlyOwner {
        devSupply = _amount;
    }

    function reveal() external onlyOwner {
        revealed = true;
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            interfaceId == type(IERC165).interfaceId;
    }

    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try
                IERC721Receiver(to).onERC721Received(
                    msg.sender,
                    from,
                    tokenId,
                    _data
                )
            returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert TransferToNonERC721ReceiverImplementer();
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    function withdraw(address payable to) external onlyOwner {
        Address.sendValue(to, address(this).balance);
    }

    function recoverToken(address token, address to) external onlyOwner {
        IERC20(token).transfer(to, IERC20(token).balanceOf(address(this)));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMints","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":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endPubsale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitPerAddress","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids_","type":"uint256[]"},{"internalType":"address[]","name":"owners_","type":"address[]"},{"internalType":"uint256","name":"max_","type":"uint256"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"norevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownership","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"premint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"pubsaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pubsaleSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pubsaledAmount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"recoverToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_ext","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_amount","type":"uint16"}],"name":"setDevSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_limit","type":"uint8"}],"name":"setLimitPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_amount","type":"uint16"}],"name":"setPubsaleSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setUnrevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPubsale","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c0604052600a6080819052692630bd3ca3b7b83432b960b11b60a09081526200002d9160019190620000b3565b506040805180820190915260068082526523b7b83432b960d11b60209092019182526200005d91600291620000b3565b506003805468ff00000000ffffffff191668640000000015e001f4179055681043561a882930000060045560016005553480156200009a57600080fd5b50600080546001600160a01b0319163317905562000196565b828054620000c19062000159565b90600052602060002090601f016020900481019282620000e5576000855562000130565b82601f106200010057805160ff191683800117855562000130565b8280016001018555821562000130579182015b828111156200013057825182559160200191906001019062000113565b506200013e92915062000142565b5090565b5b808211156200013e576000815560010162000143565b600181811c908216806200016e57607f821691505b602082108114156200019057634e487b7160e01b600052602260045260246000fd5b50919050565b6128b180620001a66000396000f3fe6080604052600436106102675760003560e01c8063715018a611610144578063a475b5dd116100b6578063cfbe73551161007a578063cfbe735514610751578063da3ef23f14610771578063e985e9c514610791578063f2fde38b146107b1578063fe2c7fee146107d1578063feaea586146107f157600080fd5b8063a475b5dd146106d2578063b584b78d146106e7578063b88d4fde146106fc578063c66828621461071c578063c87b56dd1461073157600080fd5b8063964c33b511610108578063964c33b5146105f85780639c3e73c314610625578063a0712d6814610646578063a0f45b6914610659578063a205ea421461068f578063a22cb465146106b257600080fd5b8063715018a6146105795780637c1d352d1461058e5780638611244c146105ae5780638da5cb5b146105c357806395d89b41146105e357600080fd5b806341c66d0a116101dd57806351cff8d9116101a157806351cff8d9146104ae57806355f804b3146104ce5780636352211e146104ee5780636833a2281461050e5780636c0360eb1461052e57806370a082311461054357600080fd5b806341c66d0a1461041157806342842e0e1461042c57806342ca1d091461044c57806344a0d68a1461046d578063518302271461048d57600080fd5b806313faede61161022f57806313faede61461033257806318160ddd1461035657806323b872dd1461038b5780632a484ad4146103ab5780632b5e3e26146103de57806335eb8bae146103f157600080fd5b806301ffc9a71461026c57806303a17969146102a157806306fdde03146102b8578063081812fc146102da578063095ea7b314610312575b600080fd5b34801561027857600080fd5b5061028c610287366004612410565b610811565b60405190151581526020015b60405180910390f35b3480156102ad57600080fd5b506102b6610863565b005b3480156102c457600080fd5b506102cd6108a5565b604051610298919061262c565b3480156102e657600080fd5b506102fa6102f53660046124b0565b610937565b6040516001600160a01b039091168152602001610298565b34801561031e57600080fd5b506102b661032d366004612306565b6109c8565b34801561033e57600080fd5b5061034860045481565b604051908152602001610298565b34801561036257600080fd5b5060035461037890600160301b900461ffff1681565b60405161ffff9091168152602001610298565b34801561039757600080fd5b506102b66103a636600461221c565b610ade565b3480156103b757600080fd5b506003546103cc90600160401b900460ff1681565b60405160ff9091168152602001610298565b6102b66103ec366004612306565b610ae9565b3480156103fd57600080fd5b506102b661040c366004612331565b610bd4565b34801561041d57600080fd5b506003546103789061ffff1681565b34801561043857600080fd5b506102b661044736600461221c565b610ea6565b34801561045857600080fd5b506003546103789062010000900461ffff1681565b34801561047957600080fd5b506102b66104883660046124b0565b610ec1565b34801561049957600080fd5b5060035461028c90600160481b900460ff1681565b3480156104ba57600080fd5b506102b66104c93660046121c8565b610ef0565b3480156104da57600080fd5b506102b66104e9366004612448565b610f27565b3480156104fa57600080fd5b506102fa6105093660046124b0565b610f68565b34801561051a57600080fd5b506102b66105293660046124e0565b610fd7565b34801561053a57600080fd5b506102cd611026565b34801561054f57600080fd5b5061034861055e3660046121c8565b6001600160a01b031660009081526006602052604090205490565b34801561058557600080fd5b506102b66110b4565b34801561059a57600080fd5b506102b66105a936600461248e565b6110f0565b3480156105ba57600080fd5b506102b6611132565b3480156105cf57600080fd5b506000546102fa906001600160a01b031681565b3480156105ef57600080fd5b506102cd611171565b34801561060457600080fd5b506103486106133660046121c8565b60086020526000908152604090205481565b34801561063157600080fd5b5060035461028c90600160501b900460ff1681565b6102b66106543660046124b0565b611180565b34801561066557600080fd5b506102fa6106743660046124b0565b6007602052600090815260409020546001600160a01b031681565b34801561069b57600080fd5b5060035461037890640100000000900461ffff1681565b3480156106be57600080fd5b506102b66106cd3660046122d9565b611408565b3480156106de57600080fd5b506102b6611413565b3480156106f357600080fd5b506102cd611458565b34801561070857600080fd5b506102b661071736600461225c565b611465565b34801561072857600080fd5b506102cd61149f565b34801561073d57600080fd5b506102cd61074c3660046124b0565b6114ac565b34801561075d57600080fd5b506102b661076c36600461248e565b6116a9565b34801561077d57600080fd5b506102b661078c366004612448565b6116f3565b34801561079d57600080fd5b5061028c6107ac3660046121e4565b611730565b3480156107bd57600080fd5b506102b66107cc3660046121c8565b61175e565b3480156107dd57600080fd5b506102b66107ec366004612448565b6117aa565b3480156107fd57600080fd5b506102b661080c3660046121e4565b6117e7565b60006001600160e01b031982166380ac58cd60e01b148061084257506001600160e01b03198216635b5e139f60e01b145b8061085d57506001600160e01b031982166301ffc9a760e01b145b92915050565b6000546001600160a01b031633146108965760405162461bcd60e51b815260040161088d9061263f565b60405180910390fd5b6003805460ff60501b19169055565b6060600180546108b490612776565b80601f01602080910402602001604051908101604052809291908181526020018280546108e090612776565b801561092d5780601f106109025761010080835404028352916020019161092d565b820191906000526020600020905b81548152906001019060200180831161091057829003601f168201915b5050505050905090565b600354600090600160301b900461ffff168211156109ac5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161088d565b506000908152600c60205260409020546001600160a01b031690565b60006109d382610f68565b9050806001600160a01b0316836001600160a01b03161415610a415760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161088d565b336001600160a01b0382161480610a5d5750610a5d8133611730565b610acf5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161088d565b610ad98383611910565b505050565b610ad983838361197e565b6000546001600160a01b03163314610b135760405162461bcd60e51b815260040161088d9061263f565b60005b81811015610b625780600554610b2c91906126e8565b6040516001600160a01b0385169060009060008051602061285c833981519152908290a4610b5b6001826126e8565b9050610b16565b50600554600090815260076020526040902080546001600160a01b0319166001600160a01b038416179055610b978282611bd7565b80600360068282829054906101000a900461ffff16610bb691906126c2565b92506101000a81548161ffff021916908361ffff1602179055505050565b6000546001600160a01b03163314610bfe5760405162461bcd60e51b815260040161088d9061263f565b600083600081518110610c2157634e487b7160e01b600052603260045260246000fd5b602002602001015190506000808284610c3a9190612733565b610c459060016126e8565b90508061ffff1660056000828254610c5d91906126e8565b909155505060038054829190600690610c82908490600160301b900461ffff166126c2565b92506101000a81548161ffff021916908361ffff1602179055505b855182108015610cad5750838311155b15610e9e57848281518110610cd257634e487b7160e01b600052603260045260246000fd5b60200260200101516007600085815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555082858381518110610d3257634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031660006001600160a01b031660008051602061285c83398151915260405160405180910390a4610d736001846126e8565b9250600160066000878581518110610d9b57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000828254610dd291906126e8565b92505081905550600160086000878581518110610dff57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000828254610e3691906126e8565b90915550508551610e488360016126e8565b108015610e86575085610e5c8360016126e8565b81518110610e7a57634e487b7160e01b600052603260045260246000fd5b60200260200101518310155b15610e9957610e966001836126e8565b91505b610c9d565b505050505050565b610ad983838360405180602001604052806000815250611465565b6000546001600160a01b03163314610eeb5760405162461bcd60e51b815260040161088d9061263f565b600455565b6000546001600160a01b03163314610f1a5760405162461bcd60e51b815260040161088d9061263f565b610f248147611c4e565b50565b6000546001600160a01b03163314610f515760405162461bcd60e51b815260040161088d9061263f565b8051610f6490600990602084019061205f565b5050565b60006005548210610f7b57506000919050565b815b600181118015610fa257506000818152600760205260409020546001600160a01b0316155b15610fb957610fb2600182612733565b9050610f7d565b6000908152600760205260409020546001600160a01b031692915050565b6000546001600160a01b031633146110015760405162461bcd60e51b815260040161088d9061263f565b6003805460ff909216600160401b0268ff000000000000000019909216919091179055565b6009805461103390612776565b80601f016020809104026020016040519081016040528092919081815260200182805461105f90612776565b80156110ac5780601f10611081576101008083540402835291602001916110ac565b820191906000526020600020905b81548152906001019060200180831161108f57829003601f168201915b505050505081565b6000546001600160a01b031633146110de5760405162461bcd60e51b815260040161088d9061263f565b600080546001600160a01b0319169055565b6000546001600160a01b0316331461111a5760405162461bcd60e51b815260040161088d9061263f565b6003805461ffff191661ffff92909216919091179055565b6000546001600160a01b0316331461115c5760405162461bcd60e51b815260040161088d9061263f565b6003805460ff60501b1916600160501b179055565b6060600280546108b490612776565b60035433600090815260086020526040902054600160401b90910460ff16906111aa9083906126e8565b11156111eb5760405162461bcd60e51b815260206004820152601060248201526f11549493d48e88139195081b1a5b5a5d60821b604482015260640161088d565b60035461ffff62010000820481169161120e9184916401000000009004166126e8565b111561124d5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b604482015260640161088d565b600354600160501b900460ff1661129c5760405162461bcd60e51b8152602060048201526013602482015272283ab139b0b6329034b9903737ba1037b832b760691b604482015260640161088d565b6000816004546112ac9190612714565b9050803410156112f55760405162461bcd60e51b8152602060048201526014602482015273125b9cdd59999a58da595b9d081c185e5b595b9d60621b604482015260640161088d565b8034111561133557336108fc61130b8334612733565b6040518115909202916000818181858888f19350505050158015611333573d6000803e3d6000fd5b505b60005b8281101561137b578060055461134e91906126e8565b604051339060009060008051602061285c833981519152908290a46113746001826126e8565b9050611338565b50600554600090815260076020526040902080546001600160a01b031916339081179091556113aa9083611bd7565b8160ff16600360048282829054906101000a900461ffff166113cc91906126c2565b92506101000a81548161ffff021916908361ffff1602179055508160ff16600360068282829054906101000a900461ffff16610bb691906126c2565b610f64338383611d67565b6000546001600160a01b0316331461143d5760405162461bcd60e51b815260040161088d9061263f565b6003805469ff0000000000000000001916600160481b179055565b600a805461103390612776565b61147084848461197e565b61147c84848484611e36565b611499576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b600b805461103390612776565b600354606090600160301b900461ffff168211156115245760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161088d565b600354600160481b900460ff166115c757600a805461154290612776565b80601f016020809104026020016040519081016040528092919081815260200182805461156e90612776565b80156115bb5780601f10611590576101008083540402835291602001916115bb565b820191906000526020600020905b81548152906001019060200180831161159e57829003601f168201915b50505050509050919050565b6000600980546115d690612776565b80601f016020809104026020016040519081016040528092919081815260200182805461160290612776565b801561164f5780601f106116245761010080835404028352916020019161164f565b820191906000526020600020905b81548152906001019060200180831161163257829003601f168201915b50505050509050600081511161167457604051806020016040528060008152506116a2565b8061167e84611f45565b600b6040516020016116929392919061252d565b6040516020818303038152906040525b9392505050565b6000546001600160a01b031633146116d35760405162461bcd60e51b815260040161088d9061263f565b6003805461ffff909216620100000263ffff000019909216919091179055565b6000546001600160a01b0316331461171d5760405162461bcd60e51b815260040161088d9061263f565b8051610f6490600b90602084019061205f565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205460ff1690565b6000546001600160a01b031633146117885760405162461bcd60e51b815260040161088d9061263f565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146117d45760405162461bcd60e51b815260040161088d9061263f565b8051610f6490600a90602084019061205f565b6000546001600160a01b031633146118115760405162461bcd60e51b815260040161088d9061263f565b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a082319060240160206040518083038186803b15801561185a57600080fd5b505afa15801561186e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189291906124c8565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156118d857600080fd5b505af11580156118ec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad991906123f4565b6000818152600c6020526040902080546001600160a01b0319166001600160a01b038416908117909155819061194582610f68565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061198982610f68565b9050826001600160a01b0316846001600160a01b031614156119ed5760405162461bcd60e51b815260206004820152601f60248201527f596f752063616e6e6f74207472616e7366657220746f20796f757273656c6600604482015260640161088d565b806001600160a01b0316846001600160a01b031614611a455760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642066726f6d206164647265737360601b604482015260640161088d565b336001600160a01b0382161480611a615750611a618133611730565b80611a7c575033611a7183610937565b6001600160a01b0316145b611ab85760405162461bcd60e51b815260206004820152600d60248201526c1058d8d95cdcc819195b9a5959609a1b604482015260640161088d565b611ac3600083611910565b600082815260076020526040812080546001600160a01b0319166001600160a01b038616179055611af58360016126e8565b6000818152600760205260409020549091506001600160a01b0316158015611b1e575060055481105b15611b4b57600081815260076020526040902080546001600160a01b0319166001600160a01b0384161790555b6001600160a01b0382166000908152600660205260408120805460019290611b74908490612733565b90915550506001600160a01b0384166000908152600660205260408120805460019290611ba29084906126e8565b909155505060405183906001600160a01b03808716919088169060008051602061285c83398151915290600090a45050505050565b6001600160a01b03821660009081526006602052604081208054839290611bff9084906126e8565b90915550506001600160a01b03821660009081526008602052604081208054839290611c2c9084906126e8565b925050819055508060056000828254611c4591906126e8565b90915550505050565b80471015611c9e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161088d565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611ceb576040519150601f19603f3d011682016040523d82523d6000602084013e611cf0565b606091505b5050905080610ad95760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161088d565b816001600160a01b0316836001600160a01b03161415611dc95760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161088d565b6001600160a01b038381166000818152600d6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60006001600160a01b0384163b15611f3957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611e7a9033908990889088906004016125ef565b602060405180830381600087803b158015611e9457600080fd5b505af1925050508015611ec4575060408051601f3d908101601f19168201909252611ec19181019061242c565b60015b611f1f573d808015611ef2576040519150601f19603f3d011682016040523d82523d6000602084013e611ef7565b606091505b508051611f17576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611f3d565b5060015b949350505050565b606081611f695750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611f935780611f7d816127b1565b9150611f8c9050600a83612700565b9150611f6d565b60008167ffffffffffffffff811115611fbc57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611fe6576020820181803683370190505b5090505b8415611f3d57611ffb600183612733565b9150612008600a866127cc565b6120139060306126e8565b60f81b81838151811061203657634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612058600a86612700565b9450611fea565b82805461206b90612776565b90600052602060002090601f01602090048101928261208d57600085556120d3565b82601f106120a657805160ff19168380011785556120d3565b828001600101855582156120d3579182015b828111156120d35782518255916020019190600101906120b8565b506120df9291506120e3565b5090565b5b808211156120df57600081556001016120e4565b600067ffffffffffffffff8311156121125761211261280c565b612125601f8401601f191660200161266d565b905082815283838301111561213957600080fd5b828260208301376000602084830101529392505050565b600082601f830112612160578081fd5b813560206121756121708361269e565b61266d565b80838252828201915082860187848660051b8901011115612194578586fd5b855b858110156121bb5781356121a981612822565b84529284019290840190600101612196565b5090979650505050505050565b6000602082840312156121d9578081fd5b81356116a281612822565b600080604083850312156121f6578081fd5b823561220181612822565b9150602083013561221181612822565b809150509250929050565b600080600060608486031215612230578081fd5b833561223b81612822565b9250602084013561224b81612822565b929592945050506040919091013590565b60008060008060808587031215612271578081fd5b843561227c81612822565b9350602085013561228c81612822565b925060408501359150606085013567ffffffffffffffff8111156122ae578182fd5b8501601f810187136122be578182fd5b6122cd878235602084016120f8565b91505092959194509250565b600080604083850312156122eb578182fd5b82356122f681612822565b9150602083013561221181612837565b60008060408385031215612318578182fd5b823561232381612822565b946020939093013593505050565b600080600060608486031215612345578081fd5b833567ffffffffffffffff8082111561235c578283fd5b818601915086601f83011261236f578283fd5b8135602061237f6121708361269e565b8083825282820191508286018b848660051b890101111561239e578788fd5b8796505b848710156123c05780358352600196909601959183019183016123a2565b50975050870135925050808211156123d6578283fd5b506123e386828701612150565b925050604084013590509250925092565b600060208284031215612405578081fd5b81516116a281612837565b600060208284031215612421578081fd5b81356116a281612845565b60006020828403121561243d578081fd5b81516116a281612845565b600060208284031215612459578081fd5b813567ffffffffffffffff81111561246f578182fd5b8201601f8101841361247f578182fd5b611f3d848235602084016120f8565b60006020828403121561249f578081fd5b813561ffff811681146116a2578182fd5b6000602082840312156124c1578081fd5b5035919050565b6000602082840312156124d9578081fd5b5051919050565b6000602082840312156124f1578081fd5b813560ff811681146116a2578182fd5b6000815180845261251981602086016020860161274a565b601f01601f19169290920160200192915050565b6000845160206125408285838a0161274a565b8551918401916125538184848a0161274a565b85549201918390600181811c908083168061256f57607f831692505b85831081141561258d57634e487b7160e01b88526022600452602488fd5b8080156125a157600181146125b2576125de565b60ff198516885283880195506125de565b60008b815260209020895b858110156125d65781548a8201529084019088016125bd565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061262290830184612501565b9695505050505050565b6020815260006116a26020830184612501565b60208082526014908201527311549493d488481058d8d95cdcc819195b9a595960621b604082015260600190565b604051601f8201601f1916810167ffffffffffffffff811182821017156126965761269661280c565b604052919050565b600067ffffffffffffffff8211156126b8576126b861280c565b5060051b60200190565b600061ffff8083168185168083038211156126df576126df6127e0565b01949350505050565b600082198211156126fb576126fb6127e0565b500190565b60008261270f5761270f6127f6565b500490565b600081600019048311821515161561272e5761272e6127e0565b500290565b600082821015612745576127456127e0565b500390565b60005b8381101561276557818101518382015260200161274d565b838111156114995750506000910152565b600181811c9082168061278a57607f821691505b602082108114156127ab57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156127c5576127c56127e0565b5060010190565b6000826127db576127db6127f6565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610f2457600080fd5b8015158114610f2457600080fd5b6001600160e01b031981168114610f2457600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220d858eafb2323f16b6f00e5795db80ecc91984e96717741c49a09a001fe431d7864736f6c63430008040033

Deployed ByteCode Sourcemap

30336:10272:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39036:351;;;;;;;;;;-1:-1:-1;39036:351:0;;;;;:::i;:::-;;:::i;:::-;;;10846:14:1;;10839:22;10821:41;;10809:2;10794:18;39036:351:0;;;;;;;;33573:79;;;;;;;;;;;;;:::i;:::-;;31454:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;32048:314::-;;;;;;;;;;-1:-1:-1;32048:314:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9865:32:1;;;9847:51;;9835:2;9820:18;32048:314:0;9802:102:1;31640:400:0;;;;;;;;;;-1:-1:-1;31640:400:0;;;;;:::i;:::-;;:::i;30784:31::-;;;;;;;;;;;;;;;;;;;17016:25:1;;;17004:2;16989:18;30784:31:0;16971:76:1;30648:25:0;;;;;;;;;;-1:-1:-1;30648:25:0;;;;-1:-1:-1;;;30648:25:0;;;;;;;;;16851:6:1;16839:19;;;16821:38;;16809:2;16794:18;30648:25:0;16776:89:1;35494:162:0;;;;;;;;;;-1:-1:-1;35494:162:0;;;;;:::i;:::-;;:::i;30680:34::-;;;;;;;;;;-1:-1:-1;30680:34:0;;;;-1:-1:-1;;;30680:34:0;;;;;;;;;17224:4:1;17212:17;;;17194:36;;17182:2;17167:18;30680:34:0;17149:87:1;34110:346:0;;;;;;:::i;:::-;;:::i;36193:678::-;;;;;;;;;;-1:-1:-1;36193:678:0;;;;;:::i;:::-;;:::i;30536:29::-;;;;;;;;;;-1:-1:-1;30536:29:0;;;;;;;;35664:177;;;;;;;;;;-1:-1:-1;35664:177:0;;;;;:::i;:::-;;:::i;30572:34::-;;;;;;;;;;-1:-1:-1;30572:34:0;;;;;;;;;;;33283:82;;;;;;;;;;-1:-1:-1;33283:82:0;;;;;:::i;:::-;;:::i;30723:20::-;;;;;;;;;;-1:-1:-1;30723:20:0;;;;-1:-1:-1;;;30723:20:0;;;;;;40324:120;;;;;;;;;;-1:-1:-1;40324:120:0;;;;;:::i;:::-;;:::i;38411:100::-;;;;;;;;;;-1:-1:-1;38411:100:0;;;;;:::i;:::-;;:::i;33783:319::-;;;;;;;;;;-1:-1:-1;33783:319:0;;;;;:::i;:::-;;:::i;33373:104::-;;;;;;;;;;-1:-1:-1;33373:104:0;;;;;:::i;:::-;;:::i;31024:21::-;;;;;;;;;;;;;:::i;33660:115::-;;;;;;;;;;-1:-1:-1;33660:115:0;;;;;:::i;:::-;-1:-1:-1;;;;;33751:16:0;33724:7;33751:16;;;:9;:16;;;;;;;33660:115;30244:85;;;;;;;;;;;;;:::i;38854:95::-;;;;;;;;;;-1:-1:-1;38854:95:0;;;;;:::i;:::-;;:::i;33485:80::-;;;;;;;;;;;;;:::i;29917:20::-;;;;;;;;;;-1:-1:-1;29917:20:0;;;;-1:-1:-1;;;;;29917:20:0;;;31545:87;;;;;;;;;;;;;:::i;30968:47::-;;;;;;;;;;-1:-1:-1;30968:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;30752:23;;;;;;;;;;-1:-1:-1;30752:23:0;;;;-1:-1:-1;;;30752:23:0;;;;;;34464:849;;;;;;:::i;:::-;;:::i;30917:44::-;;;;;;;;;;-1:-1:-1;30917:44:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;30917:44:0;;;30613:28;;;;;;;;;;-1:-1:-1;30613:28:0;;;;;;;;;;;32370:185;;;;;;;;;;-1:-1:-1;32370:185:0;;;;;:::i;:::-;;:::i;38957:71::-;;;;;;;;;;;;;:::i;31052:27::-;;;;;;;;;;;;;:::i;35849:336::-;;;;;;;;;;-1:-1:-1;35849:336:0;;;;;:::i;:::-;;:::i;31086:27::-;;;;;;;;;;;;;:::i;37743:660::-;;;;;;;;;;-1:-1:-1;37743:660:0;;;;;:::i;:::-;;:::i;38743:103::-;;;;;;;;;;-1:-1:-1;38743:103:0;;;;;:::i;:::-;;:::i;38631:104::-;;;;;;;;;;-1:-1:-1;38631:104:0;;;;;:::i;:::-;;:::i;32563:214::-;;;;;;;;;;-1:-1:-1;32563:214:0;;;;;:::i;:::-;;:::i;30135:101::-;;;;;;;;;;-1:-1:-1;30135:101:0;;;;;:::i;:::-;;:::i;38519:104::-;;;;;;;;;;-1:-1:-1;38519:104:0;;;;;:::i;:::-;;:::i;40452:153::-;;;;;;;;;;-1:-1:-1;40452:153:0;;;;;:::i;:::-;;:::i;39036:351::-;39175:4;-1:-1:-1;;;;;;39217:40:0;;-1:-1:-1;;;39217:40:0;;:105;;-1:-1:-1;;;;;;;39274:48:0;;-1:-1:-1;;;39274:48:0;39217:105;:162;;;-1:-1:-1;;;;;;;39339:40:0;;-1:-1:-1;;;39339:40:0;39217:162;39197:182;39036:351;-1:-1:-1;;39036:351:0:o;33573:79::-;30077:5;;-1:-1:-1;;;;;30077:5:0;30063:10;:19;30055:52;;;;-1:-1:-1;;;30055:52:0;;;;;;;:::i;:::-;;;;;;;;;33625:11:::1;:19:::0;;-1:-1:-1;;;;33625:19:0::1;::::0;;33573:79::o;31454:83::-;31491:13;31524:5;31517:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31454:83;:::o;32048:314::-;32227:11;;32169:7;;-1:-1:-1;;;32227:11:0;;;;32216:22;;;32194:116;;;;-1:-1:-1;;;32194:116:0;;14249:2:1;32194:116:0;;;14231:21:1;14288:2;14268:18;;;14261:30;14327:34;14307:18;;;14300:62;-1:-1:-1;;;14378:18:1;;;14371:42;14430:19;;32194:116:0;14221:234:1;32194:116:0;-1:-1:-1;32330:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;32330:24:0;;32048:314::o;31640:400::-;31721:13;31737:16;31745:7;31737;:16::i;:::-;31721:32;;31778:5;-1:-1:-1;;;;;31772:11:0;:2;-1:-1:-1;;;;;31772:11:0;;;31764:57;;;;-1:-1:-1;;;31764:57:0;;15078:2:1;31764:57:0;;;15060:21:1;15117:2;15097:18;;;15090:30;15156:34;15136:18;;;15129:62;-1:-1:-1;;;15207:18:1;;;15200:31;15248:19;;31764:57:0;15050:223:1;31764:57:0;31856:10;-1:-1:-1;;;;;31856:19:0;;;;:58;;;31879:35;31896:5;31903:10;31879:16;:35::i;:::-;31834:164;;;;-1:-1:-1;;;31834:164:0;;13475:2:1;31834:164:0;;;13457:21:1;13514:2;13494:18;;;13487:30;13553:34;13533:18;;;13526:62;13624:26;13604:18;;;13597:54;13668:19;;31834:164:0;13447:246:1;31834:164:0;32011:21;32020:2;32024:7;32011:8;:21::i;:::-;31640:400;;;:::o;35494:162::-;35620:28;35630:4;35636:2;35640:7;35620:9;:28::i;34110:346::-;30077:5;;-1:-1:-1;;;;;30077:5:0;30063:10;:19;30055:52;;;;-1:-1:-1;;;30055:52:0;;;;;;;:::i;:::-;34227:9:::1;34222:115;34246:6;34242:1;:10;34222:115;;;34323:1;34307:13;;:17;;;;:::i;:::-;34282:43;::::0;-1:-1:-1;;;;;34282:43:0;::::1;::::0;34299:1:::1;::::0;-1:-1:-1;;;;;;;;;;;34282:43:0;34299:1;;34282:43:::1;34254:6;34259:1;34254:6:::0;::::1;:::i;:::-;;;34222:115;;;-1:-1:-1::0;34359:13:0::1;::::0;34349:24:::1;::::0;;;:9:::1;:24;::::0;;;;:29;;-1:-1:-1;;;;;;34349:29:0::1;-1:-1:-1::0;;;;;34349:29:0;::::1;;::::0;;34389:17:::1;34349:29:::0;34399:6;34389:5:::1;:17::i;:::-;34441:6;34419:11;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;34110:346:::0;;:::o;36193:678::-;30077:5;;-1:-1:-1;;;;;30077:5:0;30063:10;:19;30055:52;;;;-1:-1:-1;;;30055:52:0;;;;;;;:::i;:::-;36297:12:::1;36312:4;36317:1;36312:7;;;;;;-1:-1:-1::0;;;36312:7:0::1;;;;;;;;;;;;;;;36297:22;;36330:6;36353:11:::0;36374:7:::1;36367:4;:14;;;;:::i;:::-;:18;::::0;36384:1:::1;36367:18;:::i;:::-;36353:32;;36420:6;36396:31;;:13;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;36438:11:0::1;:29:::0;;36460:6;;36438:11;::::1;::::0;:29:::1;::::0;36460:6;;-1:-1:-1;;;36438:29:0;::::1;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36480:384;36491:4;:11;36487:1;:15;:34;;;;;36517:4;36506:7;:15;;36487:34;36480:384;;;36559:7;36567:1;36559:10;;;;;;-1:-1:-1::0;;;36559:10:0::1;;;;;;;;;;;;;;;36538:9;:18;36548:7;36538:18;;;;;;;;;;;;:31;;;;;-1:-1:-1::0;;;;;36538:31:0::1;;;;;-1:-1:-1::0;;;;;36538:31:0::1;;;;;;36622:7;36610;36618:1;36610:10;;;;;;-1:-1:-1::0;;;36610:10:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;36589:41:0::1;36606:1;-1:-1:-1::0;;;;;36589:41:0::1;-1:-1:-1::0;;;;;;;;;;;36589:41:0::1;;;;;;;;;36645:12;36656:1;36645:12:::0;::::1;:::i;:::-;;;36699:1;36674:9;:21;36684:7;36692:1;36684:10;;;;;;-1:-1:-1::0;;;36684:10:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;36674:21:0::1;-1:-1:-1::0;;;;;36674:21:0::1;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;36743:1;36715:12;:24;36728:7;36736:1;36728:10;;;;;;-1:-1:-1::0;;;36728:10:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;36715:24:0::1;-1:-1:-1::0;;;;;36715:24:0::1;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;36773:11:0;;36765:5:::1;:1:::0;36769::::1;36765:5;:::i;:::-;:19;:45;;;;-1:-1:-1::0;36799:4:0;36804:5:::1;:1:::0;36808::::1;36804:5;:::i;:::-;36799:11;;;;;;-1:-1:-1::0;;;36799:11:0::1;;;;;;;;;;;;;;;36788:7;:22;;36765:45;36761:92;;;36831:6;36836:1;36831:6:::0;::::1;:::i;:::-;;;36761:92;36480:384;;;30118:1;;;36193:678:::0;;;:::o;35664:177::-;35794:39;35811:4;35817:2;35821:7;35794:39;;;;;;;;;;;;:16;:39::i;33283:82::-;30077:5;;-1:-1:-1;;;;;30077:5:0;30063:10;:19;30055:52;;;;-1:-1:-1;;;30055:52:0;;;;;;;:::i;:::-;33345:4:::1;:12:::0;33283:82::o;40324:120::-;30077:5;;-1:-1:-1;;;;;30077:5:0;30063:10;:19;30055:52;;;;-1:-1:-1;;;30055:52:0;;;;;;;:::i;:::-;40392:44:::1;40410:2;40414:21;40392:17;:44::i;:::-;40324:120:::0;:::o;38411:100::-;30077:5;;-1:-1:-1;;;;;30077:5:0;30063:10;:19;30055:52;;;;-1:-1:-1;;;30055:52:0;;;;;;;:::i;:::-;38485:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;38411:100:::0;:::o;33783:319::-;33847:7;33882:13;;33871:7;:24;33867:74;;-1:-1:-1;33927:1:0;;33783:319;-1:-1:-1;33783:319:0:o;33867:74::-;33966:7;33984:80;33996:1;33991:2;:6;:37;;;;-1:-1:-1;34026:1:0;34001:13;;;:9;:13;;;;;;-1:-1:-1;;;;;34001:13:0;:27;33991:37;33984:80;;;34045:7;34051:1;34045:7;;:::i;:::-;;;33984:80;;;34081:13;;;;:9;:13;;;;;;-1:-1:-1;;;;;34081:13:0;;33783:319;-1:-1:-1;;33783:319:0:o;33373:104::-;30077:5;;-1:-1:-1;;;;;30077:5:0;30063:10;:19;30055:52;;;;-1:-1:-1;;;30055:52:0;;;;;;;:::i;:::-;33445:15:::1;:24:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;33445:24:0::1;-1:-1:-1::0;;33445:24:0;;::::1;::::0;;;::::1;::::0;;33373:104::o;31024:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30244:85::-;30077:5;;-1:-1:-1;;;;;30077:5:0;30063:10;:19;30055:52;;;;-1:-1:-1;;;30055:52:0;;;;;;;:::i;:::-;30319:1:::1;30303:18:::0;;-1:-1:-1;;;;;;30303:18:0::1;::::0;;30244:85::o;38854:95::-;30077:5;;-1:-1:-1;;;;;30077:5:0;30063:10;:19;30055:52;;;;-1:-1:-1;;;30055:52:0;;;;;;;:::i;:::-;38922:9:::1;:19:::0;;-1:-1:-1;;38922:19:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;38854:95::o;33485:80::-;30077:5;;-1:-1:-1;;;;;30077:5:0;30063:10;:19;30055:52;;;;-1:-1:-1;;;30055:52:0;;;;;;;:::i;:::-;33539:11:::1;:18:::0;;-1:-1:-1;;;;33539:18:0::1;-1:-1:-1::0;;;33539:18:0::1;::::0;;33485:80::o;31545:87::-;31584:13;31617:7;31610:14;;;;;:::i;34464:849::-;34581:15;;34557:10;34544:24;;;;34581:15;34544:24;;;;;;-1:-1:-1;;;34581:15:0;;;;;;34544:33;;34571:6;;34544:33;:::i;:::-;:52;;34522:118;;;;-1:-1:-1;;;34522:118:0;;11996:2:1;34522:118:0;;;11978:21:1;12035:2;12015:18;;;12008:30;-1:-1:-1;;;12054:18:1;;;12047:46;12110:18;;34522:118:0;11968:166:1;34522:118:0;34686:13;;;;;;;;;34659:23;;34676:6;;34659:14;;;;:23;:::i;:::-;:40;;34651:67;;;;-1:-1:-1;;;34651:67:0;;11299:2:1;34651:67:0;;;11281:21:1;11338:2;11318:18;;;11311:30;-1:-1:-1;;;11357:18:1;;;11350:44;11411:18;;34651:67:0;11271:164:1;34651:67:0;34737:11;;-1:-1:-1;;;34737:11:0;;;;34729:43;;;;-1:-1:-1;;;34729:43:0;;16171:2:1;34729:43:0;;;16153:21:1;16210:2;16190:18;;;16183:30;-1:-1:-1;;;16229:18:1;;;16222:49;16288:18;;34729:43:0;16143:169:1;34729:43:0;34785:17;34812:6;34805:4;;:13;;;;:::i;:::-;34785:33;;34850:9;34837;:22;;34829:55;;;;-1:-1:-1;;;34829:55:0;;13900:2:1;34829:55:0;;;13882:21:1;13939:2;13919:18;;;13912:30;-1:-1:-1;;;13958:18:1;;;13951:50;14018:18;;34829:55:0;13872:170:1;34829:55:0;34913:9;34901;:21;34897:105;;;34947:10;34939:51;34968:21;34980:9;34968;:21;:::i;:::-;34939:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34897:105;35019:9;35014:123;35038:6;35034:1;:10;35014:123;;;35123:1;35107:13;;:17;;;;:::i;:::-;35074:51;;35095:10;;35091:1;;-1:-1:-1;;;;;;;;;;;35074:51:0;35091:1;;35074:51;35046:6;35051:1;35046:6;;:::i;:::-;;;35014:123;;;-1:-1:-1;35159:13:0;;35149:24;;;;:9;:24;;;;;:37;;-1:-1:-1;;;;;;35149:37:0;35176:10;35149:37;;;;;;35197:25;;35215:6;35197:5;:25::i;:::-;35259:6;35235:31;;:14;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;35298:6;35277:28;;:11;;:28;;;;;;;;;;;;;;;;:::i;32370:185::-;32497:50;32516:10;32528:8;32538;32497:18;:50::i;38957:71::-;30077:5;;-1:-1:-1;;;;;30077:5:0;30063:10;:19;30055:52;;;;-1:-1:-1;;;30055:52:0;;;;;;;:::i;:::-;39005:8:::1;:15:::0;;-1:-1:-1;;39005:15:0::1;-1:-1:-1::0;;;39005:15:0::1;::::0;;38957:71::o;31052:27::-;;;;;;;:::i;35849:336::-;36008:28;36018:4;36024:2;36028:7;36008:9;:28::i;:::-;36054:48;36077:4;36083:2;36087:7;36096:5;36054:22;:48::i;:::-;36049:129;;36126:40;;-1:-1:-1;;;36126:40:0;;;;;;;;;;;36049:129;35849:336;;;;:::o;31086:27::-;;;;;;;:::i;37743:660::-;37858:11;;37799:13;;-1:-1:-1;;;37858:11:0;;;;37847:22;;;37825:119;;;;-1:-1:-1;;;37825:119:0;;14662:2:1;37825:119:0;;;14644:21:1;14701:2;14681:18;;;14674:30;14740:34;14720:18;;;14713:62;-1:-1:-1;;;14791:18:1;;;14784:45;14846:19;;37825:119:0;14634:237:1;37825:119:0;37961:8;;-1:-1:-1;;;37961:8:0;;;;37957:70;;38002:13;37995:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37743:660;;;:::o;37957:70::-;38039:28;38070:7;38039:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38139:1;38114:14;38108:28;:32;:287;;;;;;;;;;;;;;;;;38232:14;38273:18;:7;:16;:18::i;:::-;38318:13;38189:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38108:287;38088:307;37743:660;-1:-1:-1;;;37743:660:0:o;38743:103::-;30077:5;;-1:-1:-1;;;;;30077:5:0;30063:10;:19;30055:52;;;;-1:-1:-1;;;30055:52:0;;;;;;;:::i;:::-;38815:13:::1;:23:::0;;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;38815:23:0;;::::1;::::0;;;::::1;::::0;;38743:103::o;38631:104::-;30077:5;;-1:-1:-1;;;;;30077:5:0;30063:10;:19;30055:52;;;;-1:-1:-1;;;30055:52:0;;;;;;;:::i;:::-;38707:20;;::::1;::::0;:13:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;32563:214::-:0;-1:-1:-1;;;;;32734:25:0;;;32705:4;32734:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;32563:214::o;30135:101::-;30077:5;;-1:-1:-1;;;;;30077:5:0;30063:10;:19;30055:52;;;;-1:-1:-1;;;30055:52:0;;;;;;;:::i;:::-;30211:5:::1;:17:::0;;-1:-1:-1;;;;;;30211:17:0::1;-1:-1:-1::0;;;;;30211:17:0;;;::::1;::::0;;;::::1;::::0;;30135:101::o;38519:104::-;30077:5;;-1:-1:-1;;;;;30077:5:0;30063:10;:19;30055:52;;;;-1:-1:-1;;;30055:52:0;;;;;;;:::i;:::-;38595:20;;::::1;::::0;:13:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;40452:153::-:0;30077:5;;-1:-1:-1;;;;;30077:5:0;30063:10;:19;30055:52;;;;-1:-1:-1;;;30055:52:0;;;;;;;:::i;:::-;40558:38:::1;::::0;-1:-1:-1;;;40558:38:0;;40590:4:::1;40558:38;::::0;::::1;9847:51:1::0;-1:-1:-1;;;;;40531:22:0;::::1;::::0;::::1;::::0;40554:2;;40531:22;;40558:23:::1;::::0;9820:18:1;;40558:38:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40531:66;::::0;-1:-1:-1;;;;;;40531:66:0::1;::::0;;;;;;-1:-1:-1;;;;;10594:32:1;;;40531:66:0::1;::::0;::::1;10576:51:1::0;10643:18;;;10636:34;10549:18;;40531:66:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32785:167::-:0;32860:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32860:29:0;-1:-1:-1;;;;;32860:29:0;;;;;;;;:24;;32914:16;32860:24;32914:7;:16::i;:::-;-1:-1:-1;;;;;32905:39:0;;;;;;;;;;;32785:167;;:::o;36879:856::-;36995:16;37014;37022:7;37014;:16::i;:::-;36995:35;;37059:2;-1:-1:-1;;;;;37051:10:0;:4;-1:-1:-1;;;;;37051:10:0;;;37043:54;;;;-1:-1:-1;;;37043:54:0;;16519:2:1;37043:54:0;;;16501:21:1;16558:2;16538:18;;;16531:30;16597:33;16577:18;;;16570:61;16648:18;;37043:54:0;16491:181:1;37043:54:0;37124:8;-1:-1:-1;;;;;37116:16:0;:4;-1:-1:-1;;;;;37116:16:0;;37108:49;;;;-1:-1:-1;;;37108:49:0;;13126:2:1;37108:49:0;;;13108:21:1;13165:2;13145:18;;;13138:30;-1:-1:-1;;;13184:18:1;;;13177:50;13244:18;;37108:49:0;13098:170:1;37108:49:0;37190:10;-1:-1:-1;;;;;37190:22:0;;;;:81;;;37233:38;37250:8;37260:10;37233:16;:38::i;:::-;37190:136;;;-1:-1:-1;37316:10:0;37292:20;37304:7;37292:11;:20::i;:::-;-1:-1:-1;;;;;37292:34:0;;37190:136;37168:199;;;;-1:-1:-1;;;37168:199:0;;15829:2:1;37168:199:0;;;15811:21:1;15868:2;15848:18;;;15841:30;-1:-1:-1;;;15887:18:1;;;15880:43;15940:18;;37168:199:0;15801:163:1;37168:199:0;37380:29;37397:1;37401:7;37380:8;:29::i;:::-;37422:18;;;;:9;:18;;;;;:23;;-1:-1:-1;;;;;;37422:23:0;-1:-1:-1;;;;;37422:23:0;;;;;37475:11;37422:18;-1:-1:-1;37475:11:0;:::i;:::-;37532:1;37503:17;;;:9;:17;;;;;;37458:28;;-1:-1:-1;;;;;;37503:17:0;:31;:57;;;;;37547:13;;37538:6;:22;37503:57;37499:118;;;37577:17;;;;:9;:17;;;;;:28;;-1:-1:-1;;;;;;37577:28:0;-1:-1:-1;;;;;37577:28:0;;;;;37499:118;-1:-1:-1;;;;;37629:19:0;;;;;;:9;:19;;;;;:24;;37652:1;;37629:19;:24;;37652:1;;37629:24;:::i;:::-;;;;-1:-1:-1;;;;;;;37664:13:0;;;;;;:9;:13;;;;;:18;;37681:1;;37664:13;:18;;37681:1;;37664:18;:::i;:::-;;;;-1:-1:-1;;37700:27:0;;37719:7;;-1:-1:-1;;;;;37700:27:0;;;;;;;;-1:-1:-1;;;;;;;;;;;37700:27:0;;;;36879:856;;;;;:::o;35321:165::-;-1:-1:-1;;;;;35384:13:0;;;;;;:9;:13;;;;;:23;;35401:6;;35384:13;:23;;35401:6;;35384:23;:::i;:::-;;;;-1:-1:-1;;;;;;;35418:16:0;;;;;;:12;:16;;;;;:26;;35438:6;;35418:16;:26;;35438:6;;35418:26;:::i;:::-;;;;;;;;35472:6;35455:13;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;35321:165:0:o;14189:317::-;14304:6;14279:21;:31;;14271:73;;;;-1:-1:-1;;;14271:73:0;;12768:2:1;14271:73:0;;;12750:21:1;12807:2;12787:18;;;12780:30;12846:31;12826:18;;;12819:59;12895:18;;14271:73:0;12740:179:1;14271:73:0;14358:12;14376:9;-1:-1:-1;;;;;14376:14:0;14398:6;14376:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14357:52;;;14428:7;14420:78;;;;-1:-1:-1;;;14420:78:0;;12341:2:1;14420:78:0;;;12323:21:1;12380:2;12360:18;;;12353:30;12419:34;12399:18;;;12392:62;12490:28;12470:18;;;12463:56;12536:19;;14420:78:0;12313:248:1;32960:315:0;33115:8;-1:-1:-1;;;;;33106:17:0;:5;-1:-1:-1;;;;;33106:17:0;;;33098:55;;;;-1:-1:-1;;;33098:55:0;;11642:2:1;33098:55:0;;;11624:21:1;11681:2;11661:18;;;11654:30;11720:27;11700:18;;;11693:55;11765:18;;33098:55:0;11614:175:1;33098:55:0;-1:-1:-1;;;;;33164:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;33164:46:0;;;;;;;;;;33226:41;;10821::1;;;33226::0;;10794:18:1;33226:41:0;;;;;;;32960:315;;;:::o;39395:921::-;39550:4;-1:-1:-1;;;;;39571:13:0;;13223:19;:23;39567:742;;39624:173;;-1:-1:-1;;;39624:173:0;;-1:-1:-1;;;;;39624:36:0;;;;;:173;;39683:10;;39716:4;;39743:7;;39773:5;;39624:173;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39624:173:0;;;;;;;;-1:-1:-1;;39624:173:0;;;;;;;;;;;;:::i;:::-;;;39603:651;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39984:13:0;;39980:259;;40034:40;;-1:-1:-1;;;40034:40:0;;;;;;;;;;;39980:259;40189:6;40183:13;40174:6;40170:2;40166:15;40159:38;39603:651;-1:-1:-1;;;;;;39861:55:0;-1:-1:-1;;;39861:55:0;;-1:-1:-1;39854:62:0;;39567:742;-1:-1:-1;40293:4:0;39567:742;39395:921;;;;;;:::o;402:723::-;458:13;679:10;675:53;;-1:-1:-1;;706:10:0;;;;;;;;;;;;-1:-1:-1;;;706:10:0;;;;;402:723::o;675:53::-;753:5;738:12;794:78;801:9;;794:78;;827:8;;;;:::i;:::-;;-1:-1:-1;850:10:0;;-1:-1:-1;858:2:0;850:10;;:::i;:::-;;;794:78;;;882:19;914:6;904:17;;;;;;-1:-1:-1;;;904:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;904:17:0;;882:39;;932:154;939:10;;932:154;;966:11;976:1;966:11;;:::i;:::-;;-1:-1:-1;1035:10:0;1043:2;1035:5;:10;:::i;:::-;1022:24;;:2;:24;:::i;:::-;1009:39;;992:6;999;992:14;;;;;;-1:-1:-1;;;992:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;992:56:0;;;;;;;;-1:-1:-1;1063:11:0;1072:2;1063:11;;:::i;:::-;;;932:154;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:2;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:2;;;309:1;306;299:12;268:2;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;88:332;;;;;:::o;425:768::-;479:5;532:3;525:4;517:6;513:17;509:27;499:2;;554:5;547;540:20;499:2;594:6;581:20;620:4;644:60;660:43;700:2;660:43;:::i;:::-;644:60;:::i;:::-;726:3;750:2;745:3;738:15;778:2;773:3;769:12;762:19;;813:2;805:6;801:15;865:3;860:2;854;851:1;847:10;839:6;835:23;831:32;828:41;825:2;;;886:5;879;872:20;825:2;912:5;926:238;940:2;937:1;934:9;926:238;;;1011:3;998:17;1028:31;1053:5;1028:31;:::i;:::-;1072:18;;1110:12;;;;1142;;;;958:1;951:9;926:238;;;-1:-1:-1;1182:5:1;;489:704;-1:-1:-1;;;;;;;489:704:1:o;1198:257::-;1257:6;1310:2;1298:9;1289:7;1285:23;1281:32;1278:2;;;1331:6;1323;1316:22;1278:2;1375:9;1362:23;1394:31;1419:5;1394:31;:::i;1730:398::-;1798:6;1806;1859:2;1847:9;1838:7;1834:23;1830:32;1827:2;;;1880:6;1872;1865:22;1827:2;1924:9;1911:23;1943:31;1968:5;1943:31;:::i;:::-;1993:5;-1:-1:-1;2050:2:1;2035:18;;2022:32;2063:33;2022:32;2063:33;:::i;:::-;2115:7;2105:17;;;1817:311;;;;;:::o;2133:466::-;2210:6;2218;2226;2279:2;2267:9;2258:7;2254:23;2250:32;2247:2;;;2300:6;2292;2285:22;2247:2;2344:9;2331:23;2363:31;2388:5;2363:31;:::i;:::-;2413:5;-1:-1:-1;2470:2:1;2455:18;;2442:32;2483:33;2442:32;2483:33;:::i;:::-;2237:362;;2535:7;;-1:-1:-1;;;2589:2:1;2574:18;;;;2561:32;;2237:362::o;2604:824::-;2699:6;2707;2715;2723;2776:3;2764:9;2755:7;2751:23;2747:33;2744:2;;;2798:6;2790;2783:22;2744:2;2842:9;2829:23;2861:31;2886:5;2861:31;:::i;:::-;2911:5;-1:-1:-1;2968:2:1;2953:18;;2940:32;2981:33;2940:32;2981:33;:::i;:::-;3033:7;-1:-1:-1;3087:2:1;3072:18;;3059:32;;-1:-1:-1;3142:2:1;3127:18;;3114:32;3169:18;3158:30;;3155:2;;;3206:6;3198;3191:22;3155:2;3234:22;;3287:4;3279:13;;3275:27;-1:-1:-1;3265:2:1;;3321:6;3313;3306:22;3265:2;3349:73;3414:7;3409:2;3396:16;3391:2;3387;3383:11;3349:73;:::i;:::-;3339:83;;;2734:694;;;;;;;:::o;3433:392::-;3498:6;3506;3559:2;3547:9;3538:7;3534:23;3530:32;3527:2;;;3580:6;3572;3565:22;3527:2;3624:9;3611:23;3643:31;3668:5;3643:31;:::i;:::-;3693:5;-1:-1:-1;3750:2:1;3735:18;;3722:32;3763:30;3722:32;3763:30;:::i;3830:325::-;3898:6;3906;3959:2;3947:9;3938:7;3934:23;3930:32;3927:2;;;3980:6;3972;3965:22;3927:2;4024:9;4011:23;4043:31;4068:5;4043:31;:::i;:::-;4093:5;4145:2;4130:18;;;;4117:32;;-1:-1:-1;;;3917:238:1:o;4160:1274::-;4287:6;4295;4303;4356:2;4344:9;4335:7;4331:23;4327:32;4324:2;;;4377:6;4369;4362:22;4324:2;4422:9;4409:23;4451:18;4492:2;4484:6;4481:14;4478:2;;;4513:6;4505;4498:22;4478:2;4556:6;4545:9;4541:22;4531:32;;4601:7;4594:4;4590:2;4586:13;4582:27;4572:2;;4628:6;4620;4613:22;4572:2;4669;4656:16;4691:4;4715:60;4731:43;4771:2;4731:43;:::i;4715:60::-;4797:3;4821:2;4816:3;4809:15;4849:2;4844:3;4840:12;4833:19;;4880:2;4876;4872:11;4928:7;4923:2;4917;4914:1;4910:10;4906:2;4902:19;4898:28;4895:41;4892:2;;;4954:6;4946;4939:22;4892:2;4981:6;4972:15;;4996:163;5010:2;5007:1;5004:9;4996:163;;;5067:17;;5055:30;;5028:1;5021:9;;;;;5105:12;;;;5137;;4996:163;;;-1:-1:-1;5178:5:1;-1:-1:-1;;5221:18:1;;5208:32;;-1:-1:-1;;5252:16:1;;;5249:2;;;5286:6;5278;5271:22;5249:2;;5314:63;5369:7;5358:8;5347:9;5343:24;5314:63;:::i;:::-;5304:73;;;5424:2;5413:9;5409:18;5396:32;5386:42;;4314:1120;;;;;:::o;5439:255::-;5506:6;5559:2;5547:9;5538:7;5534:23;5530:32;5527:2;;;5580:6;5572;5565:22;5527:2;5617:9;5611:16;5636:28;5658:5;5636:28;:::i;5699:255::-;5757:6;5810:2;5798:9;5789:7;5785:23;5781:32;5778:2;;;5831:6;5823;5816:22;5778:2;5875:9;5862:23;5894:30;5918:5;5894:30;:::i;5959:259::-;6028:6;6081:2;6069:9;6060:7;6056:23;6052:32;6049:2;;;6102:6;6094;6087:22;6049:2;6139:9;6133:16;6158:30;6182:5;6158:30;:::i;6223:480::-;6292:6;6345:2;6333:9;6324:7;6320:23;6316:32;6313:2;;;6366:6;6358;6351:22;6313:2;6411:9;6398:23;6444:18;6436:6;6433:30;6430:2;;;6481:6;6473;6466:22;6430:2;6509:22;;6562:4;6554:13;;6550:27;-1:-1:-1;6540:2:1;;6596:6;6588;6581:22;6540:2;6624:73;6689:7;6684:2;6671:16;6666:2;6662;6658:11;6624:73;:::i;6708:292::-;6766:6;6819:2;6807:9;6798:7;6794:23;6790:32;6787:2;;;6840:6;6832;6825:22;6787:2;6884:9;6871:23;6934:6;6927:5;6923:18;6916:5;6913:29;6903:2;;6961:6;6953;6946:22;7005:190;7064:6;7117:2;7105:9;7096:7;7092:23;7088:32;7085:2;;;7138:6;7130;7123:22;7085:2;-1:-1:-1;7166:23:1;;7075:120;-1:-1:-1;7075:120:1:o;7200:194::-;7270:6;7323:2;7311:9;7302:7;7298:23;7294:32;7291:2;;;7344:6;7336;7329:22;7291:2;-1:-1:-1;7372:16:1;;7281:113;-1:-1:-1;7281:113:1:o;7399:289::-;7456:6;7509:2;7497:9;7488:7;7484:23;7480:32;7477:2;;;7530:6;7522;7515:22;7477:2;7574:9;7561:23;7624:4;7617:5;7613:16;7606:5;7603:27;7593:2;;7649:6;7641;7634:22;7693:257;7734:3;7772:5;7766:12;7799:6;7794:3;7787:19;7815:63;7871:6;7864:4;7859:3;7855:14;7848:4;7841:5;7837:16;7815:63;:::i;:::-;7932:2;7911:15;-1:-1:-1;;7907:29:1;7898:39;;;;7939:4;7894:50;;7742:208;-1:-1:-1;;7742:208:1:o;7955:1531::-;8179:3;8217:6;8211:13;8243:4;8256:51;8300:6;8295:3;8290:2;8282:6;8278:15;8256:51;:::i;:::-;8370:13;;8329:16;;;;8392:55;8370:13;8329:16;8414:15;;;8392:55;:::i;:::-;8538:13;;8469:20;;;8509:3;;8598:1;8620:18;;;;8673;;;;8700:2;;8778:4;8768:8;8764:19;8752:31;;8700:2;8841;8831:8;8828:16;8808:18;8805:40;8802:2;;;-1:-1:-1;;;8868:33:1;;8924:4;8921:1;8914:15;8954:4;8875:3;8942:17;8802:2;8985:18;9012:110;;;;9136:1;9131:330;;;;8978:483;;9012:110;-1:-1:-1;;9047:24:1;;9033:39;;9092:20;;;;-1:-1:-1;9012:110:1;;9131:330;17756:4;17775:17;;;17825:4;17809:21;;9226:3;9242:169;9256:8;9253:1;9250:15;9242:169;;;9338:14;;9323:13;;;9316:37;9381:16;;;;9273:10;;9242:169;;;9246:3;;9442:8;9435:5;9431:20;9424:27;;8978:483;-1:-1:-1;9477:3:1;;8187:1299;-1:-1:-1;;;;;;;;;;;8187:1299:1:o;9909:488::-;-1:-1:-1;;;;;10178:15:1;;;10160:34;;10230:15;;10225:2;10210:18;;10203:43;10277:2;10262:18;;10255:34;;;10325:3;10320:2;10305:18;;10298:31;;;10103:4;;10346:45;;10371:19;;10363:6;10346:45;:::i;:::-;10338:53;10112:285;-1:-1:-1;;;;;;10112:285:1:o;10873:219::-;11022:2;11011:9;11004:21;10985:4;11042:44;11082:2;11071:9;11067:18;11059:6;11042:44;:::i;15278:344::-;15480:2;15462:21;;;15519:2;15499:18;;;15492:30;-1:-1:-1;;;15553:2:1;15538:18;;15531:50;15613:2;15598:18;;15452:170::o;17241:275::-;17312:2;17306:9;17377:2;17358:13;;-1:-1:-1;;17354:27:1;17342:40;;17412:18;17397:34;;17433:22;;;17394:62;17391:2;;;17459:18;;:::i;:::-;17495:2;17488:22;17286:230;;-1:-1:-1;17286:230:1:o;17521:183::-;17581:4;17614:18;17606:6;17603:30;17600:2;;;17636:18;;:::i;:::-;-1:-1:-1;17681:1:1;17677:14;17693:4;17673:25;;17590:114::o;17841:224::-;17880:3;17908:6;17941:2;17938:1;17934:10;17971:2;17968:1;17964:10;18002:3;17998:2;17994:12;17989:3;17986:21;17983:2;;;18010:18;;:::i;:::-;18046:13;;17888:177;-1:-1:-1;;;;17888:177:1:o;18070:128::-;18110:3;18141:1;18137:6;18134:1;18131:13;18128:2;;;18147:18;;:::i;:::-;-1:-1:-1;18183:9:1;;18118:80::o;18203:120::-;18243:1;18269;18259:2;;18274:18;;:::i;:::-;-1:-1:-1;18308:9:1;;18249:74::o;18328:168::-;18368:7;18434:1;18430;18426:6;18422:14;18419:1;18416:21;18411:1;18404:9;18397:17;18393:45;18390:2;;;18441:18;;:::i;:::-;-1:-1:-1;18481:9:1;;18380:116::o;18501:125::-;18541:4;18569:1;18566;18563:8;18560:2;;;18574:18;;:::i;:::-;-1:-1:-1;18611:9:1;;18550:76::o;18631:258::-;18703:1;18713:113;18727:6;18724:1;18721:13;18713:113;;;18803:11;;;18797:18;18784:11;;;18777:39;18749:2;18742:10;18713:113;;;18844:6;18841:1;18838:13;18835:2;;;-1:-1:-1;;18879:1:1;18861:16;;18854:27;18684:205::o;18894:380::-;18973:1;18969:12;;;;19016;;;19037:2;;19091:4;19083:6;19079:17;19069:27;;19037:2;19144;19136:6;19133:14;19113:18;19110:38;19107:2;;;19190:10;19185:3;19181:20;19178:1;19171:31;19225:4;19222:1;19215:15;19253:4;19250:1;19243:15;19107:2;;18949:325;;;:::o;19279:135::-;19318:3;-1:-1:-1;;19339:17:1;;19336:2;;;19359:18;;:::i;:::-;-1:-1:-1;19406:1:1;19395:13;;19326:88::o;19419:112::-;19451:1;19477;19467:2;;19482:18;;:::i;:::-;-1:-1:-1;19516:9:1;;19457:74::o;19536:127::-;19597:10;19592:3;19588:20;19585:1;19578:31;19628:4;19625:1;19618:15;19652:4;19649:1;19642:15;19668:127;19729:10;19724:3;19720:20;19717:1;19710:31;19760:4;19757:1;19750:15;19784:4;19781:1;19774:15;19800:127;19861:10;19856:3;19852:20;19849:1;19842:31;19892:4;19889:1;19882:15;19916:4;19913:1;19906:15;19932:131;-1:-1:-1;;;;;20007:31:1;;19997:42;;19987:2;;20053:1;20050;20043:12;20068:118;20154:5;20147:13;20140:21;20133:5;20130:32;20120:2;;20176:1;20173;20166:12;20191:131;-1:-1:-1;;;;;;20265:32:1;;20255:43;;20245:2;;20312:1;20309;20302:12

Swarm Source

ipfs://d858eafb2323f16b6f00e5795db80ecc91984e96717741c49a09a001fe431d78
Loading