ETH Price: $2,145.93 (-8.97%)

Token

NFTArtGenCreatorImpl (ArtGen)
 

Overview

Max Total Supply

100,000 ArtGen

Holders

6

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
nyax.eth
Balance
20 ArtGen
0x899CD70aD8f1b9bdFc9A179E7f6dcab6F9CaAB41
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
NFTArtGenCreatorImpl

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 300 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

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

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

// File @openzeppelin/contracts-upgradeable/utils/[email protected]

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev 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-upgradeable/proxy/utils/[email protected]

// OpenZeppelin Contracts v4.4.1 (proxy/utils/Initializable.sol)

pragma solidity ^0.8.0;

/**
 * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
 * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an
 * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
 * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
 *
 * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
 * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
 *
 * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
 * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
 *
 * [CAUTION]
 * ====
 * Avoid leaving a contract uninitialized.
 *
 * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
 * contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the
 * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed:
 *
 * [.hljs-theme-light.nopadding]
 * ```
 * /// @custom:oz-upgrades-unsafe-allow constructor
 * constructor() initializer {}
 * ```
 * ====
 */
abstract contract Initializable {
    /**
     * @dev Indicates that the contract has been initialized.
     */
    bool private _initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private _initializing;

    /**
     * @dev Modifier to protect an initializer function from being invoked twice.
     */
    modifier initializer() {
        // If the contract is initializing we ignore whether _initialized is set in order to support multiple
        // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the
        // contract may have been reentered.
        require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized");

        bool isTopLevelCall = !_initializing;
        if (isTopLevelCall) {
            _initializing = true;
            _initialized = true;
        }

        _;

        if (isTopLevelCall) {
            _initializing = false;
        }
    }

    /**
     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
     * {initializer} modifier, directly or indirectly.
     */
    modifier onlyInitializing() {
        require(_initializing, "Initializable: contract is not initializing");
        _;
    }

    function _isConstructor() private view returns (bool) {
        return !AddressUpgradeable.isContract(address(this));
    }
}


// File @openzeppelin/contracts-upgradeable/utils/[email protected]

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

pragma solidity ^0.8.0;

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

    function __Context_init_unchained() internal onlyInitializing {
    }
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
    uint256[50] private __gap;
}


// File @openzeppelin/contracts-upgradeable/access/[email protected]

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

pragma solidity ^0.8.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    function __Ownable_init() internal onlyInitializing {
        __Context_init_unchained();
        __Ownable_init_unchained();
    }

    function __Ownable_init_unchained() internal onlyInitializing {
        _transferOwnership(_msgSender());
    }

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

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

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

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

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


// File @openzeppelin/contracts-upgradeable/utils/math/[email protected]

// OpenZeppelin Contracts v4.4.1 (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library MathUpgradeable {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a / b + (a % b == 0 ? 0 : 1);
    }
}


// File @openzeppelin/contracts-upgradeable/utils/[email protected]

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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library StringsUpgradeable {
    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/[email protected]

// OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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


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

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

// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol)

pragma solidity ^0.8.0;


// File @openzeppelin/contracts/interfaces/[email protected]

// OpenZeppelin Contracts v4.4.1 (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface for the NFT Royalty Standard
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Called with the sale price to determine how much royalty is owed and to whom.
     * @param tokenId - the NFT asset queried for royalty information
     * @param salePrice - the sale price of the NFT asset specified by `tokenId`
     * @return receiver - address of who should be sent the royalty payment
     * @return royaltyAmount - the royalty payment amount for `salePrice`
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}


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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


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

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

pragma solidity ^0.8.0;

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


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

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

pragma solidity ^0.8.0;

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

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

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


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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

pragma solidity ^0.8.0;

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

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


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

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

pragma solidity ^0.8.0;

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

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

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

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

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


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

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

pragma solidity ^0.8.0;

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


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

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

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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


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

// 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 IERC165Upgradeable {
    /**
     * @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-upgradeable/token/ERC721/[email protected]

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

pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721Upgradeable is IERC165Upgradeable {
    /**
     * @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-upgradeable/token/ERC721/extensions/[email protected]

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

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721MetadataUpgradeable is IERC721Upgradeable {
    /**
     * @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 contracts/utils/IERC721AUpgradeable.sol

// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721AUpgradeable is IERC721Upgradeable, IERC721MetadataUpgradeable {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     * 
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);
}


// File @openzeppelin/contracts-upgradeable/token/ERC721/[email protected]

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

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721ReceiverUpgradeable {
    /**
     * @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-upgradeable/utils/introspection/[email protected]

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

pragma solidity ^0.8.0;


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

    function __ERC165_init_unchained() internal onlyInitializing {
    }
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165Upgradeable).interfaceId;
    }
    uint256[50] private __gap;
}


// File contracts/utils/ERC721AUpgradeable.sol

// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;







/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721AUpgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721AUpgradeable {
    using AddressUpgradeable for address;
    using StringsUpgradeable for uint256;

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

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

    function __ERC721A_init(string memory name_, string memory symbol_) internal onlyInitializing {
        __ERC721A_init_unchained(name_, symbol_);
    }

    function __ERC721A_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr) if (curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721AUpgradeable.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner) if(!isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSender()) revert ApproveToCaller();

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract()) if(!_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, from);

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, from);

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721ReceiverUpgradeable(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[42] private __gap;
}


// File contracts/utils/IERC721ABurnableUpgradeable.sol

// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721ABurnable compliant contract.
 */
interface IERC721ABurnableUpgradeable is IERC721AUpgradeable {
    /**
     * @dev Burns `tokenId`. See {ERC721A-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) external;
}


// File contracts/utils/ERC721ABurnableUpgradeable.sol

// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;



/**
 * @title ERC721A Burnable Token
 * @dev ERC721A Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721ABurnableUpgradeable is Initializable, ERC721AUpgradeable, IERC721ABurnableUpgradeable {
    function __ERC721ABurnable_init() internal onlyInitializing {
    }

    function __ERC721ABurnable_init_unchained() internal onlyInitializing {
    }
    /**
     * @dev Burns `tokenId`. See {ERC721A-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual override {
        _burn(tokenId, true);
    }

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[50] private __gap;
}


// File contracts/utils/IERC721AQueryableUpgradeable.sol

// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721AQueryable compliant contract.
 */
interface IERC721AQueryableUpgradeable is IERC721AUpgradeable {
    /**
     * Invalid query range (`start` >= `stop`).
     */
    error InvalidQueryRange();

    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *   - `addr` = `address(0)`
     *   - `startTimestamp` = `0`
     *   - `burned` = `false`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     */
    function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start` < `stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view returns (uint256[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(totalSupply) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K pfp collections should be fine).
     */
    function tokensOfOwner(address owner) external view returns (uint256[] memory);
}


// File contracts/utils/ERC721AQueryableUpgradeable.sol

// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;



/**
 * @title ERC721A Queryable
 * @dev ERC721A subclass with convenience query functions.
 */
abstract contract ERC721AQueryableUpgradeable is Initializable, ERC721AUpgradeable, IERC721AQueryableUpgradeable {
    function __ERC721AQueryable_init() internal onlyInitializing {
    }

    function __ERC721AQueryable_init_unchained() internal onlyInitializing {
    }
    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *   - `addr` = `address(0)`
     *   - `startTimestamp` = `0`
     *   - `burned` = `false`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     */
    function explicitOwnershipOf(uint256 tokenId) public view override returns (TokenOwnership memory) {
        TokenOwnership memory ownership;
        if (tokenId < _startTokenId() || tokenId >= _currentIndex) {
            return ownership;
        }
        ownership = _ownerships[tokenId];
        if (ownership.burned) {
            return ownership;
        }
        return _ownershipOf(tokenId);
    }

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view override returns (TokenOwnership[] memory) {
        unchecked {
            uint256 tokenIdsLength = tokenIds.length;
            TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength);
            for (uint256 i; i != tokenIdsLength; ++i) {
                ownerships[i] = explicitOwnershipOf(tokenIds[i]);
            }
            return ownerships;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start` < `stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view override returns (uint256[] memory) {
        unchecked {
            if (start >= stop) revert InvalidQueryRange();
            uint256 tokenIdsIdx;
            uint256 stopLimit = _currentIndex;
            // Set `start = max(start, _startTokenId())`.
            if (start < _startTokenId()) {
                start = _startTokenId();
            }
            // Set `stop = min(stop, _currentIndex)`.
            if (stop > stopLimit) {
                stop = stopLimit;
            }
            uint256 tokenIdsMaxLength = balanceOf(owner);
            // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
            // to cater for cases where `balanceOf(owner)` is too big.
            if (start < stop) {
                uint256 rangeLength = stop - start;
                if (rangeLength < tokenIdsMaxLength) {
                    tokenIdsMaxLength = rangeLength;
                }
            } else {
                tokenIdsMaxLength = 0;
            }
            uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
            if (tokenIdsMaxLength == 0) {
                return tokenIds;
            }
            // We need to call `explicitOwnershipOf(start)`,
            // because the slot at `start` may not be initialized.
            TokenOwnership memory ownership = explicitOwnershipOf(start);
            address currOwnershipAddr;
            // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`.
            // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range.
            if (!ownership.burned) {
                currOwnershipAddr = ownership.addr;
            }
            for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) {
                ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            // Downsize the array to fit.
            assembly {
                mstore(tokenIds, tokenIdsIdx)
            }
            return tokenIds;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(totalSupply) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K pfp collections should be fine).
     */
    function tokensOfOwner(address owner) external view override returns (uint256[] memory) {
        unchecked {
            uint256 tokenIdsIdx;
            address currOwnershipAddr;
            uint256 tokenIdsLength = balanceOf(owner);
            uint256[] memory tokenIds = new uint256[](tokenIdsLength);
            TokenOwnership memory ownership;
            for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) {
                ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            return tokenIds;
        }
    }

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[50] private __gap;
}


// File contracts/NFTArtGenUpgradeable.sol


pragma solidity ^0.8.4;











contract NFTArtGenUpgradeable is
  Initializable,
  IERC2981,
  ERC721AUpgradeable,
  ERC721ABurnableUpgradeable,
  ERC721AQueryableUpgradeable,
  OwnableUpgradeable
{
  using AddressUpgradeable for address;
  using StringsUpgradeable for uint256;
  using MathUpgradeable for uint256;

  uint32 public maxPerMint;
  uint32 public maxPerWallet;
  uint32 public maxFreeMint;
  uint256 public pauseMintAt;
  uint256 public cost;
  bool public open;
  bool public revealed;
  bool public presaleOpen;
  bool public referralOpen;
  uint256 public referralCap;
  address public reqToken;
  uint256 internal maxSupply;
  string internal baseUri;
  address internal recipient;
  uint256 internal recipientFee;
  string internal uriNotRevealed;
  bytes32 private merkleRoot;
  mapping(address => uint256) private referralMap;
  mapping(address => uint256) private _freeMints;
  address private constant _NFTGen = 0x460Fd5059E7301680fA53E63bbBF7272E643e89C;
  mapping(address => uint256) private _shares;
  address[] private _payees;

  function __NFTArtGen_init(
    string memory _name,
    string memory _symbol,
    uint256 _maxSupply,
    uint256 _commission
  ) internal onlyInitializing {
    __ERC721A_init(_name, _symbol);
    __ERC721ABurnable_init();
    __ERC721AQueryable_init();
    __Ownable_init();
    maxSupply = _maxSupply;
    revealed = false;

    _shares[_NFTGen] = _commission;
    _shares[owner()] = 1000 - _commission;
    _payees.push(_NFTGen);
    _payees.push(owner());
  }

  // ------ Dev Only ------

  function setCommission(uint256 _val1) public {
    require(msg.sender == _NFTGen, "Invalid address");
    uint256 diff = _shares[_NFTGen] - _val1;
    _shares[_NFTGen] = _val1;
    _shares[_payees[1]] += diff;
  }

  // ------ Owner Only ------

  function updateSale(
    bool _open,
    uint256 _cost,
    uint32 _maxW,
    uint32 _maxM
  ) public onlyOwner {
    open = _open;
    cost = _cost;
    maxPerWallet = _maxW;
    maxPerMint = _maxM;
  }

  function _startTokenId() internal view virtual override returns (uint256) {
    return 1;
  }

  function updateReqToken(address _address) public onlyOwner {
    reqToken = _address;
  }

  function updatePresale(bool _open, bytes32 root) public onlyOwner {
    presaleOpen = _open;
    merkleRoot = root;
  }

  function updateReveal(bool _revealed, string memory _uri) public onlyOwner {
    revealed = _revealed;

    if (_revealed == false) {
      uriNotRevealed = _uri;
    }

    if (_revealed == true) {
      bytes memory b1 = bytes(baseUri);
      if (b1.length == 0) {
        baseUri = _uri;
      }
    }
  }

  function updateMaxFreeMint(uint32 _cap) public onlyOwner {
    maxFreeMint = _cap;
  }

  function updatePauseMintAt(uint256 _pauseAt) public onlyOwner {
    require(_pauseAt >= supply(), "Invalid value");
    pauseMintAt = _pauseAt;
  }

  function updateBaseUri(string memory _uri) public {
    require(msg.sender == _NFTGen, "Invalid address");
    baseUri = _uri;
  }

  function updateWithdrawSplit(
    address[] memory _addresses,
    uint256[] memory _fees
  ) public onlyOwner {
    for (uint256 i = 1; i < _payees.length; i++) {
      delete _shares[_payees[i]];
    }
    _payees = new address[](_addresses.length + 1);
    _payees[0] = _NFTGen;

    for (uint256 i = 0; i < _addresses.length; i++) {
      _shares[_addresses[i]] = _fees[i];
      _payees[i + 1] = _addresses[i];
    }
  }

  function getWithdrawSplit()
    public
    view
    returns (address[] memory, uint256[] memory)
  {
    uint256[] memory values = new uint256[](_payees.length);

    for (uint256 i = 0; i < _payees.length; i++) {
      values[i] = _shares[_payees[i]];
    }

    return (_payees, values);
  }

  function updateReferral(bool _open, uint256 _val) public onlyOwner {
    referralOpen = _open;
    referralCap = _val;
  }

  function updateRoyalties(address _recipient, uint256 _fee) public onlyOwner {
    recipient = _recipient;
    recipientFee = _fee;
  }

  function withdraw() public payable {
    uint256 balance = address(this).balance;
    require(balance > 0, "Zero balance");

    for (uint256 i = 0; i < _payees.length; i++) {
      uint256 split = _shares[_payees[i]];
      uint256 value = ((split * balance) / 1000);
      AddressUpgradeable.sendValue(payable(_payees[i]), value);
    }
  }

  // ------ Mint! ------
  function airdrop(address[] memory _recipients, uint256[] memory _amount)
    public
    onlyOwner
  {
    require(_recipients.length == _amount.length);

    for (uint256 i = 0; i < _amount.length; i++) {
      require(supply() + _amount[i] <= totalSupply(), "reached max supply");
      _safeMint(_recipients[i], _amount[i]);
    }
  }

  function mint(uint256 count)
    external
    payable
    preMintChecks(count, msg.sender)
    postMintChecks
  {
    require(open == true, "Mint not open");
    _safeMint(msg.sender, count);
  }

  function mintTo(uint256 count, address to)
    external
    payable
    preMintChecks(count, to)
    postMintChecks
  {
    require(open == true, "Mint not open");
    _safeMint(to, count);
  }

  function mintAll() external payable onlyOwner {
    if (msg.value > 0) {
      AddressUpgradeable.sendValue(payable(_NFTGen), msg.value);
    }

    _safeMint(owner(), totalSupply() - supply());
  }

  function presaleMint(uint32 count, bytes32[] calldata proof)
    external
    payable
    preMintChecks(count, msg.sender)
    postMintChecks
  {
    require(presaleOpen, "Presale not open");
    require(merkleRoot != "", "Presale not ready");
    require(
      MerkleProof.verify(
        proof,
        merkleRoot,
        keccak256(abi.encodePacked(msg.sender))
      ),
      "Not a presale member"
    );

    _safeMint(msg.sender, count);
  }

  function presaleMintTo(
    uint32 count,
    bytes32[] calldata proof,
    address to
  ) external payable preMintChecks(count, to) postMintChecks {
    require(presaleOpen, "Presale not open");
    require(merkleRoot != "", "Presale not ready");
    require(
      MerkleProof.verify(proof, merkleRoot, keccak256(abi.encodePacked(to))),
      "Not a presale member"
    );

    _safeMint(to, count);
  }

  function referralMint(uint32 count, address referrer)
    external
    payable
    preMintChecks(count, msg.sender)
    postMintChecks
  {
    require(referralOpen == true, "Referrals not open");
    require(open == true, "Mint not open");
    require(referralCap > 0, "Cap is set to zero");
    require(_numberMinted(referrer) > 0, "Referrer has not minted");
    require(msg.sender != referrer, "Cannot refer yourself");

    _safeMint(msg.sender, count);

    referralMap[referrer] += 1;
    if (referralMap[referrer] % referralCap == 0) {
      if (supply() < totalSupply()) {
        _safeMint(referrer, 1);
      }
    }
  }

  function referralMintTo(
    uint32 count,
    address referrer,
    address to
  ) external payable preMintChecks(count, to) postMintChecks {
    require(referralOpen == true, "Referrals not open");
    require(open == true, "Mint not open");
    require(referralCap > 0, "Cap is set to zero");
    require(_numberMinted(referrer) > 0, "Referrer has not minted");
    require(to != referrer, "Cannot refer yourself");

    _safeMint(to, count);

    referralMap[referrer] += 1;
    if (referralMap[referrer] % referralCap == 0) {
      if (supply() < totalSupply()) {
        _safeMint(referrer, 1);
      }
    }
  }

  // ------ Read ------
  function supply() public view returns (uint256) {
    return _currentIndex - 1;
  }

  function totalSupply() public view override returns (uint256) {
    return maxSupply - _burnCounter;
  }

  function numberMintedOfOwner(address _address) public view returns (uint256) {
    return _numberMinted(_address);
  }

  function remainingMintsOfOwner(address _address)
    public
    view
    returns (uint256)
  {
    return maxPerWallet - _numberMinted(_address);
  }

  function mintCostOfOwner(address _address, uint256 _count)
    public
    view
    returns (uint256)
  {
    uint256 mintedSoFar = _numberMinted(_address);
    if (maxFreeMint > 0 && mintedSoFar < maxFreeMint) {
      return
        cost *
        (_count - MathUpgradeable.min(_count, maxFreeMint - mintedSoFar));
    }

    return _count * cost;
  }

  function supportsInterface(bytes4 interfaceId)
    public
    view
    override(ERC721AUpgradeable, IERC165)
    returns (bool)
  {
    return
      interfaceId == type(IERC2981).interfaceId ||
      super.supportsInterface(interfaceId);
  }

  function royaltyInfo(uint256 _tokenId, uint256 _salePrice)
    external
    view
    override
    returns (address receiver, uint256 royaltyAmount)
  {
    return (recipient, (_salePrice * recipientFee) / 1000);
  }

  function affiliatesOf(address owner) public view virtual returns (uint256) {
    return referralMap[owner];
  }

  function tokenURI(uint256 _tokenId)
    public
    view
    override
    returns (string memory)
  {
    require(_exists(_tokenId), "Does not exist");
    if (revealed == false) {
      return
        string(
          abi.encodePacked(
            uriNotRevealed,
            StringsUpgradeable.toString(_tokenId),
            ".json"
          )
        );
    }

    return
      string(
        abi.encodePacked(
          baseUri,
          StringsUpgradeable.toString(_tokenId),
          ".json"
        )
      );
  }

  // ------ Modifiers ------

  modifier preMintChecks(uint256 count, address to) {
    require(count > 0, "Mint at least one.");
    require(count <= maxPerMint, "Max mint reached.");
    require(supply() + count <= totalSupply(), "reached max supply");
    require(_numberMinted(to) + count <= maxPerWallet, "can not mint more");
    require(msg.value >= mintCostOfOwner(to, count), "Not enough fund.");

    if (pauseMintAt > 0) {
      require(supply() + count <= pauseMintAt, "reached pause supply");
    }

    if (reqToken != address(0)) {
      ERC721 accessToken = ERC721(reqToken);
      require(accessToken.balanceOf(msg.sender) > 0, "Access token not owned");
    }

    _;
  }

  modifier postMintChecks() {
    _;

    if (pauseMintAt > 0 && supply() >= pauseMintAt) {
      open = false;
      presaleOpen = false;
      pauseMintAt = 0;
    }
  }
}


// File contracts/NFTArtGenCreatorImpl.sol

contract NFTArtGenCreatorImpl is NFTArtGenUpgradeable {
  function initialize(
    string memory _name,
    string memory _symbol,
    uint256 _maxSupply,
    uint256 _commission
  ) public initializer {
    __NFTArtGen_init(_name, _symbol, _maxSupply, _commission);
  }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"affiliatesOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_amount","type":"uint256[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721AUpgradeable.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721AUpgradeable.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWithdrawSplit","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_commission","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","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":"maxFreeMint","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerMint","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintAll","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mintCostOfOwner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"mintTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"numberMintedOfOwner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"open","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseMintAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"count","type":"uint32"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint32","name":"count","type":"uint32"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"address","name":"to","type":"address"}],"name":"presaleMintTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referralCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"count","type":"uint32"},{"internalType":"address","name":"referrer","type":"address"}],"name":"referralMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint32","name":"count","type":"uint32"},{"internalType":"address","name":"referrer","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"referralMintTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"referralOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"remainingMintsOfOwner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reqToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"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":"uint256","name":"_val1","type":"uint256"}],"name":"setCommission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"updateBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_cap","type":"uint32"}],"name":"updateMaxFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pauseAt","type":"uint256"}],"name":"updatePauseMintAt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_open","type":"bool"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"updatePresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_open","type":"bool"},{"internalType":"uint256","name":"_val","type":"uint256"}],"name":"updateReferral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"updateReqToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_revealed","type":"bool"},{"internalType":"string","name":"_uri","type":"string"}],"name":"updateReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"updateRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_open","type":"bool"},{"internalType":"uint256","name":"_cost","type":"uint256"},{"internalType":"uint32","name":"_maxW","type":"uint32"},{"internalType":"uint32","name":"_maxM","type":"uint32"}],"name":"updateSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256[]","name":"_fees","type":"uint256[]"}],"name":"updateWithdrawSplit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

