Token Corgiclub

Overview CRC721

Total Supply:
9,530 Corgiclub

Holders:
387 addresses
Balance
22 Corgiclub
0x634a5dc4cda63ea8d0699d9387cdcfffc6408b84
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
ERC721FeeCollection

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at cronoscan.com on 2022-03-22
*/

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

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

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

pragma solidity ^0.8.0;

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


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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


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

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

pragma solidity ^0.8.0;

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


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

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

pragma solidity ^0.8.0;

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

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

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


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

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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

pragma solidity ^0.8.0;

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

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


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

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

pragma solidity ^0.8.0;

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

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

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

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

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


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

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

pragma solidity ^0.8.0;

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


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

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

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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


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

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

pragma solidity ^0.8.0;

/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

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

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

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

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @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 override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}


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

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

pragma solidity ^0.8.0;

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

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

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


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

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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


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

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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}


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

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

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}


// File contracts/interfaces/ICollectionRoyalty.sol

pragma solidity ^0.8.0;
//

interface ICollectionRoyalty {
    function setRoyalty(uint256 _id, uint256 royalty) external;
    
    function getRoyalty(uint256 _id) external view returns(uint256);

    function getCreator(uint256 _id) external view returns(address);

    function getDecimal() external view returns(uint256);
}


// File contracts/ERC721Collection.sol

pragma solidity ^0.8.0;
//






contract ERC721Collection is ERC721URIStorage, ERC721Enumerable, Ownable, ICollectionRoyalty {
    string public contractURI;
    using Counters for Counters.Counter;
    Counters.Counter private _counter;
    using SafeMath for uint256;

    uint256 decimal = 2;
    mapping(uint256 => uint256) public royalties;
    mapping(uint256 => address) public creators;

    modifier creatorOnly(uint256 _id) {
        require(creators[_id] == msg.sender, "CreatorOnly: ONLY_CREATOR_ALLOWED");
        _;
    }

    modifier ownerOnly(uint256 _id) {
        require(ownerOf(_id) == msg.sender, "OwnersOnly: ONLY_OWNERS_ALLOWED");
        _;
    }

    constructor(
        string memory _name,
        string memory _symbol,
        string memory _uri
    ) ERC721(_name, _symbol) {
        _counter.increment();
        contractURI = _uri;
    }

    function mintTo(
        address _initialOwner,
        string calldata _uri
    ) public virtual payable returns (uint256) {
        uint256 _id = _counter.current();
        _counter.increment();

        _safeMint(_initialOwner, _id);
        creators[_id] = msg.sender;

        _setTokenURI(_id, _uri);
        return _id;
    }

    function bulkMintTo(
        address _initialOwner,
        string[] calldata _uris
    ) public virtual payable {
        for (uint256 i = 0; i < _uris.length; i++) {
            mintTo(_initialOwner, _uris[i]);
        }
    }

    function burn(uint256 _id) public ownerOnly(_id) {
        _burn(_id);
        delete creators[_id];
    }

    function setRoyalty(uint256 _id, uint256 royalty) public override creatorOnly(_id) {
        royalties[_id] = royalty;
    }

    function getRoyalty(uint256 _id) public override virtual view returns (uint256) {
        return royalties[_id];
    }

    function getCreator(uint256 _id) public override view returns (address) {
        return creators[_id];
    }

    function getDecimal() public override view returns (uint256) {
        return decimal;
    }

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

    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }

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

    function tokenURI(uint256 tokenId)
    public
    view
    override(ERC721, ERC721URIStorage)
    returns (string memory)
    {
        return super.tokenURI(tokenId);
    }
}


// File contracts/ERC721FeeCollection.sol

pragma solidity ^0.8.0;
//

contract ERC721FeeCollection is ERC721Collection {
    using Counters for Counters.Counter;
    Counters.Counter private _counter;

    uint256 public publicFee;
    uint256 public earlyFee;
    uint256 public earlyLimit;
    address public payee;

    constructor(
        string memory _name,
        string memory _symbol,
        string memory _uri,
        uint256 _publicFee,
        uint256 _earlyFee,
        uint32 _earlyLimit,
        address _payee
    ) ERC721Collection(_name, _symbol, _uri) {
        _counter.increment();

        publicFee = _publicFee;
        earlyFee = _earlyFee;
        earlyLimit = _earlyLimit;
        payee = _payee;
    }

    function getFee(address minter) public view returns (uint256) {
        if (minter == payee) {
            return 0;
        }
        if (totalSupply() < earlyLimit) {
            return earlyFee;
        } else {
            return publicFee;
        }
    }

    modifier enoughFee(uint256 value, address minter, uint256 quantity) {
        uint256 fee = publicFee * quantity;
        if (_counter.current() <= earlyLimit) {
            fee = earlyFee * quantity;
        }
        if (minter == payee) {
            fee = 0;
        }
        require(value == fee, "Not enough fee");
        _;
    }

    function mintTo(
        address _initialOwner,
        string calldata _uri
    ) public enoughFee(msg.value, msg.sender, 1) payable override returns (uint256) {
        uint256 id = super.mintTo(_initialOwner, _uri);
        _counter.increment();
        payable(payee).transfer(msg.value);
        return id;
    }

    function bulkMintTo(
        address _initialOwner,
        string[] calldata _uris
    ) public enoughFee(msg.value, msg.sender, _uris.length) payable override {
        for (uint256 i = 0; i < _uris.length; i++) {
            super.mintTo(_initialOwner, _uris[i]);
            _counter.increment();
        }
        payable(payee).transfer(msg.value);
    }

    function getRoyalty(uint256 _id) public override view returns(uint256) {
        if (royalties[_id] == 0) {
            return 250;
        }
        return royalties[_id];
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"uint256","name":"_publicFee","type":"uint256"},{"internalType":"uint256","name":"_earlyFee","type":"uint256"},{"internalType":"uint32","name":"_earlyLimit","type":"uint32"},{"internalType":"address","name":"_payee","type":"address"}],"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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_initialOwner","type":"address"},{"internalType":"string[]","name":"_uris","type":"string[]"}],"name":"bulkMintTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"creators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlyLimit","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":"_id","type":"uint256"}],"name":"getCreator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDecimal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"getFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getRoyalty","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":[{"internalType":"address","name":"_initialOwner","type":"address"},{"internalType":"string","name":"_uri","type":"string"}],"name":"mintTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"royalties","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":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"royalty","type":"uint256"}],"name":"setRoyalty","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"}]

