Token DegenBrains

Gaming 

Overview CRC721

Total Supply:
10,000 DGNB

Holders:
234 addresses
Balance
1 DGNB
0x5345d5a36e163d1c277e2ec171974d455708664b
Loading
[ Download CSV Export  ] 
Loading
Loading

OVERVIEW

Degen Brain Finance (DBF) is the first gamified Learn2Earn web3 project on Cronos that incorporates NFT Avatars (DegenBrains), staking utility, our own CRC-20 Token, and a growing community of like-minded investors.


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

Contract Source Code Verified (Exact Match)

Contract Name:
DegenBrains

Compiler Version
v0.8.1+commit.df193b15

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIXED

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

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

// License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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


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

// License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (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`.
     *
     * 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;

    /**
     * @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 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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


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

// License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


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

// License-Identifier: MIT
// 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]

// License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

// License-Identifier: MIT
// 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]

// License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}


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

// License-Identifier: MIT
// 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]

// License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        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: invalid token ID");
        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) {
        _requireMinted(tokenId);

        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 overridden 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 token owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        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: caller is not token 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: caller is not token 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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {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 an {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 Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

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


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

// License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

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

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

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


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

// License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

// License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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


// File contracts/Brains.sol

// License-Identifier: GPL-3.0
///@consensys SWC-103
pragma solidity ^0.8.0;



contract DegenBrains is ERC721Enumerable, Ownable {
    //For nft staking.
    mapping(uint256 => address) public _ownedTokens;

    // Optional mapping for token URIs  
    mapping (uint256 => string) private _tokenURIs;
    string public baseURI;
    string public baseExtension     = ".json";
    string public metaDataFolder    = "";
    string public notRevealedUri    =  "";
    string public _name = "DegenBrains";
    string public _symbol = "DGNB";

    uint256 public cost             =   420 ether;    
    uint256 public maxSupply        =   10000;
    uint256 public remainTokenAmount=   10000;
    uint256 public maxMintAmount    =   10000;   
    uint256 public nftPerAddressLimit=  300;
    uint256 public onlyWhitelisted     = 1;
    uint256 public revealed            = 0;
    uint256 public paused              = 1;

    address[] public whitelistedAddresses;
    mapping(address => uint256) public addressMintedBalance;
    
    constructor(
        string memory _initBaseURI
    ) ERC721(_name, _symbol) {
        setBaseURI(_initBaseURI);
    }

    // internal
    // convenience function to return the baseURI
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    // public
    function mint(address _to, uint256 _mintAmount) public payable {
        uint256 supply = totalSupply();
        require(paused == 0, "Mint is paused");
        require(msg.sender != address(0x0), "Recipient should be present");
        require(_mintAmount > 0, "Need to mint at least 1 NFT");
        require(remainTokenAmount > 0, "Max NFT limit exceeded");

        if (msg.sender != owner()) {
            if (onlyWhitelisted == 1) {
                require(isWhitelisted(msg.sender), "User is not whitelisted");
                uint256 ownerMintedCount = addressMintedBalance[msg.sender];
                require(
                    ownerMintedCount + _mintAmount <= nftPerAddressLimit,
                    "Max NFT per address exceeded"
                );
            }
            //if owner change cost then frontend must be changed
            require(msg.value != 0, "Royalty value should be positive" );
            require(msg.value >= cost * _mintAmount, "Insufficient funds");
            require(_mintAmount <= maxMintAmount, "Max mint amount per session exceeded");
        }

        for (uint256 i = 1; i <= _mintAmount; i++) {
            _safeMint(_to, supply + i);
            addressMintedBalance[msg.sender]++;
            remainTokenAmount--;
        }
        if(remainTokenAmount % 1000 == 0){
            paused = 1;
        }
    }

    function isWhitelisted(address _user) public view returns (bool) {
        for (uint256 i = 0; i < whitelistedAddresses.length; i++) {
            if (whitelistedAddresses[i] == _user) {
                return true;
            }
        }
        return false;
    }

    // return all NFTs for a particular owner
    function walletOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }


    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        if(revealed == 0) return notRevealedUri;
    
        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI, baseExtension));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(base, Strings.toString(tokenId), baseExtension));
    }

    //to be seen how many collections are minted and remained in frontend 
    function getRemainCollections() public view returns (uint256) {
        return remainTokenAmount;
    }

    //to be seen how many nfts user minted and can mint
    function getRemainNFTforUser() public view returns (uint256) {
        uint256 amount;
        if (msg.sender != owner()) {
            amount = nftPerAddressLimit - addressMintedBalance[msg.sender];
        }else {
            amount = 200;
        }
        return amount;
    }       

    //only owner
    function reveal() public onlyOwner {
        revealed = 1;
    }

    function setNftPerAddressLimit(uint256 _limit) public onlyOwner {
        nftPerAddressLimit = _limit;
    }

    function setCost(uint256 _newCost) public onlyOwner {
        cost = _newCost;
    }

    function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner {
        maxMintAmount = _newmaxMintAmount;
    }

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

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

    function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
        notRevealedUri = _notRevealedURI;
    }

    function pause(bool _state) public onlyOwner {
        if(_state) paused = 1;
        else paused = 0;
    }

    function isPaused() public view returns (uint256) {
        return paused;
    }

    function setOnlyWhitelisted(uint256 _state) public onlyOwner {
        onlyWhitelisted = _state;
    }

    function whitelistUsers(address[] calldata _users) public onlyOwner {
        delete whitelistedAddresses;
        whitelistedAddresses = _users;
    }

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

        if (from == address(0)) {
        } else if (from != to) {
            delete _ownedTokens[tokenId] ;
        }

        if (to == address(0)) {
        } else if (to != from) {
            _ownedTokens[tokenId] = to;
        }
    }

    function getNFTUser (uint256 tokenId) public view returns (address) {
        if(_ownedTokens[tokenId] == address(0)) return owner();
        return _ownedTokens[tokenId];
    }

    function withdraw() public payable onlyOwner {
        // This will payout the owner the contract balance.
        // Do not remove this otherwise you will not be able to withdraw the funds.
        // =============================================================================
        (bool os, ) = payable(owner()).call{value: address(this).balance}("");
        require(os);
        // =============================================================================
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_ownedTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getNFTUser","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRemainCollections","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRemainNFTforUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metaDataFolder","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"remainTokenAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"whitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600e908051906020019062000051929190620004ec565b5060405180602001604052806000815250600f908051906020019062000079929190620004ec565b506040518060200160405280600081525060109080519060200190620000a1929190620004ec565b506040518060400160405280600b81526020017f446567656e427261696e7300000000000000000000000000000000000000000081525060119080519060200190620000ef929190620004ec565b506040518060400160405280600481526020017f44474e4200000000000000000000000000000000000000000000000000000000815250601290805190602001906200013d929190620004ec565b506816c4abbebea010000060135561271060145561271060155561271060165561012c601755600160185560006019556001601a553480156200017f57600080fd5b5060405162005bd038038062005bd08339818101604052810190620001a591906200060e565b60118054620001b49062000742565b80601f0160208091040260200160405190810160405280929190818152602001828054620001e29062000742565b8015620002335780601f10620002075761010080835404028352916020019162000233565b820191906000526020600020905b8154815290600101906020018083116200021557829003601f168201915b505050505060128054620002479062000742565b80601f0160208091040260200160405190810160405280929190818152602001828054620002759062000742565b8015620002c65780601f106200029a57610100808354040283529160200191620002c6565b820191906000526020600020905b815481529060010190602001808311620002a857829003601f168201915b50505050508160009080519060200190620002e3929190620004ec565b508060019080519060200190620002fc929190620004ec565b5050506200031f620003136200033760201b60201c565b6200033f60201b60201c565b62000330816200040560201b60201c565b5062000846565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620004156200043160201b60201c565b80600d90805190602001906200042d929190620004ec565b5050565b620004416200033760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000467620004c260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620004c0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004b7906200067a565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620004fa9062000742565b90600052602060002090601f0160209004810192826200051e57600085556200056a565b82601f106200053957805160ff19168380011785556200056a565b828001600101855582156200056a579182015b82811115620005695782518255916020019190600101906200054c565b5b5090506200057991906200057d565b5090565b5b80821115620005985760008160009055506001016200057e565b5090565b6000620005b3620005ad84620006c5565b6200069c565b905082815260208101848484011115620005cc57600080fd5b620005d98482856200070c565b509392505050565b600082601f830112620005f357600080fd5b8151620006058482602086016200059c565b91505092915050565b6000602082840312156200062157600080fd5b600082015167ffffffffffffffff8111156200063c57600080fd5b6200064a84828501620005e1565b91505092915050565b600062000662602083620006fb565b91506200066f826200081d565b602082019050919050565b60006020820190508181036000830152620006958162000653565b9050919050565b6000620006a8620006bb565b9050620006b6828262000778565b919050565b6000604051905090565b600067ffffffffffffffff821115620006e357620006e2620007dd565b5b620006ee826200080c565b9050602081019050919050565b600082825260208201905092915050565b60005b838110156200072c5780820151818401526020810190506200070f565b838111156200073c576000848401525b50505050565b600060028204905060018216806200075b57607f821691505b60208210811415620007725762000771620007ae565b5b50919050565b62000783826200080c565b810181811067ffffffffffffffff82111715620007a557620007a4620007dd565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b61537a80620008566000396000f3fe6080604052600436106103355760003560e01c8063743cc26a116101ab578063ba4e5c49116100f7578063d28d885211610095578063e985e9c51161006f578063e985e9c514610c1a578063edec5f2714610c57578063f2c4ce1e14610c80578063f2fde38b14610ca957610335565b8063d28d885214610b9b578063d5abeb0114610bc6578063da3ef23f14610bf157610335565b8063c6682862116100d1578063c668286214610adf578063c7873b8314610b0a578063c87b56dd14610b35578063d0eb26b014610b7257610335565b8063ba4e5c4914610a4e578063ba7d2c7614610a8b578063c5f9816b14610ab657610335565b80639c70b51211610164578063b09f12661161013e578063b09f126614610992578063b10b57e0146109bd578063b187bd26146109fa578063b88d4fde14610a2557610335565b80639c70b51214610927578063a22cb46514610952578063a475b5dd1461097b57610335565b8063743cc26a146108155780637f00c7a6146108405780638da5cb5b14610869578063914a8710146108945780639502743d146108d157806395d89b41146108fc57610335565b80633af32abf1161028557806351830227116102235780636352211e116101fd5780636352211e146107595780636c0360eb1461079657806370a08231146107c1578063715018a6146107fe57610335565b806351830227146106da57806355f804b3146107055780635c975abb1461072e57610335565b806342842e0e1161025f57806342842e0e1461060e578063438b63001461063757806344a0d68a146106745780634f6ccce71461069d57610335565b80633af32abf146105ab5780633ccfd60b146105e857806340c10f19146105f257610335565b8063095ea7b3116102f257806318cae269116102cc57806318cae269146104dd578063239c70ae1461051a57806323b872dd146105455780632f745c591461056e57610335565b8063095ea7b31461045e57806313faede61461048757806318160ddd146104b257610335565b806301ffc9a71461033a57806302329a291461037757806302fcb7af146103a057806306fdde03146103cb578063081812fc146103f6578063081c8c4414610433575b600080fd5b34801561034657600080fd5b50610361600480360381019061035c9190613df5565b610cd2565b60405161036e91906144e2565b60405180910390f35b34801561038357600080fd5b5061039e60048036038101906103999190613dcc565b610d4c565b005b3480156103ac57600080fd5b506103b5610d73565b6040516103c2919061483f565b60405180910390f35b3480156103d757600080fd5b506103e0610d7d565b6040516103ed91906144fd565b60405180910390f35b34801561040257600080fd5b5061041d60048036038101906104189190613e88565b610e0f565b60405161042a9190614459565b60405180910390f35b34801561043f57600080fd5b50610448610e55565b60405161045591906144fd565b60405180910390f35b34801561046a57600080fd5b5061048560048036038101906104809190613d4b565b610ee3565b005b34801561049357600080fd5b5061049c610ffb565b6040516104a9919061483f565b60405180910390f35b3480156104be57600080fd5b506104c7611001565b6040516104d4919061483f565b60405180910390f35b3480156104e957600080fd5b5061050460048036038101906104ff9190613be0565b61100e565b604051610511919061483f565b60405180910390f35b34801561052657600080fd5b5061052f611026565b60405161053c919061483f565b60405180910390f35b34801561055157600080fd5b5061056c60048036038101906105679190613c45565b61102c565b005b34801561057a57600080fd5b5061059560048036038101906105909190613d4b565b61108c565b6040516105a2919061483f565b60405180910390f35b3480156105b757600080fd5b506105d260048036038101906105cd9190613be0565b611131565b6040516105df91906144e2565b60405180910390f35b6105f0611206565b005b61060c60048036038101906106079190613d4b565b61128e565b005b34801561061a57600080fd5b5061063560048036038101906106309190613c45565b61169e565b005b34801561064357600080fd5b5061065e60048036038101906106599190613be0565b6116be565b60405161066b91906144c0565b60405180910390f35b34801561068057600080fd5b5061069b60048036038101906106969190613e88565b6117b8565b005b3480156106a957600080fd5b506106c460048036038101906106bf9190613e88565b6117ca565b6040516106d1919061483f565b60405180910390f35b3480156106e657600080fd5b506106ef611861565b6040516106fc919061483f565b60405180910390f35b34801561071157600080fd5b5061072c60048036038101906107279190613e47565b611867565b005b34801561073a57600080fd5b50610743611889565b604051610750919061483f565b60405180910390f35b34801561076557600080fd5b50610780600480360381019061077b9190613e88565b61188f565b60405161078d9190614459565b60405180910390f35b3480156107a257600080fd5b506107ab611941565b6040516107b891906144fd565b60405180910390f35b3480156107cd57600080fd5b506107e860048036038101906107e39190613be0565b6119cf565b6040516107f5919061483f565b60405180910390f35b34801561080a57600080fd5b50610813611a87565b005b34801561082157600080fd5b5061082a611a9b565b604051610837919061483f565b60405180910390f35b34801561084c57600080fd5b5061086760048036038101906108629190613e88565b611b38565b005b34801561087557600080fd5b5061087e611b4a565b60405161088b9190614459565b60405180910390f35b3480156108a057600080fd5b506108bb60048036038101906108b69190613e88565b611b74565b6040516108c89190614459565b60405180910390f35b3480156108dd57600080fd5b506108e6611c28565b6040516108f391906144fd565b60405180910390f35b34801561090857600080fd5b50610911611cb6565b60405161091e91906144fd565b60405180910390f35b34801561093357600080fd5b5061093c611d48565b604051610949919061483f565b60405180910390f35b34801561095e57600080fd5b5061097960048036038101906109749190613d0f565b611d4e565b005b34801561098757600080fd5b50610990611d64565b005b34801561099e57600080fd5b506109a7611d76565b6040516109b491906144fd565b60405180910390f35b3480156109c957600080fd5b506109e460048036038101906109df9190613e88565b611e04565b6040516109f19190614459565b60405180910390f35b348015610a0657600080fd5b50610a0f611e37565b604051610a1c919061483f565b60405180910390f35b348015610a3157600080fd5b50610a4c6004803603810190610a479190613c94565b611e41565b005b348015610a5a57600080fd5b50610a756004803603810190610a709190613e88565b611ea3565b604051610a829190614459565b60405180910390f35b348015610a9757600080fd5b50610aa0611ee2565b604051610aad919061483f565b60405180910390f35b348015610ac257600080fd5b50610add6004803603810190610ad89190613e88565b611ee8565b005b348015610aeb57600080fd5b50610af4611efa565b604051610b0191906144fd565b60405180910390f35b348015610b1657600080fd5b50610b1f611f88565b604051610b2c919061483f565b60405180910390f35b348015610b4157600080fd5b50610b5c6004803603810190610b579190613e88565b611f8e565b604051610b6991906144fd565b60405180910390f35b348015610b7e57600080fd5b50610b996004803603810190610b949190613e88565b6121a6565b005b348015610ba757600080fd5b50610bb06121b8565b604051610bbd91906144fd565b60405180910390f35b348015610bd257600080fd5b50610bdb612246565b604051610be8919061483f565b60405180910390f35b348015610bfd57600080fd5b50610c186004803603810190610c139190613e47565b61224c565b005b348015610c2657600080fd5b50610c416004803603810190610c3c9190613c09565b61226e565b604051610c4e91906144e2565b60405180910390f35b348015610c6357600080fd5b50610c7e6004803603810190610c799190613d87565b612302565b005b348015610c8c57600080fd5b50610ca76004803603810190610ca29190613e47565b61232e565b005b348015610cb557600080fd5b50610cd06004803603810190610ccb9190613be0565b612350565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d455750610d44826123d4565b5b9050919050565b610d546124b6565b8015610d67576001601a81905550610d70565b6000601a819055505b50565b6000601554905090565b606060008054610d8c90614b72565b80601f0160208091040260200160405190810160405280929190818152602001828054610db890614b72565b8015610e055780601f10610dda57610100808354040283529160200191610e05565b820191906000526020600020905b815481529060010190602001808311610de857829003601f168201915b5050505050905090565b6000610e1a82612534565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60108054610e6290614b72565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8e90614b72565b8015610edb5780601f10610eb057610100808354040283529160200191610edb565b820191906000526020600020905b815481529060010190602001808311610ebe57829003601f168201915b505050505081565b6000610eee8261188f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f569061477f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610f7e61257f565b73ffffffffffffffffffffffffffffffffffffffff161480610fad5750610fac81610fa761257f565b61226e565b5b610fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe3906146bf565b60405180910390fd5b610ff68383612587565b505050565b60135481565b6000600880549050905090565b601c6020528060005260406000206000915090505481565b60165481565b61103d61103761257f565b82612640565b61107c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611073906147bf565b60405180910390fd5b6110878383836126d5565b505050565b6000611097836119cf565b82106110d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cf9061451f565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600080600090505b601b805490508110156111fb578273ffffffffffffffffffffffffffffffffffffffff16601b8281548110611197577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156111e8576001915050611201565b80806111f390614bd5565b915050611139565b50600090505b919050565b61120e6124b6565b6000611218611b4a565b73ffffffffffffffffffffffffffffffffffffffff164760405161123b90614444565b60006040518083038185875af1925050503d8060008114611278576040519150601f19603f3d011682016040523d82523d6000602084013e61127d565b606091505b505090508061128b57600080fd5b50565b6000611298611001565b90506000601a54146112df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d69061481f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561134f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611346906147ff565b60405180910390fd5b60008211611392576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611389906147df565b60405180910390fd5b6000601554116113d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ce9061469f565b60405180910390fd5b6113df611b4a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115d457600160185414156114fa5761142533611131565b611464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145b9061465f565b60405180910390fd5b6000601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060175483826114b7919061497d565b11156114f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ef9061473f565b60405180910390fd5b505b600034141561153e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611535906145ff565b60405180910390fd5b8160135461154c9190614a04565b34101561158e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115859061463f565b60405180910390fd5b6016548211156115d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ca9061461f565b60405180910390fd5b5b6000600190505b828111611677576115f78482846115f2919061497d565b61293c565b601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061164790614bd5565b91905055506015600081548092919061165f90614b48565b9190505550808061166f90614bd5565b9150506115db565b5060006103e860155461168a9190614c1e565b1415611699576001601a819055505b505050565b6116b983838360405180602001604052806000815250611e41565b505050565b606060006116cb836119cf565b905060008167ffffffffffffffff81111561170f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561173d5781602001602082028036833780820191505090505b50905060005b828110156117ad57611755858261108c565b82828151811061178e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080806117a590614bd5565b915050611743565b508092505050919050565b6117c06124b6565b8060138190555050565b60006117d4611001565b8210611815576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180c9061479f565b60405180910390fd5b6008828154811061184f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b60195481565b61186f6124b6565b80600d90805190602001906118859291906138f9565b5050565b601a5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192f9061475f565b60405180910390fd5b80915050919050565b600d805461194e90614b72565b80601f016020809104026020016040519081016040528092919081815260200182805461197a90614b72565b80156119c75780601f1061199c576101008083540402835291602001916119c7565b820191906000526020600020905b8154815290600101906020018083116119aa57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a379061467f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611a8f6124b6565b611a99600061295a565b565b600080611aa6611b4a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b2c57601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601754611b259190614a5e565b9050611b31565b60c890505b8091505090565b611b406124b6565b8060168190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008073ffffffffffffffffffffffffffffffffffffffff16600b600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611bec57611be5611b4a565b9050611c23565b600b600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b919050565b600f8054611c3590614b72565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6190614b72565b8015611cae5780601f10611c8357610100808354040283529160200191611cae565b820191906000526020600020905b815481529060010190602001808311611c9157829003601f168201915b505050505081565b606060018054611cc590614b72565b80601f0160208091040260200160405190810160405280929190818152602001828054611cf190614b72565b8015611d3e5780601f10611d1357610100808354040283529160200191611d3e565b820191906000526020600020905b815481529060010190602001808311611d2157829003601f168201915b5050505050905090565b60185481565b611d60611d5961257f565b8383612a20565b5050565b611d6c6124b6565b6001601981905550565b60128054611d8390614b72565b80601f0160208091040260200160405190810160405280929190818152602001828054611daf90614b72565b8015611dfc5780601f10611dd157610100808354040283529160200191611dfc565b820191906000526020600020905b815481529060010190602001808311611ddf57829003601f168201915b505050505081565b600b6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601a54905090565b611e52611e4c61257f565b83612640565b611e91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e88906147bf565b60405180910390fd5b611e9d84848484612b8d565b50505050565b601b8181548110611eb357600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60175481565b611ef06124b6565b8060188190555050565b600e8054611f0790614b72565b80601f0160208091040260200160405190810160405280929190818152602001828054611f3390614b72565b8015611f805780601f10611f5557610100808354040283529160200191611f80565b820191906000526020600020905b815481529060010190602001808311611f6357829003601f168201915b505050505081565b60155481565b6060611f9982612be9565b611fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcf9061471f565b60405180910390fd5b6000600c60008481526020019081526020016000208054611ff890614b72565b80601f016020809104026020016040519081016040528092919081815260200182805461202490614b72565b80156120715780601f1061204657610100808354040283529160200191612071565b820191906000526020600020905b81548152906001019060200180831161205457829003601f168201915b505050505090506000612082612c55565b905060006019541415612123576010805461209c90614b72565b80601f01602080910402602001604051908101604052809291908181526020018280546120c890614b72565b80156121155780601f106120ea57610100808354040283529160200191612115565b820191906000526020600020905b8154815290600101906020018083116120f857829003601f168201915b5050505050925050506121a1565b6000815114156121375781925050506121a1565b60008251111561216f578082600e60405160200161215793929190614413565b604051602081830303815290604052925050506121a1565b8061217985612ce7565b600e60405160200161218d93929190614413565b604051602081830303815290604052925050505b919050565b6121ae6124b6565b8060178190555050565b601180546121c590614b72565b80601f01602080910402602001604051908101604052809291908181526020018280546121f190614b72565b801561223e5780601f106122135761010080835404028352916020019161223e565b820191906000526020600020905b81548152906001019060200180831161222157829003601f168201915b505050505081565b60145481565b6122546124b6565b80600e908051906020019061226a9291906138f9565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61230a6124b6565b601b6000612318919061397f565b8181601b91906123299291906139a0565b505050565b6123366124b6565b806010908051906020019061234c9291906138f9565b5050565b6123586124b6565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bf9061455f565b60405180910390fd5b6123d18161295a565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061249f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806124af57506124ae82612e94565b5b9050919050565b6124be61257f565b73ffffffffffffffffffffffffffffffffffffffff166124dc611b4a565b73ffffffffffffffffffffffffffffffffffffffff1614612532576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612529906146ff565b60405180910390fd5b565b61253d81612be9565b61257c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125739061475f565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166125fa8361188f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061264c8361188f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061268e575061268d818561226e565b5b806126cc57508373ffffffffffffffffffffffffffffffffffffffff166126b484610e0f565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166126f58261188f565b73ffffffffffffffffffffffffffffffffffffffff161461274b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127429061457f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b2906145bf565b60405180910390fd5b6127c6838383612efe565b6127d1600082612587565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128219190614a5e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612878919061497d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612937838383613074565b505050565b612956828260405180602001604052806000815250613079565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a86906145df565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612b8091906144e2565b60405180910390a3505050565b612b988484846126d5565b612ba4848484846130d4565b612be3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bda9061453f565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600d8054612c6490614b72565b80601f0160208091040260200160405190810160405280929190818152602001828054612c9090614b72565b8015612cdd5780601f10612cb257610100808354040283529160200191612cdd565b820191906000526020600020905b815481529060010190602001808311612cc057829003601f168201915b5050505050905090565b60606000821415612d2f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e8f565b600082905060005b60008214612d61578080612d4a90614bd5565b915050600a82612d5a91906149d3565b9150612d37565b60008167ffffffffffffffff811115612da3577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612dd55781602001600182028036833780820191505090505b5090505b60008514612e8857600182612dee9190614a5e565b9150600a85612dfd9190614c1e565b6030612e09919061497d565b60f81b818381518110612e45577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e8191906149d3565b9450612dd9565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612f0983838361326b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f4357612fae565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612fad57600b600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fe85761306f565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461306e5781600b600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b505050565b505050565b613083838361337f565b61309060008484846130d4565b6130cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130c69061453f565b60405180910390fd5b505050565b60006130f58473ffffffffffffffffffffffffffffffffffffffff16613559565b1561325e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261311e61257f565b8786866040518563ffffffff1660e01b81526004016131409493929190614474565b602060405180830381600087803b15801561315a57600080fd5b505af192505050801561318b57506040513d601f19601f820116820180604052508101906131889190613e1e565b60015b61320e573d80600081146131bb576040519150601f19603f3d011682016040523d82523d6000602084013e6131c0565b606091505b50600081511415613206576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131fd9061453f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613263565b600190505b949350505050565b61327683838361357c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132b9576132b481613581565b6132f8565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146132f7576132f683826135ca565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561333b5761333681613737565b61337a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461337957613378828261387a565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e6906146df565b60405180910390fd5b6133f881612be9565b15613438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161342f9061459f565b60405180910390fd5b61344460008383612efe565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613494919061497d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461355560008383613074565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016135d7846119cf565b6135e19190614a5e565b90506000600760008481526020019081526020016000205490508181146136c6576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061374b9190614a5e565b90506000600960008481526020019081526020016000205490506000600883815481106137a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106137e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061385e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613885836119cf565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461390590614b72565b90600052602060002090601f016020900481019282613927576000855561396e565b82601f1061394057805160ff191683800117855561396e565b8280016001018555821561396e579182015b8281111561396d578251825591602001919060010190613952565b5b50905061397b9190613a40565b5090565b508054600082559060005260206000209081019061399d9190613a40565b50565b828054828255906000526020600020908101928215613a2f579160200282015b82811115613a2e57823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906139c0565b5b509050613a3c9190613a40565b5090565b5b80821115613a59576000816000905550600101613a41565b5090565b6000613a70613a6b8461487f565b61485a565b905082815260208101848484011115613a8857600080fd5b613a93848285614b06565b509392505050565b6000613aae613aa9846148b0565b61485a565b905082815260208101848484011115613ac657600080fd5b613ad1848285614b06565b509392505050565b600081359050613ae8816152e8565b92915050565b60008083601f840112613b0057600080fd5b8235905067ffffffffffffffff811115613b1957600080fd5b602083019150836020820283011115613b3157600080fd5b9250929050565b600081359050613b47816152ff565b92915050565b600081359050613b5c81615316565b92915050565b600081519050613b7181615316565b92915050565b600082601f830112613b8857600080fd5b8135613b98848260208601613a5d565b91505092915050565b600082601f830112613bb257600080fd5b8135613bc2848260208601613a9b565b91505092915050565b600081359050613bda8161532d565b92915050565b600060208284031215613bf257600080fd5b6000613c0084828501613ad9565b91505092915050565b60008060408385031215613c1c57600080fd5b6000613c2a85828601613ad9565b9250506020613c3b85828601613ad9565b9150509250929050565b600080600060608486031215613c5a57600080fd5b6000613c6886828701613ad9565b9350506020613c7986828701613ad9565b9250506040613c8a86828701613bcb565b9150509250925092565b60008060008060808587031215613caa57600080fd5b6000613cb887828801613ad9565b9450506020613cc987828801613ad9565b9350506040613cda87828801613bcb565b925050606085013567ffffffffffffffff811115613cf757600080fd5b613d0387828801613b77565b91505092959194509250565b60008060408385031215613d2257600080fd5b6000613d3085828601613ad9565b9250506020613d4185828601613b38565b9150509250929050565b60008060408385031215613d5e57600080fd5b6000613d6c85828601613ad9565b9250506020613d7d85828601613bcb565b9150509250929050565b60008060208385031215613d9a57600080fd5b600083013567ffffffffffffffff811115613db457600080fd5b613dc085828601613aee565b92509250509250929050565b600060208284031215613dde57600080fd5b6000613dec84828501613b38565b91505092915050565b600060208284031215613e0757600080fd5b6000613e1584828501613b4d565b91505092915050565b600060208284031215613e3057600080fd5b6000613e3e84828501613b62565b91505092915050565b600060208284031215613e5957600080fd5b600082013567ffffffffffffffff811115613e7357600080fd5b613e7f84828501613ba1565b91505092915050565b600060208284031215613e9a57600080fd5b6000613ea884828501613bcb565b91505092915050565b6000613ebd83836143f5565b60208301905092915050565b613ed281614a92565b82525050565b6000613ee382614906565b613eed8185614934565b9350613ef8836148e1565b8060005b83811015613f29578151613f108882613eb1565b9750613f1b83614927565b925050600181019050613efc565b5085935050505092915050565b613f3f81614aa4565b82525050565b6000613f5082614911565b613f5a8185614945565b9350613f6a818560208601614b15565b613f7381614d0b565b840191505092915050565b6000613f898261491c565b613f938185614961565b9350613fa3818560208601614b15565b613fac81614d0b565b840191505092915050565b6000613fc28261491c565b613fcc8185614972565b9350613fdc818560208601614b15565b80840191505092915050565b60008154613ff581614b72565b613fff8186614972565b9450600182166000811461401a576001811461402b5761405e565b60ff1983168652818601935061405e565b614034856148f1565b60005b8381101561405657815481890152600182019150602081019050614037565b838801955050505b50505092915050565b6000614074602b83614961565b915061407f82614d1c565b604082019050919050565b6000614097603283614961565b91506140a282614d6b565b604082019050919050565b60006140ba602683614961565b91506140c582614dba565b604082019050919050565b60006140dd602583614961565b91506140e882614e09565b604082019050919050565b6000614100601c83614961565b915061410b82614e58565b602082019050919050565b6000614123602483614961565b915061412e82614e81565b604082019050919050565b6000614146601983614961565b915061415182614ed0565b602082019050919050565b6000614169602083614961565b915061417482614ef9565b602082019050919050565b600061418c602483614961565b915061419782614f22565b604082019050919050565b60006141af601283614961565b91506141ba82614f71565b602082019050919050565b60006141d2601783614961565b91506141dd82614f9a565b602082019050919050565b60006141f5602983614961565b915061420082614fc3565b604082019050919050565b6000614218601683614961565b915061422382615012565b602082019050919050565b600061423b603e83614961565b91506142468261503b565b604082019050919050565b600061425e602083614961565b91506142698261508a565b602082019050919050565b6000614281602083614961565b915061428c826150b3565b602082019050919050565b60006142a4602f83614961565b91506142af826150dc565b604082019050919050565b60006142c7601c83614961565b91506142d28261512b565b602082019050919050565b60006142ea601883614961565b91506142f582615154565b602082019050919050565b600061430d602183614961565b91506143188261517d565b604082019050919050565b6000614330600083614956565b915061433b826151cc565b600082019050919050565b6000614353602c83614961565b915061435e826151cf565b604082019050919050565b6000614376602e83614961565b91506143818261521e565b604082019050919050565b6000614399601b83614961565b91506143a48261526d565b602082019050919050565b60006143bc601b83614961565b91506143c782615296565b602082019050919050565b60006143df600e83614961565b91506143ea826152bf565b602082019050919050565b6143fe81614afc565b82525050565b61440d81614afc565b82525050565b600061441f8286613fb7565b915061442b8285613fb7565b91506144378284613fe8565b9150819050949350505050565b600061444f82614323565b9150819050919050565b600060208201905061446e6000830184613ec9565b92915050565b60006080820190506144896000830187613ec9565b6144966020830186613ec9565b6144a36040830185614404565b81810360608301526144b58184613f45565b905095945050505050565b600060208201905081810360008301526144da8184613ed8565b905092915050565b60006020820190506144f76000830184613f36565b92915050565b600060208201905081810360008301526145178184613f7e565b905092915050565b6000602082019050818103600083015261453881614067565b9050919050565b600060208201905081810360008301526145588161408a565b9050919050565b60006020820190508181036000830152614578816140ad565b9050919050565b60006020820190508181036000830152614598816140d0565b9050919050565b600060208201905081810360008301526145b8816140f3565b9050919050565b600060208201905081810360008301526145d881614116565b9050919050565b600060208201905081810360008301526145f881614139565b9050919050565b600060208201905081810360008301526146188161415c565b9050919050565b600060208201905081810360008301526146388161417f565b9050919050565b60006020820190508181036000830152614658816141a2565b9050919050565b60006020820190508181036000830152614678816141c5565b9050919050565b60006020820190508181036000830152614698816141e8565b9050919050565b600060208201905081810360008301526146b88161420b565b9050919050565b600060208201905081810360008301526146d88161422e565b9050919050565b600060208201905081810360008301526146f881614251565b9050919050565b6000602082019050818103600083015261471881614274565b9050919050565b6000602082019050818103600083015261473881614297565b9050919050565b60006020820190508181036000830152614758816142ba565b9050919050565b60006020820190508181036000830152614778816142dd565b9050919050565b6000602082019050818103600083015261479881614300565b9050919050565b600060208201905081810360008301526147b881614346565b9050919050565b600060208201905081810360008301526147d881614369565b9050919050565b600060208201905081810360008301526147f88161438c565b9050919050565b60006020820190508181036000830152614818816143af565b9050919050565b60006020820190508181036000830152614838816143d2565b9050919050565b60006020820190506148546000830184614404565b92915050565b6000614864614875565b90506148708282614ba4565b919050565b6000604051905090565b600067ffffffffffffffff82111561489a57614899614cdc565b5b6148a382614d0b565b9050602081019050919050565b600067ffffffffffffffff8211156148cb576148ca614cdc565b5b6148d482614d0b565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061498882614afc565b915061499383614afc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156149c8576149c7614c4f565b5b828201905092915050565b60006149de82614afc565b91506149e983614afc565b9250826149f9576149f8614c7e565b5b828204905092915050565b6000614a0f82614afc565b9150614a1a83614afc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a5357614a52614c4f565b5b828202905092915050565b6000614a6982614afc565b9150614a7483614afc565b925082821015614a8757614a86614c4f565b5b828203905092915050565b6000614a9d82614adc565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614b33578082015181840152602081019050614b18565b83811115614b42576000848401525b50505050565b6000614b5382614afc565b91506000821415614b6757614b66614c4f565b5b600182039050919050565b60006002820490506001821680614b8a57607f821691505b60208210811415614b9e57614b9d614cad565b5b50919050565b614bad82614d0b565b810181811067ffffffffffffffff82111715614bcc57614bcb614cdc565b5b80604052505050565b6000614be082614afc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c1357614c12614c4f565b5b600182019050919050565b6000614c2982614afc565b9150614c3483614afc565b925082614c4457614c43614c7e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f526f79616c74792076616c75652073686f756c6420626520706f736974697665600082015250565b7f4d6178206d696e7420616d6f756e74207065722073657373696f6e206578636560008201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f55736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d6178204e465420706572206164647265737320657863656564656400000000600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f4e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b7f526563697069656e742073686f756c642062652070726573656e740000000000600082015250565b7f4d696e7420697320706175736564000000000000000000000000000000000000600082015250565b6152f181614a92565b81146152fc57600080fd5b50565b61530881614aa4565b811461531357600080fd5b50565b61531f81614ab0565b811461532a57600080fd5b50565b61533681614afc565b811461534157600080fd5b5056fea264697066735822122065934eb4871e34ea39dc0c8dcceb5611f50478ce1fee8440d33bbdd5a55f1ff064736f6c6343000801003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d58766d5837677a5a53617436654d4267565a3835354e314b67617867625473506a526a37687a6e746f5634332f00000000000000000000

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d58766d5837677a5a53617436654d4267565a3835354e314b67617867625473506a526a37687a6e746f5634332f00000000000000000000

-----Decoded View---------------
Arg [0] : _initBaseURI (string): ipfs://QmXvmX7gzZSat6eMBgVZ855N1KgaxgbTsPjRj7hzntoV43/

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [2] : 697066733a2f2f516d58766d5837677a5a53617436654d4267565a3835354e31
Arg [3] : 4b67617867625473506a526a37687a6e746f5634332f00000000000000000000


Deployed ByteCode Sourcemap

46772:7311:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37772:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52484:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51172:105;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23362:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24875:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47123:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24392:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47248:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38412:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47678:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47400:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25575:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38080:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49473:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53599:481;;;:::i;:::-;;48075:1390;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25982:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49802:390;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51855:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38602:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47542:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52079:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47587:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23073:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47004:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22804:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45835:103;;;;;;;;;;;;;:::i;:::-;;51342:288;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51949:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45187:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53411:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47080:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23531:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47497:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25118:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51663:66;;;;;;;;;;;;;:::i;:::-;;47209:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46853:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52603:82;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26238:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47634:37;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47451:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52693:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47032:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47352;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50202:886;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51737:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47167:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47304:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52191:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25344:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52805:154;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52350:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46093:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37772:224;37874:4;37913:35;37898:50;;;:11;:50;;;;:90;;;;37952:36;37976:11;37952:23;:36::i;:::-;37898:90;37891:97;;37772:224;;;:::o;52484:111::-;45073:13;:11;:13::i;:::-;52543:6:::1;52540:47;;;52560:1;52551:6;:10;;;;52540:47;;;52586:1;52577:6;:10;;;;52540:47;52484:111:::0;:::o;51172:105::-;51225:7;51252:17;;51245:24;;51172:105;:::o;23362:100::-;23416:13;23449:5;23442:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23362:100;:::o;24875:171::-;24951:7;24971:23;24986:7;24971:14;:23::i;:::-;25014:15;:24;25030:7;25014:24;;;;;;;;;;;;;;;;;;;;;25007:31;;24875:171;;;:::o;47123:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24392:417::-;24473:13;24489:23;24504:7;24489:14;:23::i;:::-;24473:39;;24537:5;24531:11;;:2;:11;;;;24523:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24631:5;24615:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24640:37;24657:5;24664:12;:10;:12::i;:::-;24640:16;:37::i;:::-;24615:62;24593:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;24780:21;24789:2;24793:7;24780:8;:21::i;:::-;24392:417;;;:::o;47248:45::-;;;;:::o;38412:113::-;38473:7;38500:10;:17;;;;38493:24;;38412:113;:::o;47678:55::-;;;;;;;;;;;;;;;;;:::o;47400:41::-;;;;:::o;25575:336::-;25770:41;25789:12;:10;:12::i;:::-;25803:7;25770:18;:41::i;:::-;25762:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;25875:28;25885:4;25891:2;25895:7;25875:9;:28::i;:::-;25575:336;;;:::o;38080:256::-;38177:7;38213:23;38230:5;38213:16;:23::i;:::-;38205:5;:31;38197:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38302:12;:19;38315:5;38302:19;;;;;;;;;;;;;;;:26;38322:5;38302:26;;;;;;;;;;;;38295:33;;38080:256;;;;:::o;49473:274::-;49532:4;49554:9;49566:1;49554:13;;49549:168;49573:20;:27;;;;49569:1;:31;49549:168;;;49653:5;49626:32;;:20;49647:1;49626:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;49622:84;;;49686:4;49679:11;;;;;49622:84;49602:3;;;;;:::i;:::-;;;;49549:168;;;;49734:5;49727:12;;49473:274;;;;:::o;53599:481::-;45073:13;:11;:13::i;:::-;53892:7:::1;53913;:5;:7::i;:::-;53905:21;;53934;53905:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53891:69;;;53979:2;53971:11;;;::::0;::::1;;45097:1;53599:481::o:0;48075:1390::-;48149:14;48166:13;:11;:13::i;:::-;48149:30;;48208:1;48198:6;;:11;48190:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;48269:3;48247:26;;:10;:26;;;;48239:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;48338:1;48324:11;:15;48316:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;48410:1;48390:17;;:21;48382:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;48469:7;:5;:7::i;:::-;48455:21;;:10;:21;;;48451:736;;48516:1;48497:15;;:20;48493:373;;;48546:25;48560:10;48546:13;:25::i;:::-;48538:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;48618:24;48645:20;:32;48666:10;48645:32;;;;;;;;;;;;;;;;48618:59;;48760:18;;48745:11;48726:16;:30;;;;:::i;:::-;:52;;48696:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;48493:373;;48967:1;48954:9;:14;;48946:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;49049:11;49042:4;;:18;;;;:::i;:::-;49029:9;:31;;49021:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;49121:13;;49106:11;:28;;49098:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;48451:736;49204:9;49216:1;49204:13;;49199:179;49224:11;49219:1;:16;49199:179;;49257:26;49267:3;49281:1;49272:6;:10;;;;:::i;:::-;49257:9;:26::i;:::-;49298:20;:32;49319:10;49298:32;;;;;;;;;;;;;;;;:34;;;;;;;;;:::i;:::-;;;;;;49347:17;;:19;;;;;;;;;:::i;:::-;;;;;;49237:3;;;;;:::i;:::-;;;;49199:179;;;;49419:1;49411:4;49391:17;;:24;;;;:::i;:::-;:29;49388:70;;;49445:1;49436:6;:10;;;;49388:70;48075:1390;;;:::o;25982:185::-;26120:39;26137:4;26143:2;26147:7;26120:39;;;;;;;;;;;;:16;:39::i;:::-;25982:185;;;:::o;49802:390::-;49889:16;49923:23;49949:17;49959:6;49949:9;:17::i;:::-;49923:43;;49977:25;50019:15;50005:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49977:58;;50051:9;50046:113;50066:15;50062:1;:19;50046:113;;;50117:30;50137:6;50145:1;50117:19;:30::i;:::-;50103:8;50112:1;50103:11;;;;;;;;;;;;;;;;;;;;;:44;;;;;50083:3;;;;;:::i;:::-;;;;50046:113;;;;50176:8;50169:15;;;;49802:390;;;:::o;51855:86::-;45073:13;:11;:13::i;:::-;51925:8:::1;51918:4;:15;;;;51855:86:::0;:::o;38602:233::-;38677:7;38713:30;:28;:30::i;:::-;38705:5;:38;38697:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;38810:10;38821:5;38810:17;;;;;;;;;;;;;;;;;;;;;;;;38803:24;;38602:233;;;:::o;47542:38::-;;;;:::o;52079:104::-;45073:13;:11;:13::i;:::-;52164:11:::1;52154:7;:21;;;;;;;;;;;;:::i;:::-;;52079:104:::0;:::o;47587:38::-;;;;:::o;23073:222::-;23145:7;23165:13;23181:7;:16;23189:7;23181:16;;;;;;;;;;;;;;;;;;;;;23165:32;;23233:1;23216:19;;:5;:19;;;;23208:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;23282:5;23275:12;;;23073:222;;;:::o;47004:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22804:207::-;22876:7;22921:1;22904:19;;:5;:19;;;;22896:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22987:9;:16;22997:5;22987:16;;;;;;;;;;;;;;;;22980:23;;22804:207;;;:::o;45835:103::-;45073:13;:11;:13::i;:::-;45900:30:::1;45927:1;45900:18;:30::i;:::-;45835:103::o:0;51342:288::-;51394:7;51414:14;51457:7;:5;:7::i;:::-;51443:21;;:10;:21;;;51439:160;;51511:20;:32;51532:10;51511:32;;;;;;;;;;;;;;;;51490:18;;:53;;;;:::i;:::-;51481:62;;51439:160;;;51584:3;51575:12;;51439:160;51616:6;51609:13;;;51342:288;:::o;51949:122::-;45073:13;:11;:13::i;:::-;52046:17:::1;52030:13;:33;;;;51949:122:::0;:::o;45187:87::-;45233:7;45260:6;;;;;;;;;;;45253:13;;45187:87;:::o;53411:180::-;53470:7;53526:1;53493:35;;:12;:21;53506:7;53493:21;;;;;;;;;;;;;;;;;;;;;:35;;;53490:54;;;53537:7;:5;:7::i;:::-;53530:14;;;;53490:54;53562:12;:21;53575:7;53562:21;;;;;;;;;;;;;;;;;;;;;53555:28;;53411:180;;;;:::o;47080:36::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23531:104::-;23587:13;23620:7;23613:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23531:104;:::o;47497:38::-;;;;:::o;25118:155::-;25213:52;25232:12;:10;:12::i;:::-;25246:8;25256;25213:18;:52::i;:::-;25118:155;;:::o;51663:66::-;45073:13;:11;:13::i;:::-;51720:1:::1;51709:8;:12;;;;51663:66::o:0;47209:30::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46853:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;52603:82::-;52644:7;52671:6;;52664:13;;52603:82;:::o;26238:323::-;26412:41;26431:12;:10;:12::i;:::-;26445:7;26412:18;:41::i;:::-;26404:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;26515:38;26529:4;26535:2;26539:7;26548:4;26515:13;:38::i;:::-;26238:323;;;;:::o;47634:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47451:39::-;;;;:::o;52693:104::-;45073:13;:11;:13::i;:::-;52783:6:::1;52765:15;:24;;;;52693:104:::0;:::o;47032:41::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47352:::-;;;;:::o;50202:886::-;50275:13;50309:16;50317:7;50309;:16::i;:::-;50301:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;50390:23;50416:10;:19;50427:7;50416:19;;;;;;;;;;;50390:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50446:18;50467:10;:8;:10::i;:::-;50446:31;;50505:1;50493:8;;:13;50490:39;;;50515:14;50508:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50490:39;50631:1;50615:4;50609:18;:23;50605:72;;;50656:9;50649:16;;;;;;50605:72;50807:1;50787:9;50781:23;:27;50777:123;;;50856:4;50862:9;50873:13;50839:48;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50825:63;;;;;;50777:123;51032:4;51038:25;51055:7;51038:16;:25::i;:::-;51065:13;51015:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51001:79;;;;50202:886;;;;:::o;51737:110::-;45073:13;:11;:13::i;:::-;51833:6:::1;51812:18;:27;;;;51737:110:::0;:::o;47167:35::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47304:41::-;;;;:::o;52191:151::-;45073:13;:11;:13::i;:::-;52317:17:::1;52301:13;:33;;;;;;;;;;;;:::i;:::-;;52191:151:::0;:::o;25344:164::-;25441:4;25465:18;:25;25484:5;25465:25;;;;;;;;;;;;;;;:35;25491:8;25465:35;;;;;;;;;;;;;;;;;;;;;;;;;25458:42;;25344:164;;;;:::o;52805:154::-;45073:13;:11;:13::i;:::-;52891:20:::1;;52884:27;;;;:::i;:::-;52945:6;;52922:20;:29;;;;;;;:::i;:::-;;52805:154:::0;;:::o;52350:126::-;45073:13;:11;:13::i;:::-;52453:15:::1;52436:14;:32;;;;;;;;;;;;:::i;:::-;;52350:126:::0;:::o;46093:201::-;45073:13;:11;:13::i;:::-;46202:1:::1;46182:22;;:8;:22;;;;46174:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46258:28;46277:8;46258:18;:28::i;:::-;46093:201:::0;:::o;22435:305::-;22537:4;22589:25;22574:40;;;:11;:40;;;;:105;;;;22646:33;22631:48;;;:11;:48;;;;22574:105;:158;;;;22696:36;22720:11;22696:23;:36::i;:::-;22574:158;22554:178;;22435:305;;;:::o;45352:132::-;45427:12;:10;:12::i;:::-;45416:23;;:7;:5;:7::i;:::-;:23;;;45408:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45352:132::o;32850:135::-;32932:16;32940:7;32932;:16::i;:::-;32924:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;32850:135;:::o;17190:98::-;17243:7;17270:10;17263:17;;17190:98;:::o;32129:174::-;32231:2;32204:15;:24;32220:7;32204:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32287:7;32283:2;32249:46;;32258:23;32273:7;32258:14;:23::i;:::-;32249:46;;;;;;;;;;;;32129:174;;:::o;28362:264::-;28455:4;28472:13;28488:23;28503:7;28488:14;:23::i;:::-;28472:39;;28541:5;28530:16;;:7;:16;;;:52;;;;28550:32;28567:5;28574:7;28550:16;:32::i;:::-;28530:52;:87;;;;28610:7;28586:31;;:20;28598:7;28586:11;:20::i;:::-;:31;;;28530:87;28522:96;;;28362:264;;;;:::o;31385:625::-;31544:4;31517:31;;:23;31532:7;31517:14;:23::i;:::-;:31;;;31509:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;31623:1;31609:16;;:2;:16;;;;31601:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31679:39;31700:4;31706:2;31710:7;31679:20;:39::i;:::-;31783:29;31800:1;31804:7;31783:8;:29::i;:::-;31844:1;31825:9;:15;31835:4;31825:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31873:1;31856:9;:13;31866:2;31856:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31904:2;31885:7;:16;31893:7;31885:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31943:7;31939:2;31924:27;;31933:4;31924:27;;;;;;;;;;;;31964:38;31984:4;31990:2;31994:7;31964:19;:38::i;:::-;31385:625;;;:::o;28968:110::-;29044:26;29054:2;29058:7;29044:26;;;;;;;;;;;;:9;:26::i;:::-;28968:110;;:::o;46454:191::-;46528:16;46547:6;;;;;;;;;;;46528:25;;46573:8;46564:6;;:17;;;;;;;;;;;;;;;;;;46628:8;46597:40;;46618:8;46597:40;;;;;;;;;;;;46454:191;;:::o;32446:315::-;32601:8;32592:17;;:5;:17;;;;32584:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32688:8;32650:18;:25;32669:5;32650:25;;;;;;;;;;;;;;;:35;32676:8;32650:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;32734:8;32712:41;;32727:5;32712:41;;;32744:8;32712:41;;;;;;:::i;:::-;;;;;;;;32446:315;;;:::o;27442:313::-;27598:28;27608:4;27614:2;27618:7;27598:9;:28::i;:::-;27645:47;27668:4;27674:2;27678:7;27687:4;27645:22;:47::i;:::-;27637:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;27442:313;;;;:::o;28068:127::-;28133:4;28185:1;28157:30;;:7;:16;28165:7;28157:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28150:37;;28068:127;;;:::o;47944:108::-;48004:13;48037:7;48030:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47944:108;:::o;17868:723::-;17924:13;18154:1;18145:5;:10;18141:53;;;18172:10;;;;;;;;;;;;;;;;;;;;;18141:53;18204:12;18219:5;18204:20;;18235:14;18260:78;18275:1;18267:4;:9;18260:78;;18293:8;;;;;:::i;:::-;;;;18324:2;18316:10;;;;;:::i;:::-;;;18260:78;;;18348:19;18380:6;18370:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18348:39;;18398:154;18414:1;18405:5;:10;18398:154;;18442:1;18432:11;;;;;:::i;:::-;;;18509:2;18501:5;:10;;;;:::i;:::-;18488:2;:24;;;;:::i;:::-;18475:39;;18458:6;18465;18458:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;18538:2;18529:11;;;;;:::i;:::-;;;18398:154;;;18576:6;18562:21;;;;;17868:723;;;;:::o;20832:157::-;20917:4;20956:25;20941:40;;;:11;:40;;;;20934:47;;20832:157;;;:::o;52967:436::-;53103:45;53130:4;53136:2;53140:7;53103:26;:45::i;:::-;53181:1;53165:18;;:4;:18;;;53161:114;;;;;;53215:2;53207:10;;:4;:10;;;53203:72;;53241:12;:21;53254:7;53241:21;;;;;;;;;;;;53234:28;;;;;;;;;;;53203:72;53161:114;53305:1;53291:16;;:2;:16;;;53287:109;;;;;;53337:4;53331:10;;:2;:10;;;53327:69;;53382:2;53358:12;:21;53371:7;53358:21;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;53327:69;53287:109;52967:436;;;:::o;35485:125::-;;;;:::o;29305:319::-;29434:18;29440:2;29444:7;29434:5;:18::i;:::-;29485:53;29516:1;29520:2;29524:7;29533:4;29485:22;:53::i;:::-;29463:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;29305:319;;;:::o;33549:853::-;33703:4;33724:15;:2;:13;;;:15::i;:::-;33720:675;;;33776:2;33760:36;;;33797:12;:10;:12::i;:::-;33811:4;33817:7;33826:4;33760:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33756:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34018:1;34001:6;:13;:18;33997:328;;;34044:60;;;;;;;;;;:::i;:::-;;;;;;;;33997:328;34275:6;34269:13;34260:6;34256:2;34252:15;34245:38;33756:584;33892:41;;;33882:51;;;:6;:51;;;;33875:58;;;;;33720:675;34379:4;34372:11;;33549:853;;;;;;;:::o;39448:589::-;39592:45;39619:4;39625:2;39629:7;39592:26;:45::i;:::-;39670:1;39654:18;;:4;:18;;;39650:187;;;39689:40;39721:7;39689:31;:40::i;:::-;39650:187;;;39759:2;39751:10;;:4;:10;;;39747:90;;39778:47;39811:4;39817:7;39778:32;:47::i;:::-;39747:90;39650:187;39865:1;39851:16;;:2;:16;;;39847:183;;;39884:45;39921:7;39884:36;:45::i;:::-;39847:183;;;39957:4;39951:10;;:2;:10;;;39947:83;;39978:40;40006:2;40010:7;39978:27;:40::i;:::-;39947:83;39847:183;39448:589;;;:::o;29960:439::-;30054:1;30040:16;;:2;:16;;;;30032:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30113:16;30121:7;30113;:16::i;:::-;30112:17;30104:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30175:45;30204:1;30208:2;30212:7;30175:20;:45::i;:::-;30250:1;30233:9;:13;30243:2;30233:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30281:2;30262:7;:16;30270:7;30262:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30326:7;30322:2;30301:33;;30318:1;30301:33;;;;;;;;;;;;30347:44;30375:1;30379:2;30383:7;30347:19;:44::i;:::-;29960:439;;:::o;9157:326::-;9217:4;9474:1;9452:7;:19;;;:23;9445:30;;9157:326;;;:::o;34974:126::-;;;;:::o;40760:164::-;40864:10;:17;;;;40837:15;:24;40853:7;40837:24;;;;;;;;;;;:44;;;;40892:10;40908:7;40892:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40760:164;:::o;41551:988::-;41817:22;41867:1;41842:22;41859:4;41842:16;:22::i;:::-;:26;;;;:::i;:::-;41817:51;;41879:18;41900:17;:26;41918:7;41900:26;;;;;;;;;;;;41879:47;;42047:14;42033:10;:28;42029:328;;42078:19;42100:12;:18;42113:4;42100:18;;;;;;;;;;;;;;;:34;42119:14;42100:34;;;;;;;;;;;;42078:56;;42184:11;42151:12;:18;42164:4;42151:18;;;;;;;;;;;;;;;:30;42170:10;42151:30;;;;;;;;;;;:44;;;;42301:10;42268:17;:30;42286:11;42268:30;;;;;;;;;;;:43;;;;42029:328;;42453:17;:26;42471:7;42453:26;;;;;;;;;;;42446:33;;;42497:12;:18;42510:4;42497:18;;;;;;;;;;;;;;;:34;42516:14;42497:34;;;;;;;;;;;42490:41;;;41551:988;;;;:::o;42834:1079::-;43087:22;43132:1;43112:10;:17;;;;:21;;;;:::i;:::-;43087:46;;43144:18;43165:15;:24;43181:7;43165:24;;;;;;;;;;;;43144:45;;43516:19;43538:10;43549:14;43538:26;;;;;;;;;;;;;;;;;;;;;;;;43516:48;;43602:11;43577:10;43588;43577:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;43713:10;43682:15;:28;43698:11;43682:28;;;;;;;;;;;:41;;;;43854:15;:24;43870:7;43854:24;;;;;;;;;;;43847:31;;;43889:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42834:1079;;;;:::o;40338:221::-;40423:14;40440:20;40457:2;40440:16;:20::i;:::-;40423:37;;40498:7;40471:12;:16;40484:2;40471:16;;;;;;;;;;;;;;;:24;40488:6;40471:24;;;;;;;;;;;:34;;;;40545:6;40516:17;:26;40534:7;40516:26;;;;;;;;;;;:35;;;;40338:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;869:367::-;;;1002:3;995:4;987:6;983:17;979:27;969:2;;1020:1;1017;1010:12;969:2;1056:6;1043:20;1033:30;;1086:18;1078:6;1075:30;1072:2;;;1118:1;1115;1108:12;1072:2;1155:4;1147:6;1143:17;1131:29;;1209:3;1201:4;1193:6;1189:17;1179:8;1175:32;1172:41;1169:2;;;1226:1;1223;1216:12;1169:2;959:277;;;;;:::o;1242:133::-;;1323:6;1310:20;1301:29;;1339:30;1363:5;1339:30;:::i;:::-;1291:84;;;;:::o;1381:137::-;;1464:6;1451:20;1442:29;;1480:32;1506:5;1480:32;:::i;:::-;1432:86;;;;:::o;1524:141::-;;1611:6;1605:13;1596:22;;1627:32;1653:5;1627:32;:::i;:::-;1586:79;;;;:::o;1684:271::-;;1788:3;1781:4;1773:6;1769:17;1765:27;1755:2;;1806:1;1803;1796:12;1755:2;1846:6;1833:20;1871:78;1945:3;1937:6;1930:4;1922:6;1918:17;1871:78;:::i;:::-;1862:87;;1745:210;;;;;:::o;1975:273::-;;2080:3;2073:4;2065:6;2061:17;2057:27;2047:2;;2098:1;2095;2088:12;2047:2;2138:6;2125:20;2163:79;2238:3;2230:6;2223:4;2215:6;2211:17;2163:79;:::i;:::-;2154:88;;2037:211;;;;;:::o;2254:139::-;;2338:6;2325:20;2316:29;;2354:33;2381:5;2354:33;:::i;:::-;2306:87;;;;:::o;2399:262::-;;2507:2;2495:9;2486:7;2482:23;2478:32;2475:2;;;2523:1;2520;2513:12;2475:2;2566:1;2591:53;2636:7;2627:6;2616:9;2612:22;2591:53;:::i;:::-;2581:63;;2537:117;2465:196;;;;:::o;2667:407::-;;;2792:2;2780:9;2771:7;2767:23;2763:32;2760:2;;;2808:1;2805;2798:12;2760:2;2851:1;2876:53;2921:7;2912:6;2901:9;2897:22;2876:53;:::i;:::-;2866:63;;2822:117;2978:2;3004:53;3049:7;3040:6;3029:9;3025:22;3004:53;:::i;:::-;2994:63;;2949:118;2750:324;;;;;:::o;3080:552::-;;;;3222:2;3210:9;3201:7;3197:23;3193:32;3190:2;;;3238:1;3235;3228:12;3190:2;3281:1;3306:53;3351:7;3342:6;3331:9;3327:22;3306:53;:::i;:::-;3296:63;;3252:117;3408:2;3434:53;3479:7;3470:6;3459:9;3455:22;3434:53;:::i;:::-;3424:63;;3379:118;3536:2;3562:53;3607:7;3598:6;3587:9;3583:22;3562:53;:::i;:::-;3552:63;;3507:118;3180:452;;;;;:::o;3638:809::-;;;;;3806:3;3794:9;3785:7;3781:23;3777:33;3774:2;;;3823:1;3820;3813:12;3774:2;3866:1;3891:53;3936:7;3927:6;3916:9;3912:22;3891:53;:::i;:::-;3881:63;;3837:117;3993:2;4019:53;4064:7;4055:6;4044:9;4040:22;4019:53;:::i;:::-;4009:63;;3964:118;4121:2;4147:53;4192:7;4183:6;4172:9;4168:22;4147:53;:::i;:::-;4137:63;;4092:118;4277:2;4266:9;4262:18;4249:32;4308:18;4300:6;4297:30;4294:2;;;4340:1;4337;4330:12;4294:2;4368:62;4422:7;4413:6;4402:9;4398:22;4368:62;:::i;:::-;4358:72;;4220:220;3764:683;;;;;;;:::o;4453:401::-;;;4575:2;4563:9;4554:7;4550:23;4546:32;4543:2;;;4591:1;4588;4581:12;4543:2;4634:1;4659:53;4704:7;4695:6;4684:9;4680:22;4659:53;:::i;:::-;4649:63;;4605:117;4761:2;4787:50;4829:7;4820:6;4809:9;4805:22;4787:50;:::i;:::-;4777:60;;4732:115;4533:321;;;;;:::o;4860:407::-;;;4985:2;4973:9;4964:7;4960:23;4956:32;4953:2;;;5001:1;4998;4991:12;4953:2;5044:1;5069:53;5114:7;5105:6;5094:9;5090:22;5069:53;:::i;:::-;5059:63;;5015:117;5171:2;5197:53;5242:7;5233:6;5222:9;5218:22;5197:53;:::i;:::-;5187:63;;5142:118;4943:324;;;;;:::o;5273:425::-;;;5416:2;5404:9;5395:7;5391:23;5387:32;5384:2;;;5432:1;5429;5422:12;5384:2;5503:1;5492:9;5488:17;5475:31;5533:18;5525:6;5522:30;5519:2;;;5565:1;5562;5555:12;5519:2;5601:80;5673:7;5664:6;5653:9;5649:22;5601:80;:::i;:::-;5583:98;;;;5446:245;5374:324;;;;;:::o;5704:256::-;;5809:2;5797:9;5788:7;5784:23;5780:32;5777:2;;;5825:1;5822;5815:12;5777:2;5868:1;5893:50;5935:7;5926:6;5915:9;5911:22;5893:50;:::i;:::-;5883:60;;5839:114;5767:193;;;;:::o;5966:260::-;;6073:2;6061:9;6052:7;6048:23;6044:32;6041:2;;;6089:1;6086;6079:12;6041:2;6132:1;6157:52;6201:7;6192:6;6181:9;6177:22;6157:52;:::i;:::-;6147:62;;6103:116;6031:195;;;;:::o;6232:282::-;;6350:2;6338:9;6329:7;6325:23;6321:32;6318:2;;;6366:1;6363;6356:12;6318:2;6409:1;6434:63;6489:7;6480:6;6469:9;6465:22;6434:63;:::i;:::-;6424:73;;6380:127;6308:206;;;;:::o;6520:375::-;;6638:2;6626:9;6617:7;6613:23;6609:32;6606:2;;;6654:1;6651;6644:12;6606:2;6725:1;6714:9;6710:17;6697:31;6755:18;6747:6;6744:30;6741:2;;;6787:1;6784;6777:12;6741:2;6815:63;6870:7;6861:6;6850:9;6846:22;6815:63;:::i;:::-;6805:73;;6668:220;6596:299;;;;:::o;6901:262::-;;7009:2;6997:9;6988:7;6984:23;6980:32;6977:2;;;7025:1;7022;7015:12;6977:2;7068:1;7093:53;7138:7;7129:6;7118:9;7114:22;7093:53;:::i;:::-;7083:63;;7039:117;6967:196;;;;:::o;7169:179::-;;7259:46;7301:3;7293:6;7259:46;:::i;:::-;7337:4;7332:3;7328:14;7314:28;;7249:99;;;;:::o;7354:118::-;7441:24;7459:5;7441:24;:::i;:::-;7436:3;7429:37;7419:53;;:::o;7508:732::-;;7656:54;7704:5;7656:54;:::i;:::-;7726:86;7805:6;7800:3;7726:86;:::i;:::-;7719:93;;7836:56;7886:5;7836:56;:::i;:::-;7915:7;7946:1;7931:284;7956:6;7953:1;7950:13;7931:284;;;8032:6;8026:13;8059:63;8118:3;8103:13;8059:63;:::i;:::-;8052:70;;8145:60;8198:6;8145:60;:::i;:::-;8135:70;;7991:224;7978:1;7975;7971:9;7966:14;;7931:284;;;7935:14;8231:3;8224:10;;7632:608;;;;;;;:::o;8246:109::-;8327:21;8342:5;8327:21;:::i;:::-;8322:3;8315:34;8305:50;;:::o;8361:360::-;;8475:38;8507:5;8475:38;:::i;:::-;8529:70;8592:6;8587:3;8529:70;:::i;:::-;8522:77;;8608:52;8653:6;8648:3;8641:4;8634:5;8630:16;8608:52;:::i;:::-;8685:29;8707:6;8685:29;:::i;:::-;8680:3;8676:39;8669:46;;8451:270;;;;;:::o;8727:364::-;;8843:39;8876:5;8843:39;:::i;:::-;8898:71;8962:6;8957:3;8898:71;:::i;:::-;8891:78;;8978:52;9023:6;9018:3;9011:4;9004:5;9000:16;8978:52;:::i;:::-;9055:29;9077:6;9055:29;:::i;:::-;9050:3;9046:39;9039:46;;8819:272;;;;;:::o;9097:377::-;;9231:39;9264:5;9231:39;:::i;:::-;9286:89;9368:6;9363:3;9286:89;:::i;:::-;9279:96;;9384:52;9429:6;9424:3;9417:4;9410:5;9406:16;9384:52;:::i;:::-;9461:6;9456:3;9452:16;9445:23;;9207:267;;;;;:::o;9504:845::-;;9644:5;9638:12;9673:36;9699:9;9673:36;:::i;:::-;9725:89;9807:6;9802:3;9725:89;:::i;:::-;9718:96;;9845:1;9834:9;9830:17;9861:1;9856:137;;;;10007:1;10002:341;;;;9823:520;;9856:137;9940:4;9936:9;9925;9921:25;9916:3;9909:38;9976:6;9971:3;9967:16;9960:23;;9856:137;;10002:341;10069:38;10101:5;10069:38;:::i;:::-;10129:1;10143:154;10157:6;10154:1;10151:13;10143:154;;;10231:7;10225:14;10221:1;10216:3;10212:11;10205:35;10281:1;10272:7;10268:15;10257:26;;10179:4;10176:1;10172:12;10167:17;;10143:154;;;10326:6;10321:3;10317:16;10310:23;;10009:334;;9823:520;;9611:738;;;;;;:::o;10355:366::-;;10518:67;10582:2;10577:3;10518:67;:::i;:::-;10511:74;;10594:93;10683:3;10594:93;:::i;:::-;10712:2;10707:3;10703:12;10696:19;;10501:220;;;:::o;10727:366::-;;10890:67;10954:2;10949:3;10890:67;:::i;:::-;10883:74;;10966:93;11055:3;10966:93;:::i;:::-;11084:2;11079:3;11075:12;11068:19;;10873:220;;;:::o;11099:366::-;;11262:67;11326:2;11321:3;11262:67;:::i;:::-;11255:74;;11338:93;11427:3;11338:93;:::i;:::-;11456:2;11451:3;11447:12;11440:19;;11245:220;;;:::o;11471:366::-;;11634:67;11698:2;11693:3;11634:67;:::i;:::-;11627:74;;11710:93;11799:3;11710:93;:::i;:::-;11828:2;11823:3;11819:12;11812:19;;11617:220;;;:::o;11843:366::-;;12006:67;12070:2;12065:3;12006:67;:::i;:::-;11999:74;;12082:93;12171:3;12082:93;:::i;:::-;12200:2;12195:3;12191:12;12184:19;;11989:220;;;:::o;12215:366::-;;12378:67;12442:2;12437:3;12378:67;:::i;:::-;12371:74;;12454:93;12543:3;12454:93;:::i;:::-;12572:2;12567:3;12563:12;12556:19;;12361:220;;;:::o;12587:366::-;;12750:67;12814:2;12809:3;12750:67;:::i;:::-;12743:74;;12826:93;12915:3;12826:93;:::i;:::-;12944:2;12939:3;12935:12;12928:19;;12733:220;;;:::o;12959:366::-;;13122:67;13186:2;13181:3;13122:67;:::i;:::-;13115:74;;13198:93;13287:3;13198:93;:::i;:::-;13316:2;13311:3;13307:12;13300:19;;13105:220;;;:::o;13331:366::-;;13494:67;13558:2;13553:3;13494:67;:::i;:::-;13487:74;;13570:93;13659:3;13570:93;:::i;:::-;13688:2;13683:3;13679:12;13672:19;;13477:220;;;:::o;13703:366::-;;13866:67;13930:2;13925:3;13866:67;:::i;:::-;13859:74;;13942:93;14031:3;13942:93;:::i;:::-;14060:2;14055:3;14051:12;14044:19;;13849:220;;;:::o;14075:366::-;;14238:67;14302:2;14297:3;14238:67;:::i;:::-;14231:74;;14314:93;14403:3;14314:93;:::i;:::-;14432:2;14427:3;14423:12;14416:19;;14221:220;;;:::o;14447:366::-;;14610:67;14674:2;14669:3;14610:67;:::i;:::-;14603:74;;14686:93;14775:3;14686:93;:::i;:::-;14804:2;14799:3;14795:12;14788:19;;14593:220;;;:::o;14819:366::-;;14982:67;15046:2;15041:3;14982:67;:::i;:::-;14975:74;;15058:93;15147:3;15058:93;:::i;:::-;15176:2;15171:3;15167:12;15160:19;;14965:220;;;:::o;15191:366::-;;15354:67;15418:2;15413:3;15354:67;:::i;:::-;15347:74;;15430:93;15519:3;15430:93;:::i;:::-;15548:2;15543:3;15539:12;15532:19;;15337:220;;;:::o;15563:366::-;;15726:67;15790:2;15785:3;15726:67;:::i;:::-;15719:74;;15802:93;15891:3;15802:93;:::i;:::-;15920:2;15915:3;15911:12;15904:19;;15709:220;;;:::o;15935:366::-;;16098:67;16162:2;16157:3;16098:67;:::i;:::-;16091:74;;16174:93;16263:3;16174:93;:::i;:::-;16292:2;16287:3;16283:12;16276:19;;16081:220;;;:::o;16307:366::-;;16470:67;16534:2;16529:3;16470:67;:::i;:::-;16463:74;;16546:93;16635:3;16546:93;:::i;:::-;16664:2;16659:3;16655:12;16648:19;;16453:220;;;:::o;16679:366::-;;16842:67;16906:2;16901:3;16842:67;:::i;:::-;16835:74;;16918:93;17007:3;16918:93;:::i;:::-;17036:2;17031:3;17027:12;17020:19;;16825:220;;;:::o;17051:366::-;;17214:67;17278:2;17273:3;17214:67;:::i;:::-;17207:74;;17290:93;17379:3;17290:93;:::i;:::-;17408:2;17403:3;17399:12;17392:19;;17197:220;;;:::o;17423:366::-;;17586:67;17650:2;17645:3;17586:67;:::i;:::-;17579:74;;17662:93;17751:3;17662:93;:::i;:::-;17780:2;17775:3;17771:12;17764:19;;17569:220;;;:::o;17795:398::-;;17975:83;18056:1;18051:3;17975:83;:::i;:::-;17968:90;;18067:93;18156:3;18067:93;:::i;:::-;18185:1;18180:3;18176:11;18169:18;;17958:235;;;:::o;18199:366::-;;18362:67;18426:2;18421:3;18362:67;:::i;:::-;18355:74;;18438:93;18527:3;18438:93;:::i;:::-;18556:2;18551:3;18547:12;18540:19;;18345:220;;;:::o;18571:366::-;;18734:67;18798:2;18793:3;18734:67;:::i;:::-;18727:74;;18810:93;18899:3;18810:93;:::i;:::-;18928:2;18923:3;18919:12;18912:19;;18717:220;;;:::o;18943:366::-;;19106:67;19170:2;19165:3;19106:67;:::i;:::-;19099:74;;19182:93;19271:3;19182:93;:::i;:::-;19300:2;19295:3;19291:12;19284:19;;19089:220;;;:::o;19315:366::-;;19478:67;19542:2;19537:3;19478:67;:::i;:::-;19471:74;;19554:93;19643:3;19554:93;:::i;:::-;19672:2;19667:3;19663:12;19656:19;;19461:220;;;:::o;19687:366::-;;19850:67;19914:2;19909:3;19850:67;:::i;:::-;19843:74;;19926:93;20015:3;19926:93;:::i;:::-;20044:2;20039:3;20035:12;20028:19;;19833:220;;;:::o;20059:108::-;20136:24;20154:5;20136:24;:::i;:::-;20131:3;20124:37;20114:53;;:::o;20173:118::-;20260:24;20278:5;20260:24;:::i;:::-;20255:3;20248:37;20238:53;;:::o;20297:589::-;;20544:95;20635:3;20626:6;20544:95;:::i;:::-;20537:102;;20656:95;20747:3;20738:6;20656:95;:::i;:::-;20649:102;;20768:92;20856:3;20847:6;20768:92;:::i;:::-;20761:99;;20877:3;20870:10;;20526:360;;;;;;:::o;20892:379::-;;21098:147;21241:3;21098:147;:::i;:::-;21091:154;;21262:3;21255:10;;21080:191;;;:::o;21277:222::-;;21408:2;21397:9;21393:18;21385:26;;21421:71;21489:1;21478:9;21474:17;21465:6;21421:71;:::i;:::-;21375:124;;;;:::o;21505:640::-;;21738:3;21727:9;21723:19;21715:27;;21752:71;21820:1;21809:9;21805:17;21796:6;21752:71;:::i;:::-;21833:72;21901:2;21890:9;21886:18;21877:6;21833:72;:::i;:::-;21915;21983:2;21972:9;21968:18;21959:6;21915:72;:::i;:::-;22034:9;22028:4;22024:20;22019:2;22008:9;22004:18;21997:48;22062:76;22133:4;22124:6;22062:76;:::i;:::-;22054:84;;21705:440;;;;;;;:::o;22151:373::-;;22332:2;22321:9;22317:18;22309:26;;22381:9;22375:4;22371:20;22367:1;22356:9;22352:17;22345:47;22409:108;22512:4;22503:6;22409:108;:::i;:::-;22401:116;;22299:225;;;;:::o;22530:210::-;;22655:2;22644:9;22640:18;22632:26;;22668:65;22730:1;22719:9;22715:17;22706:6;22668:65;:::i;:::-;22622:118;;;;:::o;22746:313::-;;22897:2;22886:9;22882:18;22874:26;;22946:9;22940:4;22936:20;22932:1;22921:9;22917:17;22910:47;22974:78;23047:4;23038:6;22974:78;:::i;:::-;22966:86;;22864:195;;;;:::o;23065:419::-;;23269:2;23258:9;23254:18;23246:26;;23318:9;23312:4;23308:20;23304:1;23293:9;23289:17;23282:47;23346:131;23472:4;23346:131;:::i;:::-;23338:139;;23236:248;;;:::o;23490:419::-;;23694:2;23683:9;23679:18;23671:26;;23743:9;23737:4;23733:20;23729:1;23718:9;23714:17;23707:47;23771:131;23897:4;23771:131;:::i;:::-;23763:139;;23661:248;;;:::o;23915:419::-;;24119:2;24108:9;24104:18;24096:26;;24168:9;24162:4;24158:20;24154:1;24143:9;24139:17;24132:47;24196:131;24322:4;24196:131;:::i;:::-;24188:139;;24086:248;;;:::o;24340:419::-;;24544:2;24533:9;24529:18;24521:26;;24593:9;24587:4;24583:20;24579:1;24568:9;24564:17;24557:47;24621:131;24747:4;24621:131;:::i;:::-;24613:139;;24511:248;;;:::o;24765:419::-;;24969:2;24958:9;24954:18;24946:26;;25018:9;25012:4;25008:20;25004:1;24993:9;24989:17;24982:47;25046:131;25172:4;25046:131;:::i;:::-;25038:139;;24936:248;;;:::o;25190:419::-;;25394:2;25383:9;25379:18;25371:26;;25443:9;25437:4;25433:20;25429:1;25418:9;25414:17;25407:47;25471:131;25597:4;25471:131;:::i;:::-;25463:139;;25361:248;;;:::o;25615:419::-;;25819:2;25808:9;25804:18;25796:26;;25868:9;25862:4;25858:20;25854:1;25843:9;25839:17;25832:47;25896:131;26022:4;25896:131;:::i;:::-;25888:139;;25786:248;;;:::o;26040:419::-;;26244:2;26233:9;26229:18;26221:26;;26293:9;26287:4;26283:20;26279:1;26268:9;26264:17;26257:47;26321:131;26447:4;26321:131;:::i;:::-;26313:139;;26211:248;;;:::o;26465:419::-;;26669:2;26658:9;26654:18;26646:26;;26718:9;26712:4;26708:20;26704:1;26693:9;26689:17;26682:47;26746:131;26872:4;26746:131;:::i;:::-;26738:139;;26636:248;;;:::o;26890:419::-;;27094:2;27083:9;27079:18;27071:26;;27143:9;27137:4;27133:20;27129:1;27118:9;27114:17;27107:47;27171:131;27297:4;27171:131;:::i;:::-;27163:139;;27061:248;;;:::o;27315:419::-;;27519:2;27508:9;27504:18;27496:26;;27568:9;27562:4;27558:20;27554:1;27543:9;27539:17;27532:47;27596:131;27722:4;27596:131;:::i;:::-;27588:139;;27486:248;;;:::o;27740:419::-;;27944:2;27933:9;27929:18;27921:26;;27993:9;27987:4;27983:20;27979:1;27968:9;27964:17;27957:47;28021:131;28147:4;28021:131;:::i;:::-;28013:139;;27911:248;;;:::o;28165:419::-;;28369:2;28358:9;28354:18;28346:26;;28418:9;28412:4;28408:20;28404:1;28393:9;28389:17;28382:47;28446:131;28572:4;28446:131;:::i;:::-;28438:139;;28336:248;;;:::o;28590:419::-;;28794:2;28783:9;28779:18;28771:26;;28843:9;28837:4;28833:20;28829:1;28818:9;28814:17;28807:47;28871:131;28997:4;28871:131;:::i;:::-;28863:139;;28761:248;;;:::o;29015:419::-;;29219:2;29208:9;29204:18;29196:26;;29268:9;29262:4;29258:20;29254:1;29243:9;29239:17;29232:47;29296:131;29422:4;29296:131;:::i;:::-;29288:139;;29186:248;;;:::o;29440:419::-;;29644:2;29633:9;29629:18;29621:26;;29693:9;29687:4;29683:20;29679:1;29668:9;29664:17;29657:47;29721:131;29847:4;29721:131;:::i;:::-;29713:139;;29611:248;;;:::o;29865:419::-;;30069:2;30058:9;30054:18;30046:26;;30118:9;30112:4;30108:20;30104:1;30093:9;30089:17;30082:47;30146:131;30272:4;30146:131;:::i;:::-;30138:139;;30036:248;;;:::o;30290:419::-;;30494:2;30483:9;30479:18;30471:26;;30543:9;30537:4;30533:20;30529:1;30518:9;30514:17;30507:47;30571:131;30697:4;30571:131;:::i;:::-;30563:139;;30461:248;;;:::o;30715:419::-;;30919:2;30908:9;30904:18;30896:26;;30968:9;30962:4;30958:20;30954:1;30943:9;30939:17;30932:47;30996:131;31122:4;30996:131;:::i;:::-;30988:139;;30886:248;;;:::o;31140:419::-;;31344:2;31333:9;31329:18;31321:26;;31393:9;31387:4;31383:20;31379:1;31368:9;31364:17;31357:47;31421:131;31547:4;31421:131;:::i;:::-;31413:139;;31311:248;;;:::o;31565:419::-;;31769:2;31758:9;31754:18;31746:26;;31818:9;31812:4;31808:20;31804:1;31793:9;31789:17;31782:47;31846:131;31972:4;31846:131;:::i;:::-;31838:139;;31736:248;;;:::o;31990:419::-;;32194:2;32183:9;32179:18;32171:26;;32243:9;32237:4;32233:20;32229:1;32218:9;32214:17;32207:47;32271:131;32397:4;32271:131;:::i;:::-;32263:139;;32161:248;;;:::o;32415:419::-;;32619:2;32608:9;32604:18;32596:26;;32668:9;32662:4;32658:20;32654:1;32643:9;32639:17;32632:47;32696:131;32822:4;32696:131;:::i;:::-;32688:139;;32586:248;;;:::o;32840:419::-;;33044:2;33033:9;33029:18;33021:26;;33093:9;33087:4;33083:20;33079:1;33068:9;33064:17;33057:47;33121:131;33247:4;33121:131;:::i;:::-;33113:139;;33011:248;;;:::o;33265:419::-;;33469:2;33458:9;33454:18;33446:26;;33518:9;33512:4;33508:20;33504:1;33493:9;33489:17;33482:47;33546:131;33672:4;33546:131;:::i;:::-;33538:139;;33436:248;;;:::o;33690:222::-;;33821:2;33810:9;33806:18;33798:26;;33834:71;33902:1;33891:9;33887:17;33878:6;33834:71;:::i;:::-;33788:124;;;;:::o;33918:129::-;;33979:20;;:::i;:::-;33969:30;;34008:33;34036:4;34028:6;34008:33;:::i;:::-;33959:88;;;:::o;34053:75::-;;34119:2;34113:9;34103:19;;34093:35;:::o;34134:307::-;;34285:18;34277:6;34274:30;34271:2;;;34307:18;;:::i;:::-;34271:2;34345:29;34367:6;34345:29;:::i;:::-;34337:37;;34429:4;34423;34419:15;34411:23;;34200:241;;;:::o;34447:308::-;;34599:18;34591:6;34588:30;34585:2;;;34621:18;;:::i;:::-;34585:2;34659:29;34681:6;34659:29;:::i;:::-;34651:37;;34743:4;34737;34733:15;34725:23;;34514:241;;;:::o;34761:132::-;;34851:3;34843:11;;34881:4;34876:3;34872:14;34864:22;;34833:60;;;:::o;34899:141::-;;34971:3;34963:11;;34994:3;34991:1;34984:14;35028:4;35025:1;35015:18;35007:26;;34953:87;;;:::o;35046:114::-;;35147:5;35141:12;35131:22;;35120:40;;;:::o;35166:98::-;;35251:5;35245:12;35235:22;;35224:40;;;:::o;35270:99::-;;35356:5;35350:12;35340:22;;35329:40;;;:::o;35375:113::-;;35477:4;35472:3;35468:14;35460:22;;35450:38;;;:::o;35494:184::-;;35627:6;35622:3;35615:19;35667:4;35662:3;35658:14;35643:29;;35605:73;;;;:::o;35684:168::-;;35801:6;35796:3;35789:19;35841:4;35836:3;35832:14;35817:29;;35779:73;;;;:::o;35858:147::-;;35996:3;35981:18;;35971:34;;;;:::o;36011:169::-;;36129:6;36124:3;36117:19;36169:4;36164:3;36160:14;36145:29;;36107:73;;;;:::o;36186:148::-;;36325:3;36310:18;;36300:34;;;;:::o;36340:305::-;;36399:20;36417:1;36399:20;:::i;:::-;36394:25;;36433:20;36451:1;36433:20;:::i;:::-;36428:25;;36587:1;36519:66;36515:74;36512:1;36509:81;36506:2;;;36593:18;;:::i;:::-;36506:2;36637:1;36634;36630:9;36623:16;;36384:261;;;;:::o;36651:185::-;;36708:20;36726:1;36708:20;:::i;:::-;36703:25;;36742:20;36760:1;36742:20;:::i;:::-;36737:25;;36781:1;36771:2;;36786:18;;:::i;:::-;36771:2;36828:1;36825;36821:9;36816:14;;36693:143;;;;:::o;36842:348::-;;36905:20;36923:1;36905:20;:::i;:::-;36900:25;;36939:20;36957:1;36939:20;:::i;:::-;36934:25;;37127:1;37059:66;37055:74;37052:1;37049:81;37044:1;37037:9;37030:17;37026:105;37023:2;;;37134:18;;:::i;:::-;37023:2;37182:1;37179;37175:9;37164:20;;36890:300;;;;:::o;37196:191::-;;37256:20;37274:1;37256:20;:::i;:::-;37251:25;;37290:20;37308:1;37290:20;:::i;:::-;37285:25;;37329:1;37326;37323:8;37320:2;;;37334:18;;:::i;:::-;37320:2;37379:1;37376;37372:9;37364:17;;37241:146;;;;:::o;37393:96::-;;37459:24;37477:5;37459:24;:::i;:::-;37448:35;;37438:51;;;:::o;37495:90::-;;37572:5;37565:13;37558:21;37547:32;;37537:48;;;:::o;37591:149::-;;37667:66;37660:5;37656:78;37645:89;;37635:105;;;:::o;37746:126::-;;37823:42;37816:5;37812:54;37801:65;;37791:81;;;:::o;37878:77::-;;37944:5;37933:16;;37923:32;;;:::o;37961:154::-;38045:6;38040:3;38035;38022:30;38107:1;38098:6;38093:3;38089:16;38082:27;38012:103;;;:::o;38121:307::-;38189:1;38199:113;38213:6;38210:1;38207:13;38199:113;;;38298:1;38293:3;38289:11;38283:18;38279:1;38274:3;38270:11;38263:39;38235:2;38232:1;38228:10;38223:15;;38199:113;;;38330:6;38327:1;38324:13;38321:2;;;38410:1;38401:6;38396:3;38392:16;38385:27;38321:2;38170:258;;;;:::o;38434:171::-;;38496:24;38514:5;38496:24;:::i;:::-;38487:33;;38542:4;38535:5;38532:15;38529:2;;;38550:18;;:::i;:::-;38529:2;38597:1;38590:5;38586:13;38579:20;;38477:128;;;:::o;38611:320::-;;38692:1;38686:4;38682:12;38672:22;;38739:1;38733:4;38729:12;38760:18;38750:2;;38816:4;38808:6;38804:17;38794:27;;38750:2;38878;38870:6;38867:14;38847:18;38844:38;38841:2;;;38897:18;;:::i;:::-;38841:2;38662:269;;;;:::o;38937:281::-;39020:27;39042:4;39020:27;:::i;:::-;39012:6;39008:40;39150:6;39138:10;39135:22;39114:18;39102:10;39099:34;39096:62;39093:2;;;39161:18;;:::i;:::-;39093:2;39201:10;39197:2;39190:22;38980:238;;;:::o;39224:233::-;;39286:24;39304:5;39286:24;:::i;:::-;39277:33;;39332:66;39325:5;39322:77;39319:2;;;39402:18;;:::i;:::-;39319:2;39449:1;39442:5;39438:13;39431:20;;39267:190;;;:::o;39463:176::-;;39512:20;39530:1;39512:20;:::i;:::-;39507:25;;39546:20;39564:1;39546:20;:::i;:::-;39541:25;;39585:1;39575:2;;39590:18;;:::i;:::-;39575:2;39631:1;39628;39624:9;39619:14;;39497:142;;;;:::o;39645:180::-;39693:77;39690:1;39683:88;39790:4;39787:1;39780:15;39814:4;39811:1;39804:15;39831:180;39879:77;39876:1;39869:88;39976:4;39973:1;39966:15;40000:4;39997:1;39990:15;40017:180;40065:77;40062:1;40055:88;40162:4;40159:1;40152:15;40186:4;40183:1;40176:15;40203:180;40251:77;40248:1;40241:88;40348:4;40345:1;40338:15;40372:4;40369:1;40362:15;40389:102;;40481:2;40477:7;40472:2;40465:5;40461:14;40457:28;40447:38;;40437:54;;;:::o;40497:230::-;40637:34;40633:1;40625:6;40621:14;40614:58;40706:13;40701:2;40693:6;40689:15;40682:38;40603:124;:::o;40733:237::-;40873:34;40869:1;40861:6;40857:14;40850:58;40942:20;40937:2;40929:6;40925:15;40918:45;40839:131;:::o;40976:225::-;41116:34;41112:1;41104:6;41100:14;41093:58;41185:8;41180:2;41172:6;41168:15;41161:33;41082:119;:::o;41207:224::-;41347:34;41343:1;41335:6;41331:14;41324:58;41416:7;41411:2;41403:6;41399:15;41392:32;41313:118;:::o;41437:178::-;41577:30;41573:1;41565:6;41561:14;41554:54;41543:72;:::o;41621:223::-;41761:34;41757:1;41749:6;41745:14;41738:58;41830:6;41825:2;41817:6;41813:15;41806:31;41727:117;:::o;41850:175::-;41990:27;41986:1;41978:6;41974:14;41967:51;41956:69;:::o;42031:182::-;42171:34;42167:1;42159:6;42155:14;42148:58;42137:76;:::o;42219:223::-;42359:34;42355:1;42347:6;42343:14;42336:58;42428:6;42423:2;42415:6;42411:15;42404:31;42325:117;:::o;42448:168::-;42588:20;42584:1;42576:6;42572:14;42565:44;42554:62;:::o;42622:173::-;42762:25;42758:1;42750:6;42746:14;42739:49;42728:67;:::o;42801:228::-;42941:34;42937:1;42929:6;42925:14;42918:58;43010:11;43005:2;42997:6;42993:15;42986:36;42907:122;:::o;43035:172::-;43175:24;43171:1;43163:6;43159:14;43152:48;43141:66;:::o;43213:249::-;43353:34;43349:1;43341:6;43337:14;43330:58;43422:32;43417:2;43409:6;43405:15;43398:57;43319:143;:::o;43468:182::-;43608:34;43604:1;43596:6;43592:14;43585:58;43574:76;:::o;43656:182::-;43796:34;43792:1;43784:6;43780:14;43773:58;43762:76;:::o;43844:234::-;43984:34;43980:1;43972:6;43968:14;43961:58;44053:17;44048:2;44040:6;44036:15;44029:42;43950:128;:::o;44084:178::-;44224:30;44220:1;44212:6;44208:14;44201:54;44190:72;:::o;44268:174::-;44408:26;44404:1;44396:6;44392:14;44385:50;44374:68;:::o;44448:220::-;44588:34;44584:1;44576:6;44572:14;44565:58;44657:3;44652:2;44644:6;44640:15;44633:28;44554:114;:::o;44674:::-;44780:8;:::o;44794:231::-;44934:34;44930:1;44922:6;44918:14;44911:58;45003:14;44998:2;44990:6;44986:15;44979:39;44900:125;:::o;45031:233::-;45171:34;45167:1;45159:6;45155:14;45148:58;45240:16;45235:2;45227:6;45223:15;45216:41;45137:127;:::o;45270:177::-;45410:29;45406:1;45398:6;45394:14;45387:53;45376:71;:::o;45453:177::-;45593:29;45589:1;45581:6;45577:14;45570:53;45559:71;:::o;45636:164::-;45776:16;45772:1;45764:6;45760:14;45753:40;45742:58;:::o;45806:122::-;45879:24;45897:5;45879:24;:::i;:::-;45872:5;45869:35;45859:2;;45918:1;45915;45908:12;45859:2;45849:79;:::o;45934:116::-;46004:21;46019:5;46004:21;:::i;:::-;45997:5;45994:32;45984:2;;46040:1;46037;46030:12;45984:2;45974:76;:::o;46056:120::-;46128:23;46145:5;46128:23;:::i;:::-;46121:5;46118:34;46108:2;;46166:1;46163;46156:12;46108:2;46098:78;:::o;46182:122::-;46255:24;46273:5;46255:24;:::i;:::-;46248:5;46245:35;46235:2;;46294:1;46291;46284:12;46235:2;46225:79;:::o

Swarm Source

ipfs://65934eb4871e34ea39dc0c8dcceb5611f50478ce1fee8440d33bbdd5a55f1ff0
Loading