608060405234801561001057600080fd5b5061560e80620000216000396000f3fe6080604052600436106103a25760003560e01c806370a08231116101e7578063be8e43ee1161010d578063dfdd9b9a116100a0578063f2fde38b1161006f578063f2fde38b14610ae7578063f5ca4dfd14610b07578063fcfff16f14610b2a578063fe25219a14610b4557600080fd5b8063dfdd9b9a14610a54578063e985e9c514610a6b578063e9b1388f14610ab4578063f179dca114610ad457600080fd5b8063c87b56dd116100dc578063c87b56dd146109bd578063d6c5b414146109dd578063d8deebd914610a14578063db31882b14610a3457600080fd5b8063be8e43ee1461092e578063bee6348a1461094e578063c23dc68f1461096f578063c7d126101461099c57600080fd5b806399a2557a11610185578063a591252d11610154578063a591252d146108b6578063b723b34e146108db578063b88d4fde146108ee578063bd1b6be41461090e57600080fd5b806399a2557a146108435780639ea7b2ba14610863578063a0712d6814610883578063a22cb4651461089657600080fd5b80638462151c116101c15780638462151c146107d05780638624a72b146107fd5780638da5cb5b1461081057806395d89b411461082e57600080fd5b806370a082311461077b578063715018a61461079b578063828c12ce146107b057600080fd5b80633b9e106d116102cc578063518302271161026a57806364bb10611161023957806364bb1061146106f9578063672434821461071b5780636c2f5acd1461073b5780636fe0e3951461075b57600080fd5b80635183022714610684578063595882b3146106a45780635bbb2177146106ac5780636352211e146106d957600080fd5b806342966c68116102a657806342966c68146105eb578063453c23101461060b5780634b0bdd2a14610646578063507e094f1461066657600080fd5b80633b9e106d146105b05780633ccfd60b146105c357806342842e0e146105cb57600080fd5b806310384ba11161034457806323b872dd1161031357806323b872dd146105115780632a55205a14610531578063355e6b431461057057806339f7e37f1461059057600080fd5b806310384ba1146104ae57806313faede6146104c557806318160ddd146104dc5780631d02161d146104f157600080fd5b806306fdde031161038057806306fdde0314610414578063081812fc14610436578063095ea7b31461046e5780631012c3301461048e57600080fd5b806301ffc9a7146103a75780630364d22a146103dc578063047fc9aa146103f1575b600080fd5b3480156103b357600080fd5b506103c76103c2366004614e61565b610b65565b60405190151581526020015b60405180910390f35b6103ef6103ea366004615033565b610b90565b005b3480156103fd57600080fd5b50610406610ff3565b6040519081526020016103d3565b34801561042057600080fd5b50610429611009565b6040516103d3919061532b565b34801561044257600080fd5b50610456610451366004614f42565b61109b565b6040516001600160a01b0390911681526020016103d3565b34801561047a57600080fd5b506103ef610489366004614c5e565b6110df565b34801561049a57600080fd5b506103ef6104a9366004614b2f565b611166565b3480156104ba57600080fd5b5061040661012e5481565b3480156104d157600080fd5b5061040661012f5481565b3480156104e857600080fd5b506104066111b3565b3480156104fd57600080fd5b506103ef61050c366004614e14565b6111c6565b34801561051d57600080fd5b506103ef61052c366004614b7d565b61123a565b34801561053d57600080fd5b5061055161054c366004614f97565b611245565b604080516001600160a01b0390931683526020830191909152016103d3565b34801561057c57600080fd5b506103ef61058b366004614f42565b611282565b34801561059c57600080fd5b506103ef6105ab366004614e9b565b6113c5565b6103ef6105be366004614ff0565b611432565b6103ef611915565b3480156105d757600080fd5b506103ef6105e6366004614b7d565b611a02565b3480156105f757600080fd5b506103ef610606366004614f42565b611a1d565b34801561061757600080fd5b5061012d5461063190640100000000900463ffffffff1681565b60405163ffffffff90911681526020016103d3565b34801561065257600080fd5b50610406610661366004614b2f565b611a2b565b34801561067257600080fd5b5061012d546106319063ffffffff1681565b34801561069057600080fd5b50610130546103c790610100900460ff1681565b6103ef611a36565b3480156106b857600080fd5b506106cc6106c7366004614d81565b611aba565b6040516103d391906152ae565b3480156106e557600080fd5b506104566106f4366004614f42565b611b80565b34801561070557600080fd5b50610130546103c7906301000000900460ff1681565b34801561072757600080fd5b506103ef610736366004614cbb565b611b92565b34801561074757600080fd5b506103ef610756366004614c5e565b611c76565b34801561076757600080fd5b506103ef610776366004614ecf565b611cc8565b34801561078757600080fd5b50610406610796366004614b2f565b611d90565b3480156107a757600080fd5b506103ef611dde565b3480156107bc57600080fd5b506103ef6107cb366004614dd1565b611e12565b3480156107dc57600080fd5b506107f06107eb366004614b2f565b611f2f565b6040516103d39190615318565b6103ef61080b366004615085565b61207c565b34801561081c57600080fd5b5060fb546001600160a01b0316610456565b34801561083a57600080fd5b506104296124c5565b34801561084f57600080fd5b506107f061085e366004614c88565b6124d4565b34801561086f57600080fd5b506103ef61087e366004614f42565b61269c565b6103ef610891366004614f42565b612713565b3480156108a257600080fd5b506103ef6108b1366004614c34565b612a60565b3480156108c257600080fd5b5061012d5461063190600160401b900463ffffffff1681565b6103ef6108e9366004614f74565b612af6565b3480156108fa57600080fd5b506103ef610909366004614bb9565b612e44565b34801561091a57600080fd5b50610406610929366004614c5e565b612e88565b34801561093a57600080fd5b506103ef610949366004614cbb565b612f27565b34801561095a57600080fd5b50610130546103c79062010000900460ff1681565b34801561097b57600080fd5b5061098f61098a366004614f42565b613143565b6040516103d391906153ea565b3480156109a857600080fd5b5061013254610456906001600160a01b031681565b3480156109c957600080fd5b506104296109d8366004614f42565b6131fd565b3480156109e957600080fd5b506104066109f8366004614b2f565b6001600160a01b03166000908152610139602052604090205490565b348015610a2057600080fd5b506103ef610a2f366004614fb9565b613294565b348015610a4057600080fd5b506103ef610a4f366004614db5565b6132ea565b348015610a6057600080fd5b506104066101315481565b348015610a7757600080fd5b506103c7610a86366004614b4a565b6001600160a01b039182166000908152606c6020908152604080832093909416825291909152205460ff1690565b348015610ac057600080fd5b50610406610acf366004614b2f565b613336565b6103ef610ae2366004614fd4565b61335d565b348015610af357600080fd5b506103ef610b02366004614b2f565b613837565b348015610b1357600080fd5b50610b1c6138cf565b6040516103d3929190615258565b348015610b3657600080fd5b50610130546103c79060ff1681565b348015610b5157600080fd5b506103ef610b60366004614db5565b613a05565b60006001600160e01b0319821663152a902d60e11b1480610b8a5750610b8a82613a53565b92915050565b8263ffffffff163360008211610be25760405162461bcd60e51b815260206004820152601260248201527126b4b73a1030ba103632b0b9ba1037b7329760711b60448201526064015b60405180910390fd5b61012d5463ffffffff16821115610c2f5760405162461bcd60e51b815260206004820152601160248201527026b0bc1036b4b73a103932b0b1b432b21760791b6044820152606401610bd9565b610c376111b3565b82610c40610ff3565b610c4a9190615472565b1115610c685760405162461bcd60e51b8152600401610bd99061533e565b61012d54640100000000900463ffffffff1682610c8483613aa3565b610c8e9190615472565b1115610cd05760405162461bcd60e51b815260206004820152601160248201527063616e206e6f74206d696e74206d6f726560781b6044820152606401610bd9565b610cda8183612e88565b341015610d1c5760405162461bcd60e51b815260206004820152601060248201526f2737ba1032b737bab3b410333ab7321760811b6044820152606401610bd9565b61012e5415610d815761012e5482610d32610ff3565b610d3c9190615472565b1115610d815760405162461bcd60e51b81526020600482015260146024820152737265616368656420706175736520737570706c7960601b6044820152606401610bd9565b610132546001600160a01b031615610e5c57610132546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b158015610ddc57600080fd5b505afa158015610df0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e149190614f5b565b11610e5a5760405162461bcd60e51b81526020600482015260166024820152751058d8d95cdcc81d1bdad95b881b9bdd081bdddb995960521b6044820152606401610bd9565b505b6101305462010000900460ff16610ea85760405162461bcd60e51b815260206004820152601060248201526f283932b9b0b632903737ba1037b832b760811b6044820152606401610bd9565b61013854610eec5760405162461bcd60e51b815260206004820152601160248201527050726573616c65206e6f7420726561647960781b6044820152606401610bd9565b610f6384848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050610138546040516bffffffffffffffffffffffff193360601b16602082015290925060340190505b60405160208183030381529060405280519060200120613ace565b610fa65760405162461bcd60e51b81526020600482015260146024820152732737ba103090383932b9b0b6329036b2b6b132b960611b6044820152606401610bd9565b610fb6338663ffffffff16613ae4565b600061012e54118015610fd3575061012e54610fd0610ff3565b10155b15610fec57610130805462ff00ff19169055600061012e555b5050505050565b6000600160655461100491906154bd565b905090565b60606067805461101890615500565b80601f016020809104026020016040519081016040528092919081815260200182805461104490615500565b80156110915780601f1061106657610100808354040283529160200191611091565b820191906000526020600020905b81548152906001019060200180831161107457829003601f168201915b5050505050905090565b60006110a682613afe565b6110c3576040516333d1c03960e21b815260040160405180910390fd5b506000908152606b60205260409020546001600160a01b031690565b60006110ea82611b80565b9050806001600160a01b0316836001600160a01b0316141561111f5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614611156576111398133610a86565b611156576040516367d9dca160e11b815260040160405180910390fd5b611161838383613b37565b505050565b60fb546001600160a01b031633146111905760405162461bcd60e51b8152600401610bd99061536a565b61013280546001600160a01b0319166001600160a01b0392909216919091179055565b60006066546101335461100491906154bd565b60fb546001600160a01b031633146111f05760405162461bcd60e51b8152600401610bd99061536a565b610130805460ff19169415159490941790935561012f9190915561012d805467ffffffffffffffff191664010000000063ffffffff9384160263ffffffff19161791909216179055565b611161838383613b93565b610135546101365460009182916001600160a01b03909116906103e89061126c908661549e565b611276919061548a565b915091505b9250929050565b3373460fd5059e7301680fa53e63bbbf7272e643e89c146112d75760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610bd9565b73460fd5059e7301680fa53e63bbbf7272e643e89c600090815261013b6020527fd916a72ce10946b394851acd0063bb557ec6ef7bf7046cb9a8c5ea8da809b25e546113249083906154bd565b73460fd5059e7301680fa53e63bbbf7272e643e89c600090815261013b60208190527fd916a72ce10946b394851acd0063bb557ec6ef7bf7046cb9a8c5ea8da809b25e85905561013c80549394508493919291600190811061138857611388615596565b60009182526020808320909101546001600160a01b03168352820192909252604001812080549091906113bc908490615472565b90915550505050565b3373460fd5059e7301680fa53e63bbbf7272e643e89c1461141a5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610bd9565b805161142e906101349060208401906148d4565b5050565b8263ffffffff16816000821161147f5760405162461bcd60e51b815260206004820152601260248201527126b4b73a1030ba103632b0b9ba1037b7329760711b6044820152606401610bd9565b61012d5463ffffffff168211156114cc5760405162461bcd60e51b815260206004820152601160248201527026b0bc1036b4b73a103932b0b1b432b21760791b6044820152606401610bd9565b6114d46111b3565b826114dd610ff3565b6114e79190615472565b11156115055760405162461bcd60e51b8152600401610bd99061533e565b61012d54640100000000900463ffffffff168261152183613aa3565b61152b9190615472565b111561156d5760405162461bcd60e51b815260206004820152601160248201527063616e206e6f74206d696e74206d6f726560781b6044820152606401610bd9565b6115778183612e88565b3410156115b95760405162461bcd60e51b815260206004820152601060248201526f2737ba1032b737bab3b410333ab7321760811b6044820152606401610bd9565b61012e541561161e5761012e54826115cf610ff3565b6115d99190615472565b111561161e5760405162461bcd60e51b81526020600482015260146024820152737265616368656420706175736520737570706c7960601b6044820152606401610bd9565b610132546001600160a01b0316156116f957610132546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b15801561167957600080fd5b505afa15801561168d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b19190614f5b565b116116f75760405162461bcd60e51b81526020600482015260166024820152751058d8d95cdcc81d1bdad95b881b9bdd081bdddb995960521b6044820152606401610bd9565b505b610130546301000000900460ff16151560011461174d5760405162461bcd60e51b81526020600482015260126024820152712932b332b93930b639903737ba1037b832b760711b6044820152606401610bd9565b6101305460ff1615156001146117955760405162461bcd60e51b815260206004820152600d60248201526c26b4b73a103737ba1037b832b760991b6044820152606401610bd9565b600061013154116117dd5760405162461bcd60e51b81526020600482015260126024820152714361702069732073657420746f207a65726f60701b6044820152606401610bd9565b60006117e885613aa3565b1161182f5760405162461bcd60e51b8152602060048201526017602482015276149959995c9c995c881a185cc81b9bdd081b5a5b9d1959604a1b6044820152606401610bd9565b836001600160a01b0316836001600160a01b031614156118895760405162461bcd60e51b815260206004820152601560248201527421b0b73737ba103932b332b9103cb7bab939b2b63360591b6044820152606401610bd9565b611899838663ffffffff16613ae4565b6001600160a01b0384166000908152610139602052604081208054600192906118c3908490615472565b9091555050610131546001600160a01b038516600090815261013960205260409020546118f09190615556565b610fb6576118fc6111b3565b611904610ff3565b1015610fb657610fb6846001613ae4565b47806119525760405162461bcd60e51b815260206004820152600c60248201526b5a65726f2062616c616e636560a01b6044820152606401610bd9565b60005b61013c5481101561142e57600061013b600061013c848154811061197b5761197b615596565b60009182526020808320909101546001600160a01b0316835282019290925260400181205491506103e86119af858461549e565b6119b9919061548a565b90506119ed61013c84815481106119d2576119d2615596565b6000918252602090912001546001600160a01b031682613d7e565b505080806119fa9061553b565b915050611955565b61116183838360405180602001604052806000815250612e44565b611a28816001613e97565b50565b6000610b8a82613aa3565b60fb546001600160a01b03163314611a605760405162461bcd60e51b8152600401610bd99061536a565b3415611a8457611a8473460fd5059e7301680fa53e63bbbf7272e643e89c34613d7e565b611ab8611a9960fb546001600160a01b031690565b611aa1610ff3565b611aa96111b3565b611ab391906154bd565b613ae4565b565b80516060906000816001600160401b03811115611ad957611ad96155ac565b604051908082528060200260200182016040528015611b2457816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181611af75790505b50905060005b828114611b7857611b53858281518110611b4657611b46615596565b6020026020010151613143565b828281518110611b6557611b65615596565b6020908102919091010152600101611b2a565b509392505050565b6000611b8b8261405d565b5192915050565b60fb546001600160a01b03163314611bbc5760405162461bcd60e51b8152600401610bd99061536a565b8051825114611bca57600080fd5b60005b815181101561116157611bde6111b3565b828281518110611bf057611bf0615596565b6020026020010151611c00610ff3565b611c0a9190615472565b1115611c285760405162461bcd60e51b8152600401610bd99061533e565b611c64838281518110611c3d57611c3d615596565b6020026020010151838381518110611c5757611c57615596565b6020026020010151613ae4565b80611c6e8161553b565b915050611bcd565b60fb546001600160a01b03163314611ca05760405162461bcd60e51b8152600401610bd99061536a565b61013580546001600160a01b0319166001600160a01b03939093169290921790915561013655565b600054610100900460ff16611ce35760005460ff1615611ce7565b303b155b611d4a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610bd9565b600054610100900460ff16158015611d6c576000805461ffff19166101011790555b611d788585858561417f565b8015610fec576000805461ff00191690555050505050565b60006001600160a01b038216611db9576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152606a60205260409020546001600160401b031690565b60fb546001600160a01b03163314611e085760405162461bcd60e51b8152600401610bd99061536a565b611ab860006142ff565b60fb546001600160a01b03163314611e3c5760405162461bcd60e51b8152600401610bd99061536a565b610130805461ff00191661010084151590810291909117909155611e70578051611e6e906101379060208401906148d4565b505b6001821515141561142e5760006101348054611e8b90615500565b80601f0160208091040260200160405190810160405280929190818152602001828054611eb790615500565b8015611f045780601f10611ed957610100808354040283529160200191611f04565b820191906000526020600020905b815481529060010190602001808311611ee757829003601f168201915b50505050509050805160001415611161578151611f29906101349060208501906148d4565b50505050565b60606000806000611f3f85611d90565b90506000816001600160401b03811115611f5b57611f5b6155ac565b604051908082528060200260200182016040528015611f84578160200160208202803683370190505b509050611faa604080516060810182526000808252602082018190529181019190915290565b60015b83861461207057600081815260696020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615801592820192909252925061201357612068565b81516001600160a01b03161561202857815194505b876001600160a01b0316856001600160a01b03161415612068578083878060010198508151811061205b5761205b615596565b6020026020010181815250505b600101611fad565b50909695505050505050565b8363ffffffff1681600082116120c95760405162461bcd60e51b815260206004820152601260248201527126b4b73a1030ba103632b0b9ba1037b7329760711b6044820152606401610bd9565b61012d5463ffffffff168211156121165760405162461bcd60e51b815260206004820152601160248201527026b0bc1036b4b73a103932b0b1b432b21760791b6044820152606401610bd9565b61211e6111b3565b82612127610ff3565b6121319190615472565b111561214f5760405162461bcd60e51b8152600401610bd99061533e565b61012d54640100000000900463ffffffff168261216b83613aa3565b6121759190615472565b11156121b75760405162461bcd60e51b815260206004820152601160248201527063616e206e6f74206d696e74206d6f726560781b6044820152606401610bd9565b6121c18183612e88565b3410156122035760405162461bcd60e51b815260206004820152601060248201526f2737ba1032b737bab3b410333ab7321760811b6044820152606401610bd9565b61012e54156122685761012e5482612219610ff3565b6122239190615472565b11156122685760405162461bcd60e51b81526020600482015260146024820152737265616368656420706175736520737570706c7960601b6044820152606401610bd9565b610132546001600160a01b03161561234357610132546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b1580156122c357600080fd5b505afa1580156122d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122fb9190614f5b565b116123415760405162461bcd60e51b81526020600482015260166024820152751058d8d95cdcc81d1bdad95b881b9bdd081bdddb995960521b6044820152606401610bd9565b505b6101305462010000900460ff1661238f5760405162461bcd60e51b815260206004820152601060248201526f283932b9b0b632903737ba1037b832b760811b6044820152606401610bd9565b610138546123d35760405162461bcd60e51b815260206004820152601160248201527050726573616c65206e6f7420726561647960781b6044820152606401610bd9565b61243485858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050610138546040516bffffffffffffffffffffffff1960608a901b1660208201529092506034019050610f48565b6124775760405162461bcd60e51b81526020600482015260146024820152732737ba103090383932b9b0b6329036b2b6b132b960611b6044820152606401610bd9565b612487838763ffffffff16613ae4565b600061012e541180156124a4575061012e546124a1610ff3565b10155b156124bd57610130805462ff00ff19169055600061012e555b505050505050565b60606068805461101890615500565b60608183106124f657604051631960ccad60e11b815260040160405180910390fd5b606554600090600185101561250a57600194505b80841115612516578093505b600061252187611d90565b905084861015612540578585038181101561253a578091505b50612544565b5060005b6000816001600160401b0381111561255e5761255e6155ac565b604051908082528060200260200182016040528015612587578160200160208202803683370190505b5090508161259a57935061269592505050565b60006125a588613143565b9050600081604001516125b6575080515b885b8881141580156125c85750848714155b1561268957600081815260696020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615801592820192909252935061262c57612681565b82516001600160a01b03161561264157825191505b8a6001600160a01b0316826001600160a01b03161415612681578084888060010199508151811061267457612674615596565b6020026020010181815250505b6001016125b8565b50505092835250909150505b9392505050565b60fb546001600160a01b031633146126c65760405162461bcd60e51b8152600401610bd99061536a565b6126ce610ff3565b81101561270d5760405162461bcd60e51b815260206004820152600d60248201526c496e76616c69642076616c756560981b6044820152606401610bd9565b61012e55565b80336000821161275a5760405162461bcd60e51b815260206004820152601260248201527126b4b73a1030ba103632b0b9ba1037b7329760711b6044820152606401610bd9565b61012d5463ffffffff168211156127a75760405162461bcd60e51b815260206004820152601160248201527026b0bc1036b4b73a103932b0b1b432b21760791b6044820152606401610bd9565b6127af6111b3565b826127b8610ff3565b6127c29190615472565b11156127e05760405162461bcd60e51b8152600401610bd99061533e565b61012d54640100000000900463ffffffff16826127fc83613aa3565b6128069190615472565b11156128485760405162461bcd60e51b815260206004820152601160248201527063616e206e6f74206d696e74206d6f726560781b6044820152606401610bd9565b6128528183612e88565b3410156128945760405162461bcd60e51b815260206004820152601060248201526f2737ba1032b737bab3b410333ab7321760811b6044820152606401610bd9565b61012e54156128f95761012e54826128aa610ff3565b6128b49190615472565b11156128f95760405162461bcd60e51b81526020600482015260146024820152737265616368656420706175736520737570706c7960601b6044820152606401610bd9565b610132546001600160a01b0316156129d457610132546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b15801561295457600080fd5b505afa158015612968573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061298c9190614f5b565b116129d25760405162461bcd60e51b81526020600482015260166024820152751058d8d95cdcc81d1bdad95b881b9bdd081bdddb995960521b6044820152606401610bd9565b505b6101305460ff161515600114612a1c5760405162461bcd60e51b815260206004820152600d60248201526c26b4b73a103737ba1037b832b760991b6044820152606401610bd9565b612a263384613ae4565b600061012e54118015612a43575061012e54612a40610ff3565b10155b1561116157610130805462ff00ff19169055600061012e55505050565b6001600160a01b038216331415612a8a5760405163b06307db60e01b815260040160405180910390fd5b336000818152606c602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b818160008211612b3d5760405162461bcd60e51b815260206004820152601260248201527126b4b73a1030ba103632b0b9ba1037b7329760711b6044820152606401610bd9565b61012d5463ffffffff16821115612b8a5760405162461bcd60e51b815260206004820152601160248201527026b0bc1036b4b73a103932b0b1b432b21760791b6044820152606401610bd9565b612b926111b3565b82612b9b610ff3565b612ba59190615472565b1115612bc35760405162461bcd60e51b8152600401610bd99061533e565b61012d54640100000000900463ffffffff1682612bdf83613aa3565b612be99190615472565b1115612c2b5760405162461bcd60e51b815260206004820152601160248201527063616e206e6f74206d696e74206d6f726560781b6044820152606401610bd9565b612c358183612e88565b341015612c775760405162461bcd60e51b815260206004820152601060248201526f2737ba1032b737bab3b410333ab7321760811b6044820152606401610bd9565b61012e5415612cdc5761012e5482612c8d610ff3565b612c979190615472565b1115612cdc5760405162461bcd60e51b81526020600482015260146024820152737265616368656420706175736520737570706c7960601b6044820152606401610bd9565b610132546001600160a01b031615612db757610132546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b158015612d3757600080fd5b505afa158015612d4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d6f9190614f5b565b11612db55760405162461bcd60e51b81526020600482015260166024820152751058d8d95cdcc81d1bdad95b881b9bdd081bdddb995960521b6044820152606401610bd9565b505b6101305460ff161515600114612dff5760405162461bcd60e51b815260206004820152600d60248201526c26b4b73a103737ba1037b832b760991b6044820152606401610bd9565b612e098385613ae4565b600061012e54118015612e26575061012e54612e23610ff3565b10155b15611f2957610130805462ff00ff19169055600061012e5550505050565b612e4f848484613b93565b6001600160a01b0383163b15611f2957612e6b84848484614351565b611f29576040516368d2bf6b60e11b815260040160405180910390fd5b600080612e9484613aa3565b61012d54909150600160401b900463ffffffff1615801590612ec5575061012d54600160401b900463ffffffff1681105b15612f115761012d54612ef1908490612eec908490600160401b900463ffffffff166154bd565b614448565b612efb90846154bd565b61012f54612f09919061549e565b915050610b8a565b61012f54612f1f908461549e565b949350505050565b60fb546001600160a01b03163314612f515760405162461bcd60e51b8152600401610bd99061536a565b60015b61013c54811015612faf5761013b600061013c8381548110612f7857612f78615596565b60009182526020808320909101546001600160a01b0316835282019290925260400181205580612fa78161553b565b915050612f54565b508151612fbd906001615472565b6001600160401b03811115612fd457612fd46155ac565b604051908082528060200260200182016040528015612ffd578160200160208202803683370190505b5080516130139161013c91602090910190614958565b5073460fd5059e7301680fa53e63bbbf7272e643e89c61013c60008154811061303e5761303e615596565b6000918252602082200180546001600160a01b0319166001600160a01b0393909316929092179091555b82518110156111615781818151811061308357613083615596565b602002602001015161013b60008584815181106130a2576130a2615596565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055508281815181106130e0576130e0615596565b602002602001015161013c8260016130f89190615472565b8154811061310857613108615596565b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790558061313b8161553b565b915050613068565b6040805160608082018352600080835260208084018290528385018290528451928301855281835282018190529281019290925290600183108061318957506065548310155b156131945792915050565b50600082815260696020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615801592820192909252906131f45792915050565b6126958361405d565b606061320882613afe565b6132455760405162461bcd60e51b815260206004820152600e60248201526d111bd95cc81b9bdd08195e1a5cdd60921b6044820152606401610bd9565b61013054610100900460ff16613288576101376132618361445e565b604051602001613272929190615161565b6040516020818303038152906040529050919050565b6101346132618361445e565b60fb546001600160a01b031633146132be5760405162461bcd60e51b8152600401610bd99061536a565b61012d805463ffffffff909216600160401b026bffffffff000000000000000019909216919091179055565b60fb546001600160a01b031633146133145760405162461bcd60e51b8152600401610bd99061536a565b6101308054921515620100000262ff0000199093169290921790915561013855565b600061334182613aa3565b61012d54610b8a9190640100000000900463ffffffff166154bd565b8163ffffffff1633600082116133aa5760405162461bcd60e51b815260206004820152601260248201527126b4b73a1030ba103632b0b9ba1037b7329760711b6044820152606401610bd9565b61012d5463ffffffff168211156133f75760405162461bcd60e51b815260206004820152601160248201527026b0bc1036b4b73a103932b0b1b432b21760791b6044820152606401610bd9565b6133ff6111b3565b82613408610ff3565b6134129190615472565b11156134305760405162461bcd60e51b8152600401610bd99061533e565b61012d54640100000000900463ffffffff168261344c83613aa3565b6134569190615472565b11156134985760405162461bcd60e51b815260206004820152601160248201527063616e206e6f74206d696e74206d6f726560781b6044820152606401610bd9565b6134a28183612e88565b3410156134e45760405162461bcd60e51b815260206004820152601060248201526f2737ba1032b737bab3b410333ab7321760811b6044820152606401610bd9565b61012e54156135495761012e54826134fa610ff3565b6135049190615472565b11156135495760405162461bcd60e51b81526020600482015260146024820152737265616368656420706175736520737570706c7960601b6044820152606401610bd9565b610132546001600160a01b03161561362457610132546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b1580156135a457600080fd5b505afa1580156135b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135dc9190614f5b565b116136225760405162461bcd60e51b81526020600482015260166024820152751058d8d95cdcc81d1bdad95b881b9bdd081bdddb995960521b6044820152606401610bd9565b505b610130546301000000900460ff1615156001146136785760405162461bcd60e51b81526020600482015260126024820152712932b332b93930b639903737ba1037b832b760711b6044820152606401610bd9565b6101305460ff1615156001146136c05760405162461bcd60e51b815260206004820152600d60248201526c26b4b73a103737ba1037b832b760991b6044820152606401610bd9565b600061013154116137085760405162461bcd60e51b81526020600482015260126024820152714361702069732073657420746f207a65726f60701b6044820152606401610bd9565b600061371384613aa3565b1161375a5760405162461bcd60e51b8152602060048201526017602482015276149959995c9c995c881a185cc81b9bdd081b5a5b9d1959604a1b6044820152606401610bd9565b336001600160a01b03841614156137ab5760405162461bcd60e51b815260206004820152601560248201527421b0b73737ba103932b332b9103cb7bab939b2b63360591b6044820152606401610bd9565b6137bb338563ffffffff16613ae4565b6001600160a01b0383166000908152610139602052604081208054600192906137e5908490615472565b9091555050610131546001600160a01b038416600090815261013960205260409020546138129190615556565b612e095761381e6111b3565b613826610ff3565b1015612e0957612e09836001613ae4565b60fb546001600160a01b031633146138615760405162461bcd60e51b8152600401610bd99061536a565b6001600160a01b0381166138c65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bd9565b611a28816142ff565b606080600061013c805490506001600160401b038111156138f2576138f26155ac565b60405190808252806020026020018201604052801561391b578160200160208202803683370190505b50905060005b61013c5481101561399b5761013b600061013c838154811061394557613945615596565b60009182526020808320909101546001600160a01b03168352820192909252604001902054825183908390811061397e5761397e615596565b6020908102919091010152806139938161553b565b915050613921565b5061013c81818054806020026020016040519081016040528092919081815260200182805480156139f557602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116139d7575b5050505050915092509250509091565b60fb546001600160a01b03163314613a2f5760405162461bcd60e51b8152600401610bd99061536a565b610130805492151563010000000263ff000000199093169290921790915561013155565b60006001600160e01b031982166380ac58cd60e01b1480613a8457506001600160e01b03198216635b5e139f60e01b145b80610b8a57506301ffc9a760e01b6001600160e01b0319831614610b8a565b6001600160a01b03166000908152606a6020526040902054600160401b90046001600160401b031690565b600082613adb858461455b565b14949350505050565b61142e8282604051806020016040528060008152506145ff565b600081600111158015613b12575060655482105b8015610b8a575050600090815260696020526040902054600160e01b900460ff161590565b6000828152606b602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000613b9e8261405d565b9050836001600160a01b031681600001516001600160a01b031614613bd55760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480613bf35750613bf38533610a86565b80613c0e575033613c038461109b565b6001600160a01b0316145b905080613c2e57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416613c5557604051633a954ecd60e21b815260040160405180910390fd5b613c6160008487613b37565b6001600160a01b038581166000908152606a60209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652606990945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116613d35576065548214613d3557805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610fec565b80471015613dce5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610bd9565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613e1b576040519150601f19603f3d011682016040523d82523d6000602084013e613e20565b606091505b50509050806111615760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610bd9565b6000613ea28361405d565b80519091508215613f08576000336001600160a01b0383161480613ecb5750613ecb8233610a86565b80613ee6575033613edb8661109b565b6001600160a01b0316145b905080613f0657604051632ce44b5f60e11b815260040160405180910390fd5b505b613f1460008583613b37565b6001600160a01b038082166000818152606a602090815260408083208054600160801b6000196001600160401b0380841691909101811667ffffffffffffffff198416811783900482166001908101831690930277ffffffffffffffff0000000000000000ffffffffffffffff19909416179290921783558b86526069909452828520805460ff60e01b1942909316600160a01b026001600160e01b03199091169097179690961716600160e01b17855591890180845292208054919490911661401257606554821461401257805460208701516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a450506066805460010190555050565b604080516060810182526000808252602082018190529181019190915281806001116141665760655481101561416657600081815260696020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906141645780516001600160a01b0316156140fb579392505050565b5060001901600081815260696020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff161515928101929092521561415f579392505050565b6140fb565b505b604051636f96cda160e11b815260040160405180910390fd5b600054610100900460ff166141a65760405162461bcd60e51b8152600401610bd99061539f565b6141b084846147bd565b6141b86147ee565b6141c06147ee565b6141c8614815565b610133829055610130805461ff001916905573460fd5059e7301680fa53e63bbbf7272e643e89c60005261013b6020527fd916a72ce10946b394851acd0063bb557ec6ef7bf7046cb9a8c5ea8da809b25e819055614228816103e86154bd565b61013b600061423f60fb546001600160a01b031690565b6001600160a01b03168152602081019190915260400160009081209190915561013c8054600181018255918190527fa55c1639d917d7b7cbf3837f1642937d4507076edbe26b1a6008234bb0c4953090910180546001600160a01b03191673460fd5059e7301680fa53e63bbbf7272e643e89c1790556142c760fb546001600160a01b031690565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b0390921691909117905550505050565b60fb80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061438690339089908890889060040161521c565b602060405180830381600087803b1580156143a057600080fd5b505af19250505080156143d0575060408051601f3d908101601f191682019092526143cd91810190614e7e565b60015b61442b573d8080156143fe576040519150601f19603f3d011682016040523d82523d6000602084013e614403565b606091505b508051614423576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b60008183106144575781612695565b5090919050565b6060816144825750506040805180820190915260018152600360fc1b602082015290565b8160005b81156144ac57806144968161553b565b91506144a59050600a8361548a565b9150614486565b6000816001600160401b038111156144c6576144c66155ac565b6040519080825280601f01601f1916602001820160405280156144f0576020820181803683370190505b5090505b8415612f1f576145056001836154bd565b9150614512600a86615556565b61451d906030615472565b60f81b81838151811061453257614532615596565b60200101906001600160f81b031916908160001a905350614554600a8661548a565b94506144f4565b600081815b8451811015611b7857600085828151811061457d5761457d615596565b602002602001015190508083116145bf5760408051602081018590529081018290526060016040516020818303038152906040528051906020012092506145ec565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b50806145f78161553b565b915050614560565b6065546001600160a01b03841661462857604051622e076360e81b815260040160405180910390fd5b826146465760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b0384166000818152606a6020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b018116918217600160401b67ffffffffffffffff1990941690921783900481168b01811690920217909155858452606990925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15614769575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46147326000878480600101955087614351565b61474f576040516368d2bf6b60e11b815260040160405180910390fd5b8082106146e757826065541461476457600080fd5b6147ae565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821061476a575b50606555611f29600085838684565b600054610100900460ff166147e45760405162461bcd60e51b8152600401610bd99061539f565b61142e828261484c565b600054610100900460ff16611ab85760405162461bcd60e51b8152600401610bd99061539f565b600054610100900460ff1661483c5760405162461bcd60e51b8152600401610bd99061539f565b6148446147ee565b611ab86148a4565b600054610100900460ff166148735760405162461bcd60e51b8152600401610bd99061539f565b81516148869060679060208501906148d4565b50805161489a9060689060208401906148d4565b5060016065555050565b600054610100900460ff166148cb5760405162461bcd60e51b8152600401610bd99061539f565b611ab8336142ff565b8280546148e090615500565b90600052602060002090601f0160209004810192826149025760008555614948565b82601f1061491b57805160ff1916838001178555614948565b82800160010185558215614948579182015b8281111561494857825182559160200191906001019061492d565b506149549291506149ad565b5090565b828054828255906000526020600020908101928215614948579160200282015b8281111561494857825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614978565b5b8082111561495457600081556001016149ae565b60006001600160401b038311156149db576149db6155ac565b6149ee601f8401601f191660200161541f565b9050828152838383011115614a0257600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114614a3057600080fd5b919050565b60008083601f840112614a4757600080fd5b5081356001600160401b03811115614a5e57600080fd5b6020830191508360208260051b850101111561127b57600080fd5b600082601f830112614a8a57600080fd5b81356020614a9f614a9a8361544f565b61541f565b80838252828201915082860187848660051b8901011115614abf57600080fd5b60005b85811015614ade57813584529284019290840190600101614ac2565b5090979650505050505050565b80358015158114614a3057600080fd5b600082601f830112614b0c57600080fd5b612695838335602085016149c2565b803563ffffffff81168114614a3057600080fd5b600060208284031215614b4157600080fd5b61269582614a19565b60008060408385031215614b5d57600080fd5b614b6683614a19565b9150614b7460208401614a19565b90509250929050565b600080600060608486031215614b9257600080fd5b614b9b84614a19565b9250614ba960208501614a19565b9150604084013590509250925092565b60008060008060808587031215614bcf57600080fd5b614bd885614a19565b9350614be660208601614a19565b92506040850135915060608501356001600160401b03811115614c0857600080fd5b8501601f81018713614c1957600080fd5b614c28878235602084016149c2565b91505092959194509250565b60008060408385031215614c4757600080fd5b614c5083614a19565b9150614b7460208401614aeb565b60008060408385031215614c7157600080fd5b614c7a83614a19565b946020939093013593505050565b600080600060608486031215614c9d57600080fd5b614ca684614a19565b95602085013595506040909401359392505050565b60008060408385031215614cce57600080fd5b82356001600160401b0380821115614ce557600080fd5b818501915085601f830112614cf957600080fd5b81356020614d09614a9a8361544f565b8083825282820191508286018a848660051b8901011115614d2957600080fd5b600096505b84871015614d5357614d3f81614a19565b835260019690960195918301918301614d2e565b5096505086013592505080821115614d6a57600080fd5b50614d7785828601614a79565b9150509250929050565b600060208284031215614d9357600080fd5b81356001600160401b03811115614da957600080fd5b612f1f84828501614a79565b60008060408385031215614dc857600080fd5b614c7a83614aeb565b60008060408385031215614de457600080fd5b614ded83614aeb565b915060208301356001600160401b03811115614e0857600080fd5b614d7785828601614afb565b60008060008060808587031215614e2a57600080fd5b614e3385614aeb565b935060208501359250614e4860408601614b1b565b9150614e5660608601614b1b565b905092959194509250565b600060208284031215614e7357600080fd5b8135612695816155c2565b600060208284031215614e9057600080fd5b8151612695816155c2565b600060208284031215614ead57600080fd5b81356001600160401b03811115614ec357600080fd5b612f1f84828501614afb565b60008060008060808587031215614ee557600080fd5b84356001600160401b0380821115614efc57600080fd5b614f0888838901614afb565b95506020870135915080821115614f1e57600080fd5b50614f2b87828801614afb565b949794965050505060408301359260600135919050565b600060208284031215614f5457600080fd5b5035919050565b600060208284031215614f6d57600080fd5b5051919050565b60008060408385031215614f8757600080fd5b82359150614b7460208401614a19565b60008060408385031215614faa57600080fd5b50508035926020909101359150565b600060208284031215614fcb57600080fd5b61269582614b1b565b60008060408385031215614fe757600080fd5b614b6683614b1b565b60008060006060848603121561500557600080fd5b61500e84614b1b565b925061501c60208501614a19565b915061502a60408501614a19565b90509250925092565b60008060006040848603121561504857600080fd5b61505184614b1b565b925060208401356001600160401b0381111561506c57600080fd5b61507886828701614a35565b9497909650939450505050565b6000806000806060858703121561509b57600080fd5b6150a485614b1b565b935060208501356001600160401b038111156150bf57600080fd5b6150cb87828801614a35565b9094509250614e56905060408601614a19565b600081518084526020808501945080840160005b8381101561510e578151875295820195908201906001016150f2565b509495945050505050565b600081518084526151318160208601602086016154d4565b601f01601f19169290920160200192915050565b600081516151578185602086016154d4565b9290920192915050565b600080845481600182811c91508083168061517d57607f831692505b602080841082141561519d57634e487b7160e01b86526022600452602486fd5b8180156151b157600181146151c2576151ef565b60ff198616895284890196506151ef565b60008b81526020902060005b868110156151e75781548b8201529085019083016151ce565b505084890196505b5050505050506152136152028286615145565b64173539b7b760d91b815260050190565b95945050505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261524e6080830184615119565b9695505050505050565b604080825283519082018190526000906020906060840190828701845b8281101561529a5781516001600160a01b031684529284019290840190600101615275565b5050508381038285015261524e81866150de565b6020808252825182820181905260009190848201906040850190845b818110156120705761530583855180516001600160a01b031682526020808201516001600160401b0316908301526040908101511515910152565b92840192606092909201916001016152ca565b60208152600061269560208301846150de565b6020815260006126956020830184615119565b60208082526012908201527172656163686564206d617820737570706c7960701b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b81516001600160a01b031681526020808301516001600160401b03169082015260408083015115159082015260608101610b8a565b604051601f8201601f191681016001600160401b0381118282101715615447576154476155ac565b604052919050565b60006001600160401b03821115615468576154686155ac565b5060051b60200190565b600082198211156154855761548561556a565b500190565b60008261549957615499615580565b500490565b60008160001904831182151516156154b8576154b861556a565b500290565b6000828210156154cf576154cf61556a565b500390565b60005b838110156154ef5781810151838201526020016154d7565b83811115611f295750506000910152565b600181811c9082168061551457607f821691505b6020821081141561553557634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561554f5761554f61556a565b5060010190565b60008261556557615565615580565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611a2857600080fdfea264697066735822122074b7b1e768dc67b7a658123ede87c71f24a5bc4e244a3ab4d2ed9d75100a63bb64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106103a25760003560e01c806370a08231116101e7578063be8e43ee1161010d578063dfdd9b9a116100a0578063f2fde38b1161006f578063f2fde38b14610ae7578063f5ca4dfd14610b07578063fcfff16f14610b2a578063fe25219a14610b4557600080fd5b8063dfdd9b9a14610a54578063e985e9c514610a6b578063e9b1388f14610ab4578063f179dca114610ad457600080fd5b8063c87b56dd116100dc578063c87b56dd146109bd578063d6c5b414146109dd578063d8deebd914610a14578063db31882b14610a3457600080fd5b8063be8e43ee1461092e578063bee6348a1461094e578063c23dc68f1461096f578063c7d126101461099c57600080fd5b806399a2557a11610185578063a591252d11610154578063a591252d146108b6578063b723b34e146108db578063b88d4fde146108ee578063bd1b6be41461090e57600080fd5b806399a2557a146108435780639ea7b2ba14610863578063a0712d6814610883578063a22cb4651461089657600080fd5b80638462151c116101c15780638462151c146107d05780638624a72b146107fd5780638da5cb5b1461081057806395d89b411461082e57600080fd5b806370a082311461077b578063715018a61461079b578063828c12ce146107b057600080fd5b80633b9e106d116102cc578063518302271161026a57806364bb10611161023957806364bb1061146106f9578063672434821461071b5780636c2f5acd1461073b5780636fe0e3951461075b57600080fd5b80635183022714610684578063595882b3146106a45780635bbb2177146106ac5780636352211e146106d957600080fd5b806342966c68116102a657806342966c68146105eb578063453c23101461060b5780634b0bdd2a14610646578063507e094f1461066657600080fd5b80633b9e106d146105b05780633ccfd60b146105c357806342842e0e146105cb57600080fd5b806310384ba11161034457806323b872dd1161031357806323b872dd146105115780632a55205a14610531578063355e6b431461057057806339f7e37f1461059057600080fd5b806310384ba1146104ae57806313faede6146104c557806318160ddd146104dc5780631d02161d146104f157600080fd5b806306fdde031161038057806306fdde0314610414578063081812fc14610436578063095ea7b31461046e5780631012c3301461048e57600080fd5b806301ffc9a7146103a75780630364d22a146103dc578063047fc9aa146103f1575b600080fd5b3480156103b357600080fd5b506103c76103c2366004614e61565b610b65565b60405190151581526020015b60405180910390f35b6103ef6103ea366004615033565b610b90565b005b3480156103fd57600080fd5b50610406610ff3565b6040519081526020016103d3565b34801561042057600080fd5b50610429611009565b6040516103d3919061532b565b34801561044257600080fd5b50610456610451366004614f42565b61109b565b6040516001600160a01b0390911681526020016103d3565b34801561047a57600080fd5b506103ef610489366004614c5e565b6110df565b34801561049a57600080fd5b506103ef6104a9366004614b2f565b611166565b3480156104ba57600080fd5b5061040661012e5481565b3480156104d157600080fd5b5061040661012f5481565b3480156104e857600080fd5b506104066111b3565b3480156104fd57600080fd5b506103ef61050c366004614e14565b6111c6565b34801561051d57600080fd5b506103ef61052c366004614b7d565b61123a565b34801561053d57600080fd5b5061055161054c366004614f97565b611245565b604080516001600160a01b0390931683526020830191909152016103d3565b34801561057c57600080fd5b506103ef61058b366004614f42565b611282565b34801561059c57600080fd5b506103ef6105ab366004614e9b565b6113c5565b6103ef6105be366004614ff0565b611432565b6103ef611915565b3480156105d757600080fd5b506103ef6105e6366004614b7d565b611a02565b3480156105f757600080fd5b506103ef610606366004614f42565b611a1d565b34801561061757600080fd5b5061012d5461063190640100000000900463ffffffff1681565b60405163ffffffff90911681526020016103d3565b34801561065257600080fd5b50610406610661366004614b2f565b611a2b565b34801561067257600080fd5b5061012d546106319063ffffffff1681565b34801561069057600080fd5b50610130546103c790610100900460ff1681565b6103ef611a36565b3480156106b857600080fd5b506106cc6106c7366004614d81565b611aba565b6040516103d391906152ae565b3480156106e557600080fd5b506104566106f4366004614f42565b611b80565b34801561070557600080fd5b50610130546103c7906301000000900460ff1681565b34801561072757600080fd5b506103ef610736366004614cbb565b611b92565b34801561074757600080fd5b506103ef610756366004614c5e565b611c76565b34801561076757600080fd5b506103ef610776366004614ecf565b611cc8565b34801561078757600080fd5b50610406610796366004614b2f565b611d90565b3480156107a757600080fd5b506103ef611dde565b3480156107bc57600080fd5b506103ef6107cb366004614dd1565b611e12565b3480156107dc57600080fd5b506107f06107eb366004614b2f565b611f2f565b6040516103d39190615318565b6103ef61080b366004615085565b61207c565b34801561081c57600080fd5b5060fb546001600160a01b0316610456565b34801561083a57600080fd5b506104296124c5565b34801561084f57600080fd5b506107f061085e366004614c88565b6124d4565b34801561086f57600080fd5b506103ef61087e366004614f42565b61269c565b6103ef610891366004614f42565b612713565b3480156108a257600080fd5b506103ef6108b1366004614c34565b612a60565b3480156108c257600080fd5b5061012d5461063190600160401b900463ffffffff1681565b6103ef6108e9366004614f74565b612af6565b3480156108fa57600080fd5b506103ef610909366004614bb9565b612e44565b34801561091a57600080fd5b50610406610929366004614c5e565b612e88565b34801561093a57600080fd5b506103ef610949366004614cbb565b612f27565b34801561095a57600080fd5b50610130546103c79062010000900460ff1681565b34801561097b57600080fd5b5061098f61098a366004614f42565b613143565b6040516103d391906153ea565b3480156109a857600080fd5b5061013254610456906001600160a01b031681565b3480156109c957600080fd5b506104296109d8366004614f42565b6131fd565b3480156109e957600080fd5b506104066109f8366004614b2f565b6001600160a01b03166000908152610139602052604090205490565b348015610a2057600080fd5b506103ef610a2f366004614fb9565b613294565b348015610a4057600080fd5b506103ef610a4f366004614db5565b6132ea565b348015610a6057600080fd5b506104066101315481565b348015610a7757600080fd5b506103c7610a86366004614b4a565b6001600160a01b039182166000908152606c6020908152604080832093909416825291909152205460ff1690565b348015610ac057600080fd5b50610406610acf366004614b2f565b613336565b6103ef610ae2366004614fd4565b61335d565b348015610af357600080fd5b506103ef610b02366004614b2f565b613837565b348015610b1357600080fd5b50610b1c6138cf565b6040516103d3929190615258565b348015610b3657600080fd5b50610130546103c79060ff1681565b348015610b5157600080fd5b506103ef610b60366004614db5565b613a05565b60006001600160e01b0319821663152a902d60e11b1480610b8a5750610b8a82613a53565b92915050565b8263ffffffff163360008211610be25760405162461bcd60e51b815260206004820152601260248201527126b4b73a1030ba103632b0b9ba1037b7329760711b60448201526064015b60405180910390fd5b61012d5463ffffffff16821115610c2f5760405162461bcd60e51b815260206004820152601160248201527026b0bc1036b4b73a103932b0b1b432b21760791b6044820152606401610bd9565b610c376111b3565b82610c40610ff3565b610c4a9190615472565b1115610c685760405162461bcd60e51b8152600401610bd99061533e565b61012d54640100000000900463ffffffff1682610c8483613aa3565b610c8e9190615472565b1115610cd05760405162461bcd60e51b815260206004820152601160248201527063616e206e6f74206d696e74206d6f726560781b6044820152606401610bd9565b610cda8183612e88565b341015610d1c5760405162461bcd60e51b815260206004820152601060248201526f2737ba1032b737bab3b410333ab7321760811b6044820152606401610bd9565b61012e5415610d815761012e5482610d32610ff3565b610d3c9190615472565b1115610d815760405162461bcd60e51b81526020600482015260146024820152737265616368656420706175736520737570706c7960601b6044820152606401610bd9565b610132546001600160a01b031615610e5c57610132546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b158015610ddc57600080fd5b505afa158015610df0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e149190614f5b565b11610e5a5760405162461bcd60e51b81526020600482015260166024820152751058d8d95cdcc81d1bdad95b881b9bdd081bdddb995960521b6044820152606401610bd9565b505b6101305462010000900460ff16610ea85760405162461bcd60e51b815260206004820152601060248201526f283932b9b0b632903737ba1037b832b760811b6044820152606401610bd9565b61013854610eec5760405162461bcd60e51b815260206004820152601160248201527050726573616c65206e6f7420726561647960781b6044820152606401610bd9565b610f6384848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050610138546040516bffffffffffffffffffffffff193360601b16602082015290925060340190505b60405160208183030381529060405280519060200120613ace565b610fa65760405162461bcd60e51b81526020600482015260146024820152732737ba103090383932b9b0b6329036b2b6b132b960611b6044820152606401610bd9565b610fb6338663ffffffff16613ae4565b600061012e54118015610fd3575061012e54610fd0610ff3565b10155b15610fec57610130805462ff00ff19169055600061012e555b5050505050565b6000600160655461100491906154bd565b905090565b60606067805461101890615500565b80601f016020809104026020016040519081016040528092919081815260200182805461104490615500565b80156110915780601f1061106657610100808354040283529160200191611091565b820191906000526020600020905b81548152906001019060200180831161107457829003601f168201915b5050505050905090565b60006110a682613afe565b6110c3576040516333d1c03960e21b815260040160405180910390fd5b506000908152606b60205260409020546001600160a01b031690565b60006110ea82611b80565b9050806001600160a01b0316836001600160a01b0316141561111f5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614611156576111398133610a86565b611156576040516367d9dca160e11b815260040160405180910390fd5b611161838383613b37565b505050565b60fb546001600160a01b031633146111905760405162461bcd60e51b8152600401610bd99061536a565b61013280546001600160a01b0319166001600160a01b0392909216919091179055565b60006066546101335461100491906154bd565b60fb546001600160a01b031633146111f05760405162461bcd60e51b8152600401610bd99061536a565b610130805460ff19169415159490941790935561012f9190915561012d805467ffffffffffffffff191664010000000063ffffffff9384160263ffffffff19161791909216179055565b611161838383613b93565b610135546101365460009182916001600160a01b03909116906103e89061126c908661549e565b611276919061548a565b915091505b9250929050565b3373460fd5059e7301680fa53e63bbbf7272e643e89c146112d75760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610bd9565b73460fd5059e7301680fa53e63bbbf7272e643e89c600090815261013b6020527fd916a72ce10946b394851acd0063bb557ec6ef7bf7046cb9a8c5ea8da809b25e546113249083906154bd565b73460fd5059e7301680fa53e63bbbf7272e643e89c600090815261013b60208190527fd916a72ce10946b394851acd0063bb557ec6ef7bf7046cb9a8c5ea8da809b25e85905561013c80549394508493919291600190811061138857611388615596565b60009182526020808320909101546001600160a01b03168352820192909252604001812080549091906113bc908490615472565b90915550505050565b3373460fd5059e7301680fa53e63bbbf7272e643e89c1461141a5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610bd9565b805161142e906101349060208401906148d4565b5050565b8263ffffffff16816000821161147f5760405162461bcd60e51b815260206004820152601260248201527126b4b73a1030ba103632b0b9ba1037b7329760711b6044820152606401610bd9565b61012d5463ffffffff168211156114cc5760405162461bcd60e51b815260206004820152601160248201527026b0bc1036b4b73a103932b0b1b432b21760791b6044820152606401610bd9565b6114d46111b3565b826114dd610ff3565b6114e79190615472565b11156115055760405162461bcd60e51b8152600401610bd99061533e565b61012d54640100000000900463ffffffff168261152183613aa3565b61152b9190615472565b111561156d5760405162461bcd60e51b815260206004820152601160248201527063616e206e6f74206d696e74206d6f726560781b6044820152606401610bd9565b6115778183612e88565b3410156115b95760405162461bcd60e51b815260206004820152601060248201526f2737ba1032b737bab3b410333ab7321760811b6044820152606401610bd9565b61012e541561161e5761012e54826115cf610ff3565b6115d99190615472565b111561161e5760405162461bcd60e51b81526020600482015260146024820152737265616368656420706175736520737570706c7960601b6044820152606401610bd9565b610132546001600160a01b0316156116f957610132546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b15801561167957600080fd5b505afa15801561168d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b19190614f5b565b116116f75760405162461bcd60e51b81526020600482015260166024820152751058d8d95cdcc81d1bdad95b881b9bdd081bdddb995960521b6044820152606401610bd9565b505b610130546301000000900460ff16151560011461174d5760405162461bcd60e51b81526020600482015260126024820152712932b332b93930b639903737ba1037b832b760711b6044820152606401610bd9565b6101305460ff1615156001146117955760405162461bcd60e51b815260206004820152600d60248201526c26b4b73a103737ba1037b832b760991b6044820152606401610bd9565b600061013154116117dd5760405162461bcd60e51b81526020600482015260126024820152714361702069732073657420746f207a65726f60701b6044820152606401610bd9565b60006117e885613aa3565b1161182f5760405162461bcd60e51b8152602060048201526017602482015276149959995c9c995c881a185cc81b9bdd081b5a5b9d1959604a1b6044820152606401610bd9565b836001600160a01b0316836001600160a01b031614156118895760405162461bcd60e51b815260206004820152601560248201527421b0b73737ba103932b332b9103cb7bab939b2b63360591b6044820152606401610bd9565b611899838663ffffffff16613ae4565b6001600160a01b0384166000908152610139602052604081208054600192906118c3908490615472565b9091555050610131546001600160a01b038516600090815261013960205260409020546118f09190615556565b610fb6576118fc6111b3565b611904610ff3565b1015610fb657610fb6846001613ae4565b47806119525760405162461bcd60e51b815260206004820152600c60248201526b5a65726f2062616c616e636560a01b6044820152606401610bd9565b60005b61013c5481101561142e57600061013b600061013c848154811061197b5761197b615596565b60009182526020808320909101546001600160a01b0316835282019290925260400181205491506103e86119af858461549e565b6119b9919061548a565b90506119ed61013c84815481106119d2576119d2615596565b6000918252602090912001546001600160a01b031682613d7e565b505080806119fa9061553b565b915050611955565b61116183838360405180602001604052806000815250612e44565b611a28816001613e97565b50565b6000610b8a82613aa3565b60fb546001600160a01b03163314611a605760405162461bcd60e51b8152600401610bd99061536a565b3415611a8457611a8473460fd5059e7301680fa53e63bbbf7272e643e89c34613d7e565b611ab8611a9960fb546001600160a01b031690565b611aa1610ff3565b611aa96111b3565b611ab391906154bd565b613ae4565b565b80516060906000816001600160401b03811115611ad957611ad96155ac565b604051908082528060200260200182016040528015611b2457816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181611af75790505b50905060005b828114611b7857611b53858281518110611b4657611b46615596565b6020026020010151613143565b828281518110611b6557611b65615596565b6020908102919091010152600101611b2a565b509392505050565b6000611b8b8261405d565b5192915050565b60fb546001600160a01b03163314611bbc5760405162461bcd60e51b8152600401610bd99061536a565b8051825114611bca57600080fd5b60005b815181101561116157611bde6111b3565b828281518110611bf057611bf0615596565b6020026020010151611c00610ff3565b611c0a9190615472565b1115611c285760405162461bcd60e51b8152600401610bd99061533e565b611c64838281518110611c3d57611c3d615596565b6020026020010151838381518110611c5757611c57615596565b6020026020010151613ae4565b80611c6e8161553b565b915050611bcd565b60fb546001600160a01b03163314611ca05760405162461bcd60e51b8152600401610bd99061536a565b61013580546001600160a01b0319166001600160a01b03939093169290921790915561013655565b600054610100900460ff16611ce35760005460ff1615611ce7565b303b155b611d4a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610bd9565b600054610100900460ff16158015611d6c576000805461ffff19166101011790555b611d788585858561417f565b8015610fec576000805461ff00191690555050505050565b60006001600160a01b038216611db9576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152606a60205260409020546001600160401b031690565b60fb546001600160a01b03163314611e085760405162461bcd60e51b8152600401610bd99061536a565b611ab860006142ff565b60fb546001600160a01b03163314611e3c5760405162461bcd60e51b8152600401610bd99061536a565b610130805461ff00191661010084151590810291909117909155611e70578051611e6e906101379060208401906148d4565b505b6001821515141561142e5760006101348054611e8b90615500565b80601f0160208091040260200160405190810160405280929190818152602001828054611eb790615500565b8015611f045780601f10611ed957610100808354040283529160200191611f04565b820191906000526020600020905b815481529060010190602001808311611ee757829003601f168201915b50505050509050805160001415611161578151611f29906101349060208501906148d4565b50505050565b60606000806000611f3f85611d90565b90506000816001600160401b03811115611f5b57611f5b6155ac565b604051908082528060200260200182016040528015611f84578160200160208202803683370190505b509050611faa604080516060810182526000808252602082018190529181019190915290565b60015b83861461207057600081815260696020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615801592820192909252925061201357612068565b81516001600160a01b03161561202857815194505b876001600160a01b0316856001600160a01b03161415612068578083878060010198508151811061205b5761205b615596565b6020026020010181815250505b600101611fad565b50909695505050505050565b8363ffffffff1681600082116120c95760405162461bcd60e51b815260206004820152601260248201527126b4b73a1030ba103632b0b9ba1037b7329760711b6044820152606401610bd9565b61012d5463ffffffff168211156121165760405162461bcd60e51b815260206004820152601160248201527026b0bc1036b4b73a103932b0b1b432b21760791b6044820152606401610bd9565b61211e6111b3565b82612127610ff3565b6121319190615472565b111561214f5760405162461bcd60e51b8152600401610bd99061533e565b61012d54640100000000900463ffffffff168261216b83613aa3565b6121759190615472565b11156121b75760405162461bcd60e51b815260206004820152601160248201527063616e206e6f74206d696e74206d6f726560781b6044820152606401610bd9565b6121c18183612e88565b3410156122035760405162461bcd60e51b815260206004820152601060248201526f2737ba1032b737bab3b410333ab7321760811b6044820152606401610bd9565b61012e54156122685761012e5482612219610ff3565b6122239190615472565b11156122685760405162461bcd60e51b81526020600482015260146024820152737265616368656420706175736520737570706c7960601b6044820152606401610bd9565b610132546001600160a01b03161561234357610132546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b1580156122c357600080fd5b505afa1580156122d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122fb9190614f5b565b116123415760405162461bcd60e51b81526020600482015260166024820152751058d8d95cdcc81d1bdad95b881b9bdd081bdddb995960521b6044820152606401610bd9565b505b6101305462010000900460ff1661238f5760405162461bcd60e51b815260206004820152601060248201526f283932b9b0b632903737ba1037b832b760811b6044820152606401610bd9565b610138546123d35760405162461bcd60e51b815260206004820152601160248201527050726573616c65206e6f7420726561647960781b6044820152606401610bd9565b61243485858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050610138546040516bffffffffffffffffffffffff1960608a901b1660208201529092506034019050610f48565b6124775760405162461bcd60e51b81526020600482015260146024820152732737ba103090383932b9b0b6329036b2b6b132b960611b6044820152606401610bd9565b612487838763ffffffff16613ae4565b600061012e541180156124a4575061012e546124a1610ff3565b10155b156124bd57610130805462ff00ff19169055600061012e555b505050505050565b60606068805461101890615500565b60608183106124f657604051631960ccad60e11b815260040160405180910390fd5b606554600090600185101561250a57600194505b80841115612516578093505b600061252187611d90565b905084861015612540578585038181101561253a578091505b50612544565b5060005b6000816001600160401b0381111561255e5761255e6155ac565b604051908082528060200260200182016040528015612587578160200160208202803683370190505b5090508161259a57935061269592505050565b60006125a588613143565b9050600081604001516125b6575080515b885b8881141580156125c85750848714155b1561268957600081815260696020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615801592820192909252935061262c57612681565b82516001600160a01b03161561264157825191505b8a6001600160a01b0316826001600160a01b03161415612681578084888060010199508151811061267457612674615596565b6020026020010181815250505b6001016125b8565b50505092835250909150505b9392505050565b60fb546001600160a01b031633146126c65760405162461bcd60e51b8152600401610bd99061536a565b6126ce610ff3565b81101561270d5760405162461bcd60e51b815260206004820152600d60248201526c496e76616c69642076616c756560981b6044820152606401610bd9565b61012e55565b80336000821161275a5760405162461bcd60e51b815260206004820152601260248201527126b4b73a1030ba103632b0b9ba1037b7329760711b6044820152606401610bd9565b61012d5463ffffffff168211156127a75760405162461bcd60e51b815260206004820152601160248201527026b0bc1036b4b73a103932b0b1b432b21760791b6044820152606401610bd9565b6127af6111b3565b826127b8610ff3565b6127c29190615472565b11156127e05760405162461bcd60e51b8152600401610bd99061533e565b61012d54640100000000900463ffffffff16826127fc83613aa3565b6128069190615472565b11156128485760405162461bcd60e51b815260206004820152601160248201527063616e206e6f74206d696e74206d6f726560781b6044820152606401610bd9565b6128528183612e88565b3410156128945760405162461bcd60e51b815260206004820152601060248201526f2737ba1032b737bab3b410333ab7321760811b6044820152606401610bd9565b61012e54156128f95761012e54826128aa610ff3565b6128b49190615472565b11156128f95760405162461bcd60e51b81526020600482015260146024820152737265616368656420706175736520737570706c7960601b6044820152606401610bd9565b610132546001600160a01b0316156129d457610132546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b15801561295457600080fd5b505afa158015612968573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061298c9190614f5b565b116129d25760405162461bcd60e51b81526020600482015260166024820152751058d8d95cdcc81d1bdad95b881b9bdd081bdddb995960521b6044820152606401610bd9565b505b6101305460ff161515600114612a1c5760405162461bcd60e51b815260206004820152600d60248201526c26b4b73a103737ba1037b832b760991b6044820152606401610bd9565b612a263384613ae4565b600061012e54118015612a43575061012e54612a40610ff3565b10155b1561116157610130805462ff00ff19169055600061012e55505050565b6001600160a01b038216331415612a8a5760405163b06307db60e01b815260040160405180910390fd5b336000818152606c602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b818160008211612b3d5760405162461bcd60e51b815260206004820152601260248201527126b4b73a1030ba103632b0b9ba1037b7329760711b6044820152606401610bd9565b61012d5463ffffffff16821115612b8a5760405162461bcd60e51b815260206004820152601160248201527026b0bc1036b4b73a103932b0b1b432b21760791b6044820152606401610bd9565b612b926111b3565b82612b9b610ff3565b612ba59190615472565b1115612bc35760405162461bcd60e51b8152600401610bd99061533e565b61012d54640100000000900463ffffffff1682612bdf83613aa3565b612be99190615472565b1115612c2b5760405162461bcd60e51b815260206004820152601160248201527063616e206e6f74206d696e74206d6f726560781b6044820152606401610bd9565b612c358183612e88565b341015612c775760405162461bcd60e51b815260206004820152601060248201526f2737ba1032b737bab3b410333ab7321760811b6044820152606401610bd9565b61012e5415612cdc5761012e5482612c8d610ff3565b612c979190615472565b1115612cdc5760405162461bcd60e51b81526020600482015260146024820152737265616368656420706175736520737570706c7960601b6044820152606401610bd9565b610132546001600160a01b031615612db757610132546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b158015612d3757600080fd5b505afa158015612d4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d6f9190614f5b565b11612db55760405162461bcd60e51b81526020600482015260166024820152751058d8d95cdcc81d1bdad95b881b9bdd081bdddb995960521b6044820152606401610bd9565b505b6101305460ff161515600114612dff5760405162461bcd60e51b815260206004820152600d60248201526c26b4b73a103737ba1037b832b760991b6044820152606401610bd9565b612e098385613ae4565b600061012e54118015612e26575061012e54612e23610ff3565b10155b15611f2957610130805462ff00ff19169055600061012e5550505050565b612e4f848484613b93565b6001600160a01b0383163b15611f2957612e6b84848484614351565b611f29576040516368d2bf6b60e11b815260040160405180910390fd5b600080612e9484613aa3565b61012d54909150600160401b900463ffffffff1615801590612ec5575061012d54600160401b900463ffffffff1681105b15612f115761012d54612ef1908490612eec908490600160401b900463ffffffff166154bd565b614448565b612efb90846154bd565b61012f54612f09919061549e565b915050610b8a565b61012f54612f1f908461549e565b949350505050565b60fb546001600160a01b03163314612f515760405162461bcd60e51b8152600401610bd99061536a565b60015b61013c54811015612faf5761013b600061013c8381548110612f7857612f78615596565b60009182526020808320909101546001600160a01b0316835282019290925260400181205580612fa78161553b565b915050612f54565b508151612fbd906001615472565b6001600160401b03811115612fd457612fd46155ac565b604051908082528060200260200182016040528015612ffd578160200160208202803683370190505b5080516130139161013c91602090910190614958565b5073460fd5059e7301680fa53e63bbbf7272e643e89c61013c60008154811061303e5761303e615596565b6000918252602082200180546001600160a01b0319166001600160a01b0393909316929092179091555b82518110156111615781818151811061308357613083615596565b602002602001015161013b60008584815181106130a2576130a2615596565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055508281815181106130e0576130e0615596565b602002602001015161013c8260016130f89190615472565b8154811061310857613108615596565b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790558061313b8161553b565b915050613068565b6040805160608082018352600080835260208084018290528385018290528451928301855281835282018190529281019290925290600183108061318957506065548310155b156131945792915050565b50600082815260696020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615801592820192909252906131f45792915050565b6126958361405d565b606061320882613afe565b6132455760405162461bcd60e51b815260206004820152600e60248201526d111bd95cc81b9bdd08195e1a5cdd60921b6044820152606401610bd9565b61013054610100900460ff16613288576101376132618361445e565b604051602001613272929190615161565b6040516020818303038152906040529050919050565b6101346132618361445e565b60fb546001600160a01b031633146132be5760405162461bcd60e51b8152600401610bd99061536a565b61012d805463ffffffff909216600160401b026bffffffff000000000000000019909216919091179055565b60fb546001600160a01b031633146133145760405162461bcd60e51b8152600401610bd99061536a565b6101308054921515620100000262ff0000199093169290921790915561013855565b600061334182613aa3565b61012d54610b8a9190640100000000900463ffffffff166154bd565b8163ffffffff1633600082116133aa5760405162461bcd60e51b815260206004820152601260248201527126b4b73a1030ba103632b0b9ba1037b7329760711b6044820152606401610bd9565b61012d5463ffffffff168211156133f75760405162461bcd60e51b815260206004820152601160248201527026b0bc1036b4b73a103932b0b1b432b21760791b6044820152606401610bd9565b6133ff6111b3565b82613408610ff3565b6134129190615472565b11156134305760405162461bcd60e51b8152600401610bd99061533e565b61012d54640100000000900463ffffffff168261344c83613aa3565b6134569190615472565b11156134985760405162461bcd60e51b815260206004820152601160248201527063616e206e6f74206d696e74206d6f726560781b6044820152606401610bd9565b6134a28183612e88565b3410156134e45760405162461bcd60e51b815260206004820152601060248201526f2737ba1032b737bab3b410333ab7321760811b6044820152606401610bd9565b61012e54156135495761012e54826134fa610ff3565b6135049190615472565b11156135495760405162461bcd60e51b81526020600482015260146024820152737265616368656420706175736520737570706c7960601b6044820152606401610bd9565b610132546001600160a01b03161561362457610132546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b1580156135a457600080fd5b505afa1580156135b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135dc9190614f5b565b116136225760405162461bcd60e51b81526020600482015260166024820152751058d8d95cdcc81d1bdad95b881b9bdd081bdddb995960521b6044820152606401610bd9565b505b610130546301000000900460ff1615156001146136785760405162461bcd60e51b81526020600482015260126024820152712932b332b93930b639903737ba1037b832b760711b6044820152606401610bd9565b6101305460ff1615156001146136c05760405162461bcd60e51b815260206004820152600d60248201526c26b4b73a103737ba1037b832b760991b6044820152606401610bd9565b600061013154116137085760405162461bcd60e51b81526020600482015260126024820152714361702069732073657420746f207a65726f60701b6044820152606401610bd9565b600061371384613aa3565b1161375a5760405162461bcd60e51b8152602060048201526017602482015276149959995c9c995c881a185cc81b9bdd081b5a5b9d1959604a1b6044820152606401610bd9565b336001600160a01b03841614156137ab5760405162461bcd60e51b815260206004820152601560248201527421b0b73737ba103932b332b9103cb7bab939b2b63360591b6044820152606401610bd9565b6137bb338563ffffffff16613ae4565b6001600160a01b0383166000908152610139602052604081208054600192906137e5908490615472565b9091555050610131546001600160a01b038416600090815261013960205260409020546138129190615556565b612e095761381e6111b3565b613826610ff3565b1015612e0957612e09836001613ae4565b60fb546001600160a01b031633146138615760405162461bcd60e51b8152600401610bd99061536a565b6001600160a01b0381166138c65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bd9565b611a28816142ff565b606080600061013c805490506001600160401b038111156138f2576138f26155ac565b60405190808252806020026020018201604052801561391b578160200160208202803683370190505b50905060005b61013c5481101561399b5761013b600061013c838154811061394557613945615596565b60009182526020808320909101546001600160a01b03168352820192909252604001902054825183908390811061397e5761397e615596565b6020908102919091010152806139938161553b565b915050613921565b5061013c81818054806020026020016040519081016040528092919081815260200182805480156139f557602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116139d7575b5050505050915092509250509091565b60fb546001600160a01b03163314613a2f5760405162461bcd60e51b8152600401610bd99061536a565b610130805492151563010000000263ff000000199093169290921790915561013155565b60006001600160e01b031982166380ac58cd60e01b1480613a8457506001600160e01b03198216635b5e139f60e01b145b80610b8a57506301ffc9a760e01b6001600160e01b0319831614610b8a565b6001600160a01b03166000908152606a6020526040902054600160401b90046001600160401b031690565b600082613adb858461455b565b14949350505050565b61142e8282604051806020016040528060008152506145ff565b600081600111158015613b12575060655482105b8015610b8a575050600090815260696020526040902054600160e01b900460ff161590565b6000828152606b602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000613b9e8261405d565b9050836001600160a01b031681600001516001600160a01b031614613bd55760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480613bf35750613bf38533610a86565b80613c0e575033613c038461109b565b6001600160a01b0316145b905080613c2e57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416613c5557604051633a954ecd60e21b815260040160405180910390fd5b613c6160008487613b37565b6001600160a01b038581166000908152606a60209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652606990945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116613d35576065548214613d3557805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610fec565b80471015613dce5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610bd9565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613e1b576040519150601f19603f3d011682016040523d82523d6000602084013e613e20565b606091505b50509050806111615760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610bd9565b6000613ea28361405d565b80519091508215613f08576000336001600160a01b0383161480613ecb5750613ecb8233610a86565b80613ee6575033613edb8661109b565b6001600160a01b0316145b905080613f0657604051632ce44b5f60e11b815260040160405180910390fd5b505b613f1460008583613b37565b6001600160a01b038082166000818152606a602090815260408083208054600160801b6000196001600160401b0380841691909101811667ffffffffffffffff198416811783900482166001908101831690930277ffffffffffffffff0000000000000000ffffffffffffffff19909416179290921783558b86526069909452828520805460ff60e01b1942909316600160a01b026001600160e01b03199091169097179690961716600160e01b17855591890180845292208054919490911661401257606554821461401257805460208701516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a450506066805460010190555050565b604080516060810182526000808252602082018190529181019190915281806001116141665760655481101561416657600081815260696020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906141645780516001600160a01b0316156140fb579392505050565b5060001901600081815260696020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff161515928101929092521561415f579392505050565b6140fb565b505b604051636f96cda160e11b815260040160405180910390fd5b600054610100900460ff166141a65760405162461bcd60e51b8152600401610bd99061539f565b6141b084846147bd565b6141b86147ee565b6141c06147ee565b6141c8614815565b610133829055610130805461ff001916905573460fd5059e7301680fa53e63bbbf7272e643e89c60005261013b6020527fd916a72ce10946b394851acd0063bb557ec6ef7bf7046cb9a8c5ea8da809b25e819055614228816103e86154bd565b61013b600061423f60fb546001600160a01b031690565b6001600160a01b03168152602081019190915260400160009081209190915561013c8054600181018255918190527fa55c1639d917d7b7cbf3837f1642937d4507076edbe26b1a6008234bb0c4953090910180546001600160a01b03191673460fd5059e7301680fa53e63bbbf7272e643e89c1790556142c760fb546001600160a01b031690565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b0390921691909117905550505050565b60fb80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061438690339089908890889060040161521c565b602060405180830381600087803b1580156143a057600080fd5b505af19250505080156143d0575060408051601f3d908101601f191682019092526143cd91810190614e7e565b60015b61442b573d8080156143fe576040519150601f19603f3d011682016040523d82523d6000602084013e614403565b606091505b508051614423576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b60008183106144575781612695565b5090919050565b6060816144825750506040805180820190915260018152600360fc1b602082015290565b8160005b81156144ac57806144968161553b565b91506144a59050600a8361548a565b9150614486565b6000816001600160401b038111156144c6576144c66155ac565b6040519080825280601f01601f1916602001820160405280156144f0576020820181803683370190505b5090505b8415612f1f576145056001836154bd565b9150614512600a86615556565b61451d906030615472565b60f81b81838151811061453257614532615596565b60200101906001600160f81b031916908160001a905350614554600a8661548a565b94506144f4565b600081815b8451811015611b7857600085828151811061457d5761457d615596565b602002602001015190508083116145bf5760408051602081018590529081018290526060016040516020818303038152906040528051906020012092506145ec565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b50806145f78161553b565b915050614560565b6065546001600160a01b03841661462857604051622e076360e81b815260040160405180910390fd5b826146465760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b0384166000818152606a6020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b018116918217600160401b67ffffffffffffffff1990941690921783900481168b01811690920217909155858452606990925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15614769575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46147326000878480600101955087614351565b61474f576040516368d2bf6b60e11b815260040160405180910390fd5b8082106146e757826065541461476457600080fd5b6147ae565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821061476a575b50606555611f29600085838684565b600054610100900460ff166147e45760405162461bcd60e51b8152600401610bd99061539f565b61142e828261484c565b600054610100900460ff16611ab85760405162461bcd60e51b8152600401610bd99061539f565b600054610100900460ff1661483c5760405162461bcd60e51b8152600401610bd99061539f565b6148446147ee565b611ab86148a4565b600054610100900460ff166148735760405162461bcd60e51b8152600401610bd99061539f565b81516148869060679060208501906148d4565b50805161489a9060689060208401906148d4565b5060016065555050565b600054610100900460ff166148cb5760405162461bcd60e51b8152600401610bd99061539f565b611ab8336142ff565b8280546148e090615500565b90600052602060002090601f0160209004810192826149025760008555614948565b82601f1061491b57805160ff1916838001178555614948565b82800160010185558215614948579182015b8281111561494857825182559160200191906001019061492d565b506149549291506149ad565b5090565b828054828255906000526020600020908101928215614948579160200282015b8281111561494857825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614978565b5b8082111561495457600081556001016149ae565b60006001600160401b038311156149db576149db6155ac565b6149ee601f8401601f191660200161541f565b9050828152838383011115614a0257600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114614a3057600080fd5b919050565b60008083601f840112614a4757600080fd5b5081356001600160401b03811115614a5e57600080fd5b6020830191508360208260051b850101111561127b57600080fd5b600082601f830112614a8a57600080fd5b81356020614a9f614a9a8361544f565b61541f565b80838252828201915082860187848660051b8901011115614abf57600080fd5b60005b85811015614ade57813584529284019290840190600101614ac2565b5090979650505050505050565b80358015158114614a3057600080fd5b600082601f830112614b0c57600080fd5b612695838335602085016149c2565b803563ffffffff81168114614a3057600080fd5b600060208284031215614b4157600080fd5b61269582614a19565b60008060408385031215614b5d57600080fd5b614b6683614a19565b9150614b7460208401614a19565b90509250929050565b600080600060608486031215614b9257600080fd5b614b9b84614a19565b9250614ba960208501614a19565b9150604084013590509250925092565b60008060008060808587031215614bcf57600080fd5b614bd885614a19565b9350614be660208601614a19565b92506040850135915060608501356001600160401b03811115614c0857600080fd5b8501601f81018713614c1957600080fd5b614c28878235602084016149c2565b91505092959194509250565b60008060408385031215614c4757600080fd5b614c5083614a19565b9150614b7460208401614aeb565b60008060408385031215614c7157600080fd5b614c7a83614a19565b946020939093013593505050565b600080600060608486031215614c9d57600080fd5b614ca684614a19565b95602085013595506040909401359392505050565b60008060408385031215614cce57600080fd5b82356001600160401b0380821115614ce557600080fd5b818501915085601f830112614cf957600080fd5b81356020614d09614a9a8361544f565b8083825282820191508286018a848660051b8901011115614d2957600080fd5b600096505b84871015614d5357614d3f81614a19565b835260019690960195918301918301614d2e565b5096505086013592505080821115614d6a57600080fd5b50614d7785828601614a79565b9150509250929050565b600060208284031215614d9357600080fd5b81356001600160401b03811115614da957600080fd5b612f1f84828501614a79565b60008060408385031215614dc857600080fd5b614c7a83614aeb565b60008060408385031215614de457600080fd5b614ded83614aeb565b915060208301356001600160401b03811115614e0857600080fd5b614d7785828601614afb565b60008060008060808587031215614e2a57600080fd5b614e3385614aeb565b935060208501359250614e4860408601614b1b565b9150614e5660608601614b1b565b905092959194509250565b600060208284031215614e7357600080fd5b8135612695816155c2565b600060208284031215614e9057600080fd5b8151612695816155c2565b600060208284031215614ead57600080fd5b81356001600160401b03811115614ec357600080fd5b612f1f84828501614afb565b60008060008060808587031215614ee557600080fd5b84356001600160401b0380821115614efc57600080fd5b614f0888838901614afb565b95506020870135915080821115614f1e57600080fd5b50614f2b87828801614afb565b949794965050505060408301359260600135919050565b600060208284031215614f5457600080fd5b5035919050565b600060208284031215614f6d57600080fd5b5051919050565b60008060408385031215614f8757600080fd5b82359150614b7460208401614a19565b60008060408385031215614faa57600080fd5b50508035926020909101359150565b600060208284031215614fcb57600080fd5b61269582614b1b565b60008060408385031215614fe757600080fd5b614b6683614b1b565b60008060006060848603121561500557600080fd5b61500e84614b1b565b925061501c60208501614a19565b915061502a60408501614a19565b90509250925092565b60008060006040848603121561504857600080fd5b61505184614b1b565b925060208401356001600160401b0381111561506c57600080fd5b61507886828701614a35565b9497909650939450505050565b6000806000806060858703121561509b57600080fd5b6150a485614b1b565b935060208501356001600160401b038111156150bf57600080fd5b6150cb87828801614a35565b9094509250614e56905060408601614a19565b600081518084526020808501945080840160005b8381101561510e578151875295820195908201906001016150f2565b509495945050505050565b600081518084526151318160208601602086016154d4565b601f01601f19169290920160200192915050565b600081516151578185602086016154d4565b9290920192915050565b600080845481600182811c91508083168061517d57607f831692505b602080841082141561519d57634e487b7160e01b86526022600452602486fd5b8180156151b157600181146151c2576151ef565b60ff198616895284890196506151ef565b60008b81526020902060005b868110156151e75781548b8201529085019083016151ce565b505084890196505b5050505050506152136152028286615145565b64173539b7b760d91b815260050190565b95945050505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261524e6080830184615119565b9695505050505050565b604080825283519082018190526000906020906060840190828701845b8281101561529a5781516001600160a01b031684529284019290840190600101615275565b5050508381038285015261524e81866150de565b6020808252825182820181905260009190848201906040850190845b818110156120705761530583855180516001600160a01b031682526020808201516001600160401b0316908301526040908101511515910152565b92840192606092909201916001016152ca565b60208152600061269560208301846150de565b6020815260006126956020830184615119565b60208082526012908201527172656163686564206d617820737570706c7960701b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b81516001600160a01b031681526020808301516001600160401b03169082015260408083015115159082015260608101610b8a565b604051601f8201601f191681016001600160401b0381118282101715615447576154476155ac565b604052919050565b60006001600160401b03821115615468576154686155ac565b5060051b60200190565b600082198211156154855761548561556a565b500190565b60008261549957615499615580565b500490565b60008160001904831182151516156154b8576154b861556a565b500290565b6000828210156154cf576154cf61556a565b500390565b60005b838110156154ef5781810151838201526020016154d7565b83811115611f295750506000910152565b600181811c9082168061551457607f821691505b6020821081141561553557634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561554f5761554f61556a565b5060010190565b60008261556557615565615580565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611a2857600080fdfea264697066735822122074b7b1e768dc67b7a658123ede87c71f24a5bc4e244a3ab4d2ed9d75100a63bb64736f6c63430008070033