60806040526002600e553480156200001657600080fd5b5060405162004f2638038062004f2683398181016040528101906200003c91906200039f565b86868682828160009080519060200190620000599291906200022c565b508060019080519060200190620000729291906200022c565b50505062000095620000896200014860201b60201c565b6200015060201b60201c565b620000ac600d6200021660201b620017bf1760201c565b80600c9080519060200190620000c49291906200022c565b50505050620000df60116200021660201b620017bf1760201c565b83601281905550826013819055508163ffffffff1660148190555080601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050620006cf565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b8280546200023a9062000592565b90600052602060002090601f0160209004810192826200025e5760008555620002aa565b82601f106200027957805160ff1916838001178555620002aa565b82800160010185558215620002aa579182015b82811115620002a95782518255916020019190600101906200028c565b5b509050620002b99190620002bd565b5090565b5b80821115620002d8576000816000905550600101620002be565b5090565b6000620002f3620002ed84620004d8565b620004af565b90508281526020810184848401111562000312576200031162000661565b5b6200031f8482856200055c565b509392505050565b600081519050620003388162000681565b92915050565b600082601f8301126200035657620003556200065c565b5b815162000368848260208601620002dc565b91505092915050565b60008151905062000382816200069b565b92915050565b6000815190506200039981620006b5565b92915050565b600080600080600080600060e0888a031215620003c157620003c06200066b565b5b600088015167ffffffffffffffff811115620003e257620003e162000666565b5b620003f08a828b016200033e565b975050602088015167ffffffffffffffff81111562000414576200041362000666565b5b620004228a828b016200033e565b965050604088015167ffffffffffffffff81111562000446576200044562000666565b5b620004548a828b016200033e565b9550506060620004678a828b0162000371565b94505060806200047a8a828b0162000371565b93505060a06200048d8a828b0162000388565b92505060c0620004a08a828b0162000327565b91505092959891949750929550565b6000620004bb620004ce565b9050620004c98282620005c8565b919050565b6000604051905090565b600067ffffffffffffffff821115620004f657620004f56200062d565b5b620005018262000670565b9050602081019050919050565b60006200051b8262000522565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b60005b838110156200057c5780820151818401526020810190506200055f565b838111156200058c576000848401525b50505050565b60006002820490506001821680620005ab57607f821691505b60208210811415620005c257620005c1620005fe565b5b50919050565b620005d38262000670565b810181811067ffffffffffffffff82111715620005f557620005f46200062d565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6200068c816200050e565b81146200069857600080fd5b50565b620006a68162000542565b8114620006b257600080fd5b50565b620006c0816200054c565b8114620006cc57600080fd5b50565b61484780620006df6000396000f3fe6080604052600436106101f85760003560e01c806368545d931161010d578063ae90b213116100a0578063cd53d08e1161006f578063cd53d08e14610764578063d48e638a146107a1578063e8a3d485146107de578063e985e9c514610809578063f2fde38b14610846576101f8565b8063ae90b21314610696578063b88c9148146106c1578063b88d4fde146106fe578063c87b56dd14610727576101f8565b80638da5cb5b116100dc5780638da5cb5b146105ee578063933a6f0d1461061957806395d89b4114610642578063a22cb4651461066d576101f8565b806368545d931461054157806370a082311461055d578063715018a61461059a5780637f77f574146105b1576101f8565b806323b872dd1161019057806342966c681161015f57806342966c68146104485780634f6ccce71461047157806359646463146104ae5780635fe212ef146104d95780636352211e14610504576101f8565b806323b872dd1461038e5780632f745c59146103b757806334ce10c4146103f457806342842e0e1461041f576101f8565b8063095ea7b3116101cc578063095ea7b3146102d257806315bbd78f146102fb57806318160ddd146103265780631af9cf4914610351576101f8565b806275a317146101fd57806301ffc9a71461022d57806306fdde031461026a578063081812fc14610295575b600080fd5b61021760048036038101906102129190613365565b61086f565b6040516102249190613c69565b60405180910390f35b34801561023957600080fd5b50610254600480360381019061024f9190613405565b6109d8565b604051610261919061394c565b60405180910390f35b34801561027657600080fd5b5061027f6109ea565b60405161028c9190613967565b60405180910390f35b3480156102a157600080fd5b506102bc60048036038101906102b7919061345f565b610a7c565b6040516102c991906138e5565b60405180910390f35b3480156102de57600080fd5b506102f960048036038101906102f491906133c5565b610b01565b005b34801561030757600080fd5b50610310610c19565b60405161031d9190613c69565b60405180910390f35b34801561033257600080fd5b5061033b610c1f565b6040516103489190613c69565b60405180910390f35b34801561035d57600080fd5b506103786004803603810190610373919061345f565b610c2c565b6040516103859190613c69565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b091906131ef565b610c6e565b005b3480156103c357600080fd5b506103de60048036038101906103d991906133c5565b610cce565b6040516103eb9190613c69565b60405180910390f35b34801561040057600080fd5b50610409610d73565b6040516104169190613c69565b60405180910390f35b34801561042b57600080fd5b50610446600480360381019061044191906131ef565b610d7d565b005b34801561045457600080fd5b5061046f600480360381019061046a919061345f565b610d9d565b005b34801561047d57600080fd5b506104986004803603810190610493919061345f565b610e57565b6040516104a59190613c69565b60405180910390f35b3480156104ba57600080fd5b506104c3610ec8565b6040516104d09190613c69565b60405180910390f35b3480156104e557600080fd5b506104ee610ece565b6040516104fb9190613c69565b60405180910390f35b34801561051057600080fd5b5061052b6004803603810190610526919061345f565b610ed4565b60405161053891906138e5565b60405180910390f35b61055b600480360381019061055691906132c5565b610f86565b005b34801561056957600080fd5b50610584600480360381019061057f9190613182565b61112b565b6040516105919190613c69565b60405180910390f35b3480156105a657600080fd5b506105af6111e3565b005b3480156105bd57600080fd5b506105d860048036038101906105d3919061345f565b61126b565b6040516105e59190613c69565b60405180910390f35b3480156105fa57600080fd5b50610603611283565b60405161061091906138e5565b60405180910390f35b34801561062557600080fd5b50610640600480360381019061063b919061348c565b6112ad565b005b34801561064e57600080fd5b5061065761136c565b6040516106649190613967565b60405180910390f35b34801561067957600080fd5b50610694600480360381019061068f9190613325565b6113fe565b005b3480156106a257600080fd5b506106ab611414565b6040516106b891906138e5565b60405180910390f35b3480156106cd57600080fd5b506106e860048036038101906106e39190613182565b61143a565b6040516106f59190613c69565b60405180910390f35b34801561070a57600080fd5b5061072560048036038101906107209190613242565b6114c1565b005b34801561073357600080fd5b5061074e6004803603810190610749919061345f565b611523565b60405161075b9190613967565b60405180910390f35b34801561077057600080fd5b5061078b6004803603810190610786919061345f565b611535565b60405161079891906138e5565b60405180910390f35b3480156107ad57600080fd5b506107c860048036038101906107c3919061345f565b611568565b6040516107d591906138e5565b60405180910390f35b3480156107ea57600080fd5b506107f36115a5565b6040516108009190613967565b60405180910390f35b34801561081557600080fd5b50610830600480360381019061082b91906131af565b611633565b60405161083d919061394c565b60405180910390f35b34801561085257600080fd5b5061086d60048036038101906108689190613182565b6116c7565b005b6000343360016000816012546108859190613e07565b905060145461089460116117d5565b116108aa57816013546108a79190613e07565b90505b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561090557600090505b808414610947576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093e906139a9565b60405180910390fd5b60006109548989896117e3565b905061096060116117bf565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156109c8573d6000803e3d6000fd5b5080955050505050509392505050565b60006109e3826118b1565b9050919050565b6060600080546109f990613f4b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2590613f4b565b8015610a725780601f10610a4757610100808354040283529160200191610a72565b820191906000526020600020905b815481529060010190602001808311610a5557829003601f168201915b5050505050905090565b6000610a878261192b565b610ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abd90613ba9565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b0c82610ed4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7490613c09565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b9c611997565b73ffffffffffffffffffffffffffffffffffffffff161480610bcb5750610bca81610bc5611997565b611633565b5b610c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0190613ae9565b60405180910390fd5b610c14838361199f565b505050565b60135481565b6000600980549050905090565b600080600f6000848152602001908152602001600020541415610c525760fa9050610c69565b600f60008381526020019081526020016000205490505b919050565b610c7f610c79611997565b82611a58565b610cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb590613c29565b60405180910390fd5b610cc9838383611b36565b505050565b6000610cd98361112b565b8210610d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d11906139c9565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000600e54905090565b610d98838383604051806020016040528060008152506114c1565b505050565b803373ffffffffffffffffffffffffffffffffffffffff16610dbe82610ed4565b73ffffffffffffffffffffffffffffffffffffffff1614610e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0b90613989565b60405180910390fd5b610e1d82611d9d565b6010600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050565b6000610e61610c1f565b8210610ea2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9990613c49565b60405180910390fd5b60098281548110610eb657610eb56140e4565b5b90600052602060002001549050919050565b60125481565b60145481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7490613b29565b60405180910390fd5b80915050919050565b343383839050600081601254610f9c9190613e07565b9050601454610fab60116117d5565b11610fc15781601354610fbe9190613e07565b90505b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561101c57600090505b80841461105e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611055906139a9565b60405180910390fd5b60005b868690508110156110b85761109a88888884818110611083576110826140e4565b5b90506020028101906110959190613c84565b6117e3565b506110a560116117bf565b80806110b090613fae565b915050611061565b50601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611121573d6000803e3d6000fd5b5050505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561119c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119390613b09565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111eb611997565b73ffffffffffffffffffffffffffffffffffffffff16611209611283565b73ffffffffffffffffffffffffffffffffffffffff161461125f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125690613bc9565b60405180910390fd5b6112696000611da9565b565b600f6020528060005260406000206000915090505481565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b813373ffffffffffffffffffffffffffffffffffffffff166010600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134690613aa9565b60405180910390fd5b81600f600085815260200190815260200160002081905550505050565b60606001805461137b90613f4b565b80601f01602080910402602001604051908101604052809291908181526020018280546113a790613f4b565b80156113f45780601f106113c9576101008083540402835291602001916113f4565b820191906000526020600020905b8154815290600101906020018083116113d757829003601f168201915b5050505050905090565b611410611409611997565b8383611e6f565b5050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561149b57600090506114bc565b6014546114a6610c1f565b10156114b65760135490506114bc565b60125490505b919050565b6114d26114cc611997565b83611a58565b611511576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150890613c29565b60405180910390fd5b61151d84848484611fdc565b50505050565b606061152e82612038565b9050919050565b60106020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006010600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600c80546115b290613f4b565b80601f01602080910402602001604051908101604052809291908181526020018280546115de90613f4b565b801561162b5780601f106116005761010080835404028352916020019161162b565b820191906000526020600020905b81548152906001019060200180831161160e57829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6116cf611997565b73ffffffffffffffffffffffffffffffffffffffff166116ed611283565b73ffffffffffffffffffffffffffffffffffffffff1614611743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173a90613bc9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117aa90613a09565b60405180910390fd5b6117bc81611da9565b50565b6001816000016000828254019250508190555050565b600081600001549050919050565b6000806117f0600d6117d5565b90506117fc600d6117bf565b611806858261218a565b336010600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506118a68185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506121a8565b809150509392505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061192457506119238261221c565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a1283610ed4565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611a638261192b565b611aa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9990613ac9565b60405180910390fd5b6000611aad83610ed4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b1c57508373ffffffffffffffffffffffffffffffffffffffff16611b0484610a7c565b73ffffffffffffffffffffffffffffffffffffffff16145b80611b2d5750611b2c8185611633565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b5682610ed4565b73ffffffffffffffffffffffffffffffffffffffff1614611bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba390613a29565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1390613a69565b60405180910390fd5b611c278383836122fe565b611c3260008261199f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c829190613e61565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cd99190613d80565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d9883838361230e565b505050565b611da681612313565b50565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed590613a89565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fcf919061394c565b60405180910390a3505050565b611fe7848484611b36565b611ff384848484612366565b612032576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612029906139e9565b60405180910390fd5b50505050565b60606120438261192b565b612082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207990613b89565b60405180910390fd5b60006006600084815260200190815260200160002080546120a290613f4b565b80601f01602080910402602001604051908101604052809291908181526020018280546120ce90613f4b565b801561211b5780601f106120f05761010080835404028352916020019161211b565b820191906000526020600020905b8154815290600101906020018083116120fe57829003601f168201915b50505050509050600061212c6124fd565b9050600081511415612142578192505050612185565b60008251111561217757808260405160200161215f9291906138c1565b60405160208183030381529060405292505050612185565b61218084612514565b925050505b919050565b6121a48282604051806020016040528060008152506125bb565b5050565b6121b18261192b565b6121f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e790613b49565b60405180910390fd5b80600660008481526020019081526020016000209080519060200190612217929190612f1a565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806122e757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806122f757506122f682612616565b5b9050919050565b612309838383612680565b505050565b505050565b61231c81612794565b600060066000838152602001908152602001600020805461233c90613f4b565b905014612363576006600082815260200190815260200160002060006123629190612fa0565b5b50565b60006123878473ffffffffffffffffffffffffffffffffffffffff166128b1565b156124f0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123b0611997565b8786866040518563ffffffff1660e01b81526004016123d29493929190613900565b602060405180830381600087803b1580156123ec57600080fd5b505af192505050801561241d57506040513d601f19601f8201168201806040525081019061241a9190613432565b60015b6124a0573d806000811461244d576040519150601f19603f3d011682016040523d82523d6000602084013e612452565b606091505b50600081511415612498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248f906139e9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124f5565b600190505b949350505050565b606060405180602001604052806000815250905090565b606061251f8261192b565b61255e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255590613be9565b60405180910390fd5b60006125686124fd565b9050600081511161258857604051806020016040528060008152506125b3565b80612592846128d4565b6040516020016125a39291906138c1565b6040516020818303038152906040525b915050919050565b6125c58383612a35565b6125d26000848484612366565b612611576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612608906139e9565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61268b838383612c0f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126ce576126c981612c14565b61270d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461270c5761270b8382612c5d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127505761274b81612dca565b61278f565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461278e5761278d8282612e9b565b5b5b505050565b600061279f82610ed4565b90506127ad816000846122fe565b6127b860008361199f565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128089190613e61565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128ad8160008461230e565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060600082141561291c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a30565b600082905060005b6000821461294e57808061293790613fae565b915050600a826129479190613dd6565b9150612924565b60008167ffffffffffffffff81111561296a57612969614113565b5b6040519080825280601f01601f19166020018201604052801561299c5781602001600182028036833780820191505090505b5090505b60008514612a29576001826129b59190613e61565b9150600a856129c49190613ff7565b60306129d09190613d80565b60f81b8183815181106129e6576129e56140e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a229190613dd6565b94506129a0565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9c90613b69565b60405180910390fd5b612aae8161192b565b15612aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae590613a49565b60405180910390fd5b612afa600083836122fe565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b4a9190613d80565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c0b6000838361230e565b5050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c6a8461112b565b612c749190613e61565b9050600060086000848152602001908152602001600020549050818114612d59576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050612dde9190613e61565b90506000600a6000848152602001908152602001600020549050600060098381548110612e0e57612e0d6140e4565b5b906000526020600020015490508060098381548110612e3057612e2f6140e4565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480612e7f57612e7e6140b5565b5b6001900381819060005260206000200160009055905550505050565b6000612ea68361112b565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b828054612f2690613f4b565b90600052602060002090601f016020900481019282612f485760008555612f8f565b82601f10612f6157805160ff1916838001178555612f8f565b82800160010185558215612f8f579182015b82811115612f8e578251825591602001919060010190612f73565b5b509050612f9c9190612fe0565b5090565b508054612fac90613f4b565b6000825580601f10612fbe5750612fdd565b601f016020900490600052602060002090810190612fdc9190612fe0565b5b50565b5b80821115612ff9576000816000905550600101612fe1565b5090565b600061301061300b84613d0c565b613ce7565b90508281526020810184848401111561302c5761302b614160565b5b613037848285613f09565b509392505050565b60008135905061304e816147b5565b92915050565b60008083601f84011261306a57613069614147565b5b8235905067ffffffffffffffff81111561308757613086614142565b5b6020830191508360208202830111156130a3576130a2614156565b5b9250929050565b6000813590506130b9816147cc565b92915050565b6000813590506130ce816147e3565b92915050565b6000815190506130e3816147e3565b92915050565b600082601f8301126130fe576130fd614147565b5b813561310e848260208601612ffd565b91505092915050565b60008083601f84011261312d5761312c614147565b5b8235905067ffffffffffffffff81111561314a57613149614142565b5b60208301915083600182028301111561316657613165614156565b5b9250929050565b60008135905061317c816147fa565b92915050565b6000602082840312156131985761319761416a565b5b60006131a68482850161303f565b91505092915050565b600080604083850312156131c6576131c561416a565b5b60006131d48582860161303f565b92505060206131e58582860161303f565b9150509250929050565b6000806000606084860312156132085761320761416a565b5b60006132168682870161303f565b93505060206132278682870161303f565b92505060406132388682870161316d565b9150509250925092565b6000806000806080858703121561325c5761325b61416a565b5b600061326a8782880161303f565b945050602061327b8782880161303f565b935050604061328c8782880161316d565b925050606085013567ffffffffffffffff8111156132ad576132ac614165565b5b6132b9878288016130e9565b91505092959194509250565b6000806000604084860312156132de576132dd61416a565b5b60006132ec8682870161303f565b935050602084013567ffffffffffffffff81111561330d5761330c614165565b5b61331986828701613054565b92509250509250925092565b6000806040838503121561333c5761333b61416a565b5b600061334a8582860161303f565b925050602061335b858286016130aa565b9150509250929050565b60008060006040848603121561337e5761337d61416a565b5b600061338c8682870161303f565b935050602084013567ffffffffffffffff8111156133ad576133ac614165565b5b6133b986828701613117565b92509250509250925092565b600080604083850312156133dc576133db61416a565b5b60006133ea8582860161303f565b92505060206133fb8582860161316d565b9150509250929050565b60006020828403121561341b5761341a61416a565b5b6000613429848285016130bf565b91505092915050565b6000602082840312156134485761344761416a565b5b6000613456848285016130d4565b91505092915050565b6000602082840312156134755761347461416a565b5b60006134838482850161316d565b91505092915050565b600080604083850312156134a3576134a261416a565b5b60006134b18582860161316d565b92505060206134c28582860161316d565b9150509250929050565b6134d581613e95565b82525050565b6134e481613ea7565b82525050565b60006134f582613d3d565b6134ff8185613d53565b935061350f818560208601613f18565b6135188161416f565b840191505092915050565b600061352e82613d48565b6135388185613d64565b9350613548818560208601613f18565b6135518161416f565b840191505092915050565b600061356782613d48565b6135718185613d75565b9350613581818560208601613f18565b80840191505092915050565b600061359a601f83613d64565b91506135a582614180565b602082019050919050565b60006135bd600e83613d64565b91506135c8826141a9565b602082019050919050565b60006135e0602b83613d64565b91506135eb826141d2565b604082019050919050565b6000613603603283613d64565b915061360e82614221565b604082019050919050565b6000613626602683613d64565b915061363182614270565b604082019050919050565b6000613649602583613d64565b9150613654826142bf565b604082019050919050565b600061366c601c83613d64565b91506136778261430e565b602082019050919050565b600061368f602483613d64565b915061369a82614337565b604082019050919050565b60006136b2601983613d64565b91506136bd82614386565b602082019050919050565b60006136d5602183613d64565b91506136e0826143af565b604082019050919050565b60006136f8602c83613d64565b9150613703826143fe565b604082019050919050565b600061371b603883613d64565b91506137268261444d565b604082019050919050565b600061373e602a83613d64565b91506137498261449c565b604082019050919050565b6000613761602983613d64565b915061376c826144eb565b604082019050919050565b6000613784602e83613d64565b915061378f8261453a565b604082019050919050565b60006137a7602083613d64565b91506137b282614589565b602082019050919050565b60006137ca603183613d64565b91506137d5826145b2565b604082019050919050565b60006137ed602c83613d64565b91506137f882614601565b604082019050919050565b6000613810602083613d64565b915061381b82614650565b602082019050919050565b6000613833602f83613d64565b915061383e82614679565b604082019050919050565b6000613856602183613d64565b9150613861826146c8565b604082019050919050565b6000613879603183613d64565b915061388482614717565b604082019050919050565b600061389c602c83613d64565b91506138a782614766565b604082019050919050565b6138bb81613eff565b82525050565b60006138cd828561355c565b91506138d9828461355c565b91508190509392505050565b60006020820190506138fa60008301846134cc565b92915050565b600060808201905061391560008301876134cc565b61392260208301866134cc565b61392f60408301856138b2565b818103606083015261394181846134ea565b905095945050505050565b600060208201905061396160008301846134db565b92915050565b600060208201905081810360008301526139818184613523565b905092915050565b600060208201905081810360008301526139a28161358d565b9050919050565b600060208201905081810360008301526139c2816135b0565b9050919050565b600060208201905081810360008301526139e2816135d3565b9050919050565b60006020820190508181036000830152613a02816135f6565b9050919050565b60006020820190508181036000830152613a2281613619565b9050919050565b60006020820190508181036000830152613a428161363c565b9050919050565b60006020820190508181036000830152613a628161365f565b9050919050565b60006020820190508181036000830152613a8281613682565b9050919050565b60006020820190508181036000830152613aa2816136a5565b9050919050565b60006020820190508181036000830152613ac2816136c8565b9050919050565b60006020820190508181036000830152613ae2816136eb565b9050919050565b60006020820190508181036000830152613b028161370e565b9050919050565b60006020820190508181036000830152613b2281613731565b9050919050565b60006020820190508181036000830152613b4281613754565b9050919050565b60006020820190508181036000830152613b6281613777565b9050919050565b60006020820190508181036000830152613b828161379a565b9050919050565b60006020820190508181036000830152613ba2816137bd565b9050919050565b60006020820190508181036000830152613bc2816137e0565b9050919050565b60006020820190508181036000830152613be281613803565b9050919050565b60006020820190508181036000830152613c0281613826565b9050919050565b60006020820190508181036000830152613c2281613849565b9050919050565b60006020820190508181036000830152613c428161386c565b9050919050565b60006020820190508181036000830152613c628161388f565b9050919050565b6000602082019050613c7e60008301846138b2565b92915050565b60008083356001602003843603038112613ca157613ca0614151565b5b80840192508235915067ffffffffffffffff821115613cc357613cc261414c565b5b602083019250600182023603831315613cdf57613cde61415b565b5b509250929050565b6000613cf1613d02565b9050613cfd8282613f7d565b919050565b6000604051905090565b600067ffffffffffffffff821115613d2757613d26614113565b5b613d308261416f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613d8b82613eff565b9150613d9683613eff565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613dcb57613dca614028565b5b828201905092915050565b6000613de182613eff565b9150613dec83613eff565b925082613dfc57613dfb614057565b5b828204905092915050565b6000613e1282613eff565b9150613e1d83613eff565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e5657613e55614028565b5b828202905092915050565b6000613e6c82613eff565b9150613e7783613eff565b925082821015613e8a57613e89614028565b5b828203905092915050565b6000613ea082613edf565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613f36578082015181840152602081019050613f1b565b83811115613f45576000848401525b50505050565b60006002820490506001821680613f6357607f821691505b60208210811415613f7757613f76614086565b5b50919050565b613f868261416f565b810181811067ffffffffffffffff82111715613fa557613fa4614113565b5b80604052505050565b6000613fb982613eff565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613fec57613feb614028565b5b600182019050919050565b600061400282613eff565b915061400d83613eff565b92508261401d5761401c614057565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e6572734f6e6c793a204f4e4c595f4f574e4552535f414c4c4f57454400600082015250565b7f4e6f7420656e6f75676820666565000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f43726561746f724f6e6c793a204f4e4c595f43524541544f525f414c4c4f574560008201527f4400000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6147be81613e95565b81146147c957600080fd5b50565b6147d581613ea7565b81146147e057600080fd5b50565b6147ec81613eb3565b81146147f757600080fd5b50565b61480381613eff565b811461480e57600080fd5b5056fea2646970667358221220efc5470cc3837eaaccd9f309668479c1ba8fb117ea44dbecf5b5eb997f5b036a64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000ad78ebc5ac620000000000000000000000000000000000000000000000000000821ab0d441498000000000000000000000000000000000000000000000000000000000000000005dc0000000000000000000000008a04c9a13473fbded852e9650bd095c20b1385870000000000000000000000000000000000000000000000000000000000000009436f726769636c756200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009436f726769636c75620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005a68747470733a2f2f63726f6e6f73636f726769636c75622e6d7970696e6174612e636c6f75642f697066732f516d62775a4c7a5956364e66784e6638313170374a4a74756748336264706e473874626a4e673847665831536b35000000000000

Deployed Bytecode

0x6080604052600436106101f85760003560e01c806368545d931161010d578063ae90b213116100a0578063cd53d08e1161006f578063cd53d08e14610764578063d48e638a146107a1578063e8a3d485146107de578063e985e9c514610809578063f2fde38b14610846576101f8565b8063ae90b21314610696578063b88c9148146106c1578063b88d4fde146106fe578063c87b56dd14610727576101f8565b80638da5cb5b116100dc5780638da5cb5b146105ee578063933a6f0d1461061957806395d89b4114610642578063a22cb4651461066d576101f8565b806368545d931461054157806370a082311461055d578063715018a61461059a5780637f77f574146105b1576101f8565b806323b872dd1161019057806342966c681161015f57806342966c68146104485780634f6ccce71461047157806359646463146104ae5780635fe212ef146104d95780636352211e14610504576101f8565b806323b872dd1461038e5780632f745c59146103b757806334ce10c4146103f457806342842e0e1461041f576101f8565b8063095ea7b3116101cc578063095ea7b3146102d257806315bbd78f146102fb57806318160ddd146103265780631af9cf4914610351576101f8565b806275a317146101fd57806301ffc9a71461022d57806306fdde031461026a578063081812fc14610295575b600080fd5b61021760048036038101906102129190613365565b61086f565b6040516102249190613c69565b60405180910390f35b34801561023957600080fd5b50610254600480360381019061024f9190613405565b6109d8565b604051610261919061394c565b60405180910390f35b34801561027657600080fd5b5061027f6109ea565b60405161028c9190613967565b60405180910390f35b3480156102a157600080fd5b506102bc60048036038101906102b7919061345f565b610a7c565b6040516102c991906138e5565b60405180910390f35b3480156102de57600080fd5b506102f960048036038101906102f491906133c5565b610b01565b005b34801561030757600080fd5b50610310610c19565b60405161031d9190613c69565b60405180910390f35b34801561033257600080fd5b5061033b610c1f565b6040516103489190613c69565b60405180910390f35b34801561035d57600080fd5b506103786004803603810190610373919061345f565b610c2c565b6040516103859190613c69565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b091906131ef565b610c6e565b005b3480156103c357600080fd5b506103de60048036038101906103d991906133c5565b610cce565b6040516103eb9190613c69565b60405180910390f35b34801561040057600080fd5b50610409610d73565b6040516104169190613c69565b60405180910390f35b34801561042b57600080fd5b50610446600480360381019061044191906131ef565b610d7d565b005b34801561045457600080fd5b5061046f600480360381019061046a919061345f565b610d9d565b005b34801561047d57600080fd5b506104986004803603810190610493919061345f565b610e57565b6040516104a59190613c69565b60405180910390f35b3480156104ba57600080fd5b506104c3610ec8565b6040516104d09190613c69565b60405180910390f35b3480156104e557600080fd5b506104ee610ece565b6040516104fb9190613c69565b60405180910390f35b34801561051057600080fd5b5061052b6004803603810190610526919061345f565b610ed4565b60405161053891906138e5565b60405180910390f35b61055b600480360381019061055691906132c5565b610f86565b005b34801561056957600080fd5b50610584600480360381019061057f9190613182565b61112b565b6040516105919190613c69565b60405180910390f35b3480156105a657600080fd5b506105af6111e3565b005b3480156105bd57600080fd5b506105d860048036038101906105d3919061345f565b61126b565b6040516105e59190613c69565b60405180910390f35b3480156105fa57600080fd5b50610603611283565b60405161061091906138e5565b60405180910390f35b34801561062557600080fd5b50610640600480360381019061063b919061348c565b6112ad565b005b34801561064e57600080fd5b5061065761136c565b6040516106649190613967565b60405180910390f35b34801561067957600080fd5b50610694600480360381019061068f9190613325565b6113fe565b005b3480156106a257600080fd5b506106ab611414565b6040516106b891906138e5565b60405180910390f35b3480156106cd57600080fd5b506106e860048036038101906106e39190613182565b61143a565b6040516106f59190613c69565b60405180910390f35b34801561070a57600080fd5b5061072560048036038101906107209190613242565b6114c1565b005b34801561073357600080fd5b5061074e6004803603810190610749919061345f565b611523565b60405161075b9190613967565b60405180910390f35b34801561077057600080fd5b5061078b6004803603810190610786919061345f565b611535565b60405161079891906138e5565b60405180910390f35b3480156107ad57600080fd5b506107c860048036038101906107c3919061345f565b611568565b6040516107d591906138e5565b60405180910390f35b3480156107ea57600080fd5b506107f36115a5565b6040516108009190613967565b60405180910390f35b34801561081557600080fd5b50610830600480360381019061082b91906131af565b611633565b60405161083d919061394c565b60405180910390f35b34801561085257600080fd5b5061086d60048036038101906108689190613182565b6116c7565b005b6000343360016000816012546108859190613e07565b905060145461089460116117d5565b116108aa57816013546108a79190613e07565b90505b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561090557600090505b808414610947576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093e906139a9565b60405180910390fd5b60006109548989896117e3565b905061096060116117bf565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156109c8573d6000803e3d6000fd5b5080955050505050509392505050565b60006109e3826118b1565b9050919050565b6060600080546109f990613f4b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2590613f4b565b8015610a725780601f10610a4757610100808354040283529160200191610a72565b820191906000526020600020905b815481529060010190602001808311610a5557829003601f168201915b5050505050905090565b6000610a878261192b565b610ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abd90613ba9565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b0c82610ed4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7490613c09565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b9c611997565b73ffffffffffffffffffffffffffffffffffffffff161480610bcb5750610bca81610bc5611997565b611633565b5b610c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0190613ae9565b60405180910390fd5b610c14838361199f565b505050565b60135481565b6000600980549050905090565b600080600f6000848152602001908152602001600020541415610c525760fa9050610c69565b600f60008381526020019081526020016000205490505b919050565b610c7f610c79611997565b82611a58565b610cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb590613c29565b60405180910390fd5b610cc9838383611b36565b505050565b6000610cd98361112b565b8210610d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d11906139c9565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000600e54905090565b610d98838383604051806020016040528060008152506114c1565b505050565b803373ffffffffffffffffffffffffffffffffffffffff16610dbe82610ed4565b73ffffffffffffffffffffffffffffffffffffffff1614610e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0b90613989565b60405180910390fd5b610e1d82611d9d565b6010600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050565b6000610e61610c1f565b8210610ea2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9990613c49565b60405180910390fd5b60098281548110610eb657610eb56140e4565b5b90600052602060002001549050919050565b60125481565b60145481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7490613b29565b60405180910390fd5b80915050919050565b343383839050600081601254610f9c9190613e07565b9050601454610fab60116117d5565b11610fc15781601354610fbe9190613e07565b90505b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561101c57600090505b80841461105e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611055906139a9565b60405180910390fd5b60005b868690508110156110b85761109a88888884818110611083576110826140e4565b5b90506020028101906110959190613c84565b6117e3565b506110a560116117bf565b80806110b090613fae565b915050611061565b50601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611121573d6000803e3d6000fd5b5050505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561119c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119390613b09565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111eb611997565b73ffffffffffffffffffffffffffffffffffffffff16611209611283565b73ffffffffffffffffffffffffffffffffffffffff161461125f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125690613bc9565b60405180910390fd5b6112696000611da9565b565b600f6020528060005260406000206000915090505481565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b813373ffffffffffffffffffffffffffffffffffffffff166010600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134690613aa9565b60405180910390fd5b81600f600085815260200190815260200160002081905550505050565b60606001805461137b90613f4b565b80601f01602080910402602001604051908101604052809291908181526020018280546113a790613f4b565b80156113f45780601f106113c9576101008083540402835291602001916113f4565b820191906000526020600020905b8154815290600101906020018083116113d757829003601f168201915b5050505050905090565b611410611409611997565b8383611e6f565b5050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561149b57600090506114bc565b6014546114a6610c1f565b10156114b65760135490506114bc565b60125490505b919050565b6114d26114cc611997565b83611a58565b611511576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150890613c29565b60405180910390fd5b61151d84848484611fdc565b50505050565b606061152e82612038565b9050919050565b60106020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006010600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600c80546115b290613f4b565b80601f01602080910402602001604051908101604052809291908181526020018280546115de90613f4b565b801561162b5780601f106116005761010080835404028352916020019161162b565b820191906000526020600020905b81548152906001019060200180831161160e57829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6116cf611997565b73ffffffffffffffffffffffffffffffffffffffff166116ed611283565b73ffffffffffffffffffffffffffffffffffffffff1614611743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173a90613bc9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117aa90613a09565b60405180910390fd5b6117bc81611da9565b50565b6001816000016000828254019250508190555050565b600081600001549050919050565b6000806117f0600d6117d5565b90506117fc600d6117bf565b611806858261218a565b336010600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506118a68185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506121a8565b809150509392505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061192457506119238261221c565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a1283610ed4565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611a638261192b565b611aa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9990613ac9565b60405180910390fd5b6000611aad83610ed4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b1c57508373ffffffffffffffffffffffffffffffffffffffff16611b0484610a7c565b73ffffffffffffffffffffffffffffffffffffffff16145b80611b2d5750611b2c8185611633565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b5682610ed4565b73ffffffffffffffffffffffffffffffffffffffff1614611bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba390613a29565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1390613a69565b60405180910390fd5b611c278383836122fe565b611c3260008261199f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c829190613e61565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cd99190613d80565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d9883838361230e565b505050565b611da681612313565b50565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed590613a89565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fcf919061394c565b60405180910390a3505050565b611fe7848484611b36565b611ff384848484612366565b612032576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612029906139e9565b60405180910390fd5b50505050565b60606120438261192b565b612082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207990613b89565b60405180910390fd5b60006006600084815260200190815260200160002080546120a290613f4b565b80601f01602080910402602001604051908101604052809291908181526020018280546120ce90613f4b565b801561211b5780601f106120f05761010080835404028352916020019161211b565b820191906000526020600020905b8154815290600101906020018083116120fe57829003601f168201915b50505050509050600061212c6124fd565b9050600081511415612142578192505050612185565b60008251111561217757808260405160200161215f9291906138c1565b60405160208183030381529060405292505050612185565b61218084612514565b925050505b919050565b6121a48282604051806020016040528060008152506125bb565b5050565b6121b18261192b565b6121f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e790613b49565b60405180910390fd5b80600660008481526020019081526020016000209080519060200190612217929190612f1a565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806122e757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806122f757506122f682612616565b5b9050919050565b612309838383612680565b505050565b505050565b61231c81612794565b600060066000838152602001908152602001600020805461233c90613f4b565b905014612363576006600082815260200190815260200160002060006123629190612fa0565b5b50565b60006123878473ffffffffffffffffffffffffffffffffffffffff166128b1565b156124f0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123b0611997565b8786866040518563ffffffff1660e01b81526004016123d29493929190613900565b602060405180830381600087803b1580156123ec57600080fd5b505af192505050801561241d57506040513d601f19601f8201168201806040525081019061241a9190613432565b60015b6124a0573d806000811461244d576040519150601f19603f3d011682016040523d82523d6000602084013e612452565b606091505b50600081511415612498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248f906139e9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124f5565b600190505b949350505050565b606060405180602001604052806000815250905090565b606061251f8261192b565b61255e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255590613be9565b60405180910390fd5b60006125686124fd565b9050600081511161258857604051806020016040528060008152506125b3565b80612592846128d4565b6040516020016125a39291906138c1565b6040516020818303038152906040525b915050919050565b6125c58383612a35565b6125d26000848484612366565b612611576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612608906139e9565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61268b838383612c0f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126ce576126c981612c14565b61270d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461270c5761270b8382612c5d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127505761274b81612dca565b61278f565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461278e5761278d8282612e9b565b5b5b505050565b600061279f82610ed4565b90506127ad816000846122fe565b6127b860008361199f565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128089190613e61565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128ad8160008461230e565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060600082141561291c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a30565b600082905060005b6000821461294e57808061293790613fae565b915050600a826129479190613dd6565b9150612924565b60008167ffffffffffffffff81111561296a57612969614113565b5b6040519080825280601f01601f19166020018201604052801561299c5781602001600182028036833780820191505090505b5090505b60008514612a29576001826129b59190613e61565b9150600a856129c49190613ff7565b60306129d09190613d80565b60f81b8183815181106129e6576129e56140e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a229190613dd6565b94506129a0565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9c90613b69565b60405180910390fd5b612aae8161192b565b15612aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae590613a49565b60405180910390fd5b612afa600083836122fe565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b4a9190613d80565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c0b6000838361230e565b5050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c6a8461112b565b612c749190613e61565b9050600060086000848152602001908152602001600020549050818114612d59576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050612dde9190613e61565b90506000600a6000848152602001908152602001600020549050600060098381548110612e0e57612e0d6140e4565b5b906000526020600020015490508060098381548110612e3057612e2f6140e4565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480612e7f57612e7e6140b5565b5b6001900381819060005260206000200160009055905550505050565b6000612ea68361112b565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b828054612f2690613f4b565b90600052602060002090601f016020900481019282612f485760008555612f8f565b82601f10612f6157805160ff1916838001178555612f8f565b82800160010185558215612f8f579182015b82811115612f8e578251825591602001919060010190612f73565b5b509050612f9c9190612fe0565b5090565b508054612fac90613f4b565b6000825580601f10612fbe5750612fdd565b601f016020900490600052602060002090810190612fdc9190612fe0565b5b50565b5b80821115612ff9576000816000905550600101612fe1565b5090565b600061301061300b84613d0c565b613ce7565b90508281526020810184848401111561302c5761302b614160565b5b613037848285613f09565b509392505050565b60008135905061304e816147b5565b92915050565b60008083601f84011261306a57613069614147565b5b8235905067ffffffffffffffff81111561308757613086614142565b5b6020830191508360208202830111156130a3576130a2614156565b5b9250929050565b6000813590506130b9816147cc565b92915050565b6000813590506130ce816147e3565b92915050565b6000815190506130e3816147e3565b92915050565b600082601f8301126130fe576130fd614147565b5b813561310e848260208601612ffd565b91505092915050565b60008083601f84011261312d5761312c614147565b5b8235905067ffffffffffffffff81111561314a57613149614142565b5b60208301915083600182028301111561316657613165614156565b5b9250929050565b60008135905061317c816147fa565b92915050565b6000602082840312156131985761319761416a565b5b60006131a68482850161303f565b91505092915050565b600080604083850312156131c6576131c561416a565b5b60006131d48582860161303f565b92505060206131e58582860161303f565b9150509250929050565b6000806000606084860312156132085761320761416a565b5b60006132168682870161303f565b93505060206132278682870161303f565b92505060406132388682870161316d565b9150509250925092565b6000806000806080858703121561325c5761325b61416a565b5b600061326a8782880161303f565b945050602061327b8782880161303f565b935050604061328c8782880161316d565b925050606085013567ffffffffffffffff8111156132ad576132ac614165565b5b6132b9878288016130e9565b91505092959194509250565b6000806000604084860312156132de576132dd61416a565b5b60006132ec8682870161303f565b935050602084013567ffffffffffffffff81111561330d5761330c614165565b5b61331986828701613054565b92509250509250925092565b6000806040838503121561333c5761333b61416a565b5b600061334a8582860161303f565b925050602061335b858286016130aa565b9150509250929050565b60008060006040848603121561337e5761337d61416a565b5b600061338c8682870161303f565b935050602084013567ffffffffffffffff8111156133ad576133ac614165565b5b6133b986828701613117565b92509250509250925092565b600080604083850312156133dc576133db61416a565b5b60006133ea8582860161303f565b92505060206133fb8582860161316d565b9150509250929050565b60006020828403121561341b5761341a61416a565b5b6000613429848285016130bf565b91505092915050565b6000602082840312156134485761344761416a565b5b6000613456848285016130d4565b91505092915050565b6000602082840312156134755761347461416a565b5b60006134838482850161316d565b91505092915050565b600080604083850312156134a3576134a261416a565b5b60006134b18582860161316d565b92505060206134c28582860161316d565b9150509250929050565b6134d581613e95565b82525050565b6134e481613ea7565b82525050565b60006134f582613d3d565b6134ff8185613d53565b935061350f818560208601613f18565b6135188161416f565b840191505092915050565b600061352e82613d48565b6135388185613d64565b9350613548818560208601613f18565b6135518161416f565b840191505092915050565b600061356782613d48565b6135718185613d75565b9350613581818560208601613f18565b80840191505092915050565b600061359a601f83613d64565b91506135a582614180565b602082019050919050565b60006135bd600e83613d64565b91506135c8826141a9565b602082019050919050565b60006135e0602b83613d64565b91506135eb826141d2565b604082019050919050565b6000613603603283613d64565b915061360e82614221565b604082019050919050565b6000613626602683613d64565b915061363182614270565b604082019050919050565b6000613649602583613d64565b9150613654826142bf565b604082019050919050565b600061366c601c83613d64565b91506136778261430e565b602082019050919050565b600061368f602483613d64565b915061369a82614337565b604082019050919050565b60006136b2601983613d64565b91506136bd82614386565b602082019050919050565b60006136d5602183613d64565b91506136e0826143af565b604082019050919050565b60006136f8602c83613d64565b9150613703826143fe565b604082019050919050565b600061371b603883613d64565b91506137268261444d565b604082019050919050565b600061373e602a83613d64565b91506137498261449c565b604082019050919050565b6000613761602983613d64565b915061376c826144eb565b604082019050919050565b6000613784602e83613d64565b915061378f8261453a565b604082019050919050565b60006137a7602083613d64565b91506137b282614589565b602082019050919050565b60006137ca603183613d64565b91506137d5826145b2565b604082019050919050565b60006137ed602c83613d64565b91506137f882614601565b604082019050919050565b6000613810602083613d64565b915061381b82614650565b602082019050919050565b6000613833602f83613d64565b915061383e82614679565b604082019050919050565b6000613856602183613d64565b9150613861826146c8565b604082019050919050565b6000613879603183613d64565b915061388482614717565b604082019050919050565b600061389c602c83613d64565b91506138a782614766565b604082019050919050565b6138bb81613eff565b82525050565b60006138cd828561355c565b91506138d9828461355c565b91508190509392505050565b60006020820190506138fa60008301846134cc565b92915050565b600060808201905061391560008301876134cc565b61392260208301866134cc565b61392f60408301856138b2565b818103606083015261394181846134ea565b905095945050505050565b600060208201905061396160008301846134db565b92915050565b600060208201905081810360008301526139818184613523565b905092915050565b600060208201905081810360008301526139a28161358d565b9050919050565b600060208201905081810360008301526139c2816135b0565b9050919050565b600060208201905081810360008301526139e2816135d3565b9050919050565b60006020820190508181036000830152613a02816135f6565b9050919050565b60006020820190508181036000830152613a2281613619565b9050919050565b60006020820190508181036000830152613a428161363c565b9050919050565b60006020820190508181036000830152613a628161365f565b9050919050565b60006020820190508181036000830152613a8281613682565b9050919050565b60006020820190508181036000830152613aa2816136a5565b9050919050565b60006020820190508181036000830152613ac2816136c8565b9050919050565b60006020820190508181036000830152613ae2816136eb565b9050919050565b60006020820190508181036000830152613b028161370e565b9050919050565b60006020820190508181036000830152613b2281613731565b9050919050565b60006020820190508181036000830152613b4281613754565b9050919050565b60006020820190508181036000830152613b6281613777565b9050919050565b60006020820190508181036000830152613b828161379a565b9050919050565b60006020820190508181036000830152613ba2816137bd565b9050919050565b60006020820190508181036000830152613bc2816137e0565b9050919050565b60006020820190508181036000830152613be281613803565b9050919050565b60006020820190508181036000830152613c0281613826565b9050919050565b60006020820190508181036000830152613c2281613849565b9050919050565b60006020820190508181036000830152613c428161386c565b9050919050565b60006020820190508181036000830152613c628161388f565b9050919050565b6000602082019050613c7e60008301846138b2565b92915050565b60008083356001602003843603038112613ca157613ca0614151565b5b80840192508235915067ffffffffffffffff821115613cc357613cc261414c565b5b602083019250600182023603831315613cdf57613cde61415b565b5b509250929050565b6000613cf1613d02565b9050613cfd8282613f7d565b919050565b6000604051905090565b600067ffffffffffffffff821115613d2757613d26614113565b5b613d308261416f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613d8b82613eff565b9150613d9683613eff565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613dcb57613dca614028565b5b828201905092915050565b6000613de182613eff565b9150613dec83613eff565b925082613dfc57613dfb614057565b5b828204905092915050565b6000613e1282613eff565b9150613e1d83613eff565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e5657613e55614028565b5b828202905092915050565b6000613e6c82613eff565b9150613e7783613eff565b925082821015613e8a57613e89614028565b5b828203905092915050565b6000613ea082613edf565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613f36578082015181840152602081019050613f1b565b83811115613f45576000848401525b50505050565b60006002820490506001821680613f6357607f821691505b60208210811415613f7757613f76614086565b5b50919050565b613f868261416f565b810181811067ffffffffffffffff82111715613fa557613fa4614113565b5b80604052505050565b6000613fb982613eff565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613fec57613feb614028565b5b600182019050919050565b600061400282613eff565b915061400d83613eff565b92508261401d5761401c614057565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e6572734f6e6c793a204f4e4c595f4f574e4552535f414c4c4f57454400600082015250565b7f4e6f7420656e6f75676820666565000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f43726561746f724f6e6c793a204f4e4c595f43524541544f525f414c4c4f574560008201527f4400000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6147be81613e95565b81146147c957600080fd5b50565b6147d581613ea7565b81146147e057600080fd5b50565b6147ec81613eb3565b81146147f757600080fd5b50565b61480381613eff565b811461480e57600080fd5b5056fea2646970667358221220efc5470cc3837eaaccd9f309668479c1ba8fb117ea44dbecf5b5eb997f5b036a64736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000ad78ebc5ac620000000000000000000000000000000000000000000000000000821ab0d441498000000000000000000000000000000000000000000000000000000000000000005dc0000000000000000000000008a04c9a13473fbded852e9650bd095c20b1385870000000000000000000000000000000000000000000000000000000000000009436f726769636c756200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009436f726769636c75620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005a68747470733a2f2f63726f6e6f73636f726769636c75622e6d7970696e6174612e636c6f75642f697066732f516d62775a4c7a5956364e66784e6638313170374a4a74756748336264706e473874626a4e673847665831536b35000000000000