Deployed Bytecode Sourcemap

110902:281:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;108798:250;;;;;;;;;;-1:-1:-1;108798:250:0;;;;;:::i;:::-;;:::i;:::-;;;18034:14:1;;18027:22;18009:41;;17997:2;17982:18;108798:250:0;;;;;;;;105717:467;;;;;;:::i;:::-;;:::i;:::-;;107938:85;;;;;;;;;;;;;:::i;:::-;;;27662:25:1;;;27650:2;27635:18;107938:85:0;27516:177:1;73316:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;74831:204::-;;;;;;;;;;-1:-1:-1;74831:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;15129:55:1;;;15111:74;;15099:2;15084:18;74831:204:0;14965:226:1;74382:383:0;;;;;;;;;;-1:-1:-1;74382:383:0;;;;;:::i;:::-;;:::i;102385:91::-;;;;;;;;;;-1:-1:-1;102385:91:0;;;;;:::i;:::-;;:::i;100617:26::-;;;;;;;;;;;;;;;;100648:19;;;;;;;;;;;;;;;;108029:106;;;;;;;;;;;;;:::i;102065:213::-;;;;;;;;;;-1:-1:-1;102065:213:0;;;;;:::i;:::-;;:::i;75696:170::-;;;;;;;;;;-1:-1:-1;75696:170:0;;;;;:::i;:::-;;:::i;109054:222::-;;;;;;;;;;-1:-1:-1;109054:222:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;15904:55:1;;;15886:74;;15991:2;15976:18;;15969:34;;;;15859:18;109054:222:0;15712:297:1;101808:218:0;;;;;;;;;;-1:-1:-1;101808:218:0;;;;;:::i;:::-;;:::i;103187:133::-;;;;;;;;;;-1:-1:-1;103187:133:0;;;;;:::i;:::-;;:::i;107270:637::-;;;;;;:::i;:::-;;:::i;104356:351::-;;;:::i;75937:185::-;;;;;;;;;;-1:-1:-1;75937:185:0;;;;;:::i;:::-;;:::i;90561:94::-;;;;;;;;;;-1:-1:-1;90561:94:0;;;;;:::i;:::-;;:::i;100556:26::-;;;;;;;;;;-1:-1:-1;100556:26:0;;;;;;;;;;;;;;27872:10:1;27860:23;;;27842:42;;27830:2;27815:18;100556:26:0;27698:192:1;108141:120:0;;;;;;;;;;-1:-1:-1;108141:120:0;;;;;:::i;:::-;;:::i;100527:24::-;;;;;;;;;;-1:-1:-1;100527:24:0;;;;;;;;100693:20;;;;;;;;;;-1:-1:-1;100693:20:0;;;;;;;;;;;105507:204;;;:::i;95120:468::-;;;;;;;;;;-1:-1:-1;95120:468:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;73124:125::-;;;;;;;;;;-1:-1:-1;73124:125:0;;;;;:::i;:::-;;:::i;100746:24::-;;;;;;;;;;-1:-1:-1;100746:24:0;;;;;;;;;;;104739:346;;;;;;;;;;-1:-1:-1;104739:346:0;;;;;:::i;:::-;;:::i;104213:137::-;;;;;;;;;;-1:-1:-1;104213:137:0;;;;;:::i;:::-;;:::i;110961:219::-;;;;;;;;;;-1:-1:-1;110961:219:0;;;;;:::i;:::-;;:::i;70570:206::-;;;;;;;;;;-1:-1:-1;70570:206:0;;;;;:::i;:::-;;:::i;13707:103::-;;;;;;;;;;;;;:::i;102610:321::-;;;;;;;;;;-1:-1:-1;102610:321:0;;;;;:::i;:::-;;:::i;98934:891::-;;;;;;;;;;-1:-1:-1;98934:891:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;106190:418::-;;;;;;:::i;:::-;;:::i;13056:87::-;;;;;;;;;;-1:-1:-1;13129:6:0;;-1:-1:-1;;;;;13129:6:0;13056:87;;73485:104;;;;;;;;;;;;;:::i;95978:2507::-;;;;;;;;;;-1:-1:-1;95978:2507:0;;;;;:::i;:::-;;:::i;103031:150::-;;;;;;;;;;-1:-1:-1;103031:150:0;;;;;:::i;:::-;;:::i;105091:203::-;;;;;;:::i;:::-;;:::i;75107:287::-;;;;;;;;;;-1:-1:-1;75107:287:0;;;;;:::i;:::-;;:::i;100587:25::-;;;;;;;;;;-1:-1:-1;100587:25:0;;;;-1:-1:-1;;;100587:25:0;;;;;;105300:201;;;;;;:::i;:::-;;:::i;76193:370::-;;;;;;;;;;-1:-1:-1;76193:370:0;;;;;:::i;:::-;;:::i;108428:364::-;;;;;;;;;;-1:-1:-1;108428:364:0;;;;;:::i;:::-;;:::i;103326:439::-;;;;;;;;;;-1:-1:-1;103326:439:0;;;;;:::i;:::-;;:::i;100718:23::-;;;;;;;;;;-1:-1:-1;100718:23:0;;;;;;;;;;;94543:418;;;;;;;;;;-1:-1:-1;94543:418:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;100806:23::-;;;;;;;;;;-1:-1:-1;100806:23:0;;;;-1:-1:-1;;;;;100806:23:0;;;109401:551;;;;;;;;;;-1:-1:-1;109401:551:0;;;;;:::i;:::-;;:::i;109282:113::-;;;;;;;;;;-1:-1:-1;109282:113:0;;;;;:::i;:::-;-1:-1:-1;;;;;109371:18:0;109348:7;109371:18;;;:11;:18;;;;;;;109282:113;102937:88;;;;;;;;;;-1:-1:-1;102937:88:0;;;;;:::i;:::-;;:::i;102482:122::-;;;;;;;;;;-1:-1:-1;102482:122:0;;;;;:::i;:::-;;:::i;100775:26::-;;;;;;;;;;;;;;;;75465:164;;;;;;;;;;-1:-1:-1;75465:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;75586:25:0;;;75562:4;75586:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;75465:164;108267:155;;;;;;;;;;-1:-1:-1;108267:155:0;;;;;:::i;:::-;;:::i;106614:650::-;;;;;;:::i;:::-;;:::i;13965:201::-;;;;;;;;;;-1:-1:-1;13965:201:0;;;;;:::i;:::-;;:::i;103771:305::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;100672:16::-;;;;;;;;;;-1:-1:-1;100672:16:0;;;;;;;;104082:125;;;;;;;;;;-1:-1:-1;104082:125:0;;;;;:::i;:::-;;:::i;108798:250::-;108924:4;-1:-1:-1;;;;;;108954:41:0;;-1:-1:-1;;;108954:41:0;;:88;;;109006:36;109030:11;109006:23;:36::i;:::-;108940:102;108798:250;-1:-1:-1;;108798:250:0:o;105717:467::-;105824:5;109990:674;;105831:10;110063:1;110055:5;:9;110047:40;;;;-1:-1:-1;;;110047:40:0;;27099:2:1;110047:40:0;;;27081:21:1;27138:2;27118:18;;;27111:30;-1:-1:-1;;;27157:18:1;;;27150:48;27215:18;;110047:40:0;;;;;;;;;110111:10;;;;110102:19;;;110094:49;;;;-1:-1:-1;;;110094:49:0;;26753:2:1;110094:49:0;;;26735:21:1;26792:2;26772:18;;;26765:30;-1:-1:-1;;;26811:18:1;;;26804:47;26868:18;;110094:49:0;26551:341:1;110094:49:0;110178:13;:11;:13::i;:::-;110169:5;110158:8;:6;:8::i;:::-;:16;;;;:::i;:::-;:33;;110150:64;;;;-1:-1:-1;;;110150:64:0;;;;;;;:::i;:::-;110258:12;;;;;;;110249:5;110229:17;110243:2;110229:13;:17::i;:::-;:25;;;;:::i;:::-;:41;;110221:71;;;;-1:-1:-1;;;110221:71:0;;21830:2:1;110221:71:0;;;21812:21:1;21869:2;21849:18;;;21842:30;-1:-1:-1;;;21888:18:1;;;21881:47;21945:18;;110221:71:0;21628:341:1;110221:71:0;110320:26;110336:2;110340:5;110320:15;:26::i;:::-;110307:9;:39;;110299:68;;;;-1:-1:-1;;;110299:68:0;;26408:2:1;110299:68:0;;;26390:21:1;26447:2;26427:18;;;26420:30;-1:-1:-1;;;26466:18:1;;;26459:46;26522:18;;110299:68:0;26206:340:1;110299:68:0;110380:11;;:15;110376:102;;110434:11;;110425:5;110414:8;:6;:8::i;:::-;:16;;;;:::i;:::-;:31;;110406:64;;;;-1:-1:-1;;;110406:64:0;;25718:2:1;110406:64:0;;;25700:21:1;25757:2;25737:18;;;25730:30;-1:-1:-1;;;25776:18:1;;;25769:50;25836:18;;110406:64:0;25516:344:1;110406:64:0;110490:8;;-1:-1:-1;;;;;110490:8:0;:22;110486:163;;110551:8;;110577:33;;-1:-1:-1;;;110577:33:0;;110599:10;110577:33;;;15111:74:1;-1:-1:-1;;;;;110551:8:0;;;;110523:18;;110551:8;;110577:21;;15084:18:1;;110577:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;110569:72;;;;-1:-1:-1;;;110569:72:0;;22176:2:1;110569:72:0;;;22158:21:1;22215:2;22195:18;;;22188:30;-1:-1:-1;;;22234:18:1;;;22227:52;22296:18;;110569:72:0;21974:346:1;110569:72:0;110514:135;110486:163;105881:11:::2;::::0;;;::::2;;;105873:40;;;::::0;-1:-1:-1;;;105873:40:0;;24961:2:1;105873:40:0::2;::::0;::::2;24943:21:1::0;25000:2;24980:18;;;24973:30;-1:-1:-1;;;25019:18:1;;;25012:46;25075:18;;105873:40:0::2;24759:340:1::0;105873:40:0::2;105928:10;::::0;105920:46:::2;;;::::0;-1:-1:-1;;;105920:46:0;;18487:2:1;105920:46:0::2;::::0;::::2;18469:21:1::0;18526:2;18506:18;;;18499:30;-1:-1:-1;;;18545:18:1;;;18538:47;18602:18;;105920:46:0::2;18285:341:1::0;105920:46:0::2;105989:114;106018:5;;105989:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;;106034:10:0::2;::::0;106065:28:::2;::::0;-1:-1:-1;;106082:10:0::2;13112:2:1::0;13108:15;13104:53;106065:28:0::2;::::0;::::2;13092:66:1::0;106034:10:0;;-1:-1:-1;13174:12:1;;;-1:-1:-1;106065:28:0::2;;;;;;;;;;;;;106055:39;;;;;;105989:18;:114::i;:::-;105973:168;;;::::0;-1:-1:-1;;;105973:168:0;;19934:2:1;105973:168:0::2;::::0;::::2;19916:21:1::0;19973:2;19953:18;;;19946:30;-1:-1:-1;;;19992:18:1;;;19985:50;20052:18;;105973:168:0::2;19732:344:1::0;105973:168:0::2;106150:28;106160:10;106172:5;106150:28;;:9;:28::i;:::-;110731:1:::1;110717:11;;:15;:42;;;;;110748:11;;110736:8;:6;:8::i;:::-;:23;;110717:42;110713:129;;;110770:4;:12:::0;;-1:-1:-1;;110791:19:0;;;110777:5:::1;110819:11;:15:::0;110713:129:::1;105717:467:::0;;;;;:::o;107938:85::-;107977:7;108016:1;108000:13;;:17;;;;:::i;:::-;107993:24;;107938:85;:::o;73316:100::-;73370:13;73403:5;73396:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73316:100;:::o;74831:204::-;74899:7;74924:16;74932:7;74924;:16::i;:::-;74919:64;;74949:34;;-1:-1:-1;;;74949:34:0;;;;;;;;;;;74919:64;-1:-1:-1;75003:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;75003:24:0;;74831:204::o;74382:383::-;74455:13;74471:35;74498:7;74471:26;:35::i;:::-;74455:51;;74527:5;-1:-1:-1;;;;;74521:11:0;:2;-1:-1:-1;;;;;74521:11:0;;74517:48;;;74541:24;;-1:-1:-1;;;74541:24:0;;;;;;;;;;;74517:48;11572:10;-1:-1:-1;;;;;74582:21:0;;;74578:139;;74609:37;74626:5;11572:10;75465:164;:::i;74609:37::-;74605:112;;74670:35;;-1:-1:-1;;;74670:35:0;;;;;;;;;;;74605:112;74729:28;74738:2;74742:7;74751:5;74729:8;:28::i;:::-;74444:321;74382:383;;:::o;102385:91::-;13129:6;;-1:-1:-1;;;;;13129:6:0;11572:10;13276:23;13268:68;;;;-1:-1:-1;;;13268:68:0;;;;;;;:::i;:::-;102451:8:::1;:19:::0;;-1:-1:-1;;;;;;102451:19:0::1;-1:-1:-1::0;;;;;102451:19:0;;;::::1;::::0;;;::::1;::::0;;102385:91::o;108029:106::-;108082:7;108117:12;;108105:9;;:24;;;;:::i;102065:213::-;13129:6;;-1:-1:-1;;;;;13129:6:0;11572:10;13276:23;13268:68;;;;-1:-1:-1;;;13268:68:0;;;;;;;:::i;:::-;102189:4:::1;:12:::0;;-1:-1:-1;;102189:12:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;102208:4:::1;:12:::0;;;;102227::::1;:20:::0;;-1:-1:-1;;102254:18:0;102227:20;::::1;::::0;;::::1;;-1:-1:-1::0;;102254:18:0;;;;;::::1;;::::0;;102065:213::o;75696:170::-;75830:28;75840:4;75846:2;75850:7;75830:9;:28::i;109054:222::-;109224:9;;109249:12;;109165:16;;;;-1:-1:-1;;;;;109224:9:0;;;;109265:4;;109236:25;;:10;:25;:::i;:::-;109235:34;;;;:::i;:::-;109216:54;;;;109054:222;;;;;;:::o;101808:218::-;101868:10;101162:42;101868:21;101860:49;;;;-1:-1:-1;;;101860:49:0;;18833:2:1;101860:49:0;;;18815:21:1;18872:2;18852:18;;;18845:30;-1:-1:-1;;;18891:18:1;;;18884:45;18946:18;;101860:49:0;18631:339:1;101860:49:0;101162:42;101916:12;101931:16;;;:7;:16;;;;:24;;101950:5;;101931:24;:::i;:::-;101162:42;101962:16;;;;:7;:16;;;;;:24;;;102001:7;:10;;101916:39;;-1:-1:-1;101916:39:0;;101962:7;;:16;102009:1;;102001:10;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;102001:10:0;101993:19;;;;;;;;;;;;:27;;:19;;102001:10;101993:27;;;;;:::i;:::-;;;;-1:-1:-1;;;;101808:218:0:o;103187:133::-;103252:10;101162:42;103252:21;103244:49;;;;-1:-1:-1;;;103244:49:0;;18833:2:1;103244:49:0;;;18815:21:1;18872:2;18852:18;;;18845:30;-1:-1:-1;;;18891:18:1;;;18884:45;18946:18;;103244:49:0;18631:339:1;103244:49:0;103300:14;;;;:7;;:14;;;;;:::i;:::-;;103187:133;:::o;107270:637::-;107389:5;109990:674;;107396:2;110063:1;110055:5;:9;110047:40;;;;-1:-1:-1;;;110047:40:0;;27099:2:1;110047:40:0;;;27081:21:1;27138:2;27118:18;;;27111:30;-1:-1:-1;;;27157:18:1;;;27150:48;27215:18;;110047:40:0;26897:342:1;110047:40:0;110111:10;;;;110102:19;;;110094:49;;;;-1:-1:-1;;;110094:49:0;;26753:2:1;110094:49:0;;;26735:21:1;26792:2;26772:18;;;26765:30;-1:-1:-1;;;26811:18:1;;;26804:47;26868:18;;110094:49:0;26551:341:1;110094:49:0;110178:13;:11;:13::i;:::-;110169:5;110158:8;:6;:8::i;:::-;:16;;;;:::i;:::-;:33;;110150:64;;;;-1:-1:-1;;;110150:64:0;;;;;;;:::i;:::-;110258:12;;;;;;;110249:5;110229:17;110243:2;110229:13;:17::i;:::-;:25;;;;:::i;:::-;:41;;110221:71;;;;-1:-1:-1;;;110221:71:0;;21830:2:1;110221:71:0;;;21812:21:1;21869:2;21849:18;;;21842:30;-1:-1:-1;;;21888:18:1;;;21881:47;21945:18;;110221:71:0;21628:341:1;110221:71:0;110320:26;110336:2;110340:5;110320:15;:26::i;:::-;110307:9;:39;;110299:68;;;;-1:-1:-1;;;110299:68:0;;26408:2:1;110299:68:0;;;26390:21:1;26447:2;26427:18;;;26420:30;-1:-1:-1;;;26466:18:1;;;26459:46;26522:18;;110299:68:0;26206:340:1;110299:68:0;110380:11;;:15;110376:102;;110434:11;;110425:5;110414:8;:6;:8::i;:::-;:16;;;;:::i;:::-;:31;;110406:64;;;;-1:-1:-1;;;110406:64:0;;25718:2:1;110406:64:0;;;25700:21:1;25757:2;25737:18;;;25730:30;-1:-1:-1;;;25776:18:1;;;25769:50;25836:18;;110406:64:0;25516:344:1;110406:64:0;110490:8;;-1:-1:-1;;;;;110490:8:0;:22;110486:163;;110551:8;;110577:33;;-1:-1:-1;;;110577:33:0;;110599:10;110577:33;;;15111:74:1;-1:-1:-1;;;;;110551:8:0;;;;110523:18;;110551:8;;110577:21;;15084:18:1;;110577:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;110569:72;;;;-1:-1:-1;;;110569:72:0;;22176:2:1;110569:72:0;;;22158:21:1;22215:2;22195:18;;;22188:30;-1:-1:-1;;;22234:18:1;;;22227:52;22296:18;;110569:72:0;21974:346:1;110569:72:0;110514:135;110486:163;107430:12:::2;::::0;;;::::2;;;:20;;107446:4;107430:20;107422:51;;;::::0;-1:-1:-1;;;107422:51:0;;20283:2:1;107422:51:0::2;::::0;::::2;20265:21:1::0;20322:2;20302:18;;;20295:30;-1:-1:-1;;;20341:18:1;;;20334:48;20399:18;;107422:51:0::2;20081:342:1::0;107422:51:0::2;107488:4;::::0;::::2;;:12;;:4:::0;:12:::2;107480:38;;;::::0;-1:-1:-1;;;107480:38:0;;24619:2:1;107480:38:0::2;::::0;::::2;24601:21:1::0;24658:2;24638:18;;;24631:30;-1:-1:-1;;;24677:18:1;;;24670:43;24730:18;;107480:38:0::2;24417:337:1::0;107480:38:0::2;107547:1;107533:11;;:15;107525:46;;;::::0;-1:-1:-1;;;107525:46:0;;22874:2:1;107525:46:0::2;::::0;::::2;22856:21:1::0;22913:2;22893:18;;;22886:30;-1:-1:-1;;;22932:18:1;;;22925:48;22990:18;;107525:46:0::2;22672:342:1::0;107525:46:0::2;107612:1;107586:23;107600:8;107586:13;:23::i;:::-;:27;107578:63;;;::::0;-1:-1:-1;;;107578:63:0;;23221:2:1;107578:63:0::2;::::0;::::2;23203:21:1::0;23260:2;23240:18;;;23233:30;-1:-1:-1;;;23279:18:1;;;23272:53;23342:18;;107578:63:0::2;23019:347:1::0;107578:63:0::2;107662:8;-1:-1:-1::0;;;;;107656:14:0::2;:2;-1:-1:-1::0;;;;;107656:14:0::2;;;107648:48;;;::::0;-1:-1:-1;;;107648:48:0;;19177:2:1;107648:48:0::2;::::0;::::2;19159:21:1::0;19216:2;19196:18;;;19189:30;-1:-1:-1;;;19235:18:1;;;19228:51;19296:18;;107648:48:0::2;18975:345:1::0;107648:48:0::2;107705:20;107715:2;107719:5;107705:20;;:9;:20::i;:::-;-1:-1:-1::0;;;;;107734:21:0;::::2;;::::0;;;:11:::2;:21;::::0;;;;:26;;107759:1:::2;::::0;107734:21;:26:::2;::::0;107759:1;;107734:26:::2;:::i;:::-;::::0;;;-1:-1:-1;;107795:11:0::2;::::0;-1:-1:-1;;;;;107771:21:0;::::2;;::::0;;;:11:::2;:21;::::0;;;;;:35:::2;::::0;107795:11;107771:35:::2;:::i;:::-;107767:135;;107837:13;:11;:13::i;:::-;107826:8;:6;:8::i;:::-;:24;107822:73;;;107863:22;107873:8;107883:1;107863:9;:22::i;104356:351::-:0;104416:21;104452:11;104444:36;;;;-1:-1:-1;;;104444:36:0;;26067:2:1;104444:36:0;;;26049:21:1;26106:2;26086:18;;;26079:30;-1:-1:-1;;;26125:18:1;;;26118:42;26177:18;;104444:36:0;25865:336:1;104444:36:0;104494:9;104489:213;104513:7;:14;104509:18;;104489:213;;;104543:13;104559:7;:19;104567:7;104575:1;104567:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;104567:10:0;104559:19;;;;;;;;;;;;;;-1:-1:-1;104624:4:0;104605:15;104613:7;104559:19;104605:15;:::i;:::-;104604:24;;;;:::i;:::-;104587:42;;104638:56;104675:7;104683:1;104675:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;104675:10:0;104688:5;104638:28;:56::i;:::-;104534:168;;104529:3;;;;;:::i;:::-;;;;104489:213;;75937:185;76075:39;76092:4;76098:2;76102:7;76075:39;;;;;;;;;;;;:16;:39::i;90561:94::-;90627:20;90633:7;90642:4;90627:5;:20::i;:::-;90561:94;:::o;108141:120::-;108209:7;108232:23;108246:8;108232:13;:23::i;105507:204::-;13129:6;;-1:-1:-1;;;;;13129:6:0;11572:10;13276:23;13268:68;;;;-1:-1:-1;;;13268:68:0;;;;;;;:::i;:::-;105564:9:::1;:13:::0;105560:93:::1;;105588:57;101162:42;105635:9;105588:28;:57::i;:::-;105661:44;105671:7;13129:6:::0;;-1:-1:-1;;;;;13129:6:0;;13056:87;105671:7:::1;105696:8;:6;:8::i;:::-;105680:13;:11;:13::i;:::-;:24;;;;:::i;:::-;105661:9;:44::i;:::-;105507:204::o:0;95120:468::-;95295:15;;95209:23;;95270:22;95295:15;-1:-1:-1;;;;;95362:36:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;95362:36:0;;-1:-1:-1;;95362:36:0;;;;;;;;;;;;95325:73;;95418:9;95413:125;95434:14;95429:1;:19;95413:125;;95490:32;95510:8;95519:1;95510:11;;;;;;;;:::i;:::-;;;;;;;95490:19;:32::i;:::-;95474:10;95485:1;95474:13;;;;;;;;:::i;:::-;;;;;;;;;;:48;95450:3;;95413:125;;;-1:-1:-1;95559:10:0;95120:468;-1:-1:-1;;;95120:468:0:o;73124:125::-;73188:7;73215:21;73228:7;73215:12;:21::i;:::-;:26;;73124:125;-1:-1:-1;;73124:125:0:o;104739:346::-;13129:6;;-1:-1:-1;;;;;13129:6:0;11572:10;13276:23;13268:68;;;;-1:-1:-1;;;13268:68:0;;;;;;;:::i;:::-;104879:7:::1;:14;104857:11;:18;:36;104849:45;;;::::0;::::1;;104908:9;104903:177;104927:7;:14;104923:1;:18;104903:177;;;104990:13;:11;:13::i;:::-;104976:7;104984:1;104976:10;;;;;;;;:::i;:::-;;;;;;;104965:8;:6;:8::i;:::-;:21;;;;:::i;:::-;:38;;104957:69;;;;-1:-1:-1::0;;;104957:69:0::1;;;;;;;:::i;:::-;105035:37;105045:11;105057:1;105045:14;;;;;;;;:::i;:::-;;;;;;;105061:7;105069:1;105061:10;;;;;;;;:::i;:::-;;;;;;;105035:9;:37::i;:::-;104943:3:::0;::::1;::::0;::::1;:::i;:::-;;;;104903:177;;104213:137:::0;13129:6;;-1:-1:-1;;;;;13129:6:0;11572:10;13276:23;13268:68;;;;-1:-1:-1;;;13268:68:0;;;;;;;:::i;:::-;104296:9:::1;:22:::0;;-1:-1:-1;;;;;;104296:22:0::1;-1:-1:-1::0;;;;;104296:22:0;;;::::1;::::0;;;::::1;::::0;;;104325:12:::1;:19:::0;104213:137::o;110961:219::-;9751:13;;;;;;;:48;;9787:12;;;;9786:13;9751:48;;;10554:4;1316:20;1364:8;9767:16;9743:107;;;;-1:-1:-1;;;9743:107:0;;21415:2:1;9743:107:0;;;21397:21:1;21454:2;21434:18;;;21427:30;21493:34;21473:18;;;21466:62;-1:-1:-1;;;21544:18:1;;;21537:44;21598:19;;9743:107:0;21213:410:1;9743:107:0;9863:19;9886:13;;;;;;9885:14;9910:101;;;;9945:13;:20;;-1:-1:-1;;9980:19:0;;;;;9910:101;111117:57:::1;111134:5;111141:7;111150:10;111162:11;111117:16;:57::i;:::-;10041:14:::0;10037:68;;;10088:5;10072:21;;-1:-1:-1;;10072:21:0;;;9458:654;110961:219;;;;:::o;70570:206::-;70634:7;-1:-1:-1;;;;;70658:19:0;;70654:60;;70686:28;;-1:-1:-1;;;70686:28:0;;;;;;;;;;;70654:60;-1:-1:-1;;;;;;70740:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;70740:27:0;;70570:206::o;13707:103::-;13129:6;;-1:-1:-1;;;;;13129:6:0;11572:10;13276:23;13268:68;;;;-1:-1:-1;;;13268:68:0;;;;;;;:::i;:::-;13772:30:::1;13799:1;13772:18;:30::i;102610:321::-:0;13129:6;;-1:-1:-1;;;;;13129:6:0;11572:10;13276:23;13268:68;;;;-1:-1:-1;;;13268:68:0;;;;;;;:::i;:::-;102692:8:::1;:20:::0;;-1:-1:-1;;102692:20:0::1;;::::0;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;102721:62:::1;;102754:21:::0;;::::1;::::0;:14:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;102721:62;102808:4;102795:17:::0;::::1;;;102791:135;;;102823:15;102847:7;102823:32;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;102868:2;:9;102881:1;102868:14;102864:55;;;102895:14:::0;;::::1;::::0;:7:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;:::-;;102814:112;102610:321:::0;;:::o;98934:891::-;99004:16;99058:19;99092:25;99132:22;99157:16;99167:5;99157:9;:16::i;:::-;99132:41;;99188:25;99230:14;-1:-1:-1;;;;;99216:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;99216:29:0;;99188:57;;99260:31;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;99260:31:0;102372:1;99306:471;99355:14;99340:11;:29;99306:471;;99407:14;;;;:11;:14;;;;;;;;;99395:26;;;;;;;;;-1:-1:-1;;;;;99395:26:0;;;;-1:-1:-1;;;99395:26:0;;-1:-1:-1;;;;;99395:26:0;;;;;;;;-1:-1:-1;;;99395:26:0;;;;;;;;;;;;;;;;-1:-1:-1;99440:73:0;;99485:8;;99440:73;99535:14;;-1:-1:-1;;;;;99535:28:0;;99531:111;;99608:14;;;-1:-1:-1;99531:111:0;99685:5;-1:-1:-1;;;;;99664:26:0;:17;-1:-1:-1;;;;;99664:26:0;;99660:102;;;99741:1;99715:8;99724:13;;;;;;99715:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;99660:102;99371:3;;99306:471;;;-1:-1:-1;99798:8:0;;98934:891;-1:-1:-1;;;;;;98934:891:0:o;106190:418::-;106316:5;109990:674;;106323:2;110063:1;110055:5;:9;110047:40;;;;-1:-1:-1;;;110047:40:0;;27099:2:1;110047:40:0;;;27081:21:1;27138:2;27118:18;;;27111:30;-1:-1:-1;;;27157:18:1;;;27150:48;27215:18;;110047:40:0;26897:342:1;110047:40:0;110111:10;;;;110102:19;;;110094:49;;;;-1:-1:-1;;;110094:49:0;;26753:2:1;110094:49:0;;;26735:21:1;26792:2;26772:18;;;26765:30;-1:-1:-1;;;26811:18:1;;;26804:47;26868:18;;110094:49:0;26551:341:1;110094:49:0;110178:13;:11;:13::i;:::-;110169:5;110158:8;:6;:8::i;:::-;:16;;;;:::i;:::-;:33;;110150:64;;;;-1:-1:-1;;;110150:64:0;;;;;;;:::i;:::-;110258:12;;;;;;;110249:5;110229:17;110243:2;110229:13;:17::i;:::-;:25;;;;:::i;:::-;:41;;110221:71;;;;-1:-1:-1;;;110221:71:0;;21830:2:1;110221:71:0;;;21812:21:1;21869:2;21849:18;;;21842:30;-1:-1:-1;;;21888:18:1;;;21881:47;21945:18;;110221:71:0;21628:341:1;110221:71:0;110320:26;110336:2;110340:5;110320:15;:26::i;:::-;110307:9;:39;;110299:68;;;;-1:-1:-1;;;110299:68:0;;26408:2:1;110299:68:0;;;26390:21:1;26447:2;26427:18;;;26420:30;-1:-1:-1;;;26466:18:1;;;26459:46;26522:18;;110299:68:0;26206:340:1;110299:68:0;110380:11;;:15;110376:102;;110434:11;;110425:5;110414:8;:6;:8::i;:::-;:16;;;;:::i;:::-;:31;;110406:64;;;;-1:-1:-1;;;110406:64:0;;25718:2:1;110406:64:0;;;25700:21:1;25757:2;25737:18;;;25730:30;-1:-1:-1;;;25776:18:1;;;25769:50;25836:18;;110406:64:0;25516:344:1;110406:64:0;110490:8;;-1:-1:-1;;;;;110490:8:0;:22;110486:163;;110551:8;;110577:33;;-1:-1:-1;;;110577:33:0;;110599:10;110577:33;;;15111:74:1;-1:-1:-1;;;;;110551:8:0;;;;110523:18;;110551:8;;110577:21;;15084:18:1;;110577:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;110569:72;;;;-1:-1:-1;;;110569:72:0;;22176:2:1;110569:72:0;;;22158:21:1;22215:2;22195:18;;;22188:30;-1:-1:-1;;;22234:18:1;;;22227:52;22296:18;;110569:72:0;21974:346:1;110569:72:0;110514:135;110486:163;106357:11:::2;::::0;;;::::2;;;106349:40;;;::::0;-1:-1:-1;;;106349:40:0;;24961:2:1;106349:40:0::2;::::0;::::2;24943:21:1::0;25000:2;24980:18;;;24973:30;-1:-1:-1;;;25019:18:1;;;25012:46;25075:18;;106349:40:0::2;24759:340:1::0;106349:40:0::2;106404:10;::::0;106396:46:::2;;;::::0;-1:-1:-1;;;106396:46:0;;18487:2:1;106396:46:0::2;::::0;::::2;18469:21:1::0;18526:2;18506:18;;;18499:30;-1:-1:-1;;;18545:18:1;;;18538:47;18602:18;;106396:46:0::2;18285:341:1::0;106396:46:0::2;106465:70;106484:5;;106465:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;;106491:10:0::2;::::0;106513:20:::2;::::0;-1:-1:-1;;13112:2:1;13108:15;;;13104:53;106513:20:0::2;::::0;::::2;13092:66:1::0;106491:10:0;;-1:-1:-1;13174:12:1;;;-1:-1:-1;106513:20:0::2;12963:229:1::0;106465:70:0::2;106449:124;;;::::0;-1:-1:-1;;;106449:124:0;;19934:2:1;106449:124:0::2;::::0;::::2;19916:21:1::0;19973:2;19953:18;;;19946:30;-1:-1:-1;;;19992:18:1;;;19985:50;20052:18;;106449:124:0::2;19732:344:1::0;106449:124:0::2;106582:20;106592:2;106596:5;106582:20;;:9;:20::i;:::-;110731:1:::1;110717:11;;:15;:42;;;;;110748:11;;110736:8;:6;:8::i;:::-;:23;;110717:42;110713:129;;;110770:4;:12:::0;;-1:-1:-1;;110791:19:0;;;110777:5:::1;110819:11;:15:::0;110713:129:::1;106190:418:::0;;;;;;:::o;73485:104::-;73541:13;73574:7;73567:14;;;;;:::i;95978:2507::-;96113:16;96180:4;96171:5;:13;96167:45;;96193:19;;-1:-1:-1;;;96193:19:0;;;;;;;;;;;96167:45;96281:13;;96227:19;;102372:1;96372:5;:23;96368:87;;;102372:1;96416:23;;96368:87;96535:9;96528:4;:16;96524:73;;;96572:9;96565:16;;96524:73;96611:25;96639:16;96649:5;96639:9;:16::i;:::-;96611:44;;96833:4;96825:5;:12;96821:278;;;96880:12;;;96915:31;;;96911:111;;;96991:11;96971:31;;96911:111;96839:198;96821:278;;;-1:-1:-1;97082:1:0;96821:278;97113:25;97155:17;-1:-1:-1;;;;;97141:32:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;97141:32:0;-1:-1:-1;97113:60:0;-1:-1:-1;97192:22:0;97188:78;;97242:8;-1:-1:-1;97235:15:0;;-1:-1:-1;;;97235:15:0;97188:78;97410:31;97444:26;97464:5;97444:19;:26::i;:::-;97410:60;;97485:25;97730:9;:16;;;97725:92;;-1:-1:-1;97787:14:0;;97725:92;97848:5;97831:477;97860:4;97855:1;:9;;:45;;;;;97883:17;97868:11;:32;;97855:45;97831:477;;;97938:14;;;;:11;:14;;;;;;;;;97926:26;;;;;;;;;-1:-1:-1;;;;;97926:26:0;;;;-1:-1:-1;;;97926:26:0;;-1:-1:-1;;;;;97926:26:0;;;;;;;;-1:-1:-1;;;97926:26:0;;;;;;;;;;;;;;;;-1:-1:-1;97971:73:0;;98016:8;;97971:73;98066:14;;-1:-1:-1;;;;;98066:28:0;;98062:111;;98139:14;;;-1:-1:-1;98062:111:0;98216:5;-1:-1:-1;;;;;98195:26:0;:17;-1:-1:-1;;;;;98195:26:0;;98191:102;;;98272:1;98246:8;98255:13;;;;;;98246:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;98191:102;97902:3;;97831:477;;;-1:-1:-1;;;98393:29:0;;;-1:-1:-1;98400:8:0;;-1:-1:-1;;95978:2507:0;;;;;;:::o;103031:150::-;13129:6;;-1:-1:-1;;;;;13129:6:0;11572:10;13276:23;13268:68;;;;-1:-1:-1;;;13268:68:0;;;;;;;:::i;:::-;103120:8:::1;:6;:8::i;:::-;103108;:20;;103100:46;;;::::0;-1:-1:-1;;;103100:46:0;;23934:2:1;103100:46:0::1;::::0;::::1;23916:21:1::0;23973:2;23953:18;;;23946:30;-1:-1:-1;;;23992:18:1;;;23985:43;24045:18;;103100:46:0::1;23732:337:1::0;103100:46:0::1;103153:11;:22:::0;103031:150::o;105091:203::-;105166:5;105173:10;110063:1;110055:5;:9;110047:40;;;;-1:-1:-1;;;110047:40:0;;27099:2:1;110047:40:0;;;27081:21:1;27138:2;27118:18;;;27111:30;-1:-1:-1;;;27157:18:1;;;27150:48;27215:18;;110047:40:0;26897:342:1;110047:40:0;110111:10;;;;110102:19;;;110094:49;;;;-1:-1:-1;;;110094:49:0;;26753:2:1;110094:49:0;;;26735:21:1;26792:2;26772:18;;;26765:30;-1:-1:-1;;;26811:18:1;;;26804:47;26868:18;;110094:49:0;26551:341:1;110094:49:0;110178:13;:11;:13::i;:::-;110169:5;110158:8;:6;:8::i;:::-;:16;;;;:::i;:::-;:33;;110150:64;;;;-1:-1:-1;;;110150:64:0;;;;;;;:::i;:::-;110258:12;;;;;;;110249:5;110229:17;110243:2;110229:13;:17::i;:::-;:25;;;;:::i;:::-;:41;;110221:71;;;;-1:-1:-1;;;110221:71:0;;21830:2:1;110221:71:0;;;21812:21:1;21869:2;21849:18;;;21842:30;-1:-1:-1;;;21888:18:1;;;21881:47;21945:18;;110221:71:0;21628:341:1;110221:71:0;110320:26;110336:2;110340:5;110320:15;:26::i;:::-;110307:9;:39;;110299:68;;;;-1:-1:-1;;;110299:68:0;;26408:2:1;110299:68:0;;;26390:21:1;26447:2;26427:18;;;26420:30;-1:-1:-1;;;26466:18:1;;;26459:46;26522:18;;110299:68:0;26206:340:1;110299:68:0;110380:11;;:15;110376:102;;110434:11;;110425:5;110414:8;:6;:8::i;:::-;:16;;;;:::i;:::-;:31;;110406:64;;;;-1:-1:-1;;;110406:64:0;;25718:2:1;110406:64:0;;;25700:21:1;25757:2;25737:18;;;25730:30;-1:-1:-1;;;25776:18:1;;;25769:50;25836:18;;110406:64:0;25516:344:1;110406:64:0;110490:8;;-1:-1:-1;;;;;110490:8:0;:22;110486:163;;110551:8;;110577:33;;-1:-1:-1;;;110577:33:0;;110599:10;110577:33;;;15111:74:1;-1:-1:-1;;;;;110551:8:0;;;;110523:18;;110551:8;;110577:21;;15084:18:1;;110577:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;110569:72;;;;-1:-1:-1;;;110569:72:0;;22176:2:1;110569:72:0;;;22158:21:1;22215:2;22195:18;;;22188:30;-1:-1:-1;;;22234:18:1;;;22227:52;22296:18;;110569:72:0;21974:346:1;110569:72:0;110514:135;110486:163;105223:4:::2;::::0;::::2;;:12;;:4:::0;:12:::2;105215:38;;;::::0;-1:-1:-1;;;105215:38:0;;24619:2:1;105215:38:0::2;::::0;::::2;24601:21:1::0;24658:2;24638:18;;;24631:30;-1:-1:-1;;;24677:18:1;;;24670:43;24730:18;;105215:38:0::2;24417:337:1::0;105215:38:0::2;105260:28;105270:10;105282:5;105260:9;:28::i;:::-;110731:1:::1;110717:11;;:15;:42;;;;;110748:11;;110736:8;:6;:8::i;:::-;:23;;110717:42;110713:129;;;110770:4;:12:::0;;-1:-1:-1;;110791:19:0;;;110777:5:::1;110819:11;:15:::0;105091:203;;;:::o;75107:287::-;-1:-1:-1;;;;;75206:24:0;;11572:10;75206:24;75202:54;;;75239:17;;-1:-1:-1;;;75239:17:0;;;;;;;;;;;75202:54;11572:10;75269:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;75269:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;75269:53:0;;;;;;;;;;75338:48;;18009:41:1;;;75269:42:0;;11572:10;75338:48;;17982:18:1;75338:48:0;;;;;;;75107:287;;:::o;105300:201::-;105389:5;105396:2;110063:1;110055:5;:9;110047:40;;;;-1:-1:-1;;;110047:40:0;;27099:2:1;110047:40:0;;;27081:21:1;27138:2;27118:18;;;27111:30;-1:-1:-1;;;27157:18:1;;;27150:48;27215:18;;110047:40:0;26897:342:1;110047:40:0;110111:10;;;;110102:19;;;110094:49;;;;-1:-1:-1;;;110094:49:0;;26753:2:1;110094:49:0;;;26735:21:1;26792:2;26772:18;;;26765:30;-1:-1:-1;;;26811:18:1;;;26804:47;26868:18;;110094:49:0;26551:341:1;110094:49:0;110178:13;:11;:13::i;:::-;110169:5;110158:8;:6;:8::i;:::-;:16;;;;:::i;:::-;:33;;110150:64;;;;-1:-1:-1;;;110150:64:0;;;;;;;:::i;:::-;110258:12;;;;;;;110249:5;110229:17;110243:2;110229:13;:17::i;:::-;:25;;;;:::i;:::-;:41;;110221:71;;;;-1:-1:-1;;;110221:71:0;;21830:2:1;110221:71:0;;;21812:21:1;21869:2;21849:18;;;21842:30;-1:-1:-1;;;21888:18:1;;;21881:47;21945:18;;110221:71:0;21628:341:1;110221:71:0;110320:26;110336:2;110340:5;110320:15;:26::i;:::-;110307:9;:39;;110299:68;;;;-1:-1:-1;;;110299:68:0;;26408:2:1;110299:68:0;;;26390:21:1;26447:2;26427:18;;;26420:30;-1:-1:-1;;;26466:18:1;;;26459:46;26522:18;;110299:68:0;26206:340:1;110299:68:0;110380:11;;:15;110376:102;;110434:11;;110425:5;110414:8;:6;:8::i;:::-;:16;;;;:::i;:::-;:31;;110406:64;;;;-1:-1:-1;;;110406:64:0;;25718:2:1;110406:64:0;;;25700:21:1;25757:2;25737:18;;;25730:30;-1:-1:-1;;;25776:18:1;;;25769:50;25836:18;;110406:64:0;25516:344:1;110406:64:0;110490:8;;-1:-1:-1;;;;;110490:8:0;:22;110486:163;;110551:8;;110577:33;;-1:-1:-1;;;110577:33:0;;110599:10;110577:33;;;15111:74:1;-1:-1:-1;;;;;110551:8:0;;;;110523:18;;110551:8;;110577:21;;15084:18:1;;110577:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;110569:72;;;;-1:-1:-1;;;110569:72:0;;22176:2:1;110569:72:0;;;22158:21:1;22215:2;22195:18;;;22188:30;-1:-1:-1;;;22234:18:1;;;22227:52;22296:18;;110569:72:0;21974:346:1;110569:72:0;110514:135;110486:163;105438:4:::2;::::0;::::2;;:12;;:4:::0;:12:::2;105430:38;;;::::0;-1:-1:-1;;;105430:38:0;;24619:2:1;105430:38:0::2;::::0;::::2;24601:21:1::0;24658:2;24638:18;;;24631:30;-1:-1:-1;;;24677:18:1;;;24670:43;24730:18;;105430:38:0::2;24417:337:1::0;105430:38:0::2;105475:20;105485:2;105489:5;105475:9;:20::i;:::-;110731:1:::1;110717:11;;:15;:42;;;;;110748:11;;110736:8;:6;:8::i;:::-;:23;;110717:42;110713:129;;;110770:4;:12:::0;;-1:-1:-1;;110791:19:0;;;110777:5:::1;110819:11;:15:::0;105300:201;;;;:::o;76193:370::-;76360:28;76370:4;76376:2;76380:7;76360:9;:28::i;:::-;-1:-1:-1;;;;;76403:13:0;;1316:20;1364:8;76399:157;;76424:56;76455:4;76461:2;76465:7;76474:5;76424:30;:56::i;:::-;76420:136;;76504:40;;-1:-1:-1;;;76504:40:0;;;;;;;;;;;108428:364;108523:7;108542:19;108564:23;108578:8;108564:13;:23::i;:::-;108598:11;;108542:45;;-1:-1:-1;;;;108598:11:0;;;;:15;;;;:44;;-1:-1:-1;108631:11:0;;-1:-1:-1;;;108631:11:0;;;;108617:25;;108598:44;108594:164;;;108723:11;;108695:54;;108715:6;;108723:25;;108737:11;;-1:-1:-1;;;108723:11:0;;;;:25;:::i;:::-;108695:19;:54::i;:::-;108686:63;;:6;:63;:::i;:::-;108669:4;;:81;;;;:::i;:::-;108653:97;;;;;108594:164;108782:4;;108773:13;;:6;:13;:::i;:::-;108766:20;108428:364;-1:-1:-1;;;;108428:364:0:o;103326:439::-;13129:6;;-1:-1:-1;;;;;13129:6:0;11572:10;13276:23;13268:68;;;;-1:-1:-1;;;13268:68:0;;;;;;;:::i;:::-;103464:1:::1;103447:88;103471:7;:14:::0;103467:18;::::1;103447:88;;;103508:7;:19;103516:7;103524:1;103516:10;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;103516:10:0::1;103508:19:::0;;;::::1;::::0;;;;;;;;103501:26;103487:3;::::1;::::0;::::1;:::i;:::-;;;;103447:88;;;-1:-1:-1::0;103565:17:0;;:21:::1;::::0;103585:1:::1;103565:21;:::i;:::-;-1:-1:-1::0;;;;;103551:36:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;103551:36:0::1;-1:-1:-1::0;103541:46:0;;::::1;::::0;:7:::1;::::0;:46:::1;::::0;;::::1;::::0;::::1;:::i;:::-;;101162:42;103594:7;103602:1;103594:10;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;:20:::0;;-1:-1:-1;;;;;;103594:20:0::1;-1:-1:-1::0;;;;;103594:20:0;;;::::1;::::0;;;::::1;::::0;;;103623:137:::1;103647:10;:17;103643:1;:21;103623:137;;;103705:5;103711:1;103705:8;;;;;;;;:::i;:::-;;;;;;;103680:7;:22;103688:10;103699:1;103688:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;103680:22:0::1;-1:-1:-1::0;;;;;103680:22:0::1;;;;;;;;;;;;:33;;;;103739:10;103750:1;103739:13;;;;;;;;:::i;:::-;;;;;;;103722:7;103730:1;103734;103730:5;;;;:::i;:::-;103722:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:30:::0;;-1:-1:-1;;;;;;103722:30:0::1;-1:-1:-1::0;;;;;103722:30:0;;;::::1;::::0;;;::::1;::::0;;103666:3;::::1;::::0;::::1;:::i;:::-;;;;103623:137;;94543:418:::0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;102372:1:0;94699:25;;;:53;;;94739:13;;94728:7;:24;;94699:53;94695:102;;;94776:9;94543:418;-1:-1:-1;;94543:418:0:o;94695:102::-;-1:-1:-1;94819:20:0;;;;:11;:20;;;;;;;;;94807:32;;;;;;;;;-1:-1:-1;;;;;94807:32:0;;;;-1:-1:-1;;;94807:32:0;;-1:-1:-1;;;;;94807:32:0;;;;;;;;-1:-1:-1;;;94807:32:0;;;;;;;;;;;;;;;;94850:65;;94894:9;94543:418;-1:-1:-1;;94543:418:0:o;94850:65::-;94932:21;94945:7;94932:12;:21::i;109401:551::-;109487:13;109520:17;109528:8;109520:7;:17::i;:::-;109512:44;;;;-1:-1:-1;;;109512:44:0;;24276:2:1;109512:44:0;;;24258:21:1;24315:2;24295:18;;;24288:30;-1:-1:-1;;;24334:18:1;;;24327:44;24388:18;;109512:44:0;24074:338:1;109512:44:0;109567:8;;;;;;;109563:218;;109661:14;109690:37;109718:8;109690:27;:37::i;:::-;109630:132;;;;;;;;;:::i;:::-;;;;;;;;;;;;;109595:178;;109401:551;;;:::o;109563:218::-;109849:7;109869:37;109897:8;109869:27;:37::i;102937:88::-;13129:6;;-1:-1:-1;;;;;13129:6:0;11572:10;13276:23;13268:68;;;;-1:-1:-1;;;13268:68:0;;;;;;;:::i;:::-;103001:11:::1;:18:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;103001:18:0::1;-1:-1:-1::0;;103001:18:0;;::::1;::::0;;;::::1;::::0;;102937:88::o;102482:122::-;13129:6;;-1:-1:-1;;;;;13129:6:0;11572:10;13276:23;13268:68;;;;-1:-1:-1;;;13268:68:0;;;;;;;:::i;:::-;102555:11:::1;:19:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;102555:19:0;;::::1;::::0;;;::::1;::::0;;;102581:10:::1;:17:::0;102482:122::o;108267:155::-;108352:7;108393:23;108407:8;108393:13;:23::i;:::-;108378:12;;:38;;;:12;;;;;:38;:::i;106614:650::-;106714:5;109990:674;;106721:10;110063:1;110055:5;:9;110047:40;;;;-1:-1:-1;;;110047:40:0;;27099:2:1;110047:40:0;;;27081:21:1;27138:2;27118:18;;;27111:30;-1:-1:-1;;;27157:18:1;;;27150:48;27215:18;;110047:40:0;26897:342:1;110047:40:0;110111:10;;;;110102:19;;;110094:49;;;;-1:-1:-1;;;110094:49:0;;26753:2:1;110094:49:0;;;26735:21:1;26792:2;26772:18;;;26765:30;-1:-1:-1;;;26811:18:1;;;26804:47;26868:18;;110094:49:0;26551:341:1;110094:49:0;110178:13;:11;:13::i;:::-;110169:5;110158:8;:6;:8::i;:::-;:16;;;;:::i;:::-;:33;;110150:64;;;;-1:-1:-1;;;110150:64:0;;;;;;;:::i;:::-;110258:12;;;;;;;110249:5;110229:17;110243:2;110229:13;:17::i;:::-;:25;;;;:::i;:::-;:41;;110221:71;;;;-1:-1:-1;;;110221:71:0;;21830:2:1;110221:71:0;;;21812:21:1;21869:2;21849:18;;;21842:30;-1:-1:-1;;;21888:18:1;;;21881:47;21945:18;;110221:71:0;21628:341:1;110221:71:0;110320:26;110336:2;110340:5;110320:15;:26::i;:::-;110307:9;:39;;110299:68;;;;-1:-1:-1;;;110299:68:0;;26408:2:1;110299:68:0;;;26390:21:1;26447:2;26427:18;;;26420:30;-1:-1:-1;;;26466:18:1;;;26459:46;26522:18;;110299:68:0;26206:340:1;110299:68:0;110380:11;;:15;110376:102;;110434:11;;110425:5;110414:8;:6;:8::i;:::-;:16;;;;:::i;:::-;:31;;110406:64;;;;-1:-1:-1;;;110406:64:0;;25718:2:1;110406:64:0;;;25700:21:1;25757:2;25737:18;;;25730:30;-1:-1:-1;;;25776:18:1;;;25769:50;25836:18;;110406:64:0;25516:344:1;110406:64:0;110490:8;;-1:-1:-1;;;;;110490:8:0;:22;110486:163;;110551:8;;110577:33;;-1:-1:-1;;;110577:33:0;;110599:10;110577:33;;;15111:74:1;-1:-1:-1;;;;;110551:8:0;;;;110523:18;;110551:8;;110577:21;;15084:18:1;;110577:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;110569:72;;;;-1:-1:-1;;;110569:72:0;;22176:2:1;110569:72:0;;;22158:21:1;22215:2;22195:18;;;22188:30;-1:-1:-1;;;22234:18:1;;;22227:52;22296:18;;110569:72:0;21974:346:1;110569:72:0;110514:135;110486:163;106771:12:::2;::::0;;;::::2;;;:20;;106787:4;106771:20;106763:51;;;::::0;-1:-1:-1;;;106763:51:0;;20283:2:1;106763:51:0::2;::::0;::::2;20265:21:1::0;20322:2;20302:18;;;20295:30;-1:-1:-1;;;20341:18:1;;;20334:48;20399:18;;106763:51:0::2;20081:342:1::0;106763:51:0::2;106829:4;::::0;::::2;;:12;;:4:::0;:12:::2;106821:38;;;::::0;-1:-1:-1;;;106821:38:0;;24619:2:1;106821:38:0::2;::::0;::::2;24601:21:1::0;24658:2;24638:18;;;24631:30;-1:-1:-1;;;24677:18:1;;;24670:43;24730:18;;106821:38:0::2;24417:337:1::0;106821:38:0::2;106888:1;106874:11;;:15;106866:46;;;::::0;-1:-1:-1;;;106866:46:0;;22874:2:1;106866:46:0::2;::::0;::::2;22856:21:1::0;22913:2;22893:18;;;22886:30;-1:-1:-1;;;22932:18:1;;;22925:48;22990:18;;106866:46:0::2;22672:342:1::0;106866:46:0::2;106953:1;106927:23;106941:8;106927:13;:23::i;:::-;:27;106919:63;;;::::0;-1:-1:-1;;;106919:63:0;;23221:2:1;106919:63:0::2;::::0;::::2;23203:21:1::0;23260:2;23240:18;;;23233:30;-1:-1:-1;;;23279:18:1;;;23272:53;23342:18;;106919:63:0::2;23019:347:1::0;106919:63:0::2;106997:10;-1:-1:-1::0;;;;;106997:22:0;::::2;;;106989:56;;;::::0;-1:-1:-1;;;106989:56:0;;19177:2:1;106989:56:0::2;::::0;::::2;19159:21:1::0;19216:2;19196:18;;;19189:30;-1:-1:-1;;;19235:18:1;;;19228:51;19296:18;;106989:56:0::2;18975:345:1::0;106989:56:0::2;107054:28;107064:10;107076:5;107054:28;;:9;:28::i;:::-;-1:-1:-1::0;;;;;107091:21:0;::::2;;::::0;;;:11:::2;:21;::::0;;;;:26;;107116:1:::2;::::0;107091:21;:26:::2;::::0;107116:1;;107091:26:::2;:::i;:::-;::::0;;;-1:-1:-1;;107152:11:0::2;::::0;-1:-1:-1;;;;;107128:21:0;::::2;;::::0;;;:11:::2;:21;::::0;;;;;:35:::2;::::0;107152:11;107128:35:::2;:::i;:::-;107124:135;;107194:13;:11;:13::i;:::-;107183:8;:6;:8::i;:::-;:24;107179:73;;;107220:22;107230:8;107240:1;107220:9;:22::i;13965:201::-:0;13129:6;;-1:-1:-1;;;;;13129:6:0;11572:10;13276:23;13268:68;;;;-1:-1:-1;;;13268:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14054:22:0;::::1;14046:73;;;::::0;-1:-1:-1;;;14046:73:0;;19527:2:1;14046:73:0::1;::::0;::::1;19509:21:1::0;19566:2;19546:18;;;19539:30;19605:34;19585:18;;;19578:62;-1:-1:-1;;;19656:18:1;;;19649:36;19702:19;;14046:73:0::1;19325:402:1::0;14046:73:0::1;14130:28;14149:8;14130:18;:28::i;103771:305::-:0;103835:16;103853;103881:23;103921:7;:14;;;;-1:-1:-1;;;;;103907:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;103907:29:0;;103881:55;;103950:9;103945:93;103969:7;:14;103965:18;;103945:93;;;104011:7;:19;104019:7;104027:1;104019:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;104019:10:0;104011:19;;;;;;;;;;;;;103999:9;;:6;;104006:1;;103999:9;;;;;;:::i;:::-;;;;;;;;;;:31;103985:3;;;;:::i;:::-;;;;103945:93;;;;104054:7;104063:6;104046:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;104046:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;103771:305;;:::o;104082:125::-;13129:6;;-1:-1:-1;;;;;13129:6:0;11572:10;13276:23;13268:68;;;;-1:-1:-1;;;13268:68:0;;;;;;;:::i;:::-;104156:12:::1;:20:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;104156:20:0;;::::1;::::0;;;::::1;::::0;;;104183:11:::1;:18:::0;104082:125::o;70157:349::-;70281:4;-1:-1:-1;;;;;;70318:51:0;;-1:-1:-1;;;70318:51:0;;:127;;-1:-1:-1;;;;;;;70386:59:0;;-1:-1:-1;;;70386:59:0;70318:127;:180;;;-1:-1:-1;;;;;;;;;;66904:51:0;;;70462:36;66795:168;70858:137;-1:-1:-1;;;;;70954:19:0;70919:7;70954:19;;;:12;:19;;;;;:32;-1:-1:-1;;;70954:32:0;;-1:-1:-1;;;;;70954:32:0;;70858:137::o;18956:190::-;19081:4;19134;19105:25;19118:5;19125:4;19105:12;:25::i;:::-;:33;;18956:190;-1:-1:-1;;;;18956:190:0:o;77076:104::-;77145:27;77155:2;77159:8;77145:27;;;;;;;;;;;;:9;:27::i;76818:174::-;76875:4;76918:7;102372:1;76899:26;;:53;;;;;76939:13;;76929:7;:23;76899:53;:85;;;;-1:-1:-1;;76957:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;76957:27:0;;;;76956:28;;76818:174::o;86040:196::-;86155:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;86155:29:0;-1:-1:-1;;;;;86155:29:0;;;;;;;;;86200:28;;86155:24;;86200:28;;;;;;;86040:196;;;:::o;80988:2130::-;81103:35;81141:21;81154:7;81141:12;:21::i;:::-;81103:59;;81201:4;-1:-1:-1;;;;;81179:26:0;:13;:18;;;-1:-1:-1;;;;;81179:26:0;;81175:67;;81214:28;;-1:-1:-1;;;81214:28:0;;;;;;;;;;;81175:67;81255:22;11572:10;-1:-1:-1;;;;;81281:20:0;;;;:73;;-1:-1:-1;81318:36:0;81335:4;11572:10;75465:164;:::i;81318:36::-;81281:126;;;-1:-1:-1;11572:10:0;81371:20;81383:7;81371:11;:20::i;:::-;-1:-1:-1;;;;;81371:36:0;;81281:126;81255:153;;81426:17;81421:66;;81452:35;;-1:-1:-1;;;81452:35:0;;;;;;;;;;;81421:66;-1:-1:-1;;;;;81502:16:0;;81498:52;;81527:23;;-1:-1:-1;;;81527:23:0;;;;;;;;;;;81498:52;81671:35;81688:1;81692:7;81701:4;81671:8;:35::i;:::-;-1:-1:-1;;;;;82002:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;82002:31:0;;;-1:-1:-1;;;;;82002:31:0;;;-1:-1:-1;;82002:31:0;;;;;;;82048:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;82048:29:0;;;;;;;;;;;82128:20;;;:11;:20;;;;;;82163:18;;-1:-1:-1;;;;;;82196:49:0;;;;-1:-1:-1;;;82229:15:0;82196:49;;;;;;;;;;82519:11;;82579:24;;;;;82622:13;;82128:20;;82579:24;;82622:13;82618:384;;82832:13;;82817:11;:28;82813:174;;82870:20;;82939:28;;;;-1:-1:-1;;;;;82913:54:0;-1:-1:-1;;;82913:54:0;-1:-1:-1;;;;;;82913:54:0;;;-1:-1:-1;;;;;82870:20:0;;82913:54;;;;82813:174;81977:1036;;;83049:7;83045:2;-1:-1:-1;;;;;83030:27:0;83039:4;-1:-1:-1;;;;;83030:27:0;;;;;;;;;;;83068:42;102610:321;2315:317;2430:6;2405:21;:31;;2397:73;;;;-1:-1:-1;;;2397:73:0;;21057:2:1;2397:73:0;;;21039:21:1;21096:2;21076:18;;;21069:30;21135:31;21115:18;;;21108:59;21184:18;;2397:73:0;20855:353:1;2397:73:0;2484:12;2502:9;-1:-1:-1;;;;;2502:14:0;2524:6;2502:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2483:52;;;2554:7;2546:78;;;;-1:-1:-1;;;2546:78:0;;20630:2:1;2546:78:0;;;20612:21:1;20669:2;20649:18;;;20642:30;20708:34;20688:18;;;20681:62;20779:28;20759:18;;;20752:56;20825:19;;2546:78:0;20428:422:1;83514:2408:0;83594:35;83632:21;83645:7;83632:12;:21::i;:::-;83681:18;;83594:59;;-1:-1:-1;83712:290:0;;;;83746:22;11572:10;-1:-1:-1;;;;;83772:20:0;;;;:77;;-1:-1:-1;83813:36:0;83830:4;11572:10;75465:164;:::i;83813:36::-;83772:134;;;-1:-1:-1;11572:10:0;83870:20;83882:7;83870:11;:20::i;:::-;-1:-1:-1;;;;;83870:36:0;;83772:134;83746:161;;83929:17;83924:66;;83955:35;;-1:-1:-1;;;83955:35:0;;;;;;;;;;;83924:66;83731:271;83712:290;84130:35;84147:1;84151:7;84160:4;84130:8;:35::i;:::-;-1:-1:-1;;;;;84495:18:0;;;84461:31;84495:18;;;:12;:18;;;;;;;;84528:24;;-1:-1:-1;;;;;;;;;;84528:24:0;;;;;;;;;-1:-1:-1;;84528:24:0;;;;84567:29;;;;;84551:1;84567:29;;;;;;;;-1:-1:-1;;84567:29:0;;;;;;;;;;84729:20;;;:11;:20;;;;;;84764;;-1:-1:-1;;;;84832:15:0;84799:49;;;-1:-1:-1;;;84799:49:0;-1:-1:-1;;;;;;84799:49:0;;;;;;;;;;84863:22;-1:-1:-1;;;84863:22:0;;;85155:11;;;85215:24;;;;;85258:13;;84495:18;;85215:24;;85258:13;85254:384;;85468:13;;85453:11;:28;85449:174;;85506:20;;85575:28;;;;-1:-1:-1;;;;;85549:54:0;-1:-1:-1;;;85549:54:0;-1:-1:-1;;;;;;85549:54:0;;;-1:-1:-1;;;;;85506:20:0;;85549:54;;;;85449:174;-1:-1:-1;;85666:35:0;;85693:7;;-1:-1:-1;85689:1:0;;-1:-1:-1;;;;;;85666:35:0;;;;;85689:1;;85666:35;-1:-1:-1;;85889:12:0;:14;;;;;;-1:-1:-1;;83514:2408:0:o;71951:1111::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;72062:7:0;;102372:1;72111:23;72107:888;;72147:13;;72140:4;:20;72136:859;;;72181:31;72215:17;;;:11;:17;;;;;;;;;72181:51;;;;;;;;;-1:-1:-1;;;;;72181:51:0;;;;-1:-1:-1;;;72181:51:0;;-1:-1:-1;;;;;72181:51:0;;;;;;;;-1:-1:-1;;;72181:51:0;;;;;;;;;;;;;;72251:729;;72301:14;;-1:-1:-1;;;;;72301:28:0;;72297:101;;72365:9;71951:1111;-1:-1:-1;;;71951:1111:0:o;72297:101::-;-1:-1:-1;;;72740:6:0;72785:17;;;;:11;:17;;;;;;;;;72773:29;;;;;;;;;-1:-1:-1;;;;;72773:29:0;;;;;-1:-1:-1;;;72773:29:0;;-1:-1:-1;;;;;72773:29:0;;;;;;;;-1:-1:-1;;;72773:29:0;;;;;;;;;;;;;72833:28;72829:109;;72901:9;71951:1111;-1:-1:-1;;;71951:1111:0:o;72829:109::-;72700:261;;;72162:833;72136:859;73023:31;;-1:-1:-1;;;73023:31:0;;;;;;;;;;;101289:482;10354:13;;;;;;;10346:69;;;;-1:-1:-1;;;10346:69:0;;;;;;;:::i;:::-;101458:30:::1;101473:5;101480:7;101458:14;:30::i;:::-;101495:24;:22;:24::i;:::-;101526:25;:23;:25::i;:::-;101558:16;:14;:16::i;:::-;101581:9;:22:::0;;;101610:8:::1;:16:::0;;-1:-1:-1;;101610:16:0::1;::::0;;101162:42:::1;101621:5;101635:16:::0;:7:::1;:16;::::0;;:30;;;101691:18:::1;101654:11:::0;101691:4:::1;:18;:::i;:::-;101672:7;:16;101680:7;13129:6:::0;;-1:-1:-1;;;;;13129:6:0;;13056:87;101680:7:::1;-1:-1:-1::0;;;;;101672:16:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;101672:16:0;;;:37;;;;101716:7:::1;:21:::0;;::::1;::::0;::::1;::::0;;;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;101716:21:0::1;101162:42;101716:21;::::0;;101757:7:::1;13129:6:::0;;-1:-1:-1;;;;;13129:6:0;;13056:87;101757:7:::1;101744:21:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;101744:21:0;;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;101744:21:0::1;-1:-1:-1::0;;;;;101744:21:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;;101289:482:0:o;14326:191::-;14419:6;;;-1:-1:-1;;;;;14436:17:0;;;-1:-1:-1;;;;;;14436:17:0;;;;;;;14469:40;;14419:6;;;14436:17;14419:6;;14469:40;;14400:16;;14469:40;14389:128;14326:191;:::o;86728:689::-;86912:83;;-1:-1:-1;;;86912:83:0;;86891:4;;-1:-1:-1;;;;;86912:47:0;;;;;:83;;11572:10;;86974:4;;86980:7;;86989:5;;86912:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;86912:83:0;;;;;;;;-1:-1:-1;;86912:83:0;;;;;;;;;;;;:::i;:::-;;;86908:502;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;87168:13:0;;87164:235;;87214:40;;-1:-1:-1;;;87214:40:0;;;;;;;;;;;87164:235;87357:6;87351:13;87342:6;87338:2;87334:15;87327:38;86908:502;-1:-1:-1;;;;;;87042:66:0;-1:-1:-1;;;87042:66:0;;-1:-1:-1;86728:689:0;;;;;;:::o;15086:106::-;15144:7;15175:1;15171;:5;:13;;15183:1;15171:13;;;-1:-1:-1;15179:1:0;;15164:20;-1:-1:-1;15086:106:0:o;16283:723::-;16339:13;16560:10;16556:53;;-1:-1:-1;;16587:10:0;;;;;;;;;;;;-1:-1:-1;;;16587:10:0;;;;;16283:723::o;16556:53::-;16634:5;16619:12;16675:78;16682:9;;16675:78;;16708:8;;;;:::i;:::-;;-1:-1:-1;16731:10:0;;-1:-1:-1;16739:2:0;16731:10;;:::i;:::-;;;16675:78;;;16763:19;16795:6;-1:-1:-1;;;;;16785:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16785:17:0;;16763:39;;16813:154;16820:10;;16813:154;;16847:11;16857:1;16847:11;;:::i;:::-;;-1:-1:-1;16916:10:0;16924:2;16916:5;:10;:::i;:::-;16903:24;;:2;:24;:::i;:::-;16890:39;;16873:6;16880;16873:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;16873:56:0;;;;;;;;-1:-1:-1;16944:11:0;16953:2;16944:11;;:::i;:::-;;;16813:154;;19508:701;19591:7;19634:4;19591:7;19649:523;19673:5;:12;19669:1;:16;19649:523;;;19707:20;19730:5;19736:1;19730:8;;;;;;;;:::i;:::-;;;;;;;19707:31;;19773:12;19757;:28;19753:408;;19910:44;;;;;;13354:19:1;;;13389:12;;;13382:28;;;13426:12;;19910:44:0;;;;;;;;;;;;19900:55;;;;;;19885:70;;19753:408;;;20100:44;;;;;;13354:19:1;;;13389:12;;;13382:28;;;13426:12;;20100:44:0;;;;;;;;;;;;20090:55;;;;;;20075:70;;19753:408;-1:-1:-1;19687:3:0;;;;:::i;:::-;;;;19649:523;;77553:1749;77699:13;;-1:-1:-1;;;;;77727:16:0;;77723:48;;77752:19;;-1:-1:-1;;;77752:19:0;;;;;;;;;;;77723:48;77786:13;77782:44;;77808:18;;-1:-1:-1;;;77808:18:0;;;;;;;;;;;77782:44;-1:-1:-1;;;;;78177:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;78236:49:0;;-1:-1:-1;;;;;78177:44:0;;;;;;;78236:49;;;-1:-1:-1;;;;;78177:44:0;;;;;;78236:49;;;;;;;;;;;;;;;;78302:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;78352:66:0;;;-1:-1:-1;;;78402:15:0;78352:66;;;;;;;;;;;;;78302:25;;78499:23;;;;1316:20;1364:8;78539:631;;78579:313;78610:38;;78635:12;;-1:-1:-1;;;;;78610:38:0;;;78627:1;;78610:38;;78627:1;;78610:38;78676:69;78715:1;78719:2;78723:14;;;;;;78739:5;78676:30;:69::i;:::-;78671:174;;78781:40;;-1:-1:-1;;;78781:40:0;;;;;;;;;;;78671:174;78887:3;78872:12;:18;78579:313;;78973:12;78956:13;;:29;78952:43;;78987:8;;;78952:43;78539:631;;;79036:119;79067:40;;79092:14;;;;;-1:-1:-1;;;;;79067:40:0;;;79084:1;;79067:40;;79084:1;;79067:40;79150:3;79135:12;:18;79036:119;;78539:631;-1:-1:-1;79184:13:0;:28;79234:60;79263:1;79267:2;79271:12;79285:8;79234:60;:::i;68699:153::-;10354:13;;;;;;;10346:69;;;;-1:-1:-1;;;10346:69:0;;;;;;;:::i;:::-;68804:40:::1;68829:5;68836:7;68804:24;:40::i;90226:68::-:0;10354:13;;;;;;;10346:69;;;;-1:-1:-1;;;10346:69:0;;;;;;;:::i;12720:134::-;10354:13;;;;;;;10346:69;;;;-1:-1:-1;;;10346:69:0;;;;;;;:::i;:::-;12783:26:::1;:24;:26::i;:::-;12820;:24;:26::i;68860:206::-:0;10354:13;;;;;;;10346:69;;;;-1:-1:-1;;;10346:69:0;;;;;;;:::i;:::-;68975:13;;::::1;::::0;:5:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;68999:17:0;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;102372:1:0;69027:13:::1;:31:::0;-1:-1:-1;;68860:206:0:o;12862:113::-;10354:13;;;;;;;10346:69;;;;-1:-1:-1;;;10346:69:0;;;;;;;:::i;:::-;12935:32:::1;11572:10:::0;12935:18:::1;:32::i;-1:-1:-1:-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:406:1;78:5;-1:-1:-1;;;;;104:6:1;101:30;98:56;;;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:45;;;309:1;306;299:12;268:45;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;14:406;;;;;:::o;425:196::-;493:20;;-1:-1:-1;;;;;542:54:1;;532:65;;522:93;;611:1;608;601:12;522:93;425:196;;;:::o;626:367::-;689:8;699:6;753:3;746:4;738:6;734:17;730:27;720:55;;771:1;768;761:12;720:55;-1:-1:-1;794:20:1;;-1:-1:-1;;;;;826:30:1;;823:50;;;869:1;866;859:12;823:50;906:4;898:6;894:17;882:29;;966:3;959:4;949:6;946:1;942:14;934:6;930:27;926:38;923:47;920:67;;;983:1;980;973:12;998:673;1052:5;1105:3;1098:4;1090:6;1086:17;1082:27;1072:55;;1123:1;1120;1113:12;1072:55;1159:6;1146:20;1185:4;1209:60;1225:43;1265:2;1225:43;:::i;:::-;1209:60;:::i;:::-;1291:3;1315:2;1310:3;1303:15;1343:2;1338:3;1334:12;1327:19;;1378:2;1370:6;1366:15;1430:3;1425:2;1419;1416:1;1412:10;1404:6;1400:23;1396:32;1393:41;1390:61;;;1447:1;1444;1437:12;1390:61;1469:1;1479:163;1493:2;1490:1;1487:9;1479:163;;;1550:17;;1538:30;;1588:12;;;;1620;;;;1511:1;1504:9;1479:163;;;-1:-1:-1;1660:5:1;;998:673;-1:-1:-1;;;;;;;998:673:1:o;1676:160::-;1741:20;;1797:13;;1790:21;1780:32;;1770:60;;1826:1;1823;1816:12;1841:221;1884:5;1937:3;1930:4;1922:6;1918:17;1914:27;1904:55;;1955:1;1952;1945:12;1904:55;1977:79;2052:3;2043:6;2030:20;2023:4;2015:6;2011:17;1977:79;:::i;2067:163::-;2134:20;;2194:10;2183:22;;2173:33;;2163:61;;2220:1;2217;2210:12;2235:186;2294:6;2347:2;2335:9;2326:7;2322:23;2318:32;2315:52;;;2363:1;2360;2353:12;2315:52;2386:29;2405:9;2386:29;:::i;2426:260::-;2494:6;2502;2555:2;2543:9;2534:7;2530:23;2526:32;2523:52;;;2571:1;2568;2561:12;2523:52;2594:29;2613:9;2594:29;:::i;:::-;2584:39;;2642:38;2676:2;2665:9;2661:18;2642:38;:::i;:::-;2632:48;;2426:260;;;;;:::o;2691:328::-;2768:6;2776;2784;2837:2;2825:9;2816:7;2812:23;2808:32;2805:52;;;2853:1;2850;2843:12;2805:52;2876:29;2895:9;2876:29;:::i;:::-;2866:39;;2924:38;2958:2;2947:9;2943:18;2924:38;:::i;:::-;2914:48;;3009:2;2998:9;2994:18;2981:32;2971:42;;2691:328;;;;;:::o;3024:666::-;3119:6;3127;3135;3143;3196:3;3184:9;3175:7;3171:23;3167:33;3164:53;;;3213:1;3210;3203:12;3164:53;3236:29;3255:9;3236:29;:::i;:::-;3226:39;;3284:38;3318:2;3307:9;3303:18;3284:38;:::i;:::-;3274:48;;3369:2;3358:9;3354:18;3341:32;3331:42;;3424:2;3413:9;3409:18;3396:32;-1:-1:-1;;;;;3443:6:1;3440:30;3437:50;;;3483:1;3480;3473:12;3437:50;3506:22;;3559:4;3551:13;;3547:27;-1:-1:-1;3537:55:1;;3588:1;3585;3578:12;3537:55;3611:73;3676:7;3671:2;3658:16;3653:2;3649;3645:11;3611:73;:::i;:::-;3601:83;;;3024:666;;;;;;;:::o;3695:254::-;3760:6;3768;3821:2;3809:9;3800:7;3796:23;3792:32;3789:52;;;3837:1;3834;3827:12;3789:52;3860:29;3879:9;3860:29;:::i;:::-;3850:39;;3908:35;3939:2;3928:9;3924:18;3908:35;:::i;3954:254::-;4022:6;4030;4083:2;4071:9;4062:7;4058:23;4054:32;4051:52;;;4099:1;4096;4089:12;4051:52;4122:29;4141:9;4122:29;:::i;:::-;4112:39;4198:2;4183:18;;;;4170:32;;-1:-1:-1;;;3954:254:1:o;4213:322::-;4290:6;4298;4306;4359:2;4347:9;4338:7;4334:23;4330:32;4327:52;;;4375:1;4372;4365:12;4327:52;4398:29;4417:9;4398:29;:::i;:::-;4388:39;4474:2;4459:18;;4446:32;;-1:-1:-1;4525:2:1;4510:18;;;4497:32;;4213:322;-1:-1:-1;;;4213:322:1:o;4540:1157::-;4658:6;4666;4719:2;4707:9;4698:7;4694:23;4690:32;4687:52;;;4735:1;4732;4725:12;4687:52;4775:9;4762:23;-1:-1:-1;;;;;4845:2:1;4837:6;4834:14;4831:34;;;4861:1;4858;4851:12;4831:34;4899:6;4888:9;4884:22;4874:32;;4944:7;4937:4;4933:2;4929:13;4925:27;4915:55;;4966:1;4963;4956:12;4915:55;5002:2;4989:16;5024:4;5048:60;5064:43;5104:2;5064:43;:::i;5048:60::-;5130:3;5154:2;5149:3;5142:15;5182:2;5177:3;5173:12;5166:19;;5213:2;5209;5205:11;5261:7;5256:2;5250;5247:1;5243:10;5239:2;5235:19;5231:28;5228:41;5225:61;;;5282:1;5279;5272:12;5225:61;5304:1;5295:10;;5314:169;5328:2;5325:1;5322:9;5314:169;;;5385:23;5404:3;5385:23;:::i;:::-;5373:36;;5346:1;5339:9;;;;;5429:12;;;;5461;;5314:169;;;-1:-1:-1;5502:5:1;-1:-1:-1;;5545:18:1;;5532:32;;-1:-1:-1;;5576:16:1;;;5573:36;;;5605:1;5602;5595:12;5573:36;;5628:63;5683:7;5672:8;5661:9;5657:24;5628:63;:::i;:::-;5618:73;;;4540:1157;;;;;:::o;5702:348::-;5786:6;5839:2;5827:9;5818:7;5814:23;5810:32;5807:52;;;5855:1;5852;5845:12;5807:52;5895:9;5882:23;-1:-1:-1;;;;;5920:6:1;5917:30;5914:50;;;5960:1;5957;5950:12;5914:50;5983:61;6036:7;6027:6;6016:9;6012:22;5983:61;:::i;6055:248::-;6120:6;6128;6181:2;6169:9;6160:7;6156:23;6152:32;6149:52;;;6197:1;6194;6187:12;6149:52;6220:26;6236:9;6220:26;:::i;6308:390::-;6383:6;6391;6444:2;6432:9;6423:7;6419:23;6415:32;6412:52;;;6460:1;6457;6450:12;6412:52;6483:26;6499:9;6483:26;:::i;:::-;6473:36;;6560:2;6549:9;6545:18;6532:32;-1:-1:-1;;;;;6579:6:1;6576:30;6573:50;;;6619:1;6616;6609:12;6573:50;6642;6684:7;6675:6;6664:9;6660:22;6642:50;:::i;6956:393::-;7037:6;7045;7053;7061;7114:3;7102:9;7093:7;7089:23;7085:33;7082:53;;;7131:1;7128;7121:12;7082:53;7154:26;7170:9;7154:26;:::i;:::-;7144:36;;7227:2;7216:9;7212:18;7199:32;7189:42;;7250:37;7283:2;7272:9;7268:18;7250:37;:::i;:::-;7240:47;;7306:37;7339:2;7328:9;7324:18;7306:37;:::i;:::-;7296:47;;6956:393;;;;;;;:::o;7354:245::-;7412:6;7465:2;7453:9;7444:7;7440:23;7436:32;7433:52;;;7481:1;7478;7471:12;7433:52;7520:9;7507:23;7539:30;7563:5;7539:30;:::i;7604:249::-;7673:6;7726:2;7714:9;7705:7;7701:23;7697:32;7694:52;;;7742:1;7739;7732:12;7694:52;7774:9;7768:16;7793:30;7817:5;7793:30;:::i;7858:322::-;7927:6;7980:2;7968:9;7959:7;7955:23;7951:32;7948:52;;;7996:1;7993;7986:12;7948:52;8036:9;8023:23;-1:-1:-1;;;;;8061:6:1;8058:30;8055:50;;;8101:1;8098;8091:12;8055:50;8124;8166:7;8157:6;8146:9;8142:22;8124:50;:::i;8185:680::-;8291:6;8299;8307;8315;8368:3;8356:9;8347:7;8343:23;8339:33;8336:53;;;8385:1;8382;8375:12;8336:53;8425:9;8412:23;-1:-1:-1;;;;;8495:2:1;8487:6;8484:14;8481:34;;;8511:1;8508;8501:12;8481:34;8534:50;8576:7;8567:6;8556:9;8552:22;8534:50;:::i;:::-;8524:60;;8637:2;8626:9;8622:18;8609:32;8593:48;;8666:2;8656:8;8653:16;8650:36;;;8682:1;8679;8672:12;8650:36;;8705:52;8749:7;8738:8;8727:9;8723:24;8705:52;:::i;:::-;8185:680;;8695:62;;-1:-1:-1;;;;8804:2:1;8789:18;;8776:32;;8855:2;8840:18;8827:32;;8185:680;-1:-1:-1;8185:680:1:o;8870:180::-;8929:6;8982:2;8970:9;8961:7;8957:23;8953:32;8950:52;;;8998:1;8995;8988:12;8950:52;-1:-1:-1;9021:23:1;;8870:180;-1:-1:-1;8870:180:1:o;9055:184::-;9125:6;9178:2;9166:9;9157:7;9153:23;9149:32;9146:52;;;9194:1;9191;9184:12;9146:52;-1:-1:-1;9217:16:1;;9055:184;-1:-1:-1;9055:184:1:o;9244:254::-;9312:6;9320;9373:2;9361:9;9352:7;9348:23;9344:32;9341:52;;;9389:1;9386;9379:12;9341:52;9425:9;9412:23;9402:33;;9454:38;9488:2;9477:9;9473:18;9454:38;:::i;9503:248::-;9571:6;9579;9632:2;9620:9;9611:7;9607:23;9603:32;9600:52;;;9648:1;9645;9638:12;9600:52;-1:-1:-1;;9671:23:1;;;9741:2;9726:18;;;9713:32;;-1:-1:-1;9503:248:1:o;9756:184::-;9814:6;9867:2;9855:9;9846:7;9842:23;9838:32;9835:52;;;9883:1;9880;9873:12;9835:52;9906:28;9924:9;9906:28;:::i;9945:258::-;10012:6;10020;10073:2;10061:9;10052:7;10048:23;10044:32;10041:52;;;10089:1;10086;10079:12;10041:52;10112:28;10130:9;10112:28;:::i;10208:332::-;10284:6;10292;10300;10353:2;10341:9;10332:7;10328:23;10324:32;10321:52;;;10369:1;10366;10359:12;10321:52;10392:28;10410:9;10392:28;:::i;:::-;10382:38;;10439;10473:2;10462:9;10458:18;10439:38;:::i;:::-;10429:48;;10496:38;10530:2;10519:9;10515:18;10496:38;:::i;:::-;10486:48;;10208:332;;;;;:::o;10545:509::-;10639:6;10647;10655;10708:2;10696:9;10687:7;10683:23;10679:32;10676:52;;;10724:1;10721;10714:12;10676:52;10747:28;10765:9;10747:28;:::i;:::-;10737:38;;10826:2;10815:9;10811:18;10798:32;-1:-1:-1;;;;;10845:6:1;10842:30;10839:50;;;10885:1;10882;10875:12;10839:50;10924:70;10986:7;10977:6;10966:9;10962:22;10924:70;:::i;:::-;10545:509;;11013:8;;-1:-1:-1;10898:96:1;;-1:-1:-1;;;;10545:509:1:o;11059:583::-;11162:6;11170;11178;11186;11239:2;11227:9;11218:7;11214:23;11210:32;11207:52;;;11255:1;11252;11245:12;11207:52;11278:28;11296:9;11278:28;:::i;:::-;11268:38;;11357:2;11346:9;11342:18;11329:32;-1:-1:-1;;;;;11376:6:1;11373:30;11370:50;;;11416:1;11413;11406:12;11370:50;11455:70;11517:7;11508:6;11497:9;11493:22;11455:70;:::i;:::-;11544:8;;-1:-1:-1;11429:96:1;-1:-1:-1;11598:38:1;;-1:-1:-1;11632:2:1;11617:18;;11598:38;:::i;11647:435::-;11700:3;11738:5;11732:12;11765:6;11760:3;11753:19;11791:4;11820:2;11815:3;11811:12;11804:19;;11857:2;11850:5;11846:14;11878:1;11888:169;11902:6;11899:1;11896:13;11888:169;;;11963:13;;11951:26;;11997:12;;;;12032:15;;;;11924:1;11917:9;11888:169;;;-1:-1:-1;12073:3:1;;11647:435;-1:-1:-1;;;;;11647:435:1:o;12087:257::-;12128:3;12166:5;12160:12;12193:6;12188:3;12181:19;12209:63;12265:6;12258:4;12253:3;12249:14;12242:4;12235:5;12231:16;12209:63;:::i;:::-;12326:2;12305:15;-1:-1:-1;;12301:29:1;12292:39;;;;12333:4;12288:50;;12087:257;-1:-1:-1;;12087:257:1:o;12349:185::-;12391:3;12429:5;12423:12;12444:52;12489:6;12484:3;12477:4;12470:5;12466:16;12444:52;:::i;:::-;12512:16;;;;;12349:185;-1:-1:-1;;12349:185:1:o;13449:1301::-;13726:3;13755:1;13788:6;13782:13;13818:3;13840:1;13868:9;13864:2;13860:18;13850:28;;13928:2;13917:9;13913:18;13950;13940:61;;13994:4;13986:6;13982:17;13972:27;;13940:61;14020:2;14068;14060:6;14057:14;14037:18;14034:38;14031:165;;;-1:-1:-1;;;14095:33:1;;14151:4;14148:1;14141:15;14181:4;14102:3;14169:17;14031:165;14212:18;14239:104;;;;14357:1;14352:320;;;;14205:467;;14239:104;-1:-1:-1;;14272:24:1;;14260:37;;14317:16;;;;-1:-1:-1;14239:104:1;;14352:320;28436:1;28429:14;;;28473:4;28460:18;;14447:1;14461:165;14475:6;14472:1;14469:13;14461:165;;;14553:14;;14540:11;;;14533:35;14596:16;;;;14490:10;;14461:165;;;14465:3;;14655:6;14650:3;14646:16;14639:23;;14205:467;;;;;;;14688:56;14713:30;14739:3;14731:6;14713:30;:::i;:::-;-1:-1:-1;;;12599:20:1;;12644:1;12635:11;;12539:113;14688:56;14681:63;13449:1301;-1:-1:-1;;;;;13449:1301:1:o;15196:511::-;15390:4;-1:-1:-1;;;;;15500:2:1;15492:6;15488:15;15477:9;15470:34;15552:2;15544:6;15540:15;15535:2;15524:9;15520:18;15513:43;;15592:6;15587:2;15576:9;15572:18;15565:34;15635:3;15630:2;15619:9;15615:18;15608:31;15656:45;15696:3;15685:9;15681:19;15673:6;15656:45;:::i;:::-;15648:53;15196:511;-1:-1:-1;;;;;;15196:511:1:o;16014:855::-;16282:2;16294:21;;;16364:13;;16267:18;;;16386:22;;;16234:4;;16461;;16439:2;16424:18;;;16488:15;;;16234:4;16531:218;16545:6;16542:1;16539:13;16531:218;;;16610:13;;-1:-1:-1;;;;;16606:62:1;16594:75;;16689:12;;;;16724:15;;;;16567:1;16560:9;16531:218;;;16535:3;;;16794:9;16789:3;16785:19;16780:2;16769:9;16765:18;16758:47;16822:41;16859:3;16851:6;16822:41;:::i;16874:724::-;17109:2;17161:21;;;17231:13;;17134:18;;;17253:22;;;17080:4;;17109:2;17332:15;;;;17306:2;17291:18;;;17080:4;17375:197;17389:6;17386:1;17383:13;17375:197;;;17438:52;17486:3;17477:6;17471:13;12741:12;;-1:-1:-1;;;;;12737:61:1;12725:74;;12852:4;12841:16;;;12835:23;-1:-1:-1;;;;;12831:48:1;12815:14;;;12808:72;12943:4;12932:16;;;12926:23;12919:31;12912:39;12896:14;;12889:63;12657:301;17438:52;17547:15;;;;17519:4;17510:14;;;;;17411:1;17404:9;17375:197;;17603:261;17782:2;17771:9;17764:21;17745:4;17802:56;17854:2;17843:9;17839:18;17831:6;17802:56;:::i;18061:219::-;18210:2;18199:9;18192:21;18173:4;18230:44;18270:2;18259:9;18255:18;18247:6;18230:44;:::i;22325:342::-;22527:2;22509:21;;;22566:2;22546:18;;;22539:30;-1:-1:-1;;;22600:2:1;22585:18;;22578:48;22658:2;22643:18;;22325:342::o;23371:356::-;23573:2;23555:21;;;23592:18;;;23585:30;23651:34;23646:2;23631:18;;23624:62;23718:2;23703:18;;23371:356::o;25104:407::-;25306:2;25288:21;;;25345:2;25325:18;;;25318:30;25384:34;25379:2;25364:18;;25357:62;-1:-1:-1;;;25450:2:1;25435:18;;25428:41;25501:3;25486:19;;25104:407::o;27244:267::-;12741:12;;-1:-1:-1;;;;;12737:61:1;12725:74;;12852:4;12841:16;;;12835:23;-1:-1:-1;;;;;12831:48:1;12815:14;;;12808:72;12943:4;12932:16;;;12926:23;12919:31;12912:39;12896:14;;;12889:63;27442:2;27427:18;;27454:51;12657:301;27895:275;27966:2;27960:9;28031:2;28012:13;;-1:-1:-1;;28008:27:1;27996:40;;-1:-1:-1;;;;;28051:34:1;;28087:22;;;28048:62;28045:88;;;28113:18;;:::i;:::-;28149:2;28142:22;27895:275;;-1:-1:-1;27895:275:1:o;28175:183::-;28235:4;-1:-1:-1;;;;;28260:6:1;28257:30;28254:56;;;28290:18;;:::i;:::-;-1:-1:-1;28335:1:1;28331:14;28347:4;28327:25;;28175:183::o;28489:128::-;28529:3;28560:1;28556:6;28553:1;28550:13;28547:39;;;28566:18;;:::i;:::-;-1:-1:-1;28602:9:1;;28489:128::o;28622:120::-;28662:1;28688;28678:35;;28693:18;;:::i;:::-;-1:-1:-1;28727:9:1;;28622:120::o;28747:168::-;28787:7;28853:1;28849;28845:6;28841:14;28838:1;28835:21;28830:1;28823:9;28816:17;28812:45;28809:71;;;28860:18;;:::i;:::-;-1:-1:-1;28900:9:1;;28747:168::o;28920:125::-;28960:4;28988:1;28985;28982:8;28979:34;;;28993:18;;:::i;:::-;-1:-1:-1;29030:9:1;;28920:125::o;29050:258::-;29122:1;29132:113;29146:6;29143:1;29140:13;29132:113;;;29222:11;;;29216:18;29203:11;;;29196:39;29168:2;29161:10;29132:113;;;29263:6;29260:1;29257:13;29254:48;;;-1:-1:-1;;29298:1:1;29280:16;;29273:27;29050:258::o;29313:380::-;29392:1;29388:12;;;;29435;;;29456:61;;29510:4;29502:6;29498:17;29488:27;;29456:61;29563:2;29555:6;29552:14;29532:18;29529:38;29526:161;;;29609:10;29604:3;29600:20;29597:1;29590:31;29644:4;29641:1;29634:15;29672:4;29669:1;29662:15;29526:161;;29313:380;;;:::o;29698:135::-;29737:3;-1:-1:-1;;29758:17:1;;29755:43;;;29778:18;;:::i;:::-;-1:-1:-1;29825:1:1;29814:13;;29698:135::o;29838:112::-;29870:1;29896;29886:35;;29901:18;;:::i;:::-;-1:-1:-1;29935:9:1;;29838:112::o;29955:127::-;30016:10;30011:3;30007:20;30004:1;29997:31;30047:4;30044:1;30037:15;30071:4;30068:1;30061:15;30087:127;30148:10;30143:3;30139:20;30136:1;30129:31;30179:4;30176:1;30169:15;30203:4;30200:1;30193:15;30219:127;30280:10;30275:3;30271:20;30268:1;30261:31;30311:4;30308:1;30301:15;30335:4;30332:1;30325:15;30351:127;30412:10;30407:3;30403:20;30400:1;30393:31;30443:4;30440:1;30433:15;30467:4;30464:1;30457:15;30483:131;-1:-1:-1;;;;;;30557:32:1;;30547:43;;30537:71;;30604:1;30601;30594:12

Swarm Source

ipfs://74b7b1e768dc67b7a658123ede87c71f24a5bc4e244a3ab4d2ed9d75100a63bb
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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