-----Decoded View---------------
Arg [0] : _name (string): Corgiclub
Arg [1] : _symbol (string): Corgiclub
Arg [2] : _uri (string): https://cronoscorgiclub.mypinata.cloud/ipfs/QmbwZLzYV6NfxNf811p7JJtugH3bdpnG8tbjNg8GfX1Sk5
Arg [3] : _publicFee (uint256): 200000000000000000000
Arg [4] : _earlyFee (uint256): 150000000000000000000
Arg [5] : _earlyLimit (uint32): 1500
Arg [6] : _payee (address): 0x8a04c9a13473fbded852e9650bd095c20b138587

-----Encoded View---------------
15 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [3] : 00000000000000000000000000000000000000000000000ad78ebc5ac6200000
Arg [4] : 00000000000000000000000000000000000000000000000821ab0d4414980000
Arg [5] : 00000000000000000000000000000000000000000000000000000000000005dc
Arg [6] : 0000000000000000000000008a04c9a13473fbded852e9650bd095c20b138587
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [8] : 436f726769636c75620000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [10] : 436f726769636c75620000000000000000000000000000000000000000000000
Arg [11] : 000000000000000000000000000000000000000000000000000000000000005a
Arg [12] : 68747470733a2f2f63726f6e6f73636f726769636c75622e6d7970696e617461
Arg [13] : 2e636c6f75642f697066732f516d62775a4c7a5956364e66784e663831317037
Arg [14] : 4a4a74756748336264706e473874626a4e673847665831536b35000000000000


Deployed ByteCode Sourcemap

59534:2224:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60862:325;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59065:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22697:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24256:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23779:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59705:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39626:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61572:183;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25006:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39294:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58636:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25416:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58138:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39816:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59674:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59735:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22391:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61195:369;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22121:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46855:103;;;;;;;;;;;;;:::i;:::-;;56943:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46204:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58255:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22866:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24549:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59767:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60229:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25672:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59269:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56994:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58517:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56768:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24775:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47113:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60862:325;61017:7;60965:9;60976:10;60988:1;60585:11;60611:8;60599:9;;:20;;;;:::i;:::-;60585:34;;60656:10;;60634:18;:8;:16;:18::i;:::-;:32;60630:90;;60700:8;60689;;:19;;;;:::i;:::-;60683:25;;60630:90;60744:5;;;;;;;;;;;60734:15;;:6;:15;;;60730:55;;;60772:1;60766:7;;60730:55;60812:3;60803:5;:12;60795:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;61037:10:::1;61050:33;61063:13;61078:4;;61050:12;:33::i;:::-;61037:46;;61094:20;:8;:18;:20::i;:::-;61133:5;;;;;;;;;;;61125:23;;:34;61149:9;61125:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;61177:2;61170:9;;;60574:280:::0;60862:325;;;;;;;;:::o;59065:196::-;59188:4;59217:36;59241:11;59217:23;:36::i;:::-;59210:43;;59065:196;;;:::o;22697:100::-;22751:13;22784:5;22777:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22697:100;:::o;24256:221::-;24332:7;24360:16;24368:7;24360;:16::i;:::-;24352:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24445:15;:24;24461:7;24445:24;;;;;;;;;;;;;;;;;;;;;24438:31;;24256:221;;;:::o;23779:411::-;23860:13;23876:23;23891:7;23876:14;:23::i;:::-;23860:39;;23924:5;23918:11;;:2;:11;;;;23910:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24018:5;24002:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24027:37;24044:5;24051:12;:10;:12::i;:::-;24027:16;:37::i;:::-;24002:62;23980:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24161:21;24170:2;24174:7;24161:8;:21::i;:::-;23849:341;23779:411;;:::o;59705:23::-;;;;:::o;39626:113::-;39687:7;39714:10;:17;;;;39707:24;;39626:113;:::o;61572:183::-;61634:7;61676:1;61658:9;:14;61668:3;61658:14;;;;;;;;;;;;:19;61654:62;;;61701:3;61694:10;;;;61654:62;61733:9;:14;61743:3;61733:14;;;;;;;;;;;;61726:21;;61572:183;;;;:::o;25006:339::-;25201:41;25220:12;:10;:12::i;:::-;25234:7;25201:18;:41::i;:::-;25193:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25309:28;25319:4;25325:2;25329:7;25309:9;:28::i;:::-;25006:339;;;:::o;39294:256::-;39391:7;39427:23;39444:5;39427:16;:23::i;:::-;39419:5;:31;39411:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;39516:12;:19;39529:5;39516:19;;;;;;;;;;;;;;;:26;39536:5;39516:26;;;;;;;;;;;;39509:33;;39294:256;;;;:::o;58636:94::-;58688:7;58715;;58708:14;;58636:94;:::o;25416:185::-;25554:39;25571:4;25577:2;25581:7;25554:39;;;;;;;;;;;;:16;:39::i;:::-;25416:185;;;:::o;58138:109::-;58182:3;57259:10;57243:26;;:12;57251:3;57243:7;:12::i;:::-;:26;;;57235:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;58198:10:::1;58204:3;58198:5;:10::i;:::-;58226:8;:13;58235:3;58226:13;;;;;;;;;;;;58219:20;;;;;;;;;;;58138:109:::0;;:::o;39816:233::-;39891:7;39927:30;:28;:30::i;:::-;39919:5;:38;39911:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;40024:10;40035:5;40024:17;;;;;;;;:::i;:::-;;;;;;;;;;40017:24;;39816:233;;;:::o;59674:24::-;;;;:::o;59735:25::-;;;;:::o;22391:239::-;22463:7;22483:13;22499:7;:16;22507:7;22499:16;;;;;;;;;;;;;;;;;;;;;22483:32;;22551:1;22534:19;;:5;:19;;;;22526:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22617:5;22610:12;;;22391:239;;;:::o;61195:369::-;61305:9;61316:10;61328:5;;:12;;60585:11;60611:8;60599:9;;:20;;;;:::i;:::-;60585:34;;60656:10;;60634:18;:8;:16;:18::i;:::-;:32;60630:90;;60700:8;60689;;:19;;;;:::i;:::-;60683:25;;60630:90;60744:5;;;;;;;;;;;60734:15;;:6;:15;;;60730:55;;;60772:1;60766:7;;60730:55;60812:3;60803:5;:12;60795:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;61375:9:::1;61370:142;61394:5;;:12;;61390:1;:16;61370:142;;;61428:37;61441:13;61456:5;;61462:1;61456:8;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;61428:12;:37::i;:::-;;61480:20;:8;:18;:20::i;:::-;61408:3;;;;;:::i;:::-;;;;61370:142;;;;61530:5;;;;;;;;;;;61522:23;;:34;61546:9;61522:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;60574:280:::0;61195:369;;;;;;:::o;22121:208::-;22193:7;22238:1;22221:19;;:5;:19;;;;22213:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22305:9;:16;22315:5;22305:16;;;;;;;;;;;;;;;;22298:23;;22121:208;;;:::o;46855:103::-;46435:12;:10;:12::i;:::-;46424:23;;:7;:5;:7::i;:::-;:23;;;46416:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46920:30:::1;46947:1;46920:18;:30::i;:::-;46855:103::o:0;56943:44::-;;;;;;;;;;;;;;;;;:::o;46204:87::-;46250:7;46277:6;;;;;;;;;;;46270:13;;46204:87;:::o;58255:126::-;58333:3;57116:10;57099:27;;:8;:13;57108:3;57099:13;;;;;;;;;;;;;;;;;;;;;:27;;;57091:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;58366:7:::1;58349:9;:14;58359:3;58349:14;;;;;;;;;;;:24;;;;58255:126:::0;;;:::o;22866:104::-;22922:13;22955:7;22948:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22866:104;:::o;24549:155::-;24644:52;24663:12;:10;:12::i;:::-;24677:8;24687;24644:18;:52::i;:::-;24549:155;;:::o;59767:20::-;;;;;;;;;;;;;:::o;60229:269::-;60282:7;60316:5;;;;;;;;;;;60306:15;;:6;:15;;;60302:56;;;60345:1;60338:8;;;;60302:56;60388:10;;60372:13;:11;:13::i;:::-;:26;60368:123;;;60422:8;;60415:15;;;;60368:123;60470:9;;60463:16;;60229:269;;;;:::o;25672:328::-;25847:41;25866:12;:10;:12::i;:::-;25880:7;25847:18;:41::i;:::-;25839:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25953:39;25967:4;25973:2;25977:7;25986:5;25953:13;:39::i;:::-;25672:328;;;;:::o;59269:180::-;59380:13;59418:23;59433:7;59418:14;:23::i;:::-;59411:30;;59269:180;;;:::o;56994:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;58517:111::-;58580:7;58607:8;:13;58616:3;58607:13;;;;;;;;;;;;;;;;;;;;;58600:20;;58517:111;;;:::o;56768:25::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24775:164::-;24872:4;24896:18;:25;24915:5;24896:25;;;;;;;;;;;;;;;:35;24922:8;24896:35;;;;;;;;;;;;;;;;;;;;;;;;;24889:42;;24775:164;;;;:::o;47113:201::-;46435:12;:10;:12::i;:::-;46424:23;;:7;:5;:7::i;:::-;:23;;;46416:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47222:1:::1;47202:22;;:8;:22;;;;47194:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;47278:28;47297:8;47278:18;:28::i;:::-;47113:201:::0;:::o;48676:127::-;48783:1;48765:7;:14;;;:19;;;;;;;;;;;48676:127;:::o;48554:114::-;48619:7;48646;:14;;;48639:21;;48554:114;;;:::o;57542:345::-;57660:7;57680:11;57694:18;:8;:16;:18::i;:::-;57680:32;;57723:20;:8;:18;:20::i;:::-;57756:29;57766:13;57781:3;57756:9;:29::i;:::-;57812:10;57796:8;:13;57805:3;57796:13;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;57835:23;57848:3;57853:4;;57835:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;:23::i;:::-;57876:3;57869:10;;;57542:345;;;;;:::o;38986:224::-;39088:4;39127:35;39112:50;;;:11;:50;;;;:90;;;;39166:36;39190:11;39166:23;:36::i;:::-;39112:90;39105:97;;38986:224;;;:::o;27510:127::-;27575:4;27627:1;27599:30;;:7;:16;27607:7;27599:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27592:37;;27510:127;;;:::o;16952:98::-;17005:7;17032:10;17025:17;;16952:98;:::o;31656:174::-;31758:2;31731:15;:24;31747:7;31731:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31814:7;31810:2;31776:46;;31785:23;31800:7;31785:14;:23::i;:::-;31776:46;;;;;;;;;;;;31656:174;;:::o;27804:348::-;27897:4;27922:16;27930:7;27922;:16::i;:::-;27914:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27998:13;28014:23;28029:7;28014:14;:23::i;:::-;27998:39;;28067:5;28056:16;;:7;:16;;;:51;;;;28100:7;28076:31;;:20;28088:7;28076:11;:20::i;:::-;:31;;;28056:51;:87;;;;28111:32;28128:5;28135:7;28111:16;:32::i;:::-;28056:87;28048:96;;;27804:348;;;;:::o;30913:625::-;31072:4;31045:31;;:23;31060:7;31045:14;:23::i;:::-;:31;;;31037:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;31151:1;31137:16;;:2;:16;;;;31129:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31207:39;31228:4;31234:2;31238:7;31207:20;:39::i;:::-;31311:29;31328:1;31332:7;31311:8;:29::i;:::-;31372:1;31353:9;:15;31363:4;31353:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31401:1;31384:9;:13;31394:2;31384:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31432:2;31413:7;:16;31421:7;31413:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31471:7;31467:2;31452:27;;31461:4;31452:27;;;;;;;;;;;;31492:38;31512:4;31518:2;31522:7;31492:19;:38::i;:::-;30913:625;;;:::o;58942:115::-;59029:20;59041:7;59029:11;:20::i;:::-;58942:115;:::o;47474:191::-;47548:16;47567:6;;;;;;;;;;;47548:25;;47593:8;47584:6;;:17;;;;;;;;;;;;;;;;;;47648:8;47617:40;;47638:8;47617:40;;;;;;;;;;;;47537:128;47474:191;:::o;31972:315::-;32127:8;32118:17;;:5;:17;;;;32110:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32214:8;32176:18;:25;32195:5;32176:25;;;;;;;;;;;;;;;:35;32202:8;32176:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;32260:8;32238:41;;32253:5;32238:41;;;32270:8;32238:41;;;;;;:::i;:::-;;;;;;;;31972:315;;;:::o;26882:::-;27039:28;27049:4;27055:2;27059:7;27039:9;:28::i;:::-;27086:48;27109:4;27115:2;27119:7;27128:5;27086:22;:48::i;:::-;27078:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26882:315;;;;:::o;35385:679::-;35458:13;35492:16;35500:7;35492;:16::i;:::-;35484:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;35575:23;35601:10;:19;35612:7;35601:19;;;;;;;;;;;35575:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35631:18;35652:10;:8;:10::i;:::-;35631:31;;35760:1;35744:4;35738:18;:23;35734:72;;;35785:9;35778:16;;;;;;35734:72;35936:1;35916:9;35910:23;:27;35906:108;;;35985:4;35991:9;35968:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35954:48;;;;;;35906:108;36033:23;36048:7;36033:14;:23::i;:::-;36026:30;;;;35385:679;;;;:::o;28494:110::-;28570:26;28580:2;28584:7;28570:26;;;;;;;;;;;;:9;:26::i;:::-;28494:110;;:::o;36220:217::-;36320:16;36328:7;36320;:16::i;:::-;36312:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;36420:9;36398:10;:19;36409:7;36398:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;36220:217;;:::o;21752:305::-;21854:4;21906:25;21891:40;;;:11;:40;;;;:105;;;;21963:33;21948:48;;;:11;:48;;;;21891:105;:158;;;;22013:36;22037:11;22013:23;:36::i;:::-;21891:158;21871:178;;21752:305;;;:::o;58738:196::-;58881:45;58908:4;58914:2;58918:7;58881:26;:45::i;:::-;58738:196;;;:::o;34734:125::-;;;;:::o;36666:206::-;36735:20;36747:7;36735:11;:20::i;:::-;36809:1;36778:10;:19;36789:7;36778:19;;;;;;;;;;;36772:33;;;;;:::i;:::-;;;:38;36768:97;;36834:10;:19;36845:7;36834:19;;;;;;;;;;;;36827:26;;;;:::i;:::-;36768:97;36666:206;:::o;32852:799::-;33007:4;33028:15;:2;:13;;;:15::i;:::-;33024:620;;;33080:2;33064:36;;;33101:12;:10;:12::i;:::-;33115:4;33121:7;33130:5;33064:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33060:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33323:1;33306:6;:13;:18;33302:272;;;33349:60;;;;;;;;;;:::i;:::-;;;;;;;;33302:272;33524:6;33518:13;33509:6;33505:2;33501:15;33494:38;33060:529;33197:41;;;33187:51;;;:6;:51;;;;33180:58;;;;;33024:620;33628:4;33621:11;;32852:799;;;;;;;:::o;23623:94::-;23674:13;23700:9;;;;;;;;;;;;;;23623:94;:::o;23041:334::-;23114:13;23148:16;23156:7;23148;:16::i;:::-;23140:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;23229:21;23253:10;:8;:10::i;:::-;23229:34;;23305:1;23287:7;23281:21;:25;:86;;;;;;;;;;;;;;;;;23333:7;23342:18;:7;:16;:18::i;:::-;23316:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23281:86;23274:93;;;23041:334;;;:::o;28831:321::-;28961:18;28967:2;28971:7;28961:5;:18::i;:::-;29012:54;29043:1;29047:2;29051:7;29060:5;29012:22;:54::i;:::-;28990:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28831:321;;;:::o;20173:157::-;20258:4;20297:25;20282:40;;;:11;:40;;;;20275:47;;20173:157;;;:::o;40662:589::-;40806:45;40833:4;40839:2;40843:7;40806:26;:45::i;:::-;40884:1;40868:18;;:4;:18;;;40864:187;;;40903:40;40935:7;40903:31;:40::i;:::-;40864:187;;;40973:2;40965:10;;:4;:10;;;40961:90;;40992:47;41025:4;41031:7;40992:32;:47::i;:::-;40961:90;40864:187;41079:1;41065:16;;:2;:16;;;41061:183;;;41098:45;41135:7;41098:36;:45::i;:::-;41061:183;;;41171:4;41165:10;;:2;:10;;;41161:83;;41192:40;41220:2;41224:7;41192:27;:40::i;:::-;41161:83;41061:183;40662:589;;;:::o;30156:420::-;30216:13;30232:23;30247:7;30232:14;:23::i;:::-;30216:39;;30268:48;30289:5;30304:1;30308:7;30268:20;:48::i;:::-;30357:29;30374:1;30378:7;30357:8;:29::i;:::-;30419:1;30399:9;:16;30409:5;30399:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;30438:7;:16;30446:7;30438:16;;;;;;;;;;;;30431:23;;;;;;;;;;;30500:7;30496:1;30472:36;;30481:5;30472:36;;;;;;;;;;;;30521:47;30541:5;30556:1;30560:7;30521:19;:47::i;:::-;30205:371;30156:420;:::o;8993:326::-;9053:4;9310:1;9288:7;:19;;;:23;9281:30;;8993:326;;;:::o;17541:723::-;17597:13;17827:1;17818:5;:10;17814:53;;;17845:10;;;;;;;;;;;;;;;;;;;;;17814:53;17877:12;17892:5;17877:20;;17908:14;17933:78;17948:1;17940:4;:9;17933:78;;17966:8;;;;;:::i;:::-;;;;17997:2;17989:10;;;;;:::i;:::-;;;17933:78;;;18021:19;18053:6;18043:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18021:39;;18071:154;18087:1;18078:5;:10;18071:154;;18115:1;18105:11;;;;;:::i;:::-;;;18182:2;18174:5;:10;;;;:::i;:::-;18161:2;:24;;;;:::i;:::-;18148:39;;18131:6;18138;18131:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18211:2;18202:11;;;;;:::i;:::-;;;18071:154;;;18249:6;18235:21;;;;;17541:723;;;;:::o;29488:439::-;29582:1;29568:16;;:2;:16;;;;29560:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29641:16;29649:7;29641;:16::i;:::-;29640:17;29632:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29703:45;29732:1;29736:2;29740:7;29703:20;:45::i;:::-;29778:1;29761:9;:13;29771:2;29761:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29809:2;29790:7;:16;29798:7;29790:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29854:7;29850:2;29829:33;;29846:1;29829:33;;;;;;;;;;;;29875:44;29903:1;29907:2;29911:7;29875:19;:44::i;:::-;29488:439;;:::o;34223:126::-;;;;:::o;41974:164::-;42078:10;:17;;;;42051:15;:24;42067:7;42051:24;;;;;;;;;;;:44;;;;42106:10;42122:7;42106:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41974:164;:::o;42765:988::-;43031:22;43081:1;43056:22;43073:4;43056:16;:22::i;:::-;:26;;;;:::i;:::-;43031:51;;43093:18;43114:17;:26;43132:7;43114:26;;;;;;;;;;;;43093:47;;43261:14;43247:10;:28;43243:328;;43292:19;43314:12;:18;43327:4;43314:18;;;;;;;;;;;;;;;:34;43333:14;43314:34;;;;;;;;;;;;43292:56;;43398:11;43365:12;:18;43378:4;43365:18;;;;;;;;;;;;;;;:30;43384:10;43365:30;;;;;;;;;;;:44;;;;43515:10;43482:17;:30;43500:11;43482:30;;;;;;;;;;;:43;;;;43277:294;43243:328;43667:17;:26;43685:7;43667:26;;;;;;;;;;;43660:33;;;43711:12;:18;43724:4;43711:18;;;;;;;;;;;;;;;:34;43730:14;43711:34;;;;;;;;;;;43704:41;;;42846:907;;42765:988;;:::o;44048:1079::-;44301:22;44346:1;44326:10;:17;;;;:21;;;;:::i;:::-;44301:46;;44358:18;44379:15;:24;44395:7;44379:24;;;;;;;;;;;;44358:45;;44730:19;44752:10;44763:14;44752:26;;;;;;;;:::i;:::-;;;;;;;;;;44730:48;;44816:11;44791:10;44802;44791:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;44927:10;44896:15;:28;44912:11;44896:28;;;;;;;;;;;:41;;;;45068:15;:24;45084:7;45068:24;;;;;;;;;;;45061:31;;;45103:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44119:1008;;;44048:1079;:::o;41552:221::-;41637:14;41654:20;41671:2;41654:16;:20::i;:::-;41637:37;;41712:7;41685:12;:16;41698:2;41685:16;;;;;;;;;;;;;;;:24;41702:6;41685:24;;;;;;;;;;;:34;;;;41759:6;41730:17;:26;41748:7;41730:26;;;;;;;;;;;:35;;;;41626:147;41552:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;584:580::-;669:8;679:6;729:3;722:4;714:6;710:17;706:27;696:122;;737:79;;:::i;:::-;696:122;850:6;837:20;827:30;;880:18;872:6;869:30;866:117;;;902:79;;:::i;:::-;866:117;1016:4;1008:6;1004:17;992:29;;1070:3;1062:4;1054:6;1050:17;1040:8;1036:32;1033:41;1030:128;;;1077:79;;:::i;:::-;1030:128;584:580;;;;;:::o;1170:133::-;1213:5;1251:6;1238:20;1229:29;;1267:30;1291:5;1267:30;:::i;:::-;1170:133;;;;:::o;1309:137::-;1354:5;1392:6;1379:20;1370:29;;1408:32;1434:5;1408:32;:::i;:::-;1309:137;;;;:::o;1452:141::-;1508:5;1539:6;1533:13;1524:22;;1555:32;1581:5;1555:32;:::i;:::-;1452:141;;;;:::o;1612:338::-;1667:5;1716:3;1709:4;1701:6;1697:17;1693:27;1683:122;;1724:79;;:::i;:::-;1683:122;1841:6;1828:20;1866:78;1940:3;1932:6;1925:4;1917:6;1913:17;1866:78;:::i;:::-;1857:87;;1673:277;1612:338;;;;:::o;1970:553::-;2028:8;2038:6;2088:3;2081:4;2073:6;2069:17;2065:27;2055:122;;2096:79;;:::i;:::-;2055:122;2209:6;2196:20;2186:30;;2239:18;2231:6;2228:30;2225:117;;;2261:79;;:::i;:::-;2225:117;2375:4;2367:6;2363:17;2351:29;;2429:3;2421:4;2413:6;2409:17;2399:8;2395:32;2392:41;2389:128;;;2436:79;;:::i;:::-;2389:128;1970:553;;;;;:::o;2529:139::-;2575:5;2613:6;2600:20;2591:29;;2629:33;2656:5;2629:33;:::i;:::-;2529:139;;;;:::o;2674:329::-;2733:6;2782:2;2770:9;2761:7;2757:23;2753:32;2750:119;;;2788:79;;:::i;:::-;2750:119;2908:1;2933:53;2978:7;2969:6;2958:9;2954:22;2933:53;:::i;:::-;2923:63;;2879:117;2674:329;;;;:::o;3009:474::-;3077:6;3085;3134:2;3122:9;3113:7;3109:23;3105:32;3102:119;;;3140:79;;:::i;:::-;3102:119;3260:1;3285:53;3330:7;3321:6;3310:9;3306:22;3285:53;:::i;:::-;3275:63;;3231:117;3387:2;3413:53;3458:7;3449:6;3438:9;3434:22;3413:53;:::i;:::-;3403:63;;3358:118;3009:474;;;;;:::o;3489:619::-;3566:6;3574;3582;3631:2;3619:9;3610:7;3606:23;3602:32;3599:119;;;3637:79;;:::i;:::-;3599:119;3757:1;3782:53;3827:7;3818:6;3807:9;3803:22;3782:53;:::i;:::-;3772:63;;3728:117;3884:2;3910:53;3955:7;3946:6;3935:9;3931:22;3910:53;:::i;:::-;3900:63;;3855:118;4012:2;4038:53;4083:7;4074:6;4063:9;4059:22;4038:53;:::i;:::-;4028:63;;3983:118;3489:619;;;;;:::o;4114:943::-;4209:6;4217;4225;4233;4282:3;4270:9;4261:7;4257:23;4253:33;4250:120;;;4289:79;;:::i;:::-;4250:120;4409:1;4434:53;4479:7;4470:6;4459:9;4455:22;4434:53;:::i;:::-;4424:63;;4380:117;4536:2;4562:53;4607:7;4598:6;4587:9;4583:22;4562:53;:::i;:::-;4552:63;;4507:118;4664:2;4690:53;4735:7;4726:6;4715:9;4711:22;4690:53;:::i;:::-;4680:63;;4635:118;4820:2;4809:9;4805:18;4792:32;4851:18;4843:6;4840:30;4837:117;;;4873:79;;:::i;:::-;4837:117;4978:62;5032:7;5023:6;5012:9;5008:22;4978:62;:::i;:::-;4968:72;;4763:287;4114:943;;;;;;;:::o;5063:728::-;5170:6;5178;5186;5235:2;5223:9;5214:7;5210:23;5206:32;5203:119;;;5241:79;;:::i;:::-;5203:119;5361:1;5386:53;5431:7;5422:6;5411:9;5407:22;5386:53;:::i;:::-;5376:63;;5332:117;5516:2;5505:9;5501:18;5488:32;5547:18;5539:6;5536:30;5533:117;;;5569:79;;:::i;:::-;5533:117;5682:92;5766:7;5757:6;5746:9;5742:22;5682:92;:::i;:::-;5664:110;;;;5459:325;5063:728;;;;;:::o;5797:468::-;5862:6;5870;5919:2;5907:9;5898:7;5894:23;5890:32;5887:119;;;5925:79;;:::i;:::-;5887:119;6045:1;6070:53;6115:7;6106:6;6095:9;6091:22;6070:53;:::i;:::-;6060:63;;6016:117;6172:2;6198:50;6240:7;6231:6;6220:9;6216:22;6198:50;:::i;:::-;6188:60;;6143:115;5797:468;;;;;:::o;6271:674::-;6351:6;6359;6367;6416:2;6404:9;6395:7;6391:23;6387:32;6384:119;;;6422:79;;:::i;:::-;6384:119;6542:1;6567:53;6612:7;6603:6;6592:9;6588:22;6567:53;:::i;:::-;6557:63;;6513:117;6697:2;6686:9;6682:18;6669:32;6728:18;6720:6;6717:30;6714:117;;;6750:79;;:::i;:::-;6714:117;6863:65;6920:7;6911:6;6900:9;6896:22;6863:65;:::i;:::-;6845:83;;;;6640:298;6271:674;;;;;:::o;6951:474::-;7019:6;7027;7076:2;7064:9;7055:7;7051:23;7047:32;7044:119;;;7082:79;;:::i;:::-;7044:119;7202:1;7227:53;7272:7;7263:6;7252:9;7248:22;7227:53;:::i;:::-;7217:63;;7173:117;7329:2;7355:53;7400:7;7391:6;7380:9;7376:22;7355:53;:::i;:::-;7345:63;;7300:118;6951:474;;;;;:::o;7431:327::-;7489:6;7538:2;7526:9;7517:7;7513:23;7509:32;7506:119;;;7544:79;;:::i;:::-;7506:119;7664:1;7689:52;7733:7;7724:6;7713:9;7709:22;7689:52;:::i;:::-;7679:62;;7635:116;7431:327;;;;:::o;7764:349::-;7833:6;7882:2;7870:9;7861:7;7857:23;7853:32;7850:119;;;7888:79;;:::i;:::-;7850:119;8008:1;8033:63;8088:7;8079:6;8068:9;8064:22;8033:63;:::i;:::-;8023:73;;7979:127;7764:349;;;;:::o;8119:329::-;8178:6;8227:2;8215:9;8206:7;8202:23;8198:32;8195:119;;;8233:79;;:::i;:::-;8195:119;8353:1;8378:53;8423:7;8414:6;8403:9;8399:22;8378:53;:::i;:::-;8368:63;;8324:117;8119:329;;;;:::o;8454:474::-;8522:6;8530;8579:2;8567:9;8558:7;8554:23;8550:32;8547:119;;;8585:79;;:::i;:::-;8547:119;8705:1;8730:53;8775:7;8766:6;8755:9;8751:22;8730:53;:::i;:::-;8720:63;;8676:117;8832:2;8858:53;8903:7;8894:6;8883:9;8879:22;8858:53;:::i;:::-;8848:63;;8803:118;8454:474;;;;;:::o;8934:118::-;9021:24;9039:5;9021:24;:::i;:::-;9016:3;9009:37;8934:118;;:::o;9058:109::-;9139:21;9154:5;9139:21;:::i;:::-;9134:3;9127:34;9058:109;;:::o;9173:360::-;9259:3;9287:38;9319:5;9287:38;:::i;:::-;9341:70;9404:6;9399:3;9341:70;:::i;:::-;9334:77;;9420:52;9465:6;9460:3;9453:4;9446:5;9442:16;9420:52;:::i;:::-;9497:29;9519:6;9497:29;:::i;:::-;9492:3;9488:39;9481:46;;9263:270;9173:360;;;;:::o;9539:364::-;9627:3;9655:39;9688:5;9655:39;:::i;:::-;9710:71;9774:6;9769:3;9710:71;:::i;:::-;9703:78;;9790:52;9835:6;9830:3;9823:4;9816:5;9812:16;9790:52;:::i;:::-;9867:29;9889:6;9867:29;:::i;:::-;9862:3;9858:39;9851:46;;9631:272;9539:364;;;;:::o;9909:377::-;10015:3;10043:39;10076:5;10043:39;:::i;:::-;10098:89;10180:6;10175:3;10098:89;:::i;:::-;10091:96;;10196:52;10241:6;10236:3;10229:4;10222:5;10218:16;10196:52;:::i;:::-;10273:6;10268:3;10264:16;10257:23;;10019:267;9909:377;;;;:::o;10292:366::-;10434:3;10455:67;10519:2;10514:3;10455:67;:::i;:::-;10448:74;;10531:93;10620:3;10531:93;:::i;:::-;10649:2;10644:3;10640:12;10633:19;;10292:366;;;:::o;10664:::-;10806:3;10827:67;10891:2;10886:3;10827:67;:::i;:::-;10820:74;;10903:93;10992:3;10903:93;:::i;:::-;11021:2;11016:3;11012:12;11005:19;;10664:366;;;:::o;11036:::-;11178:3;11199:67;11263:2;11258:3;11199:67;:::i;:::-;11192:74;;11275:93;11364:3;11275:93;:::i;:::-;11393:2;11388:3;11384:12;11377:19;;11036:366;;;:::o;11408:::-;11550:3;11571:67;11635:2;11630:3;11571:67;:::i;:::-;11564:74;;11647:93;11736:3;11647:93;:::i;:::-;11765:2;11760:3;11756:12;11749:19;;11408:366;;;:::o;11780:::-;11922:3;11943:67;12007:2;12002:3;11943:67;:::i;:::-;11936:74;;12019:93;12108:3;12019:93;:::i;:::-;12137:2;12132:3;12128:12;12121:19;;11780:366;;;:::o;12152:::-;12294:3;12315:67;12379:2;12374:3;12315:67;:::i;:::-;12308:74;;12391:93;12480:3;12391:93;:::i;:::-;12509:2;12504:3;12500:12;12493:19;;12152:366;;;:::o;12524:::-;12666:3;12687:67;12751:2;12746:3;12687:67;:::i;:::-;12680:74;;12763:93;12852:3;12763:93;:::i;:::-;12881:2;12876:3;12872:12;12865:19;;12524:366;;;:::o;12896:::-;13038:3;13059:67;13123:2;13118:3;13059:67;:::i;:::-;13052:74;;13135:93;13224:3;13135:93;:::i;:::-;13253:2;13248:3;13244:12;13237:19;;12896:366;;;:::o;13268:::-;13410:3;13431:67;13495:2;13490:3;13431:67;:::i;:::-;13424:74;;13507:93;13596:3;13507:93;:::i;:::-;13625:2;13620:3;13616:12;13609:19;;13268:366;;;:::o;13640:::-;13782:3;13803:67;13867:2;13862:3;13803:67;:::i;:::-;13796:74;;13879:93;13968:3;13879:93;:::i;:::-;13997:2;13992:3;13988:12;13981:19;;13640:366;;;:::o;14012:::-;14154:3;14175:67;14239:2;14234:3;14175:67;:::i;:::-;14168:74;;14251:93;14340:3;14251:93;:::i;:::-;14369:2;14364:3;14360:12;14353:19;;14012:366;;;:::o;14384:::-;14526:3;14547:67;14611:2;14606:3;14547:67;:::i;:::-;14540:74;;14623:93;14712:3;14623:93;:::i;:::-;14741:2;14736:3;14732:12;14725:19;;14384:366;;;:::o;14756:::-;14898:3;14919:67;14983:2;14978:3;14919:67;:::i;:::-;14912:74;;14995:93;15084:3;14995:93;:::i;:::-;15113:2;15108:3;15104:12;15097:19;;14756:366;;;:::o;15128:::-;15270:3;15291:67;15355:2;15350:3;15291:67;:::i;:::-;15284:74;;15367:93;15456:3;15367:93;:::i;:::-;15485:2;15480:3;15476:12;15469:19;;15128:366;;;:::o;15500:::-;15642:3;15663:67;15727:2;15722:3;15663:67;:::i;:::-;15656:74;;15739:93;15828:3;15739:93;:::i;:::-;15857:2;15852:3;15848:12;15841:19;;15500:366;;;:::o;15872:::-;16014:3;16035:67;16099:2;16094:3;16035:67;:::i;:::-;16028:74;;16111:93;16200:3;16111:93;:::i;:::-;16229:2;16224:3;16220:12;16213:19;;15872:366;;;:::o;16244:::-;16386:3;16407:67;16471:2;16466:3;16407:67;:::i;:::-;16400:74;;16483:93;16572:3;16483:93;:::i;:::-;16601:2;16596:3;16592:12;16585:19;;16244:366;;;:::o;16616:::-;16758:3;16779:67;16843:2;16838:3;16779:67;:::i;:::-;16772:74;;16855:93;16944:3;16855:93;:::i;:::-;16973:2;16968:3;16964:12;16957:19;;16616:366;;;:::o;16988:::-;17130:3;17151:67;17215:2;17210:3;17151:67;:::i;:::-;17144:74;;17227:93;17316:3;17227:93;:::i;:::-;17345:2;17340:3;17336:12;17329:19;;16988:366;;;:::o;17360:::-;17502:3;17523:67;17587:2;17582:3;17523:67;:::i;:::-;17516:74;;17599:93;17688:3;17599:93;:::i;:::-;17717:2;17712:3;17708:12;17701:19;;17360:366;;;:::o;17732:::-;17874:3;17895:67;17959:2;17954:3;17895:67;:::i;:::-;17888:74;;17971:93;18060:3;17971:93;:::i;:::-;18089:2;18084:3;18080:12;18073:19;;17732:366;;;:::o;18104:::-;18246:3;18267:67;18331:2;18326:3;18267:67;:::i;:::-;18260:74;;18343:93;18432:3;18343:93;:::i;:::-;18461:2;18456:3;18452:12;18445:19;;18104:366;;;:::o;18476:::-;18618:3;18639:67;18703:2;18698:3;18639:67;:::i;:::-;18632:74;;18715:93;18804:3;18715:93;:::i;:::-;18833:2;18828:3;18824:12;18817:19;;18476:366;;;:::o;18848:118::-;18935:24;18953:5;18935:24;:::i;:::-;18930:3;18923:37;18848:118;;:::o;18972:435::-;19152:3;19174:95;19265:3;19256:6;19174:95;:::i;:::-;19167:102;;19286:95;19377:3;19368:6;19286:95;:::i;:::-;19279:102;;19398:3;19391:10;;18972:435;;;;;:::o;19413:222::-;19506:4;19544:2;19533:9;19529:18;19521:26;;19557:71;19625:1;19614:9;19610:17;19601:6;19557:71;:::i;:::-;19413:222;;;;:::o;19641:640::-;19836:4;19874:3;19863:9;19859:19;19851:27;;19888:71;19956:1;19945:9;19941:17;19932:6;19888:71;:::i;:::-;19969:72;20037:2;20026:9;20022:18;20013:6;19969:72;:::i;:::-;20051;20119:2;20108:9;20104:18;20095:6;20051:72;:::i;:::-;20170:9;20164:4;20160:20;20155:2;20144:9;20140:18;20133:48;20198:76;20269:4;20260:6;20198:76;:::i;:::-;20190:84;;19641:640;;;;;;;:::o;20287:210::-;20374:4;20412:2;20401:9;20397:18;20389:26;;20425:65;20487:1;20476:9;20472:17;20463:6;20425:65;:::i;:::-;20287:210;;;;:::o;20503:313::-;20616:4;20654:2;20643:9;20639:18;20631:26;;20703:9;20697:4;20693:20;20689:1;20678:9;20674:17;20667:47;20731:78;20804:4;20795:6;20731:78;:::i;:::-;20723:86;;20503:313;;;;:::o;20822:419::-;20988:4;21026:2;21015:9;21011:18;21003:26;;21075:9;21069:4;21065:20;21061:1;21050:9;21046:17;21039:47;21103:131;21229:4;21103:131;:::i;:::-;21095:139;;20822:419;;;:::o;21247:::-;21413:4;21451:2;21440:9;21436:18;21428:26;;21500:9;21494:4;21490:20;21486:1;21475:9;21471:17;21464:47;21528:131;21654:4;21528:131;:::i;:::-;21520:139;;21247:419;;;:::o;21672:::-;21838:4;21876:2;21865:9;21861:18;21853:26;;21925:9;21919:4;21915:20;21911:1;21900:9;21896:17;21889:47;21953:131;22079:4;21953:131;:::i;:::-;21945:139;;21672:419;;;:::o;22097:::-;22263:4;22301:2;22290:9;22286:18;22278:26;;22350:9;22344:4;22340:20;22336:1;22325:9;22321:17;22314:47;22378:131;22504:4;22378:131;:::i;:::-;22370:139;;22097:419;;;:::o;22522:::-;22688:4;22726:2;22715:9;22711:18;22703:26;;22775:9;22769:4;22765:20;22761:1;22750:9;22746:17;22739:47;22803:131;22929:4;22803:131;:::i;:::-;22795:139;;22522:419;;;:::o;22947:::-;23113:4;23151:2;23140:9;23136:18;23128:26;;23200:9;23194:4;23190:20;23186:1;23175:9;23171:17;23164:47;23228:131;23354:4;23228:131;:::i;:::-;23220:139;;22947:419;;;:::o;23372:::-;23538:4;23576:2;23565:9;23561:18;23553:26;;23625:9;23619:4;23615:20;23611:1;23600:9;23596:17;23589:47;23653:131;23779:4;23653:131;:::i;:::-;23645:139;;23372:419;;;:::o;23797:::-;23963:4;24001:2;23990:9;23986:18;23978:26;;24050:9;24044:4;24040:20;24036:1;24025:9;24021:17;24014:47;24078:131;24204:4;24078:131;:::i;:::-;24070:139;;23797:419;;;:::o;24222:::-;24388:4;24426:2;24415:9;24411:18;24403:26;;24475:9;24469:4;24465:20;24461:1;24450:9;24446:17;24439:47;24503:131;24629:4;24503:131;:::i;:::-;24495:139;;24222:419;;;:::o;24647:::-;24813:4;24851:2;24840:9;24836:18;24828:26;;24900:9;24894:4;24890:20;24886:1;24875:9;24871:17;24864:47;24928:131;25054:4;24928:131;:::i;:::-;24920:139;;24647:419;;;:::o;25072:::-;25238:4;25276:2;25265:9;25261:18;25253:26;;25325:9;25319:4;25315:20;25311:1;25300:9;25296:17;25289:47;25353:131;25479:4;25353:131;:::i;:::-;25345:139;;25072:419;;;:::o;25497:::-;25663:4;25701:2;25690:9;25686:18;25678:26;;25750:9;25744:4;25740:20;25736:1;25725:9;25721:17;25714:47;25778:131;25904:4;25778:131;:::i;:::-;25770:139;;25497:419;;;:::o;25922:::-;26088:4;26126:2;26115:9;26111:18;26103:26;;26175:9;26169:4;26165:20;26161:1;26150:9;26146:17;26139:47;26203:131;26329:4;26203:131;:::i;:::-;26195:139;;25922:419;;;:::o;26347:::-;26513:4;26551:2;26540:9;26536:18;26528:26;;26600:9;26594:4;26590:20;26586:1;26575:9;26571:17;26564:47;26628:131;26754:4;26628:131;:::i;:::-;26620:139;;26347:419;;;:::o;26772:::-;26938:4;26976:2;26965:9;26961:18;26953:26;;27025:9;27019:4;27015:20;27011:1;27000:9;26996:17;26989:47;27053:131;27179:4;27053:131;:::i;:::-;27045:139;;26772:419;;;:::o;27197:::-;27363:4;27401:2;27390:9;27386:18;27378:26;;27450:9;27444:4;27440:20;27436:1;27425:9;27421:17;27414:47;27478:131;27604:4;27478:131;:::i;:::-;27470:139;;27197:419;;;:::o;27622:::-;27788:4;27826:2;27815:9;27811:18;27803:26;;27875:9;27869:4;27865:20;27861:1;27850:9;27846:17;27839:47;27903:131;28029:4;27903:131;:::i;:::-;27895:139;;27622:419;;;:::o;28047:::-;28213:4;28251:2;28240:9;28236:18;28228:26;;28300:9;28294:4;28290:20;28286:1;28275:9;28271:17;28264:47;28328:131;28454:4;28328:131;:::i;:::-;28320:139;;28047:419;;;:::o;28472:::-;28638:4;28676:2;28665:9;28661:18;28653:26;;28725:9;28719:4;28715:20;28711:1;28700:9;28696:17;28689:47;28753:131;28879:4;28753:131;:::i;:::-;28745:139;;28472:419;;;:::o;28897:::-;29063:4;29101:2;29090:9;29086:18;29078:26;;29150:9;29144:4;29140:20;29136:1;29125:9;29121:17;29114:47;29178:131;29304:4;29178:131;:::i;:::-;29170:139;;28897:419;;;:::o;29322:::-;29488:4;29526:2;29515:9;29511:18;29503:26;;29575:9;29569:4;29565:20;29561:1;29550:9;29546:17;29539:47;29603:131;29729:4;29603:131;:::i;:::-;29595:139;;29322:419;;;:::o;29747:::-;29913:4;29951:2;29940:9;29936:18;29928:26;;30000:9;29994:4;29990:20;29986:1;29975:9;29971:17;29964:47;30028:131;30154:4;30028:131;:::i;:::-;30020:139;;29747:419;;;:::o;30172:::-;30338:4;30376:2;30365:9;30361:18;30353:26;;30425:9;30419:4;30415:20;30411:1;30400:9;30396:17;30389:47;30453:131;30579:4;30453:131;:::i;:::-;30445:139;;30172:419;;;:::o;30597:222::-;30690:4;30728:2;30717:9;30713:18;30705:26;;30741:71;30809:1;30798:9;30794:17;30785:6;30741:71;:::i;:::-;30597:222;;;;:::o;30825:725::-;30903:4;30909:6;30965:11;30952:25;31065:1;31059:4;31055:12;31044:8;31028:14;31024:29;31020:48;31000:18;30996:73;30986:168;;31073:79;;:::i;:::-;30986:168;31185:18;31175:8;31171:33;31163:41;;31237:4;31224:18;31214:28;;31265:18;31257:6;31254:30;31251:117;;;31287:79;;:::i;:::-;31251:117;31395:2;31389:4;31385:13;31377:21;;31452:4;31444:6;31440:17;31424:14;31420:38;31414:4;31410:49;31407:136;;;31462:79;;:::i;:::-;31407:136;30916:634;30825:725;;;;;:::o;31556:129::-;31590:6;31617:20;;:::i;:::-;31607:30;;31646:33;31674:4;31666:6;31646:33;:::i;:::-;31556:129;;;:::o;31691:75::-;31724:6;31757:2;31751:9;31741:19;;31691:75;:::o;31772:307::-;31833:4;31923:18;31915:6;31912:30;31909:56;;;31945:18;;:::i;:::-;31909:56;31983:29;32005:6;31983:29;:::i;:::-;31975:37;;32067:4;32061;32057:15;32049:23;;31772:307;;;:::o;32085:98::-;32136:6;32170:5;32164:12;32154:22;;32085:98;;;:::o;32189:99::-;32241:6;32275:5;32269:12;32259:22;;32189:99;;;:::o;32294:168::-;32377:11;32411:6;32406:3;32399:19;32451:4;32446:3;32442:14;32427:29;;32294:168;;;;:::o;32468:169::-;32552:11;32586:6;32581:3;32574:19;32626:4;32621:3;32617:14;32602:29;;32468:169;;;;:::o;32643:148::-;32745:11;32782:3;32767:18;;32643:148;;;;:::o;32797:305::-;32837:3;32856:20;32874:1;32856:20;:::i;:::-;32851:25;;32890:20;32908:1;32890:20;:::i;:::-;32885:25;;33044:1;32976:66;32972:74;32969:1;32966:81;32963:107;;;33050:18;;:::i;:::-;32963:107;33094:1;33091;33087:9;33080:16;;32797:305;;;;:::o;33108:185::-;33148:1;33165:20;33183:1;33165:20;:::i;:::-;33160:25;;33199:20;33217:1;33199:20;:::i;:::-;33194:25;;33238:1;33228:35;;33243:18;;:::i;:::-;33228:35;33285:1;33282;33278:9;33273:14;;33108:185;;;;:::o;33299:348::-;33339:7;33362:20;33380:1;33362:20;:::i;:::-;33357:25;;33396:20;33414:1;33396:20;:::i;:::-;33391:25;;33584:1;33516:66;33512:74;33509:1;33506:81;33501:1;33494:9;33487:17;33483:105;33480:131;;;33591:18;;:::i;:::-;33480:131;33639:1;33636;33632:9;33621:20;;33299:348;;;;:::o;33653:191::-;33693:4;33713:20;33731:1;33713:20;:::i;:::-;33708:25;;33747:20;33765:1;33747:20;:::i;:::-;33742:25;;33786:1;33783;33780:8;33777:34;;;33791:18;;:::i;:::-;33777:34;33836:1;33833;33829:9;33821:17;;33653:191;;;;:::o;33850:96::-;33887:7;33916:24;33934:5;33916:24;:::i;:::-;33905:35;;33850:96;;;:::o;33952:90::-;33986:7;34029:5;34022:13;34015:21;34004:32;;33952:90;;;:::o;34048:149::-;34084:7;34124:66;34117:5;34113:78;34102:89;;34048:149;;;:::o;34203:126::-;34240:7;34280:42;34273:5;34269:54;34258:65;;34203:126;;;:::o;34335:77::-;34372:7;34401:5;34390:16;;34335:77;;;:::o;34418:154::-;34502:6;34497:3;34492;34479:30;34564:1;34555:6;34550:3;34546:16;34539:27;34418:154;;;:::o;34578:307::-;34646:1;34656:113;34670:6;34667:1;34664:13;34656:113;;;34755:1;34750:3;34746:11;34740:18;34736:1;34731:3;34727:11;34720:39;34692:2;34689:1;34685:10;34680:15;;34656:113;;;34787:6;34784:1;34781:13;34778:101;;;34867:1;34858:6;34853:3;34849:16;34842:27;34778:101;34627:258;34578:307;;;:::o;34891:320::-;34935:6;34972:1;34966:4;34962:12;34952:22;;35019:1;35013:4;35009:12;35040:18;35030:81;;35096:4;35088:6;35084:17;35074:27;;35030:81;35158:2;35150:6;35147:14;35127:18;35124:38;35121:84;;;35177:18;;:::i;:::-;35121:84;34942:269;34891:320;;;:::o;35217:281::-;35300:27;35322:4;35300:27;:::i;:::-;35292:6;35288:40;35430:6;35418:10;35415:22;35394:18;35382:10;35379:34;35376:62;35373:88;;;35441:18;;:::i;:::-;35373:88;35481:10;35477:2;35470:22;35260:238;35217:281;;:::o;35504:233::-;35543:3;35566:24;35584:5;35566:24;:::i;:::-;35557:33;;35612:66;35605:5;35602:77;35599:103;;;35682:18;;:::i;:::-;35599:103;35729:1;35722:5;35718:13;35711:20;;35504:233;;;:::o;35743:176::-;35775:1;35792:20;35810:1;35792:20;:::i;:::-;35787:25;;35826:20;35844:1;35826:20;:::i;:::-;35821:25;;35865:1;35855:35;;35870:18;;:::i;:::-;35855:35;35911:1;35908;35904:9;35899:14;;35743:176;;;;:::o;35925:180::-;35973:77;35970:1;35963:88;36070:4;36067:1;36060:15;36094:4;36091:1;36084:15;36111:180;36159:77;36156:1;36149:88;36256:4;36253:1;36246:15;36280:4;36277:1;36270:15;36297:180;36345:77;36342:1;36335:88;36442:4;36439:1;36432:15;36466:4;36463:1;36456:15;36483:180;36531:77;36528:1;36521:88;36628:4;36625:1;36618:15;36652:4;36649:1;36642:15;36669:180;36717:77;36714:1;36707:88;36814:4;36811:1;36804:15;36838:4;36835:1;36828:15;36855:180;36903:77;36900:1;36893:88;37000:4;36997:1;36990:15;37024:4;37021:1;37014:15;37041:117;37150:1;37147;37140:12;37164:117;37273:1;37270;37263:12;37287:117;37396:1;37393;37386:12;37410:117;37519:1;37516;37509:12;37533:117;37642:1;37639;37632:12;37656:117;37765:1;37762;37755:12;37779:117;37888:1;37885;37878:12;37902:117;38011:1;38008;38001:12;38025:117;38134:1;38131;38124:12;38148:102;38189:6;38240:2;38236:7;38231:2;38224:5;38220:14;38216:28;38206:38;;38148:102;;;:::o;38256:181::-;38396:33;38392:1;38384:6;38380:14;38373:57;38256:181;:::o;38443:164::-;38583:16;38579:1;38571:6;38567:14;38560:40;38443:164;:::o;38613:230::-;38753:34;38749:1;38741:6;38737:14;38730:58;38822:13;38817:2;38809:6;38805:15;38798:38;38613:230;:::o;38849:237::-;38989:34;38985:1;38977:6;38973:14;38966:58;39058:20;39053:2;39045:6;39041:15;39034:45;38849:237;:::o;39092:225::-;39232:34;39228:1;39220:6;39216:14;39209:58;39301:8;39296:2;39288:6;39284:15;39277:33;39092:225;:::o;39323:224::-;39463:34;39459:1;39451:6;39447:14;39440:58;39532:7;39527:2;39519:6;39515:15;39508:32;39323:224;:::o;39553:178::-;39693:30;39689:1;39681:6;39677:14;39670:54;39553:178;:::o;39737:223::-;39877:34;39873:1;39865:6;39861:14;39854:58;39946:6;39941:2;39933:6;39929:15;39922:31;39737:223;:::o;39966:175::-;40106:27;40102:1;40094:6;40090:14;40083:51;39966:175;:::o;40147:220::-;40287:34;40283:1;40275:6;40271:14;40264:58;40356:3;40351:2;40343:6;40339:15;40332:28;40147:220;:::o;40373:231::-;40513:34;40509:1;40501:6;40497:14;40490:58;40582:14;40577:2;40569:6;40565:15;40558:39;40373:231;:::o;40610:243::-;40750:34;40746:1;40738:6;40734:14;40727:58;40819:26;40814:2;40806:6;40802:15;40795:51;40610:243;:::o;40859:229::-;40999:34;40995:1;40987:6;40983:14;40976:58;41068:12;41063:2;41055:6;41051:15;41044:37;40859:229;:::o;41094:228::-;41234:34;41230:1;41222:6;41218:14;41211:58;41303:11;41298:2;41290:6;41286:15;41279:36;41094:228;:::o;41328:233::-;41468:34;41464:1;41456:6;41452:14;41445:58;41537:16;41532:2;41524:6;41520:15;41513:41;41328:233;:::o;41567:182::-;41707:34;41703:1;41695:6;41691:14;41684:58;41567:182;:::o;41755:236::-;41895:34;41891:1;41883:6;41879:14;41872:58;41964:19;41959:2;41951:6;41947:15;41940:44;41755:236;:::o;41997:231::-;42137:34;42133:1;42125:6;42121:14;42114:58;42206:14;42201:2;42193:6;42189:15;42182:39;41997:231;:::o;42234:182::-;42374:34;42370:1;42362:6;42358:14;42351:58;42234:182;:::o;42422:234::-;42562:34;42558:1;42550:6;42546:14;42539:58;42631:17;42626:2;42618:6;42614:15;42607:42;42422:234;:::o;42662:220::-;42802:34;42798:1;42790:6;42786:14;42779:58;42871:3;42866:2;42858:6;42854:15;42847:28;42662:220;:::o;42888:236::-;43028:34;43024:1;43016:6;43012:14;43005:58;43097:19;43092:2;43084:6;43080:15;43073:44;42888:236;:::o;43130:231::-;43270:34;43266:1;43258:6;43254:14;43247:58;43339:14;43334:2;43326:6;43322:15;43315:39;43130:231;:::o;43367:122::-;43440:24;43458:5;43440:24;:::i;:::-;43433:5;43430:35;43420:63;;43479:1;43476;43469:12;43420:63;43367:122;:::o;43495:116::-;43565:21;43580:5;43565:21;:::i;:::-;43558:5;43555:32;43545:60;;43601:1;43598;43591:12;43545:60;43495:116;:::o;43617:120::-;43689:23;43706:5;43689:23;:::i;:::-;43682:5;43679:34;43669:62;;43727:1;43724;43717:12;43669:62;43617:120;:::o;43743:122::-;43816:24;43834:5;43816:24;:::i;:::-;43809:5;43806:35;43796:63;;43855:1;43852;43845:12;43796:63;43743:122;:::o

Swarm Source

ipfs://efc5470cc3837eaaccd9f309668479c1ba8fb117ea44dbecf5b5eb997f5b036a
Loading