ETH Price: $2,123.21 (-10.63%)

Token

Quacks for the People ()
 

Overview

Max Total Supply

104

Holders

49

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x56CD7D6D1cA6059D7cFF85819159e86a82893f80
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
QuacksForThePeople

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-17
*/

// SPDX-License-Identifier: MIT
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/ERC1155/[email protected]
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256 id,
        uint256 value
    );

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(
        address indexed account,
        address indexed operator,
        bool approved
    );

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id)
        external
        view
        returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator)
        external
        view
        returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

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

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

pragma solidity ^0.8.0;

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File @openzeppelin/contracts/token/ERC1155/extensions/[email protected]
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

// File @openzeppelin/contracts/utils/[email protected]
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File @openzeppelin/contracts/utils/[email protected]
// 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/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/ERC1155/[email protected]

pragma solidity ^0.8.0;

/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            account != address(0),
            "ERC1155: address zero is not a valid owner"
        );
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(
            accounts.length == ids.length,
            "ERC1155: accounts and ids length mismatch"
        );

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        uint256 fromBalance = _balances[id][from];
        require(
            fromBalance >= amount,
            "ERC1155: insufficient balance for transfer"
        );
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(
            ids.length == amounts.length,
            "ERC1155: ids and amounts length mismatch"
        );
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(
                fromBalance >= amount,
                "ERC1155: insufficient balance for transfer"
            );
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(
            operator,
            from,
            to,
            ids,
            amounts,
            data
        );
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(
            operator,
            address(0),
            to,
            id,
            amount,
            data
        );
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(
            ids.length == amounts.length,
            "ERC1155: ids and amounts length mismatch"
        );

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(
            operator,
            address(0),
            to,
            ids,
            amounts,
            data
        );
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(
            ids.length == amounts.length,
            "ERC1155: ids and amounts length mismatch"
        );

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(
                fromBalance >= amount,
                "ERC1155: burn amount exceeds balance"
            );
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `ids` and `amounts` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try
                IERC1155Receiver(to).onERC1155Received(
                    operator,
                    from,
                    id,
                    amount,
                    data
                )
            returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try
                IERC1155Receiver(to).onERC1155BatchReceived(
                    operator,
                    from,
                    ids,
                    amounts,
                    data
                )
            returns (bytes4 response) {
                if (
                    response != IERC1155Receiver.onERC1155BatchReceived.selector
                ) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element)
        private
        pure
        returns (uint256[] memory)
    {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// File @openzeppelin/contracts/utils/[email protected]
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

// File @openzeppelin/contracts/access/[email protected]
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

// File @openzeppelin/contracts/token/ERC1155/extensions/[email protected]
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol)

pragma solidity ^0.8.0;

/**
 * @dev Extension of ERC1155 that adds tracking of total supply per id.
 *
 * Useful for scenarios where Fungible and Non-fungible tokens have to be
 * clearly identified. Note: While a totalSupply of 1 might mean the
 * corresponding is an NFT, there is no guarantees that no other token with the
 * same id are not going to be minted.
 */
abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupply;

    /**
     * @dev Total amount of tokens in with a given id.
     */
    function totalSupply(uint256 id) public view virtual returns (uint256) {
        return _totalSupply[id];
    }

    /**
     * @dev Indicates whether any token exist with a given id, or not.
     */
    function exists(uint256 id) public view virtual returns (bool) {
        return ERC1155Supply.totalSupply(id) > 0;
    }

    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        if (from == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] += amounts[i];
            }
        }

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                uint256 id = ids[i];
                uint256 amount = amounts[i];
                uint256 supply = _totalSupply[id];
                require(
                    supply >= amount,
                    "ERC1155: burn amount exceeds totalSupply"
                );
                unchecked {
                    _totalSupply[id] = supply - amount;
                }
            }
        }
    }
}

pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}


pragma solidity ^0.8.13;

//import {IOperatorFilterRegistry} from "./IOperatorFilterRegistry.sol";

/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
        _;
    }
}

pragma solidity ^0.8.13;

//import {OperatorFilterer} from "./OperatorFilterer.sol";

/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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


interface iQuacksQQ_OG is IERC721 {
    function burnAndCombine(
        uint256 _tokenID,
        uint256[] calldata tokenIds
    ) external payable ;
    
    function tokenIdLevels(uint256)  external view returns(uint256);
}

interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(
        uint256 tokenId,
        uint256 salePrice
    ) external view returns (address receiver, uint256 royaltyAmount);
}

/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}


pragma solidity ^0.8.0;

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


pragma solidity ^0.8.6;

contract QuacksForThePeople is ERC1155, IERC721Receiver, Ownable, DefaultOperatorFilterer, ReentrancyGuard, ERC2981 {
    using Strings for uint256;

    string public baseURI = "ipfs://bafybeifyne7flhgsjjk42fhgrybclwwappc2oopgqqd5zju4axo2tmgcgi/";
    string public name = "Quacks for the People";

    mapping(uint8 => uint256 ) public tokenIdsBurnsNeeded;
    mapping(uint8 => uint8 ) public tokenIdsTokenIdToBurn;
    mapping(uint8 => bool) public tokenIdsMintStatus;
    mapping(uint8 => uint256 ) public tokenIdsMintPrice;
    mapping(uint8 => bool) public tokenIdsBurnToRedeemStatus;
    address public NFTContractAddress_ = 0x5231298cf21aCf2f5a3128872867cb02043f169E;
    iQuacksQQ_OG immutable OgQuacksNFT;

    event SetBaseURI(string indexed _baseURI);

    constructor(string memory _baseURI) ERC1155(_baseURI) {
        // tokenIdsMintStatus[1] = true;
        // tokenIdsMintPrice[1] = 0.005 ether;
        emit SetBaseURI(baseURI);
        OgQuacksNFT = iQuacksQQ_OG(NFTContractAddress_);
    }

 /**
     * @dev See {IERC1155-setApprovalForAll}.
     *      In this example the added modifier ensures that the operator is allowed by the OperatorFilterRegistry.
     */
    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     *      In this example the added modifier ensures that the operator is allowed by the OperatorFilterRegistry.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, uint256 amount, bytes memory data)
        public
        override
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     *      In this example the added modifier ensures that the operator is allowed by the OperatorFilterRegistry.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override onlyAllowedOperator(from) {
        super.safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155, ERC2981) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    function updateTokenIdsMintStatus (uint8 _tokenId, bool _status) public onlyOwner {
            tokenIdsMintStatus[_tokenId] = _status;      
    }

    function updateTokenIdsBurnToRedeemStatus (uint8 _tokenId, bool _status) public onlyOwner {
            tokenIdsBurnToRedeemStatus[_tokenId] = _status;      
    }
       
    function updateTokenIdsBurnsNeeded (uint8[] memory _tokenIds,uint256[] memory _burnQuantitys) public onlyOwner {
        for (uint256 i = 0; i<_tokenIds.length;i++){
            tokenIdsBurnsNeeded[_tokenIds[i]] = _burnQuantitys[i];
        }        
    }
              
    function updateTokenIdsTokenIdToBurn (uint8[] memory _tokenIds,uint8[] memory _burnIds) public onlyOwner {
        for (uint256 i = 0; i<_tokenIds.length;i++){
            tokenIdsTokenIdToBurn[_tokenIds[i]] = _burnIds[i];
        }        
    }
    
    function updateTokenIdsMintPrice (uint8[] memory _tokenIds,uint256[] memory _mintPrices) public onlyOwner {
        for (uint256 i = 0; i<_tokenIds.length;i++){
            tokenIdsMintPrice[_tokenIds[i]] = _mintPrices[i];
        }        
    }


    /**
     * @notice Sends multiple tokens to a single address
     * @param _tokenID The id of the token to send
     * @param _address The address to receive the tokens
     * @param _quantity How many to send she receiver
     */
    function batchMint(
        uint256 _tokenID,
        address _address,
        uint256 _quantity
    ) external onlyOwner {
        _mint(_address, _tokenID, _quantity, "");
    }

    function wrap(uint256[] calldata tokenIds_) external nonReentrant {
        uint256 amt = 0;
        uint256 amt2 = 0;
        for (uint256 i = 0; i < tokenIds_.length; i++) {
            OgQuacksNFT.safeTransferFrom(msg.sender, address(this), tokenIds_[i]);
            amt += (2**OgQuacksNFT.tokenIdLevels(tokenIds_[i]));
            amt2 += ((2**OgQuacksNFT.tokenIdLevels(tokenIds_[i])) - 1);
        }
        _mint(msg.sender, 1, amt, "");
        if (amt2 > 0) {
            _mint(msg.sender, 2, amt2, "");
        }
    }

    function onERC721Received(
        address operator_,
        address from_,
        uint256 tokenId_,
        bytes memory data_
    ) external override returns (bytes4) {

        return this.onERC721Received.selector;
    }
    
    function burnToRedeem(
        uint8 _burnTokenID,
        uint256 _burnQuantity,
        uint8 _redeemTokenID,
        uint256 _redeemQuantity
    ) 
    external payable nonReentrant {
        require(tokenIdsTokenIdToBurn[_redeemTokenID] == _burnTokenID );
        require( (tokenIdsBurnsNeeded[_redeemTokenID] * _redeemQuantity) == (_burnQuantity * _redeemQuantity ) );
        require(tokenIdsBurnToRedeemStatus[_redeemTokenID] == true);
        _burn(msg.sender, _burnTokenID, _burnQuantity);
        _mint(msg.sender, _redeemTokenID, _redeemQuantity, "");

    }

    function publicMint(
        uint8 _tokenID,
        address _address,
        uint256 _quantity
    )
    external payable nonReentrant  {
       require(tokenIdsMintStatus[_tokenID] == true);
       require((tokenIdsMintPrice[_tokenID] * _quantity) <= msg.value);

            _mint(_address, _tokenID, _quantity, "");

    }


   /**
     * @notice Airdrop tokens to multiple addresses at once.
     * No strict supply is set in the contract. All methods are ownerOnly,
     * it is up to the owner to control the supply by not minting
     * past their desired number for each token.
     * @dev Airdrop tokens to each address in the calldata list,
     * setting the supply to the length of the list + previously minted (airdropped) supply.
     * Add an address once per token you would like to send.
     * @param _tokenIds The tokenIDs to send
     * @param _list address[] list of wallets to send tokens to
     * @param _qty The qty of each token we are sending
     */
    function airdrop(
        uint256[] memory _tokenIds,
        address[] calldata _list,
        uint256[] memory _qty
    ) external onlyOwner {
        for (uint256 i = 0; i < _list.length; i++) {
            // Mint address, tokenid, amount
            _mint(_list[i], _tokenIds[i], _qty[i], "Mint-a-palooza!");
        }
    }

    function burnAndCombineContractQuacks(
        uint256 _tokenID,
        uint256[] calldata tokenIds
    )
    external payable  {

        bool check = false;
        bool check2 = false;
        require(tokenIds.length == 2);
        for (uint256 i; i < tokenIds.length; i++) {
            require(OgQuacksNFT.tokenIdLevels(tokenIds[i]) == OgQuacksNFT.tokenIdLevels(_tokenID), "Tokens are not right level");
            if (tokenIds[i] == _tokenID) {
                check = true;
            }
            else {
                check2 = true;
            }
            
        }
        require(check == true, "tokenID param not in token array param");
        require(check2 == true, "no burn token in token array param");
        OgQuacksNFT.burnAndCombine(_tokenID,tokenIds);

        if (OgQuacksNFT.tokenIdLevels(_tokenID) < 1) {
            _mint(msg.sender, 3, 3, "");
        }
        else {
        _mint(msg.sender, 3, 1, "");
        }
       
        
    }

    function setName(string memory _name) public onlyOwner {
        name = _name;
    }


    function updateBaseUri(string memory _baseURI) external onlyOwner {
        baseURI = _baseURI;
        emit SetBaseURI(baseURI);
    }

    function uri(uint256 typeId) public view override returns (string memory) {
        return
            bytes(baseURI).length > 0
                ? string(abi.encodePacked(baseURI, typeId.toString(),".json"))
                : baseURI;
    }

    function withdraw() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }

    function burn(
        address tokenOwner,
        uint256 tokenId,
        uint256 totalToBurn
    ) external {
        _burn(tokenOwner, tokenId, totalToBurn);
    }

}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"string","name":"_baseURI","type":"string"}],"name":"SetBaseURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"NFTContractAddress_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"address[]","name":"_list","type":"address[]"},{"internalType":"uint256[]","name":"_qty","type":"uint256[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenID","type":"uint256"},{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"totalToBurn","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenID","type":"uint256"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"burnAndCombineContractQuacks","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_burnTokenID","type":"uint8"},{"internalType":"uint256","name":"_burnQuantity","type":"uint256"},{"internalType":"uint8","name":"_redeemTokenID","type":"uint8"},{"internalType":"uint256","name":"_redeemQuantity","type":"uint256"}],"name":"burnToRedeem","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator_","type":"address"},{"internalType":"address","name":"from_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"bytes","name":"data_","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_tokenID","type":"uint8"},{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","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":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"setName","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":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"tokenIdsBurnToRedeemStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"tokenIdsBurnsNeeded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"tokenIdsMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"tokenIdsMintStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"tokenIdsTokenIdToBurn","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"updateBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_tokenId","type":"uint8"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"updateTokenIdsBurnToRedeemStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8[]","name":"_tokenIds","type":"uint8[]"},{"internalType":"uint256[]","name":"_burnQuantitys","type":"uint256[]"}],"name":"updateTokenIdsBurnsNeeded","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8[]","name":"_tokenIds","type":"uint8[]"},{"internalType":"uint256[]","name":"_mintPrices","type":"uint256[]"}],"name":"updateTokenIdsMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_tokenId","type":"uint8"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"updateTokenIdsMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8[]","name":"_tokenIds","type":"uint8[]"},{"internalType":"uint8[]","name":"_burnIds","type":"uint8[]"}],"name":"updateTokenIdsTokenIdToBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"wrap","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040526040518060800160405280604381526020016200693660439139600790816200002e919062000746565b506040518060400160405280601581526020017f517561636b7320666f72207468652050656f706c6500000000000000000000008152506008908162000075919062000746565b50735231298cf21acf2f5a3128872867cb02043f169e600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000d857600080fd5b5060405162006979380380620069798339818101604052810190620000fe919062000991565b733cc6cdda760b79bafa08df41ecfa224f810dceb66001826200012781620003e960201b60201c565b50620001486200013c620003fe60201b60201c565b6200040660201b60201c565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200033d57801562000203576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620001c992919062000a27565b600060405180830381600087803b158015620001e457600080fd5b505af1158015620001f9573d6000803e3d6000fd5b505050506200033c565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620002bd576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200028392919062000a27565b600060405180830381600087803b1580156200029e57600080fd5b505af1158015620002b3573d6000803e3d6000fd5b505050506200033b565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b815260040162000306919062000a54565b600060405180830381600087803b1580156200032157600080fd5b505af115801562000336573d6000803e3d6000fd5b505050505b5b5b50506001600481905550600760405162000358919062000b0b565b60405180910390207f23c8c9488efebfd474e85a7956de6f39b17c7ab88502d42a623db2d8e382bbaa60405160405180910390a2600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505062000b24565b8060029081620003fa919062000746565b5050565b600033905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200054e57607f821691505b60208210810362000564576200056362000506565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005ce7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200058f565b620005da86836200058f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000627620006216200061b84620005f2565b620005fc565b620005f2565b9050919050565b6000819050919050565b620006438362000606565b6200065b62000652826200062e565b8484546200059c565b825550505050565b600090565b6200067262000663565b6200067f81848462000638565b505050565b5b81811015620006a7576200069b60008262000668565b60018101905062000685565b5050565b601f821115620006f657620006c0816200056a565b620006cb846200057f565b81016020851015620006db578190505b620006f3620006ea856200057f565b83018262000684565b50505b505050565b600082821c905092915050565b60006200071b60001984600802620006fb565b1980831691505092915050565b600062000736838362000708565b9150826002028217905092915050565b6200075182620004cc565b67ffffffffffffffff8111156200076d576200076c620004d7565b5b62000779825462000535565b62000786828285620006ab565b600060209050601f831160018114620007be5760008415620007a9578287015190505b620007b5858262000728565b86555062000825565b601f198416620007ce866200056a565b60005b82811015620007f857848901518255600182019150602085019450602081019050620007d1565b8683101562000818578489015162000814601f89168262000708565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b62000867826200084b565b810181811067ffffffffffffffff82111715620008895762000888620004d7565b5b80604052505050565b60006200089e6200082d565b9050620008ac82826200085c565b919050565b600067ffffffffffffffff821115620008cf57620008ce620004d7565b5b620008da826200084b565b9050602081019050919050565b60005b8381101562000907578082015181840152602081019050620008ea565b60008484015250505050565b60006200092a6200092484620008b1565b62000892565b90508281526020810184848401111562000949576200094862000846565b5b62000956848285620008e7565b509392505050565b600082601f83011262000976576200097562000841565b5b81516200098884826020860162000913565b91505092915050565b600060208284031215620009aa57620009a962000837565b5b600082015167ffffffffffffffff811115620009cb57620009ca6200083c565b5b620009d9848285016200095e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000a0f82620009e2565b9050919050565b62000a218162000a02565b82525050565b600060408201905062000a3e600083018562000a16565b62000a4d602083018462000a16565b9392505050565b600060208201905062000a6b600083018462000a16565b92915050565b600081905092915050565b6000815462000a8b8162000535565b62000a97818662000a71565b9450600182166000811462000ab5576001811462000acb5762000b02565b60ff198316865281151582028601935062000b02565b62000ad6856200056a565b60005b8381101562000afa5781548189015260018201915060208101905062000ad9565b838801955050505b50505092915050565b600062000b19828462000a7c565b915081905092915050565b608051615dcc62000b6a600039600081816110cd015281816111670152818161132a015281816113bb0152818161199b01528181611a430152611b110152615dcc6000f3fe6080604052600436106102195760003560e01c80636c0360eb11610123578063c47f0027116100ab578063f242432a1161006f578063f242432a146107f9578063f25d946d14610822578063f2fde38b1461083e578063f5298aca14610867578063f6d52c631461089057610219565b8063c47f002714610718578063cc17a5bf14610741578063cd15dce11461076a578063d10507a914610793578063e985e9c5146107bc57610219565b80638da5cb5b116100f25780638da5cb5b1461062e578063a22cb46514610659578063a8eb09ee14610682578063b2fa650f146106bf578063b64babbd146106fc57610219565b80636c0360eb1461059a578063706f71e1146105c5578063715018a6146105ee5780638428c1851461060557610219565b80632a55205a116101a657806339f7e37f1161017557806339f7e37f146104d65780633ccfd60b146104ff57806341f434341461051657806342277e3e146105415780634e1273f41461055d57610219565b80632a55205a146104095780632a8117cb146104475780632eb2c2d6146104845780633567ed3b146104ad57610219565b80630e89341c116101ed5780630e89341c146102ec578063150b7a02146103295780631c4017bd1461036657806323612182146103a357806328415588146103cc57610219565b8062fdd58e1461021e57806301ffc9a71461025b578063028a2a1f1461029857806306fdde03146102c1575b600080fd5b34801561022a57600080fd5b506102456004803603810190610240919061375c565b6108bb565b60405161025291906137ab565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d919061381e565b610983565b60405161028f9190613866565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba9190613a13565b610995565b005b3480156102cd57600080fd5b506102d6610a27565b6040516102e39190613b0a565b60405180910390f35b3480156102f857600080fd5b50610313600480360381019061030e9190613b2c565b610ab5565b6040516103209190613b0a565b60405180910390f35b34801561033557600080fd5b50610350600480360381019061034b9190613c0e565b610b90565b60405161035d9190613ca0565b60405180910390f35b34801561037257600080fd5b5061038d60048036038101906103889190613cbb565b610ba4565b60405161039a9190613cf7565b60405180910390f35b3480156103af57600080fd5b506103ca60048036038101906103c59190613dd5565b610bc4565b005b3480156103d857600080fd5b506103f360048036038101906103ee9190613cbb565b610c42565b6040516104009190613866565b60405180910390f35b34801561041557600080fd5b50610430600480360381019061042b9190613e4d565b610c62565b60405161043e929190613e9c565b60405180910390f35b34801561045357600080fd5b5061046e60048036038101906104699190613cbb565b610e4c565b60405161047b91906137ab565b60405180910390f35b34801561049057600080fd5b506104ab60048036038101906104a69190613ec5565b610e64565b005b3480156104b957600080fd5b506104d460048036038101906104cf9190613f94565b610fba565b005b3480156104e257600080fd5b506104fd60048036038101906104f89190614088565b610fe2565b005b34801561050b57600080fd5b50610514611040565b005b34801561052257600080fd5b5061052b611098565b6040516105389190614130565b60405180910390f35b61055b600480360381019061055691906141a6565b6110aa565b005b34801561056957600080fd5b50610584600480360381019061057f91906142c9565b61149f565b60405161059191906143ff565b60405180910390f35b3480156105a657600080fd5b506105af6115b8565b6040516105bc9190613b0a565b60405180910390f35b3480156105d157600080fd5b506105ec60048036038101906105e7919061444d565b611646565b005b3480156105fa57600080fd5b50610603611683565b005b34801561061157600080fd5b5061062c6004803603810190610627919061444d565b611697565b005b34801561063a57600080fd5b506106436116d4565b604051610650919061448d565b60405180910390f35b34801561066557600080fd5b50610680600480360381019061067b91906144a8565b6116fe565b005b34801561068e57600080fd5b506106a960048036038101906106a49190613cbb565b611808565b6040516106b69190613866565b60405180910390f35b3480156106cb57600080fd5b506106e660048036038101906106e19190613cbb565b611828565b6040516106f391906137ab565b60405180910390f35b610716600480360381019061071191906144e8565b611840565b005b34801561072457600080fd5b5061073f600480360381019061073a9190614088565b611920565b005b34801561074d57600080fd5b506107686004803603810190610763919061453b565b61193b565b005b34801561077657600080fd5b50610791600480360381019061078c9190613dd5565b611c49565b005b34801561079f57600080fd5b506107ba60048036038101906107b591906145de565b611cc7565b005b3480156107c857600080fd5b506107e360048036038101906107de919061468a565b611d93565b6040516107f09190613866565b60405180910390f35b34801561080557600080fd5b50610820600480360381019061081b91906146ca565b611e27565b005b61083c60048036038101906108379190614761565b611f7d565b005b34801561084a57600080fd5b50610865600480360381019061086091906147c8565b6120ae565b005b34801561087357600080fd5b5061088e600480360381019061088991906147f5565b612131565b005b34801561089c57600080fd5b506108a5612141565b6040516108b2919061448d565b60405180910390f35b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361092b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610922906148ba565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600061098e82612167565b9050919050565b61099d6121e1565b60005b8251811015610a22578181815181106109bc576109bb6148da565b5b6020026020010151600a60008584815181106109db576109da6148da565b5b602002602001015160ff1660ff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508080610a1a90614938565b9150506109a0565b505050565b60088054610a34906149af565b80601f0160208091040260200160405190810160405280929190818152602001828054610a60906149af565b8015610aad5780601f10610a8257610100808354040283529160200191610aad565b820191906000526020600020905b815481529060010190602001808311610a9057829003601f168201915b505050505081565b6060600060078054610ac6906149af565b905011610b5d5760078054610ada906149af565b80601f0160208091040260200160405190810160405280929190818152602001828054610b06906149af565b8015610b535780601f10610b2857610100808354040283529160200191610b53565b820191906000526020600020905b815481529060010190602001808311610b3657829003601f168201915b5050505050610b89565b6007610b688361225f565b604051602001610b79929190614b00565b6040516020818303038152906040525b9050919050565b600063150b7a0260e01b9050949350505050565b600a6020528060005260406000206000915054906101000a900460ff1681565b610bcc6121e1565b60005b8251811015610c3d57818181518110610beb57610bea6148da565b5b6020026020010151600c6000858481518110610c0a57610c096148da565b5b602002602001015160ff1660ff168152602001908152602001600020819055508080610c3590614938565b915050610bcf565b505050565b600b6020528060005260406000206000915054906101000a900460ff1681565b6000806000600660008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610df75760056040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610e016123bf565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610e2d9190614b2f565b610e379190614ba0565b90508160000151819350935050509250929050565b600c6020528060005260406000206000915090505481565b8460006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610fa4573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ed857610ed386868686866123c9565b610fb2565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610f21929190614bd1565b602060405180830381865afa158015610f3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f629190614c0f565b610fa357336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610f9a919061448d565b60405180910390fd5b5b610fb186868686866123c9565b5b505050505050565b610fc26121e1565b610fdd8284836040518060200160405280600081525061246a565b505050565b610fea6121e1565b8060079081610ff99190614dc9565b5060076040516110099190614e9b565b60405180910390207f23c8c9488efebfd474e85a7956de6f39b17c7ab88502d42a623db2d8e382bbaa60405160405180910390a250565b6110486121e1565b6110506116d4565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611095573d6000803e3d6000fd5b50565b6daaeb6d7670e522a718067333cd4e81565b600080600284849050146110bd57600080fd5b60005b84849050811015611299577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166345b0c0fa876040518263ffffffff1660e01b815260040161112491906137ab565b602060405180830381865afa158015611141573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111659190614ec7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166345b0c0fa8787858181106111b4576111b36148da565b5b905060200201356040518263ffffffff1660e01b81526004016111d791906137ab565b602060405180830381865afa1580156111f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112189190614ec7565b14611258576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124f90614f40565b60405180910390fd5b8585858381811061126c5761126b6148da565b5b90506020020135036112815760019250611286565b600191505b808061129190614938565b9150506110c0565b5060011515821515146112e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d890614fd2565b60405180910390fd5b6001151581151514611328576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131f90615064565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166392e37aea8686866040518463ffffffff1660e01b8152600401611385939291906150ee565b600060405180830381600087803b15801561139f57600080fd5b505af11580156113b3573d6000803e3d6000fd5b5050505060017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166345b0c0fa876040518263ffffffff1660e01b815260040161141291906137ab565b602060405180830381865afa15801561142f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114539190614ec7565b101561147a57611475336003806040518060200160405280600081525061246a565b611498565b61149733600360016040518060200160405280600081525061246a565b5b5050505050565b606081518351146114e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114dc90615192565b60405180910390fd5b6000835167ffffffffffffffff81111561150257611501613897565b5b6040519080825280602002602001820160405280156115305781602001602082028036833780820191505090505b50905060005b84518110156115ad5761157d858281518110611555576115546148da565b5b60200260200101518583815181106115705761156f6148da565b5b60200260200101516108bb565b8282815181106115905761158f6148da565b5b602002602001018181525050806115a690614938565b9050611536565b508091505092915050565b600780546115c5906149af565b80601f01602080910402602001604051908101604052809291908181526020018280546115f1906149af565b801561163e5780601f106116135761010080835404028352916020019161163e565b820191906000526020600020905b81548152906001019060200180831161162157829003601f168201915b505050505081565b61164e6121e1565b80600d60008460ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b61168b6121e1565b611695600061261a565b565b61169f6121e1565b80600b60008460ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156117f9576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611776929190614bd1565b602060405180830381865afa158015611793573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b79190614c0f565b6117f857806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016117ef919061448d565b60405180910390fd5b5b61180383836126e0565b505050565b600d6020528060005260406000206000915054906101000a900460ff1681565b60096020528060005260406000206000915090505481565b600260045403611885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187c906151fe565b60405180910390fd5b600260048190555060011515600b60008560ff1660ff16815260200190815260200160002060009054906101000a900460ff161515146118c457600080fd5b3481600c60008660ff1660ff168152602001908152602001600020546118ea9190614b2f565b11156118f557600080fd5b611913828460ff16836040518060200160405280600081525061246a565b6001600481905550505050565b6119286121e1565b80600890816119379190614dc9565b5050565b600260045403611980576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611977906151fe565b60405180910390fd5b600260048190555060008060005b84849050811015611bf8577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166342842e0e33308888868181106119ea576119e96148da565b5b905060200201356040518463ffffffff1660e01b8152600401611a0f9392919061521e565b600060405180830381600087803b158015611a2957600080fd5b505af1158015611a3d573d6000803e3d6000fd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166345b0c0fa868684818110611a9057611a8f6148da565b5b905060200201356040518263ffffffff1660e01b8152600401611ab391906137ab565b602060405180830381865afa158015611ad0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af49190614ec7565b6002611b009190615388565b83611b0b91906153d3565b925060017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166345b0c0fa878785818110611b5e57611b5d6148da565b5b905060200201356040518263ffffffff1660e01b8152600401611b8191906137ab565b602060405180830381865afa158015611b9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc29190614ec7565b6002611bce9190615388565b611bd89190615407565b82611be391906153d3565b91508080611bf090614938565b91505061198e565b50611c15336001846040518060200160405280600081525061246a565b6000811115611c3b57611c3a336002836040518060200160405280600081525061246a565b5b505060016004819055505050565b611c516121e1565b60005b8251811015611cc257818181518110611c7057611c6f6148da565b5b602002602001015160096000858481518110611c8f57611c8e6148da565b5b602002602001015160ff1660ff168152602001908152602001600020819055508080611cba90614938565b915050611c54565b505050565b611ccf6121e1565b60005b83839050811015611d8c57611d79848483818110611cf357611cf26148da565b5b9050602002016020810190611d0891906147c8565b868381518110611d1b57611d1a6148da565b5b6020026020010151848481518110611d3657611d356148da565b5b60200260200101516040518060400160405280600f81526020017f4d696e742d612d70616c6f6f7a6121000000000000000000000000000000000081525061246a565b8080611d8490614938565b915050611cd2565b5050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8460006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611f67573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e9b57611e9686868686866126f6565b611f75565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611ee4929190614bd1565b602060405180830381865afa158015611f01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f259190614c0f565b611f6657336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611f5d919061448d565b60405180910390fd5b5b611f7486868686866126f6565b5b505050505050565b600260045403611fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb9906151fe565b60405180910390fd5b60026004819055508360ff16600a60008460ff1660ff16815260200190815260200160002060009054906101000a900460ff1660ff161461200257600080fd5b808361200e9190614b2f565b81600960008560ff1660ff168152602001908152602001600020546120339190614b2f565b1461203d57600080fd5b60011515600d60008460ff1660ff16815260200190815260200160002060009054906101000a900460ff1615151461207457600080fd5b612082338560ff1685612797565b6120a0338360ff16836040518060200160405280600081525061246a565b600160048190555050505050565b6120b66121e1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211c906154ad565b60405180910390fd5b61212e8161261a565b50565b61213c838383612797565b505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806121da57506121d9826129dd565b5b9050919050565b6121e9612abf565b73ffffffffffffffffffffffffffffffffffffffff166122076116d4565b73ffffffffffffffffffffffffffffffffffffffff161461225d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225490615519565b60405180910390fd5b565b6060600082036122a6576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123ba565b600082905060005b600082146122d85780806122c190614938565b915050600a826122d19190614ba0565b91506122ae565b60008167ffffffffffffffff8111156122f4576122f3613897565b5b6040519080825280601f01601f1916602001820160405280156123265781602001600182028036833780820191505090505b5090505b600085146123b35760018261233f9190615407565b9150600a8561234e9190615539565b603061235a91906153d3565b60f81b8183815181106123705761236f6148da565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123ac9190614ba0565b945061232a565b8093505050505b919050565b6000612710905090565b6123d1612abf565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480612417575061241685612411612abf565b611d93565b5b612456576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244d906155dc565b60405180910390fd5b6124638585858585612ac7565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036124d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d09061566e565b60405180910390fd5b60006124e3612abf565b905060006124f085612de8565b905060006124fd85612de8565b905061250e83600089858589612e62565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461256d91906153d3565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516125eb92919061568e565b60405180910390a461260283600089858589612e6a565b61261183600089898989612e72565b50505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6126f26126eb612abf565b8383613049565b5050565b6126fe612abf565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061274457506127438561273e612abf565b611d93565b5b612783576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277a906155dc565b60405180910390fd5b61279085858585856131b5565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612806576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127fd90615729565b60405180910390fd5b6000612810612abf565b9050600061281d84612de8565b9050600061282a84612de8565b905061284a83876000858560405180602001604052806000815250612e62565b600080600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050848110156128e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d8906157bb565b60405180910390fd5b84810360008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516129ae92919061568e565b60405180910390a46129d484886000868660405180602001604052806000815250612e6a565b50505050505050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612aa857507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612ab85750612ab782613450565b5b9050919050565b600033905090565b8151835114612b0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b029061584d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b71906158df565b60405180910390fd5b6000612b84612abf565b9050612b94818787878787612e62565b60005b8451811015612d45576000858281518110612bb557612bb46148da565b5b602002602001015190506000858381518110612bd457612bd36148da565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612c75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6c90615971565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d2a91906153d3565b9250508190555050505080612d3e90614938565b9050612b97565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612dbc929190615991565b60405180910390a4612dd2818787878787612e6a565b612de08187878787876134ba565b505050505050565b60606000600167ffffffffffffffff811115612e0757612e06613897565b5b604051908082528060200260200182016040528015612e355781602001602082028036833780820191505090505b5090508281600081518110612e4d57612e4c6148da565b5b60200260200101818152505080915050919050565b505050505050565b505050505050565b612e918473ffffffffffffffffffffffffffffffffffffffff16613691565b15613041578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612ed7959493929190615a1d565b6020604051808303816000875af1925050508015612f1357506040513d601f19601f82011682018060405250810190612f109190615a8c565b60015b612fb857612f1f615ac6565b806308c379a003612f7b5750612f33615ae8565b80612f3e5750612f7d565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f729190613b0a565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612faf90615bea565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461303f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303690615c7c565b60405180910390fd5b505b505050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036130b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ae90615d0e565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516131a89190613866565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321b906158df565b60405180910390fd5b600061322e612abf565b9050600061323b85612de8565b9050600061324885612de8565b9050613258838989858589612e62565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050858110156132ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132e690615971565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133a491906153d3565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a60405161342192919061568e565b60405180910390a4613437848a8a86868a612e6a565b613445848a8a8a8a8a612e72565b505050505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6134d98473ffffffffffffffffffffffffffffffffffffffff16613691565b15613689578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161351f959493929190615d2e565b6020604051808303816000875af192505050801561355b57506040513d601f19601f820116820180604052508101906135589190615a8c565b60015b61360057613567615ac6565b806308c379a0036135c3575061357b615ae8565b8061358657506135c5565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135ba9190613b0a565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135f790615bea565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161367e90615c7c565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006136f3826136c8565b9050919050565b613703816136e8565b811461370e57600080fd5b50565b600081359050613720816136fa565b92915050565b6000819050919050565b61373981613726565b811461374457600080fd5b50565b60008135905061375681613730565b92915050565b60008060408385031215613773576137726136be565b5b600061378185828601613711565b925050602061379285828601613747565b9150509250929050565b6137a581613726565b82525050565b60006020820190506137c0600083018461379c565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6137fb816137c6565b811461380657600080fd5b50565b600081359050613818816137f2565b92915050565b600060208284031215613834576138336136be565b5b600061384284828501613809565b91505092915050565b60008115159050919050565b6138608161384b565b82525050565b600060208201905061387b6000830184613857565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6138cf82613886565b810181811067ffffffffffffffff821117156138ee576138ed613897565b5b80604052505050565b60006139016136b4565b905061390d82826138c6565b919050565b600067ffffffffffffffff82111561392d5761392c613897565b5b602082029050602081019050919050565b600080fd5b600060ff82169050919050565b61395981613943565b811461396457600080fd5b50565b60008135905061397681613950565b92915050565b600061398f61398a84613912565b6138f7565b905080838252602082019050602084028301858111156139b2576139b161393e565b5b835b818110156139db57806139c78882613967565b8452602084019350506020810190506139b4565b5050509392505050565b600082601f8301126139fa576139f9613881565b5b8135613a0a84826020860161397c565b91505092915050565b60008060408385031215613a2a57613a296136be565b5b600083013567ffffffffffffffff811115613a4857613a476136c3565b5b613a54858286016139e5565b925050602083013567ffffffffffffffff811115613a7557613a746136c3565b5b613a81858286016139e5565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613ac5578082015181840152602081019050613aaa565b60008484015250505050565b6000613adc82613a8b565b613ae68185613a96565b9350613af6818560208601613aa7565b613aff81613886565b840191505092915050565b60006020820190508181036000830152613b248184613ad1565b905092915050565b600060208284031215613b4257613b416136be565b5b6000613b5084828501613747565b91505092915050565b600080fd5b600067ffffffffffffffff821115613b7957613b78613897565b5b613b8282613886565b9050602081019050919050565b82818337600083830152505050565b6000613bb1613bac84613b5e565b6138f7565b905082815260208101848484011115613bcd57613bcc613b59565b5b613bd8848285613b8f565b509392505050565b600082601f830112613bf557613bf4613881565b5b8135613c05848260208601613b9e565b91505092915050565b60008060008060808587031215613c2857613c276136be565b5b6000613c3687828801613711565b9450506020613c4787828801613711565b9350506040613c5887828801613747565b925050606085013567ffffffffffffffff811115613c7957613c786136c3565b5b613c8587828801613be0565b91505092959194509250565b613c9a816137c6565b82525050565b6000602082019050613cb56000830184613c91565b92915050565b600060208284031215613cd157613cd06136be565b5b6000613cdf84828501613967565b91505092915050565b613cf181613943565b82525050565b6000602082019050613d0c6000830184613ce8565b92915050565b600067ffffffffffffffff821115613d2d57613d2c613897565b5b602082029050602081019050919050565b6000613d51613d4c84613d12565b6138f7565b90508083825260208201905060208402830185811115613d7457613d7361393e565b5b835b81811015613d9d5780613d898882613747565b845260208401935050602081019050613d76565b5050509392505050565b600082601f830112613dbc57613dbb613881565b5b8135613dcc848260208601613d3e565b91505092915050565b60008060408385031215613dec57613deb6136be565b5b600083013567ffffffffffffffff811115613e0a57613e096136c3565b5b613e16858286016139e5565b925050602083013567ffffffffffffffff811115613e3757613e366136c3565b5b613e4385828601613da7565b9150509250929050565b60008060408385031215613e6457613e636136be565b5b6000613e7285828601613747565b9250506020613e8385828601613747565b9150509250929050565b613e96816136e8565b82525050565b6000604082019050613eb16000830185613e8d565b613ebe602083018461379c565b9392505050565b600080600080600060a08688031215613ee157613ee06136be565b5b6000613eef88828901613711565b9550506020613f0088828901613711565b945050604086013567ffffffffffffffff811115613f2157613f206136c3565b5b613f2d88828901613da7565b935050606086013567ffffffffffffffff811115613f4e57613f4d6136c3565b5b613f5a88828901613da7565b925050608086013567ffffffffffffffff811115613f7b57613f7a6136c3565b5b613f8788828901613be0565b9150509295509295909350565b600080600060608486031215613fad57613fac6136be565b5b6000613fbb86828701613747565b9350506020613fcc86828701613711565b9250506040613fdd86828701613747565b9150509250925092565b600067ffffffffffffffff82111561400257614001613897565b5b61400b82613886565b9050602081019050919050565b600061402b61402684613fe7565b6138f7565b90508281526020810184848401111561404757614046613b59565b5b614052848285613b8f565b509392505050565b600082601f83011261406f5761406e613881565b5b813561407f848260208601614018565b91505092915050565b60006020828403121561409e5761409d6136be565b5b600082013567ffffffffffffffff8111156140bc576140bb6136c3565b5b6140c88482850161405a565b91505092915050565b6000819050919050565b60006140f66140f16140ec846136c8565b6140d1565b6136c8565b9050919050565b6000614108826140db565b9050919050565b600061411a826140fd565b9050919050565b61412a8161410f565b82525050565b60006020820190506141456000830184614121565b92915050565b600080fd5b60008083601f84011261416657614165613881565b5b8235905067ffffffffffffffff8111156141835761418261414b565b5b60208301915083602082028301111561419f5761419e61393e565b5b9250929050565b6000806000604084860312156141bf576141be6136be565b5b60006141cd86828701613747565b935050602084013567ffffffffffffffff8111156141ee576141ed6136c3565b5b6141fa86828701614150565b92509250509250925092565b600067ffffffffffffffff82111561422157614220613897565b5b602082029050602081019050919050565b600061424561424084614206565b6138f7565b905080838252602082019050602084028301858111156142685761426761393e565b5b835b81811015614291578061427d8882613711565b84526020840193505060208101905061426a565b5050509392505050565b600082601f8301126142b0576142af613881565b5b81356142c0848260208601614232565b91505092915050565b600080604083850312156142e0576142df6136be565b5b600083013567ffffffffffffffff8111156142fe576142fd6136c3565b5b61430a8582860161429b565b925050602083013567ffffffffffffffff81111561432b5761432a6136c3565b5b61433785828601613da7565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61437681613726565b82525050565b6000614388838361436d565b60208301905092915050565b6000602082019050919050565b60006143ac82614341565b6143b6818561434c565b93506143c18361435d565b8060005b838110156143f25781516143d9888261437c565b97506143e483614394565b9250506001810190506143c5565b5085935050505092915050565b6000602082019050818103600083015261441981846143a1565b905092915050565b61442a8161384b565b811461443557600080fd5b50565b60008135905061444781614421565b92915050565b60008060408385031215614464576144636136be565b5b600061447285828601613967565b925050602061448385828601614438565b9150509250929050565b60006020820190506144a26000830184613e8d565b92915050565b600080604083850312156144bf576144be6136be565b5b60006144cd85828601613711565b92505060206144de85828601614438565b9150509250929050565b600080600060608486031215614501576145006136be565b5b600061450f86828701613967565b935050602061452086828701613711565b925050604061453186828701613747565b9150509250925092565b60008060208385031215614552576145516136be565b5b600083013567ffffffffffffffff8111156145705761456f6136c3565b5b61457c85828601614150565b92509250509250929050565b60008083601f84011261459e5761459d613881565b5b8235905067ffffffffffffffff8111156145bb576145ba61414b565b5b6020830191508360208202830111156145d7576145d661393e565b5b9250929050565b600080600080606085870312156145f8576145f76136be565b5b600085013567ffffffffffffffff811115614616576146156136c3565b5b61462287828801613da7565b945050602085013567ffffffffffffffff811115614643576146426136c3565b5b61464f87828801614588565b9350935050604085013567ffffffffffffffff811115614672576146716136c3565b5b61467e87828801613da7565b91505092959194509250565b600080604083850312156146a1576146a06136be565b5b60006146af85828601613711565b92505060206146c085828601613711565b9150509250929050565b600080600080600060a086880312156146e6576146e56136be565b5b60006146f488828901613711565b955050602061470588828901613711565b945050604061471688828901613747565b935050606061472788828901613747565b925050608086013567ffffffffffffffff811115614748576147476136c3565b5b61475488828901613be0565b9150509295509295909350565b6000806000806080858703121561477b5761477a6136be565b5b600061478987828801613967565b945050602061479a87828801613747565b93505060406147ab87828801613967565b92505060606147bc87828801613747565b91505092959194509250565b6000602082840312156147de576147dd6136be565b5b60006147ec84828501613711565b91505092915050565b60008060006060848603121561480e5761480d6136be565b5b600061481c86828701613711565b935050602061482d86828701613747565b925050604061483e86828701613747565b9150509250925092565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b60006148a4602a83613a96565b91506148af82614848565b604082019050919050565b600060208201905081810360008301526148d381614897565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061494382613726565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361497557614974614909565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806149c757607f821691505b6020821081036149da576149d9614980565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154614a0d816149af565b614a1781866149e0565b94506001821660008114614a325760018114614a4757614a7a565b60ff1983168652811515820286019350614a7a565b614a50856149eb565b60005b83811015614a7257815481890152600182019150602081019050614a53565b838801955050505b50505092915050565b6000614a8e82613a8b565b614a9881856149e0565b9350614aa8818560208601613aa7565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614aea6005836149e0565b9150614af582614ab4565b600582019050919050565b6000614b0c8285614a00565b9150614b188284614a83565b9150614b2382614add565b91508190509392505050565b6000614b3a82613726565b9150614b4583613726565b9250828202614b5381613726565b91508282048414831517614b6a57614b69614909565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614bab82613726565b9150614bb683613726565b925082614bc657614bc5614b71565b5b828204905092915050565b6000604082019050614be66000830185613e8d565b614bf36020830184613e8d565b9392505050565b600081519050614c0981614421565b92915050565b600060208284031215614c2557614c246136be565b5b6000614c3384828501614bfa565b91505092915050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614c897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614c4c565b614c938683614c4c565b95508019841693508086168417925050509392505050565b6000614cc6614cc1614cbc84613726565b6140d1565b613726565b9050919050565b6000819050919050565b614ce083614cab565b614cf4614cec82614ccd565b848454614c59565b825550505050565b600090565b614d09614cfc565b614d14818484614cd7565b505050565b5b81811015614d3857614d2d600082614d01565b600181019050614d1a565b5050565b601f821115614d7d57614d4e816149eb565b614d5784614c3c565b81016020851015614d66578190505b614d7a614d7285614c3c565b830182614d19565b50505b505050565b600082821c905092915050565b6000614da060001984600802614d82565b1980831691505092915050565b6000614db98383614d8f565b9150826002028217905092915050565b614dd282613a8b565b67ffffffffffffffff811115614deb57614dea613897565b5b614df582546149af565b614e00828285614d3c565b600060209050601f831160018114614e335760008415614e21578287015190505b614e2b8582614dad565b865550614e93565b601f198416614e41866149eb565b60005b82811015614e6957848901518255600182019150602085019450602081019050614e44565b86831015614e865784890151614e82601f891682614d8f565b8355505b6001600288020188555050505b505050505050565b6000614ea78284614a00565b915081905092915050565b600081519050614ec181613730565b92915050565b600060208284031215614edd57614edc6136be565b5b6000614eeb84828501614eb2565b91505092915050565b7f546f6b656e7320617265206e6f74207269676874206c6576656c000000000000600082015250565b6000614f2a601a83613a96565b9150614f3582614ef4565b602082019050919050565b60006020820190508181036000830152614f5981614f1d565b9050919050565b7f746f6b656e494420706172616d206e6f7420696e20746f6b656e20617272617960008201527f20706172616d0000000000000000000000000000000000000000000000000000602082015250565b6000614fbc602683613a96565b9150614fc782614f60565b604082019050919050565b60006020820190508181036000830152614feb81614faf565b9050919050565b7f6e6f206275726e20746f6b656e20696e20746f6b656e2061727261792070617260008201527f616d000000000000000000000000000000000000000000000000000000000000602082015250565b600061504e602283613a96565b915061505982614ff2565b604082019050919050565b6000602082019050818103600083015261507d81615041565b9050919050565b600080fd5b82818337505050565b600061509e838561434c565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156150d1576150d0615084565b5b6020830292506150e2838584615089565b82840190509392505050565b6000604082019050615103600083018661379c565b8181036020830152615116818486615092565b9050949350505050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b600061517c602983613a96565b915061518782615120565b604082019050919050565b600060208201905081810360008301526151ab8161516f565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006151e8601f83613a96565b91506151f3826151b2565b602082019050919050565b60006020820190508181036000830152615217816151db565b9050919050565b60006060820190506152336000830186613e8d565b6152406020830185613e8d565b61524d604083018461379c565b949350505050565b60008160011c9050919050565b6000808291508390505b60018511156152ac5780860481111561528857615287614909565b5b60018516156152975780820291505b80810290506152a585615255565b945061526c565b94509492505050565b6000826152c55760019050615381565b816152d35760009050615381565b81600181146152e957600281146152f357615322565b6001915050615381565b60ff84111561530557615304614909565b5b8360020a91508482111561531c5761531b614909565b5b50615381565b5060208310610133831016604e8410600b84101617156153575782820a90508381111561535257615351614909565b5b615381565b6153648484846001615262565b9250905081840481111561537b5761537a614909565b5b81810290505b9392505050565b600061539382613726565b915061539e83613726565b92506153cb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846152b5565b905092915050565b60006153de82613726565b91506153e983613726565b925082820190508082111561540157615400614909565b5b92915050565b600061541282613726565b915061541d83613726565b925082820390508181111561543557615434614909565b5b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615497602683613a96565b91506154a28261543b565b604082019050919050565b600060208201905081810360008301526154c68161548a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615503602083613a96565b915061550e826154cd565b602082019050919050565b60006020820190508181036000830152615532816154f6565b9050919050565b600061554482613726565b915061554f83613726565b92508261555f5761555e614b71565b5b828206905092915050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206e6f7220617070726f7665640000000000000000000000000000000000602082015250565b60006155c6602f83613a96565b91506155d18261556a565b604082019050919050565b600060208201905081810360008301526155f5816155b9565b9050919050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615658602183613a96565b9150615663826155fc565b604082019050919050565b600060208201905081810360008301526156878161564b565b9050919050565b60006040820190506156a3600083018561379c565b6156b0602083018461379c565b9392505050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000615713602383613a96565b915061571e826156b7565b604082019050919050565b6000602082019050818103600083015261574281615706565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b60006157a5602483613a96565b91506157b082615749565b604082019050919050565b600060208201905081810360008301526157d481615798565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000615837602883613a96565b9150615842826157db565b604082019050919050565b600060208201905081810360008301526158668161582a565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006158c9602583613a96565b91506158d48261586d565b604082019050919050565b600060208201905081810360008301526158f8816158bc565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b600061595b602a83613a96565b9150615966826158ff565b604082019050919050565b6000602082019050818103600083015261598a8161594e565b9050919050565b600060408201905081810360008301526159ab81856143a1565b905081810360208301526159bf81846143a1565b90509392505050565b600081519050919050565b600082825260208201905092915050565b60006159ef826159c8565b6159f981856159d3565b9350615a09818560208601613aa7565b615a1281613886565b840191505092915050565b600060a082019050615a326000830188613e8d565b615a3f6020830187613e8d565b615a4c604083018661379c565b615a59606083018561379c565b8181036080830152615a6b81846159e4565b90509695505050505050565b600081519050615a86816137f2565b92915050565b600060208284031215615aa257615aa16136be565b5b6000615ab084828501615a77565b91505092915050565b60008160e01c9050919050565b600060033d1115615ae55760046000803e615ae2600051615ab9565b90505b90565b600060443d10615b7557615afa6136b4565b60043d036004823e80513d602482011167ffffffffffffffff82111715615b22575050615b75565b808201805167ffffffffffffffff811115615b405750505050615b75565b80602083010160043d038501811115615b5d575050505050615b75565b615b6c826020018501866138c6565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000615bd4603483613a96565b9150615bdf82615b78565b604082019050919050565b60006020820190508181036000830152615c0381615bc7565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000615c66602883613a96565b9150615c7182615c0a565b604082019050919050565b60006020820190508181036000830152615c9581615c59565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000615cf8602983613a96565b9150615d0382615c9c565b604082019050919050565b60006020820190508181036000830152615d2781615ceb565b9050919050565b600060a082019050615d436000830188613e8d565b615d506020830187613e8d565b8181036040830152615d6281866143a1565b90508181036060830152615d7681856143a1565b90508181036080830152615d8a81846159e4565b9050969550505050505056fea264697066735822122049f5b158c39c51a68ee941e71c1c8b0eb230908d9e2a364f04c0e1c49c51a2db64736f6c63430008110033697066733a2f2f6261667962656966796e6537666c6867736a6a6b3432666867727962636c777761707063326f6f7067717164357a6a753461786f32746d676367692f00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000043697066733a2f2f6261667962656966796e6537666c6867736a6a6b3432666867727962636c777761707063326f6f7067717164357a6a753461786f32746d676367692f0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102195760003560e01c80636c0360eb11610123578063c47f0027116100ab578063f242432a1161006f578063f242432a146107f9578063f25d946d14610822578063f2fde38b1461083e578063f5298aca14610867578063f6d52c631461089057610219565b8063c47f002714610718578063cc17a5bf14610741578063cd15dce11461076a578063d10507a914610793578063e985e9c5146107bc57610219565b80638da5cb5b116100f25780638da5cb5b1461062e578063a22cb46514610659578063a8eb09ee14610682578063b2fa650f146106bf578063b64babbd146106fc57610219565b80636c0360eb1461059a578063706f71e1146105c5578063715018a6146105ee5780638428c1851461060557610219565b80632a55205a116101a657806339f7e37f1161017557806339f7e37f146104d65780633ccfd60b146104ff57806341f434341461051657806342277e3e146105415780634e1273f41461055d57610219565b80632a55205a146104095780632a8117cb146104475780632eb2c2d6146104845780633567ed3b146104ad57610219565b80630e89341c116101ed5780630e89341c146102ec578063150b7a02146103295780631c4017bd1461036657806323612182146103a357806328415588146103cc57610219565b8062fdd58e1461021e57806301ffc9a71461025b578063028a2a1f1461029857806306fdde03146102c1575b600080fd5b34801561022a57600080fd5b506102456004803603810190610240919061375c565b6108bb565b60405161025291906137ab565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d919061381e565b610983565b60405161028f9190613866565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba9190613a13565b610995565b005b3480156102cd57600080fd5b506102d6610a27565b6040516102e39190613b0a565b60405180910390f35b3480156102f857600080fd5b50610313600480360381019061030e9190613b2c565b610ab5565b6040516103209190613b0a565b60405180910390f35b34801561033557600080fd5b50610350600480360381019061034b9190613c0e565b610b90565b60405161035d9190613ca0565b60405180910390f35b34801561037257600080fd5b5061038d60048036038101906103889190613cbb565b610ba4565b60405161039a9190613cf7565b60405180910390f35b3480156103af57600080fd5b506103ca60048036038101906103c59190613dd5565b610bc4565b005b3480156103d857600080fd5b506103f360048036038101906103ee9190613cbb565b610c42565b6040516104009190613866565b60405180910390f35b34801561041557600080fd5b50610430600480360381019061042b9190613e4d565b610c62565b60405161043e929190613e9c565b60405180910390f35b34801561045357600080fd5b5061046e60048036038101906104699190613cbb565b610e4c565b60405161047b91906137ab565b60405180910390f35b34801561049057600080fd5b506104ab60048036038101906104a69190613ec5565b610e64565b005b3480156104b957600080fd5b506104d460048036038101906104cf9190613f94565b610fba565b005b3480156104e257600080fd5b506104fd60048036038101906104f89190614088565b610fe2565b005b34801561050b57600080fd5b50610514611040565b005b34801561052257600080fd5b5061052b611098565b6040516105389190614130565b60405180910390f35b61055b600480360381019061055691906141a6565b6110aa565b005b34801561056957600080fd5b50610584600480360381019061057f91906142c9565b61149f565b60405161059191906143ff565b60405180910390f35b3480156105a657600080fd5b506105af6115b8565b6040516105bc9190613b0a565b60405180910390f35b3480156105d157600080fd5b506105ec60048036038101906105e7919061444d565b611646565b005b3480156105fa57600080fd5b50610603611683565b005b34801561061157600080fd5b5061062c6004803603810190610627919061444d565b611697565b005b34801561063a57600080fd5b506106436116d4565b604051610650919061448d565b60405180910390f35b34801561066557600080fd5b50610680600480360381019061067b91906144a8565b6116fe565b005b34801561068e57600080fd5b506106a960048036038101906106a49190613cbb565b611808565b6040516106b69190613866565b60405180910390f35b3480156106cb57600080fd5b506106e660048036038101906106e19190613cbb565b611828565b6040516106f391906137ab565b60405180910390f35b610716600480360381019061071191906144e8565b611840565b005b34801561072457600080fd5b5061073f600480360381019061073a9190614088565b611920565b005b34801561074d57600080fd5b506107686004803603810190610763919061453b565b61193b565b005b34801561077657600080fd5b50610791600480360381019061078c9190613dd5565b611c49565b005b34801561079f57600080fd5b506107ba60048036038101906107b591906145de565b611cc7565b005b3480156107c857600080fd5b506107e360048036038101906107de919061468a565b611d93565b6040516107f09190613866565b60405180910390f35b34801561080557600080fd5b50610820600480360381019061081b91906146ca565b611e27565b005b61083c60048036038101906108379190614761565b611f7d565b005b34801561084a57600080fd5b50610865600480360381019061086091906147c8565b6120ae565b005b34801561087357600080fd5b5061088e600480360381019061088991906147f5565b612131565b005b34801561089c57600080fd5b506108a5612141565b6040516108b2919061448d565b60405180910390f35b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361092b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610922906148ba565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600061098e82612167565b9050919050565b61099d6121e1565b60005b8251811015610a22578181815181106109bc576109bb6148da565b5b6020026020010151600a60008584815181106109db576109da6148da565b5b602002602001015160ff1660ff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508080610a1a90614938565b9150506109a0565b505050565b60088054610a34906149af565b80601f0160208091040260200160405190810160405280929190818152602001828054610a60906149af565b8015610aad5780601f10610a8257610100808354040283529160200191610aad565b820191906000526020600020905b815481529060010190602001808311610a9057829003601f168201915b505050505081565b6060600060078054610ac6906149af565b905011610b5d5760078054610ada906149af565b80601f0160208091040260200160405190810160405280929190818152602001828054610b06906149af565b8015610b535780601f10610b2857610100808354040283529160200191610b53565b820191906000526020600020905b815481529060010190602001808311610b3657829003601f168201915b5050505050610b89565b6007610b688361225f565b604051602001610b79929190614b00565b6040516020818303038152906040525b9050919050565b600063150b7a0260e01b9050949350505050565b600a6020528060005260406000206000915054906101000a900460ff1681565b610bcc6121e1565b60005b8251811015610c3d57818181518110610beb57610bea6148da565b5b6020026020010151600c6000858481518110610c0a57610c096148da565b5b602002602001015160ff1660ff168152602001908152602001600020819055508080610c3590614938565b915050610bcf565b505050565b600b6020528060005260406000206000915054906101000a900460ff1681565b6000806000600660008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610df75760056040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610e016123bf565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610e2d9190614b2f565b610e379190614ba0565b90508160000151819350935050509250929050565b600c6020528060005260406000206000915090505481565b8460006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610fa4573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ed857610ed386868686866123c9565b610fb2565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610f21929190614bd1565b602060405180830381865afa158015610f3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f629190614c0f565b610fa357336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610f9a919061448d565b60405180910390fd5b5b610fb186868686866123c9565b5b505050505050565b610fc26121e1565b610fdd8284836040518060200160405280600081525061246a565b505050565b610fea6121e1565b8060079081610ff99190614dc9565b5060076040516110099190614e9b565b60405180910390207f23c8c9488efebfd474e85a7956de6f39b17c7ab88502d42a623db2d8e382bbaa60405160405180910390a250565b6110486121e1565b6110506116d4565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611095573d6000803e3d6000fd5b50565b6daaeb6d7670e522a718067333cd4e81565b600080600284849050146110bd57600080fd5b60005b84849050811015611299577f0000000000000000000000005231298cf21acf2f5a3128872867cb02043f169e73ffffffffffffffffffffffffffffffffffffffff166345b0c0fa876040518263ffffffff1660e01b815260040161112491906137ab565b602060405180830381865afa158015611141573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111659190614ec7565b7f0000000000000000000000005231298cf21acf2f5a3128872867cb02043f169e73ffffffffffffffffffffffffffffffffffffffff166345b0c0fa8787858181106111b4576111b36148da565b5b905060200201356040518263ffffffff1660e01b81526004016111d791906137ab565b602060405180830381865afa1580156111f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112189190614ec7565b14611258576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124f90614f40565b60405180910390fd5b8585858381811061126c5761126b6148da565b5b90506020020135036112815760019250611286565b600191505b808061129190614938565b9150506110c0565b5060011515821515146112e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d890614fd2565b60405180910390fd5b6001151581151514611328576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131f90615064565b60405180910390fd5b7f0000000000000000000000005231298cf21acf2f5a3128872867cb02043f169e73ffffffffffffffffffffffffffffffffffffffff166392e37aea8686866040518463ffffffff1660e01b8152600401611385939291906150ee565b600060405180830381600087803b15801561139f57600080fd5b505af11580156113b3573d6000803e3d6000fd5b5050505060017f0000000000000000000000005231298cf21acf2f5a3128872867cb02043f169e73ffffffffffffffffffffffffffffffffffffffff166345b0c0fa876040518263ffffffff1660e01b815260040161141291906137ab565b602060405180830381865afa15801561142f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114539190614ec7565b101561147a57611475336003806040518060200160405280600081525061246a565b611498565b61149733600360016040518060200160405280600081525061246a565b5b5050505050565b606081518351146114e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114dc90615192565b60405180910390fd5b6000835167ffffffffffffffff81111561150257611501613897565b5b6040519080825280602002602001820160405280156115305781602001602082028036833780820191505090505b50905060005b84518110156115ad5761157d858281518110611555576115546148da565b5b60200260200101518583815181106115705761156f6148da565b5b60200260200101516108bb565b8282815181106115905761158f6148da565b5b602002602001018181525050806115a690614938565b9050611536565b508091505092915050565b600780546115c5906149af565b80601f01602080910402602001604051908101604052809291908181526020018280546115f1906149af565b801561163e5780601f106116135761010080835404028352916020019161163e565b820191906000526020600020905b81548152906001019060200180831161162157829003601f168201915b505050505081565b61164e6121e1565b80600d60008460ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b61168b6121e1565b611695600061261a565b565b61169f6121e1565b80600b60008460ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156117f9576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611776929190614bd1565b602060405180830381865afa158015611793573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b79190614c0f565b6117f857806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016117ef919061448d565b60405180910390fd5b5b61180383836126e0565b505050565b600d6020528060005260406000206000915054906101000a900460ff1681565b60096020528060005260406000206000915090505481565b600260045403611885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187c906151fe565b60405180910390fd5b600260048190555060011515600b60008560ff1660ff16815260200190815260200160002060009054906101000a900460ff161515146118c457600080fd5b3481600c60008660ff1660ff168152602001908152602001600020546118ea9190614b2f565b11156118f557600080fd5b611913828460ff16836040518060200160405280600081525061246a565b6001600481905550505050565b6119286121e1565b80600890816119379190614dc9565b5050565b600260045403611980576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611977906151fe565b60405180910390fd5b600260048190555060008060005b84849050811015611bf8577f0000000000000000000000005231298cf21acf2f5a3128872867cb02043f169e73ffffffffffffffffffffffffffffffffffffffff166342842e0e33308888868181106119ea576119e96148da565b5b905060200201356040518463ffffffff1660e01b8152600401611a0f9392919061521e565b600060405180830381600087803b158015611a2957600080fd5b505af1158015611a3d573d6000803e3d6000fd5b505050507f0000000000000000000000005231298cf21acf2f5a3128872867cb02043f169e73ffffffffffffffffffffffffffffffffffffffff166345b0c0fa868684818110611a9057611a8f6148da565b5b905060200201356040518263ffffffff1660e01b8152600401611ab391906137ab565b602060405180830381865afa158015611ad0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af49190614ec7565b6002611b009190615388565b83611b0b91906153d3565b925060017f0000000000000000000000005231298cf21acf2f5a3128872867cb02043f169e73ffffffffffffffffffffffffffffffffffffffff166345b0c0fa878785818110611b5e57611b5d6148da565b5b905060200201356040518263ffffffff1660e01b8152600401611b8191906137ab565b602060405180830381865afa158015611b9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc29190614ec7565b6002611bce9190615388565b611bd89190615407565b82611be391906153d3565b91508080611bf090614938565b91505061198e565b50611c15336001846040518060200160405280600081525061246a565b6000811115611c3b57611c3a336002836040518060200160405280600081525061246a565b5b505060016004819055505050565b611c516121e1565b60005b8251811015611cc257818181518110611c7057611c6f6148da565b5b602002602001015160096000858481518110611c8f57611c8e6148da565b5b602002602001015160ff1660ff168152602001908152602001600020819055508080611cba90614938565b915050611c54565b505050565b611ccf6121e1565b60005b83839050811015611d8c57611d79848483818110611cf357611cf26148da565b5b9050602002016020810190611d0891906147c8565b868381518110611d1b57611d1a6148da565b5b6020026020010151848481518110611d3657611d356148da565b5b60200260200101516040518060400160405280600f81526020017f4d696e742d612d70616c6f6f7a6121000000000000000000000000000000000081525061246a565b8080611d8490614938565b915050611cd2565b5050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8460006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611f67573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e9b57611e9686868686866126f6565b611f75565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611ee4929190614bd1565b602060405180830381865afa158015611f01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f259190614c0f565b611f6657336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611f5d919061448d565b60405180910390fd5b5b611f7486868686866126f6565b5b505050505050565b600260045403611fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb9906151fe565b60405180910390fd5b60026004819055508360ff16600a60008460ff1660ff16815260200190815260200160002060009054906101000a900460ff1660ff161461200257600080fd5b808361200e9190614b2f565b81600960008560ff1660ff168152602001908152602001600020546120339190614b2f565b1461203d57600080fd5b60011515600d60008460ff1660ff16815260200190815260200160002060009054906101000a900460ff1615151461207457600080fd5b612082338560ff1685612797565b6120a0338360ff16836040518060200160405280600081525061246a565b600160048190555050505050565b6120b66121e1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211c906154ad565b60405180910390fd5b61212e8161261a565b50565b61213c838383612797565b505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806121da57506121d9826129dd565b5b9050919050565b6121e9612abf565b73ffffffffffffffffffffffffffffffffffffffff166122076116d4565b73ffffffffffffffffffffffffffffffffffffffff161461225d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225490615519565b60405180910390fd5b565b6060600082036122a6576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123ba565b600082905060005b600082146122d85780806122c190614938565b915050600a826122d19190614ba0565b91506122ae565b60008167ffffffffffffffff8111156122f4576122f3613897565b5b6040519080825280601f01601f1916602001820160405280156123265781602001600182028036833780820191505090505b5090505b600085146123b35760018261233f9190615407565b9150600a8561234e9190615539565b603061235a91906153d3565b60f81b8183815181106123705761236f6148da565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123ac9190614ba0565b945061232a565b8093505050505b919050565b6000612710905090565b6123d1612abf565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480612417575061241685612411612abf565b611d93565b5b612456576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244d906155dc565b60405180910390fd5b6124638585858585612ac7565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036124d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d09061566e565b60405180910390fd5b60006124e3612abf565b905060006124f085612de8565b905060006124fd85612de8565b905061250e83600089858589612e62565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461256d91906153d3565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516125eb92919061568e565b60405180910390a461260283600089858589612e6a565b61261183600089898989612e72565b50505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6126f26126eb612abf565b8383613049565b5050565b6126fe612abf565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061274457506127438561273e612abf565b611d93565b5b612783576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277a906155dc565b60405180910390fd5b61279085858585856131b5565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612806576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127fd90615729565b60405180910390fd5b6000612810612abf565b9050600061281d84612de8565b9050600061282a84612de8565b905061284a83876000858560405180602001604052806000815250612e62565b600080600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050848110156128e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d8906157bb565b60405180910390fd5b84810360008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516129ae92919061568e565b60405180910390a46129d484886000868660405180602001604052806000815250612e6a565b50505050505050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612aa857507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612ab85750612ab782613450565b5b9050919050565b600033905090565b8151835114612b0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b029061584d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b71906158df565b60405180910390fd5b6000612b84612abf565b9050612b94818787878787612e62565b60005b8451811015612d45576000858281518110612bb557612bb46148da565b5b602002602001015190506000858381518110612bd457612bd36148da565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612c75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6c90615971565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d2a91906153d3565b9250508190555050505080612d3e90614938565b9050612b97565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612dbc929190615991565b60405180910390a4612dd2818787878787612e6a565b612de08187878787876134ba565b505050505050565b60606000600167ffffffffffffffff811115612e0757612e06613897565b5b604051908082528060200260200182016040528015612e355781602001602082028036833780820191505090505b5090508281600081518110612e4d57612e4c6148da565b5b60200260200101818152505080915050919050565b505050505050565b505050505050565b612e918473ffffffffffffffffffffffffffffffffffffffff16613691565b15613041578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612ed7959493929190615a1d565b6020604051808303816000875af1925050508015612f1357506040513d601f19601f82011682018060405250810190612f109190615a8c565b60015b612fb857612f1f615ac6565b806308c379a003612f7b5750612f33615ae8565b80612f3e5750612f7d565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f729190613b0a565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612faf90615bea565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461303f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303690615c7c565b60405180910390fd5b505b505050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036130b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ae90615d0e565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516131a89190613866565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321b906158df565b60405180910390fd5b600061322e612abf565b9050600061323b85612de8565b9050600061324885612de8565b9050613258838989858589612e62565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050858110156132ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132e690615971565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133a491906153d3565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a60405161342192919061568e565b60405180910390a4613437848a8a86868a612e6a565b613445848a8a8a8a8a612e72565b505050505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6134d98473ffffffffffffffffffffffffffffffffffffffff16613691565b15613689578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161351f959493929190615d2e565b6020604051808303816000875af192505050801561355b57506040513d601f19601f820116820180604052508101906135589190615a8c565b60015b61360057613567615ac6565b806308c379a0036135c3575061357b615ae8565b8061358657506135c5565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135ba9190613b0a565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135f790615bea565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161367e90615c7c565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006136f3826136c8565b9050919050565b613703816136e8565b811461370e57600080fd5b50565b600081359050613720816136fa565b92915050565b6000819050919050565b61373981613726565b811461374457600080fd5b50565b60008135905061375681613730565b92915050565b60008060408385031215613773576137726136be565b5b600061378185828601613711565b925050602061379285828601613747565b9150509250929050565b6137a581613726565b82525050565b60006020820190506137c0600083018461379c565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6137fb816137c6565b811461380657600080fd5b50565b600081359050613818816137f2565b92915050565b600060208284031215613834576138336136be565b5b600061384284828501613809565b91505092915050565b60008115159050919050565b6138608161384b565b82525050565b600060208201905061387b6000830184613857565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6138cf82613886565b810181811067ffffffffffffffff821117156138ee576138ed613897565b5b80604052505050565b60006139016136b4565b905061390d82826138c6565b919050565b600067ffffffffffffffff82111561392d5761392c613897565b5b602082029050602081019050919050565b600080fd5b600060ff82169050919050565b61395981613943565b811461396457600080fd5b50565b60008135905061397681613950565b92915050565b600061398f61398a84613912565b6138f7565b905080838252602082019050602084028301858111156139b2576139b161393e565b5b835b818110156139db57806139c78882613967565b8452602084019350506020810190506139b4565b5050509392505050565b600082601f8301126139fa576139f9613881565b5b8135613a0a84826020860161397c565b91505092915050565b60008060408385031215613a2a57613a296136be565b5b600083013567ffffffffffffffff811115613a4857613a476136c3565b5b613a54858286016139e5565b925050602083013567ffffffffffffffff811115613a7557613a746136c3565b5b613a81858286016139e5565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613ac5578082015181840152602081019050613aaa565b60008484015250505050565b6000613adc82613a8b565b613ae68185613a96565b9350613af6818560208601613aa7565b613aff81613886565b840191505092915050565b60006020820190508181036000830152613b248184613ad1565b905092915050565b600060208284031215613b4257613b416136be565b5b6000613b5084828501613747565b91505092915050565b600080fd5b600067ffffffffffffffff821115613b7957613b78613897565b5b613b8282613886565b9050602081019050919050565b82818337600083830152505050565b6000613bb1613bac84613b5e565b6138f7565b905082815260208101848484011115613bcd57613bcc613b59565b5b613bd8848285613b8f565b509392505050565b600082601f830112613bf557613bf4613881565b5b8135613c05848260208601613b9e565b91505092915050565b60008060008060808587031215613c2857613c276136be565b5b6000613c3687828801613711565b9450506020613c4787828801613711565b9350506040613c5887828801613747565b925050606085013567ffffffffffffffff811115613c7957613c786136c3565b5b613c8587828801613be0565b91505092959194509250565b613c9a816137c6565b82525050565b6000602082019050613cb56000830184613c91565b92915050565b600060208284031215613cd157613cd06136be565b5b6000613cdf84828501613967565b91505092915050565b613cf181613943565b82525050565b6000602082019050613d0c6000830184613ce8565b92915050565b600067ffffffffffffffff821115613d2d57613d2c613897565b5b602082029050602081019050919050565b6000613d51613d4c84613d12565b6138f7565b90508083825260208201905060208402830185811115613d7457613d7361393e565b5b835b81811015613d9d5780613d898882613747565b845260208401935050602081019050613d76565b5050509392505050565b600082601f830112613dbc57613dbb613881565b5b8135613dcc848260208601613d3e565b91505092915050565b60008060408385031215613dec57613deb6136be565b5b600083013567ffffffffffffffff811115613e0a57613e096136c3565b5b613e16858286016139e5565b925050602083013567ffffffffffffffff811115613e3757613e366136c3565b5b613e4385828601613da7565b9150509250929050565b60008060408385031215613e6457613e636136be565b5b6000613e7285828601613747565b9250506020613e8385828601613747565b9150509250929050565b613e96816136e8565b82525050565b6000604082019050613eb16000830185613e8d565b613ebe602083018461379c565b9392505050565b600080600080600060a08688031215613ee157613ee06136be565b5b6000613eef88828901613711565b9550506020613f0088828901613711565b945050604086013567ffffffffffffffff811115613f2157613f206136c3565b5b613f2d88828901613da7565b935050606086013567ffffffffffffffff811115613f4e57613f4d6136c3565b5b613f5a88828901613da7565b925050608086013567ffffffffffffffff811115613f7b57613f7a6136c3565b5b613f8788828901613be0565b9150509295509295909350565b600080600060608486031215613fad57613fac6136be565b5b6000613fbb86828701613747565b9350506020613fcc86828701613711565b9250506040613fdd86828701613747565b9150509250925092565b600067ffffffffffffffff82111561400257614001613897565b5b61400b82613886565b9050602081019050919050565b600061402b61402684613fe7565b6138f7565b90508281526020810184848401111561404757614046613b59565b5b614052848285613b8f565b509392505050565b600082601f83011261406f5761406e613881565b5b813561407f848260208601614018565b91505092915050565b60006020828403121561409e5761409d6136be565b5b600082013567ffffffffffffffff8111156140bc576140bb6136c3565b5b6140c88482850161405a565b91505092915050565b6000819050919050565b60006140f66140f16140ec846136c8565b6140d1565b6136c8565b9050919050565b6000614108826140db565b9050919050565b600061411a826140fd565b9050919050565b61412a8161410f565b82525050565b60006020820190506141456000830184614121565b92915050565b600080fd5b60008083601f84011261416657614165613881565b5b8235905067ffffffffffffffff8111156141835761418261414b565b5b60208301915083602082028301111561419f5761419e61393e565b5b9250929050565b6000806000604084860312156141bf576141be6136be565b5b60006141cd86828701613747565b935050602084013567ffffffffffffffff8111156141ee576141ed6136c3565b5b6141fa86828701614150565b92509250509250925092565b600067ffffffffffffffff82111561422157614220613897565b5b602082029050602081019050919050565b600061424561424084614206565b6138f7565b905080838252602082019050602084028301858111156142685761426761393e565b5b835b81811015614291578061427d8882613711565b84526020840193505060208101905061426a565b5050509392505050565b600082601f8301126142b0576142af613881565b5b81356142c0848260208601614232565b91505092915050565b600080604083850312156142e0576142df6136be565b5b600083013567ffffffffffffffff8111156142fe576142fd6136c3565b5b61430a8582860161429b565b925050602083013567ffffffffffffffff81111561432b5761432a6136c3565b5b61433785828601613da7565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61437681613726565b82525050565b6000614388838361436d565b60208301905092915050565b6000602082019050919050565b60006143ac82614341565b6143b6818561434c565b93506143c18361435d565b8060005b838110156143f25781516143d9888261437c565b97506143e483614394565b9250506001810190506143c5565b5085935050505092915050565b6000602082019050818103600083015261441981846143a1565b905092915050565b61442a8161384b565b811461443557600080fd5b50565b60008135905061444781614421565b92915050565b60008060408385031215614464576144636136be565b5b600061447285828601613967565b925050602061448385828601614438565b9150509250929050565b60006020820190506144a26000830184613e8d565b92915050565b600080604083850312156144bf576144be6136be565b5b60006144cd85828601613711565b92505060206144de85828601614438565b9150509250929050565b600080600060608486031215614501576145006136be565b5b600061450f86828701613967565b935050602061452086828701613711565b925050604061453186828701613747565b9150509250925092565b60008060208385031215614552576145516136be565b5b600083013567ffffffffffffffff8111156145705761456f6136c3565b5b61457c85828601614150565b92509250509250929050565b60008083601f84011261459e5761459d613881565b5b8235905067ffffffffffffffff8111156145bb576145ba61414b565b5b6020830191508360208202830111156145d7576145d661393e565b5b9250929050565b600080600080606085870312156145f8576145f76136be565b5b600085013567ffffffffffffffff811115614616576146156136c3565b5b61462287828801613da7565b945050602085013567ffffffffffffffff811115614643576146426136c3565b5b61464f87828801614588565b9350935050604085013567ffffffffffffffff811115614672576146716136c3565b5b61467e87828801613da7565b91505092959194509250565b600080604083850312156146a1576146a06136be565b5b60006146af85828601613711565b92505060206146c085828601613711565b9150509250929050565b600080600080600060a086880312156146e6576146e56136be565b5b60006146f488828901613711565b955050602061470588828901613711565b945050604061471688828901613747565b935050606061472788828901613747565b925050608086013567ffffffffffffffff811115614748576147476136c3565b5b61475488828901613be0565b9150509295509295909350565b6000806000806080858703121561477b5761477a6136be565b5b600061478987828801613967565b945050602061479a87828801613747565b93505060406147ab87828801613967565b92505060606147bc87828801613747565b91505092959194509250565b6000602082840312156147de576147dd6136be565b5b60006147ec84828501613711565b91505092915050565b60008060006060848603121561480e5761480d6136be565b5b600061481c86828701613711565b935050602061482d86828701613747565b925050604061483e86828701613747565b9150509250925092565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b60006148a4602a83613a96565b91506148af82614848565b604082019050919050565b600060208201905081810360008301526148d381614897565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061494382613726565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361497557614974614909565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806149c757607f821691505b6020821081036149da576149d9614980565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154614a0d816149af565b614a1781866149e0565b94506001821660008114614a325760018114614a4757614a7a565b60ff1983168652811515820286019350614a7a565b614a50856149eb565b60005b83811015614a7257815481890152600182019150602081019050614a53565b838801955050505b50505092915050565b6000614a8e82613a8b565b614a9881856149e0565b9350614aa8818560208601613aa7565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614aea6005836149e0565b9150614af582614ab4565b600582019050919050565b6000614b0c8285614a00565b9150614b188284614a83565b9150614b2382614add565b91508190509392505050565b6000614b3a82613726565b9150614b4583613726565b9250828202614b5381613726565b91508282048414831517614b6a57614b69614909565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614bab82613726565b9150614bb683613726565b925082614bc657614bc5614b71565b5b828204905092915050565b6000604082019050614be66000830185613e8d565b614bf36020830184613e8d565b9392505050565b600081519050614c0981614421565b92915050565b600060208284031215614c2557614c246136be565b5b6000614c3384828501614bfa565b91505092915050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614c897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614c4c565b614c938683614c4c565b95508019841693508086168417925050509392505050565b6000614cc6614cc1614cbc84613726565b6140d1565b613726565b9050919050565b6000819050919050565b614ce083614cab565b614cf4614cec82614ccd565b848454614c59565b825550505050565b600090565b614d09614cfc565b614d14818484614cd7565b505050565b5b81811015614d3857614d2d600082614d01565b600181019050614d1a565b5050565b601f821115614d7d57614d4e816149eb565b614d5784614c3c565b81016020851015614d66578190505b614d7a614d7285614c3c565b830182614d19565b50505b505050565b600082821c905092915050565b6000614da060001984600802614d82565b1980831691505092915050565b6000614db98383614d8f565b9150826002028217905092915050565b614dd282613a8b565b67ffffffffffffffff811115614deb57614dea613897565b5b614df582546149af565b614e00828285614d3c565b600060209050601f831160018114614e335760008415614e21578287015190505b614e2b8582614dad565b865550614e93565b601f198416614e41866149eb565b60005b82811015614e6957848901518255600182019150602085019450602081019050614e44565b86831015614e865784890151614e82601f891682614d8f565b8355505b6001600288020188555050505b505050505050565b6000614ea78284614a00565b915081905092915050565b600081519050614ec181613730565b92915050565b600060208284031215614edd57614edc6136be565b5b6000614eeb84828501614eb2565b91505092915050565b7f546f6b656e7320617265206e6f74207269676874206c6576656c000000000000600082015250565b6000614f2a601a83613a96565b9150614f3582614ef4565b602082019050919050565b60006020820190508181036000830152614f5981614f1d565b9050919050565b7f746f6b656e494420706172616d206e6f7420696e20746f6b656e20617272617960008201527f20706172616d0000000000000000000000000000000000000000000000000000602082015250565b6000614fbc602683613a96565b9150614fc782614f60565b604082019050919050565b60006020820190508181036000830152614feb81614faf565b9050919050565b7f6e6f206275726e20746f6b656e20696e20746f6b656e2061727261792070617260008201527f616d000000000000000000000000000000000000000000000000000000000000602082015250565b600061504e602283613a96565b915061505982614ff2565b604082019050919050565b6000602082019050818103600083015261507d81615041565b9050919050565b600080fd5b82818337505050565b600061509e838561434c565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156150d1576150d0615084565b5b6020830292506150e2838584615089565b82840190509392505050565b6000604082019050615103600083018661379c565b8181036020830152615116818486615092565b9050949350505050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b600061517c602983613a96565b915061518782615120565b604082019050919050565b600060208201905081810360008301526151ab8161516f565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006151e8601f83613a96565b91506151f3826151b2565b602082019050919050565b60006020820190508181036000830152615217816151db565b9050919050565b60006060820190506152336000830186613e8d565b6152406020830185613e8d565b61524d604083018461379c565b949350505050565b60008160011c9050919050565b6000808291508390505b60018511156152ac5780860481111561528857615287614909565b5b60018516156152975780820291505b80810290506152a585615255565b945061526c565b94509492505050565b6000826152c55760019050615381565b816152d35760009050615381565b81600181146152e957600281146152f357615322565b6001915050615381565b60ff84111561530557615304614909565b5b8360020a91508482111561531c5761531b614909565b5b50615381565b5060208310610133831016604e8410600b84101617156153575782820a90508381111561535257615351614909565b5b615381565b6153648484846001615262565b9250905081840481111561537b5761537a614909565b5b81810290505b9392505050565b600061539382613726565b915061539e83613726565b92506153cb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846152b5565b905092915050565b60006153de82613726565b91506153e983613726565b925082820190508082111561540157615400614909565b5b92915050565b600061541282613726565b915061541d83613726565b925082820390508181111561543557615434614909565b5b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615497602683613a96565b91506154a28261543b565b604082019050919050565b600060208201905081810360008301526154c68161548a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615503602083613a96565b915061550e826154cd565b602082019050919050565b60006020820190508181036000830152615532816154f6565b9050919050565b600061554482613726565b915061554f83613726565b92508261555f5761555e614b71565b5b828206905092915050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206e6f7220617070726f7665640000000000000000000000000000000000602082015250565b60006155c6602f83613a96565b91506155d18261556a565b604082019050919050565b600060208201905081810360008301526155f5816155b9565b9050919050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615658602183613a96565b9150615663826155fc565b604082019050919050565b600060208201905081810360008301526156878161564b565b9050919050565b60006040820190506156a3600083018561379c565b6156b0602083018461379c565b9392505050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000615713602383613a96565b915061571e826156b7565b604082019050919050565b6000602082019050818103600083015261574281615706565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b60006157a5602483613a96565b91506157b082615749565b604082019050919050565b600060208201905081810360008301526157d481615798565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000615837602883613a96565b9150615842826157db565b604082019050919050565b600060208201905081810360008301526158668161582a565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006158c9602583613a96565b91506158d48261586d565b604082019050919050565b600060208201905081810360008301526158f8816158bc565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b600061595b602a83613a96565b9150615966826158ff565b604082019050919050565b6000602082019050818103600083015261598a8161594e565b9050919050565b600060408201905081810360008301526159ab81856143a1565b905081810360208301526159bf81846143a1565b90509392505050565b600081519050919050565b600082825260208201905092915050565b60006159ef826159c8565b6159f981856159d3565b9350615a09818560208601613aa7565b615a1281613886565b840191505092915050565b600060a082019050615a326000830188613e8d565b615a3f6020830187613e8d565b615a4c604083018661379c565b615a59606083018561379c565b8181036080830152615a6b81846159e4565b90509695505050505050565b600081519050615a86816137f2565b92915050565b600060208284031215615aa257615aa16136be565b5b6000615ab084828501615a77565b91505092915050565b60008160e01c9050919050565b600060033d1115615ae55760046000803e615ae2600051615ab9565b90505b90565b600060443d10615b7557615afa6136b4565b60043d036004823e80513d602482011167ffffffffffffffff82111715615b22575050615b75565b808201805167ffffffffffffffff811115615b405750505050615b75565b80602083010160043d038501811115615b5d575050505050615b75565b615b6c826020018501866138c6565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000615bd4603483613a96565b9150615bdf82615b78565b604082019050919050565b60006020820190508181036000830152615c0381615bc7565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000615c66602883613a96565b9150615c7182615c0a565b604082019050919050565b60006020820190508181036000830152615c9581615c59565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000615cf8602983613a96565b9150615d0382615c9c565b604082019050919050565b60006020820190508181036000830152615d2781615ceb565b9050919050565b600060a082019050615d436000830188613e8d565b615d506020830187613e8d565b8181036040830152615d6281866143a1565b90508181036060830152615d7681856143a1565b90508181036080830152615d8a81846159e4565b9050969550505050505056fea264697066735822122049f5b158c39c51a68ee941e71c1c8b0eb230908d9e2a364f04c0e1c49c51a2db64736f6c63430008110033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000043697066733a2f2f6261667962656966796e6537666c6867736a6a6b3432666867727962636c777761707063326f6f7067717164357a6a753461786f32746d676367692f0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _baseURI (string): ipfs://bafybeifyne7flhgsjjk42fhgrybclwwappc2oopgqqd5zju4axo2tmgcgi/

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [2] : 697066733a2f2f6261667962656966796e6537666c6867736a6a6b3432666867
Arg [3] : 727962636c777761707063326f6f7067717164357a6a753461786f32746d6763
Arg [4] : 67692f0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

64033:8695:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21443:317;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66432:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67230:250;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64290:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72183:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68735:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64403:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67492:250;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64463:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60646:438;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;64518:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66058:302;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67993:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72037:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72436:106;;;;;;;;;;;;;:::i;:::-;;48345:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70927:1006;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21926:561;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64190:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66768:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42476:103;;;;;;;;;;;;;:::i;:::-;;66611:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41828:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65249:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64576:56;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64343:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69571:338;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71941:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68187:540;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66948:260;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70581:338;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22819:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65613:252;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68981:582;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42734:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72550:173;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64639:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21443:317;21574:7;21640:1;21621:21;;:7;:21;;;21599:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;21730:9;:13;21740:2;21730:13;;;;;;;;;;;:22;21744:7;21730:22;;;;;;;;;;;;;;;;21723:29;;21443:317;;;;:::o;66432:171::-;66535:4;66559:36;66583:11;66559:23;:36::i;:::-;66552:43;;66432:171;;;:::o;67230:250::-;41714:13;:11;:13::i;:::-;67351:9:::1;67346:119;67368:9;:16;67366:1;:18;67346:119;;;67442:8;67451:1;67442:11;;;;;;;;:::i;:::-;;;;;;;;67404:21;:35;67426:9;67436:1;67426:12;;;;;;;;:::i;:::-;;;;;;;;67404:35;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;67385:3;;;;;:::i;:::-;;;;67346:119;;;;67230:250:::0;;:::o;64290:44::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;72183:245::-;72242:13;72312:1;72294:7;72288:21;;;;;:::i;:::-;;;:25;:132;;72413:7;72288:132;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72357:7;72366:17;:6;:15;:17::i;:::-;72340:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;72288:132;72268:152;;72183:245;;;:::o;68735:234::-;68903:6;68931:30;;;68924:37;;68735:234;;;;;;:::o;64403:53::-;;;;;;;;;;;;;;;;;;;;;;:::o;67492:250::-;41714:13;:11;:13::i;:::-;67614:9:::1;67609:118;67631:9;:16;67629:1;:18;67609:118;;;67701:11;67713:1;67701:14;;;;;;;;:::i;:::-;;;;;;;;67667:17;:31;67685:9;67695:1;67685:12;;;;;;;;:::i;:::-;;;;;;;;67667:31;;;;;;;;;;;;;;;:48;;;;67648:3;;;;;:::i;:::-;;;;67609:118;;;;67492:250:::0;;:::o;64463:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;60646:438::-;60741:7;60750;60770:26;60799:17;:26;60817:7;60799:26;;;;;;;;;;;60770:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60870:1;60842:30;;:7;:16;;;:30;;;60838:92;;60899:19;60889:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60838:92;60942:21;61006:17;:15;:17::i;:::-;60966:57;;60979:7;:23;;;60967:35;;:9;:35;;;;:::i;:::-;60966:57;;;;:::i;:::-;60942:81;;61044:7;:16;;;61062:13;61036:40;;;;;;60646:438;;;;;:::o;64518:51::-;;;;;;;;;;;;;;;;;:::o;66058:302::-;66278:4;49641:1;48445:42;49593:45;;;:49;49589:539;;;49882:10;49874:18;;:4;:18;;;49870:85;;66295:57:::1;66323:4;66329:2;66333:3;66338:7;66347:4;66295:27;:57::i;:::-;49933:7:::0;;49870:85;48445:42;49974;;;50025:4;50032:10;49974:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49969:148;;50090:10;50071:30;;;;;;;;;;;:::i;:::-;;;;;;;;49969:148;49589:539;66295:57:::1;66323:4;66329:2;66333:3;66338:7;66347:4;66295:27;:57::i;:::-;66058:302:::0;;;;;;;:::o;67993:186::-;41714:13;:11;:13::i;:::-;68131:40:::1;68137:8;68147;68157:9;68131:40;;;;;;;;;;;::::0;:5:::1;:40::i;:::-;67993:186:::0;;;:::o;72037:138::-;41714:13;:11;:13::i;:::-;72124:8:::1;72114:7;:18;;;;;;:::i;:::-;;72159:7;72148:19;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;72037:138:::0;:::o;72436:106::-;41714:13;:11;:13::i;:::-;72494:7:::1;:5;:7::i;:::-;72486:25;;:48;72512:21;72486:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;72436:106::o:0;48345:143::-;48445:42;48345:143;:::o;70927:1006::-;71073:10;71102:11;71159:1;71140:8;;:15;;:20;71132:29;;;;;;71177:9;71172:356;71192:8;;:15;;71188:1;:19;71172:356;;;71279:11;:25;;;71305:8;71279:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71237:11;:25;;;71263:8;;71272:1;71263:11;;;;;;;:::i;:::-;;;;;;;;71237:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:77;71229:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;71379:8;71364;;71373:1;71364:11;;;;;;;:::i;:::-;;;;;;;;:23;71360:143;;71416:4;71408:12;;71360:143;;;71483:4;71474:13;;71360:143;71209:3;;;;;:::i;:::-;;;;71172:356;;;;71555:4;71546:13;;:5;:13;;;71538:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;71631:4;71621:14;;:6;:14;;;71613:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;71685:11;:26;;;71712:8;71721;;71685:45;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71785:1;71747:11;:25;;;71773:8;71747:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;71743:164;;;71803:27;71809:10;71821:1;71824;71803:27;;;;;;;;;;;;:5;:27::i;:::-;71743:164;;;71868:27;71874:10;71886:1;71889;71868:27;;;;;;;;;;;;:5;:27::i;:::-;71743:164;71060:873;;70927:1006;;;:::o;21926:561::-;22082:16;22157:3;:10;22138:8;:15;:29;22116:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;22249:30;22296:8;:15;22282:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22249:63;;22330:9;22325:122;22349:8;:15;22345:1;:19;22325:122;;;22405:30;22415:8;22424:1;22415:11;;;;;;;;:::i;:::-;;;;;;;;22428:3;22432:1;22428:6;;;;;;;;:::i;:::-;;;;;;;;22405:9;:30::i;:::-;22386:13;22400:1;22386:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;22366:3;;;;:::i;:::-;;;22325:122;;;;22466:13;22459:20;;;21926:561;;;;:::o;64190:93::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;66768:165::-;41714:13;:11;:13::i;:::-;66912:7:::1;66873:26;:36;66900:8;66873:36;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;66768:165:::0;;:::o;42476:103::-;41714:13;:11;:13::i;:::-;42541:30:::1;42568:1;42541:18;:30::i;:::-;42476:103::o:0;66611:149::-;41714:13;:11;:13::i;:::-;66739:7:::1;66708:18;:28;66727:8;66708:28;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;66611:149:::0;;:::o;41828:87::-;41874:7;41901:6;;;;;;;;;;;41894:13;;41828:87;:::o;65249:176::-;65353:8;50387:1;48445:42;50339:45;;;:49;50335:225;;;48445:42;50410;;;50461:4;50468:8;50410:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50405:144;;50524:8;50505:28;;;;;;;;;;;:::i;:::-;;;;;;;;50405:144;50335:225;65374:43:::1;65398:8;65408;65374:23;:43::i;:::-;65249:176:::0;;;:::o;64576:56::-;;;;;;;;;;;;;;;;;;;;;;:::o;64343:53::-;;;;;;;;;;;;;;;;;:::o;69571:338::-;52746:1;53344:7;;:19;53336:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;52746:1;53477:7;:18;;;;69764:4:::1;69732:36;;:18;:28;69751:8;69732:28;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;69724:45;;;::::0;::::1;;69832:9;69818;69788:17;:27;69806:8;69788:27;;;;;;;;;;;;;;;;:39;;;;:::i;:::-;69787:54;;69779:63;;;::::0;::::1;;69859:40;69865:8;69875;69859:40;;69885:9;69859:40;;;;;;;;;;;::::0;:5:::1;:40::i;:::-;52702:1:::0;53656:7;:22;;;;69571:338;;;:::o;71941:86::-;41714:13;:11;:13::i;:::-;72014:5:::1;72007:4;:12;;;;;;:::i;:::-;;71941:86:::0;:::o;68187:540::-;52746:1;53344:7;;:19;53336:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;52746:1;53477:7;:18;;;;68264:11:::1;68290:12:::0;68322:9:::1;68317:282;68341:9;;:16;;68337:1;:20;68317:282;;;68379:11;:28;;;68408:10;68428:4;68435:9;;68445:1;68435:12;;;;;;;:::i;:::-;;;;;;;;68379:69;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;68474:11;:25;;;68500:9;;68510:1;68500:12;;;;;;;:::i;:::-;;;;;;;;68474:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68471:1;:42;;;;:::i;:::-;68463:51;;;;;:::i;:::-;;;68585:1;68542:11;:25;;;68568:9;;68578:1;68568:12;;;;;;;:::i;:::-;;;;;;;;68542:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68539:1;:42;;;;:::i;:::-;68538:48;;;;:::i;:::-;68529:58;;;;;:::i;:::-;;;68359:3;;;;;:::i;:::-;;;;68317:282;;;;68609:29;68615:10;68627:1;68630:3;68609:29;;;;;;;;;;;::::0;:5:::1;:29::i;:::-;68660:1;68653:4;:8;68649:71;;;68678:30;68684:10;68696:1;68699:4;68678:30;;;;;;;;;;;::::0;:5:::1;:30::i;:::-;68649:71;68253:474;;52702:1:::0;53656:7;:22;;;;68187:540;;:::o;66948:260::-;41714:13;:11;:13::i;:::-;67075:9:::1;67070:123;67092:9;:16;67090:1;:18;67070:123;;;67164:14;67179:1;67164:17;;;;;;;;:::i;:::-;;;;;;;;67128:19;:33;67148:9;67158:1;67148:12;;;;;;;;:::i;:::-;;;;;;;;67128:33;;;;;;;;;;;;;;;:53;;;;67109:3;;;;;:::i;:::-;;;;67070:123;;;;66948:260:::0;;:::o;70581:338::-;41714:13;:11;:13::i;:::-;70744:9:::1;70739:173;70763:5;;:12;;70759:1;:16;70739:173;;;70843:57;70849:5;;70855:1;70849:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;70859:9;70869:1;70859:12;;;;;;;;:::i;:::-;;;;;;;;70873:4;70878:1;70873:7;;;;;;;;:::i;:::-;;;;;;;;70843:57;;;;;;;;;;;;;;;;::::0;:5:::1;:57::i;:::-;70777:3;;;;;:::i;:::-;;;;70739:173;;;;70581:338:::0;;;;:::o;22819:218::-;22963:4;22992:18;:27;23011:7;22992:27;;;;;;;;;;;;;;;:37;23020:8;22992:37;;;;;;;;;;;;;;;;;;;;;;;;;22985:44;;22819:218;;;;:::o;65613:252::-;65780:4;49641:1;48445:42;49593:45;;;:49;49589:539;;;49882:10;49874:18;;:4;:18;;;49870:85;;65802:55:::1;65825:4;65831:2;65835:7;65844:6;65852:4;65802:22;:55::i;:::-;49933:7:::0;;49870:85;48445:42;49974;;;50025:4;50032:10;49974:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49969:148;;50090:10;50071:30;;;;;;;;;;;:::i;:::-;;;;;;;;49969:148;49589:539;65802:55:::1;65825:4;65831:2;65835:7;65844:6;65852:4;65802:22;:55::i;:::-;65613:252:::0;;;;;;;:::o;68981:582::-;52746:1;53344:7;;:19;53336:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;52746:1;53477:7;:18;;;;69232:12:::1;69191:53;;:21;:37;69213:14;69191:37;;;;;;;;;;;;;;;;;;;;;;;;;:53;;;69183:63;;;::::0;::::1;;69342:15;69326:13;:31;;;;:::i;:::-;69305:15;69267:19;:35;69287:14;69267:35;;;;;;;;;;;;;;;;:53;;;;:::i;:::-;69266:93;69257:104;;;::::0;::::1;;69426:4;69380:50;;:26;:42;69407:14;69380:42;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;69372:59;;;::::0;::::1;;69442:46;69448:10;69460:12;69442:46;;69474:13;69442:5;:46::i;:::-;69499:54;69505:10;69517:14;69499:54;;69533:15;69499:54;;;;;;;;;;;::::0;:5:::1;:54::i;:::-;52702:1:::0;53656:7;:22;;;;68981:582;;;;:::o;42734:238::-;41714:13;:11;:13::i;:::-;42857:1:::1;42837:22;;:8;:22;;::::0;42815:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;42936:28;42955:8;42936:18;:28::i;:::-;42734:238:::0;:::o;72550:173::-;72676:39;72682:10;72694:7;72703:11;72676:5;:39::i;:::-;72550:173;;;:::o;64639:79::-;;;;;;;;;;;;;:::o;60376:215::-;60478:4;60517:26;60502:41;;;:11;:41;;;;:81;;;;60547:36;60571:11;60547:23;:36::i;:::-;60502:81;60495:88;;60376:215;;;:::o;41993:132::-;42068:12;:10;:12::i;:::-;42057:23;;:7;:5;:7::i;:::-;:23;;;42049:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41993:132::o;38469:723::-;38525:13;38755:1;38746:5;:10;38742:53;;38773:10;;;;;;;;;;;;;;;;;;;;;38742:53;38805:12;38820:5;38805:20;;38836:14;38861:78;38876:1;38868:4;:9;38861:78;;38894:8;;;;;:::i;:::-;;;;38925:2;38917:10;;;;;:::i;:::-;;;38861:78;;;38949:19;38981:6;38971:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38949:39;;38999:154;39015:1;39006:5;:10;38999:154;;39043:1;39033:11;;;;;:::i;:::-;;;39110:2;39102:5;:10;;;;:::i;:::-;39089:2;:24;;;;:::i;:::-;39076:39;;39059:6;39066;39059:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;39139:2;39130:11;;;;;:::i;:::-;;;38999:154;;;39177:6;39163:21;;;;;38469:723;;;;:::o;61366:97::-;61424:6;61450:5;61443:12;;61366:97;:::o;23593:439::-;23834:12;:10;:12::i;:::-;23826:20;;:4;:20;;;:60;;;;23850:36;23867:4;23873:12;:10;:12::i;:::-;23850:16;:36::i;:::-;23826:60;23804:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;23972:52;23995:4;24001:2;24005:3;24010:7;24019:4;23972:22;:52::i;:::-;23593:439;;;;;:::o;28504:818::-;28671:1;28657:16;;:2;:16;;;28649:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;28724:16;28743:12;:10;:12::i;:::-;28724:31;;28766:20;28789:21;28807:2;28789:17;:21::i;:::-;28766:44;;28821:24;28848:25;28866:6;28848:17;:25::i;:::-;28821:52;;28886:66;28907:8;28925:1;28929:2;28933:3;28938:7;28947:4;28886:20;:66::i;:::-;28986:6;28965:9;:13;28975:2;28965:13;;;;;;;;;;;:17;28979:2;28965:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;29045:2;29008:52;;29041:1;29008:52;;29023:8;29008:52;;;29049:2;29053:6;29008:52;;;;;;;:::i;:::-;;;;;;;;29073:65;29093:8;29111:1;29115:2;29119:3;29124:7;29133:4;29073:19;:65::i;:::-;29151:163;29196:8;29227:1;29244:2;29261;29278:6;29299:4;29151:30;:163::i;:::-;28638:684;;;28504:818;;;;:::o;43132:191::-;43206:16;43225:6;;;;;;;;;;;43206:25;;43251:8;43242:6;;:17;;;;;;;;;;;;;;;;;;43306:8;43275:40;;43296:8;43275:40;;;;;;;;;;;;43195:128;43132:191;:::o;22560:187::-;22687:52;22706:12;:10;:12::i;:::-;22720:8;22730;22687:18;:52::i;:::-;22560:187;;:::o;23109:407::-;23325:12;:10;:12::i;:::-;23317:20;;:4;:20;;;:60;;;;23341:36;23358:4;23364:12;:10;:12::i;:::-;23341:16;:36::i;:::-;23317:60;23295:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;23463:45;23481:4;23487:2;23491;23495:6;23503:4;23463:17;:45::i;:::-;23109:407;;;;;:::o;30962:808::-;31105:1;31089:18;;:4;:18;;;31081:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;31160:16;31179:12;:10;:12::i;:::-;31160:31;;31202:20;31225:21;31243:2;31225:17;:21::i;:::-;31202:44;;31257:24;31284:25;31302:6;31284:17;:25::i;:::-;31257:52;;31322:66;31343:8;31353:4;31367:1;31371:3;31376:7;31322:66;;;;;;;;;;;;:20;:66::i;:::-;31401:19;31423:9;:13;31433:2;31423:13;;;;;;;;;;;:19;31437:4;31423:19;;;;;;;;;;;;;;;;31401:41;;31476:6;31461:11;:21;;31453:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;31595:6;31581:11;:20;31559:9;:13;31569:2;31559:13;;;;;;;;;;;:19;31573:4;31559:19;;;;;;;;;;;;;;;:42;;;;31669:1;31630:54;;31655:4;31630:54;;31645:8;31630:54;;;31673:2;31677:6;31630:54;;;;;;;:::i;:::-;;;;;;;;31697:65;31717:8;31727:4;31741:1;31745:3;31750:7;31697:65;;;;;;;;;;;;:19;:65::i;:::-;31070:700;;;;30962:808;;;:::o;20416:360::-;20563:4;20620:26;20605:41;;;:11;:41;;;;:110;;;;20678:37;20663:52;;;:11;:52;;;;20605:110;:163;;;;20732:36;20756:11;20732:23;:36::i;:::-;20605:163;20585:183;;20416:360;;;:::o;18118:98::-;18171:7;18198:10;18191:17;;18118:98;:::o;25865:1321::-;26106:7;:14;26092:3;:10;:28;26070:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;26221:1;26207:16;;:2;:16;;;26199:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;26278:16;26297:12;:10;:12::i;:::-;26278:31;;26322:60;26343:8;26353:4;26359:2;26363:3;26368:7;26377:4;26322:20;:60::i;:::-;26400:9;26395:470;26419:3;:10;26415:1;:14;26395:470;;;26451:10;26464:3;26468:1;26464:6;;;;;;;;:::i;:::-;;;;;;;;26451:19;;26485:14;26502:7;26510:1;26502:10;;;;;;;;:::i;:::-;;;;;;;;26485:27;;26529:19;26551:9;:13;26561:2;26551:13;;;;;;;;;;;:19;26565:4;26551:19;;;;;;;;;;;;;;;;26529:41;;26626:6;26611:11;:21;;26585:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;26790:6;26776:11;:20;26754:9;:13;26764:2;26754:13;;;;;;;;;;;:19;26768:4;26754:19;;;;;;;;;;;;;;;:42;;;;26847:6;26826:9;:13;26836:2;26826:13;;;;;;;;;;;:17;26840:2;26826:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;26436:429;;;26431:3;;;;:::i;:::-;;;26395:470;;;;26912:2;26882:47;;26906:4;26882:47;;26896:8;26882:47;;;26916:3;26921:7;26882:47;;;;;;;:::i;:::-;;;;;;;;26942:59;26962:8;26972:4;26978:2;26982:3;26987:7;26996:4;26942:19;:59::i;:::-;27014:164;27064:8;27087:4;27106:2;27123:3;27141:7;27163:4;27014:35;:164::i;:::-;26059:1127;25865:1321;;;;;:::o;37800:230::-;37893:16;37927:22;37966:1;37952:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37927:41;;37990:7;37979:5;37985:1;37979:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;38017:5;38010:12;;;37800:230;;;:::o;34507:221::-;;;;;;;:::o;35683:220::-;;;;;;;:::o;35911:898::-;36126:15;:2;:13;;;:15::i;:::-;36122:680;;;36196:2;36179:38;;;36240:8;36271:4;36298:2;36323:6;36352:4;36179:196;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36158:633;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;36664:6;36657:14;;;;;;;;;;;:::i;:::-;;;;;;;;36158:633;;;36713:62;;;;;;;;;;:::i;:::-;;;;;;;;36158:633;36450:43;;;36438:55;;;:8;:55;;;;36434:154;;36518:50;;;;;;;;;;:::i;:::-;;;;;;;;36434:154;36389:214;36122:680;35911:898;;;;;;:::o;33218:331::-;33373:8;33364:17;;:5;:17;;;33356:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;33476:8;33438:18;:25;33457:5;33438:25;;;;;;;;;;;;;;;:35;33464:8;33438:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;33522:8;33500:41;;33515:5;33500:41;;;33532:8;33500:41;;;;;;:::i;:::-;;;;;;;;33218:331;;;:::o;24496:1011::-;24698:1;24684:16;;:2;:16;;;24676:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;24755:16;24774:12;:10;:12::i;:::-;24755:31;;24797:20;24820:21;24838:2;24820:17;:21::i;:::-;24797:44;;24852:24;24879:25;24897:6;24879:17;:25::i;:::-;24852:52;;24917:60;24938:8;24948:4;24954:2;24958:3;24963:7;24972:4;24917:20;:60::i;:::-;24990:19;25012:9;:13;25022:2;25012:13;;;;;;;;;;;:19;25026:4;25012:19;;;;;;;;;;;;;;;;24990:41;;25079:6;25064:11;:21;;25042:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;25227:6;25213:11;:20;25191:9;:13;25201:2;25191:13;;;;;;;;;;;:19;25205:4;25191:19;;;;;;;;;;;;;;;:42;;;;25276:6;25255:9;:13;25265:2;25255:13;;;;;;;;;;;:17;25269:2;25255:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;25331:2;25300:46;;25325:4;25300:46;;25315:8;25300:46;;;25335:2;25339:6;25300:46;;;;;;;:::i;:::-;;;;;;;;25359:59;25379:8;25389:4;25395:2;25399:3;25404:7;25413:4;25359:19;:59::i;:::-;25431:68;25462:8;25472:4;25478:2;25482;25486:6;25494:4;25431:30;:68::i;:::-;24665:842;;;;24496:1011;;;;;:::o;19197:207::-;19327:4;19371:25;19356:40;;;:11;:40;;;;19349:47;;19197:207;;;:::o;36817:975::-;37057:15;:2;:13;;;:15::i;:::-;37053:732;;;37127:2;37110:43;;;37176:8;37207:4;37234:3;37260:7;37290:4;37110:203;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37089:685;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;37647:6;37640:14;;;;;;;;;;;:::i;:::-;;;;;;;;37089:685;;;37696:62;;;;;;;;;;:::i;:::-;;;;;;;;37089:685;37410:48;;;37398:60;;;:8;:60;;;;37372:199;;37501:50;;;;;;;;;;:::i;:::-;;;;;;;;37372:199;37327:259;37053:732;36817:975;;;;;;:::o;9650:326::-;9710:4;9967:1;9945:7;:19;;;:23;9938:30;;9650:326;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:118::-;1764:24;1782:5;1764:24;:::i;:::-;1759:3;1752:37;1677:118;;:::o;1801:222::-;1894:4;1932:2;1921:9;1917:18;1909:26;;1945:71;2013:1;2002:9;1998:17;1989:6;1945:71;:::i;:::-;1801:222;;;;:::o;2029:149::-;2065:7;2105:66;2098:5;2094:78;2083:89;;2029:149;;;:::o;2184:120::-;2256:23;2273:5;2256:23;:::i;:::-;2249:5;2246:34;2236:62;;2294:1;2291;2284:12;2236:62;2184:120;:::o;2310:137::-;2355:5;2393:6;2380:20;2371:29;;2409:32;2435:5;2409:32;:::i;:::-;2310:137;;;;:::o;2453:327::-;2511:6;2560:2;2548:9;2539:7;2535:23;2531:32;2528:119;;;2566:79;;:::i;:::-;2528:119;2686:1;2711:52;2755:7;2746:6;2735:9;2731:22;2711:52;:::i;:::-;2701:62;;2657:116;2453:327;;;;:::o;2786:90::-;2820:7;2863:5;2856:13;2849:21;2838:32;;2786:90;;;:::o;2882:109::-;2963:21;2978:5;2963:21;:::i;:::-;2958:3;2951:34;2882:109;;:::o;2997:210::-;3084:4;3122:2;3111:9;3107:18;3099:26;;3135:65;3197:1;3186:9;3182:17;3173:6;3135:65;:::i;:::-;2997:210;;;;:::o;3213:117::-;3322:1;3319;3312:12;3336:102;3377:6;3428:2;3424:7;3419:2;3412:5;3408:14;3404:28;3394:38;;3336:102;;;:::o;3444:180::-;3492:77;3489:1;3482:88;3589:4;3586:1;3579:15;3613:4;3610:1;3603:15;3630:281;3713:27;3735:4;3713:27;:::i;:::-;3705:6;3701:40;3843:6;3831:10;3828:22;3807:18;3795:10;3792:34;3789:62;3786:88;;;3854:18;;:::i;:::-;3786:88;3894:10;3890:2;3883:22;3673:238;3630:281;;:::o;3917:129::-;3951:6;3978:20;;:::i;:::-;3968:30;;4007:33;4035:4;4027:6;4007:33;:::i;:::-;3917:129;;;:::o;4052:309::-;4127:4;4217:18;4209:6;4206:30;4203:56;;;4239:18;;:::i;:::-;4203:56;4289:4;4281:6;4277:17;4269:25;;4349:4;4343;4339:15;4331:23;;4052:309;;;:::o;4367:117::-;4476:1;4473;4466:12;4490:86;4525:7;4565:4;4558:5;4554:16;4543:27;;4490:86;;;:::o;4582:118::-;4653:22;4669:5;4653:22;:::i;:::-;4646:5;4643:33;4633:61;;4690:1;4687;4680:12;4633:61;4582:118;:::o;4706:135::-;4750:5;4788:6;4775:20;4766:29;;4804:31;4829:5;4804:31;:::i;:::-;4706:135;;;;:::o;4862:704::-;4956:5;4981:79;4997:62;5052:6;4997:62;:::i;:::-;4981:79;:::i;:::-;4972:88;;5080:5;5109:6;5102:5;5095:21;5143:4;5136:5;5132:16;5125:23;;5196:4;5188:6;5184:17;5176:6;5172:30;5225:3;5217:6;5214:15;5211:122;;;5244:79;;:::i;:::-;5211:122;5359:6;5342:218;5376:6;5371:3;5368:15;5342:218;;;5451:3;5480:35;5511:3;5499:10;5480:35;:::i;:::-;5475:3;5468:48;5545:4;5540:3;5536:14;5529:21;;5418:142;5402:4;5397:3;5393:14;5386:21;;5342:218;;;5346:21;4962:604;;4862:704;;;;;:::o;5587:366::-;5656:5;5705:3;5698:4;5690:6;5686:17;5682:27;5672:122;;5713:79;;:::i;:::-;5672:122;5830:6;5817:20;5855:92;5943:3;5935:6;5928:4;5920:6;5916:17;5855:92;:::i;:::-;5846:101;;5662:291;5587:366;;;;:::o;5959:886::-;6073:6;6081;6130:2;6118:9;6109:7;6105:23;6101:32;6098:119;;;6136:79;;:::i;:::-;6098:119;6284:1;6273:9;6269:17;6256:31;6314:18;6306:6;6303:30;6300:117;;;6336:79;;:::i;:::-;6300:117;6441:76;6509:7;6500:6;6489:9;6485:22;6441:76;:::i;:::-;6431:86;;6227:300;6594:2;6583:9;6579:18;6566:32;6625:18;6617:6;6614:30;6611:117;;;6647:79;;:::i;:::-;6611:117;6752:76;6820:7;6811:6;6800:9;6796:22;6752:76;:::i;:::-;6742:86;;6537:301;5959:886;;;;;:::o;6851:99::-;6903:6;6937:5;6931:12;6921:22;;6851:99;;;:::o;6956:169::-;7040:11;7074:6;7069:3;7062:19;7114:4;7109:3;7105:14;7090:29;;6956:169;;;;:::o;7131:246::-;7212:1;7222:113;7236:6;7233:1;7230:13;7222:113;;;7321:1;7316:3;7312:11;7306:18;7302:1;7297:3;7293:11;7286:39;7258:2;7255:1;7251:10;7246:15;;7222:113;;;7369:1;7360:6;7355:3;7351:16;7344:27;7193:184;7131:246;;;:::o;7383:377::-;7471:3;7499:39;7532:5;7499:39;:::i;:::-;7554:71;7618:6;7613:3;7554:71;:::i;:::-;7547:78;;7634:65;7692:6;7687:3;7680:4;7673:5;7669:16;7634:65;:::i;:::-;7724:29;7746:6;7724:29;:::i;:::-;7719:3;7715:39;7708:46;;7475:285;7383:377;;;;:::o;7766:313::-;7879:4;7917:2;7906:9;7902:18;7894:26;;7966:9;7960:4;7956:20;7952:1;7941:9;7937:17;7930:47;7994:78;8067:4;8058:6;7994:78;:::i;:::-;7986:86;;7766:313;;;;:::o;8085:329::-;8144:6;8193:2;8181:9;8172:7;8168:23;8164:32;8161:119;;;8199:79;;:::i;:::-;8161:119;8319:1;8344:53;8389:7;8380:6;8369:9;8365:22;8344:53;:::i;:::-;8334:63;;8290:117;8085:329;;;;:::o;8420:117::-;8529:1;8526;8519:12;8543:307;8604:4;8694:18;8686:6;8683:30;8680:56;;;8716:18;;:::i;:::-;8680:56;8754:29;8776:6;8754:29;:::i;:::-;8746:37;;8838:4;8832;8828:15;8820:23;;8543:307;;;:::o;8856:146::-;8953:6;8948:3;8943;8930:30;8994:1;8985:6;8980:3;8976:16;8969:27;8856:146;;;:::o;9008:423::-;9085:5;9110:65;9126:48;9167:6;9126:48;:::i;:::-;9110:65;:::i;:::-;9101:74;;9198:6;9191:5;9184:21;9236:4;9229:5;9225:16;9274:3;9265:6;9260:3;9256:16;9253:25;9250:112;;;9281:79;;:::i;:::-;9250:112;9371:54;9418:6;9413:3;9408;9371:54;:::i;:::-;9091:340;9008:423;;;;;:::o;9450:338::-;9505:5;9554:3;9547:4;9539:6;9535:17;9531:27;9521:122;;9562:79;;:::i;:::-;9521:122;9679:6;9666:20;9704:78;9778:3;9770:6;9763:4;9755:6;9751:17;9704:78;:::i;:::-;9695:87;;9511:277;9450:338;;;;:::o;9794:943::-;9889:6;9897;9905;9913;9962:3;9950:9;9941:7;9937:23;9933:33;9930:120;;;9969:79;;:::i;:::-;9930:120;10089:1;10114:53;10159:7;10150:6;10139:9;10135:22;10114:53;:::i;:::-;10104:63;;10060:117;10216:2;10242:53;10287:7;10278:6;10267:9;10263:22;10242:53;:::i;:::-;10232:63;;10187:118;10344:2;10370:53;10415:7;10406:6;10395:9;10391:22;10370:53;:::i;:::-;10360:63;;10315:118;10500:2;10489:9;10485:18;10472:32;10531:18;10523:6;10520:30;10517:117;;;10553:79;;:::i;:::-;10517:117;10658:62;10712:7;10703:6;10692:9;10688:22;10658:62;:::i;:::-;10648:72;;10443:287;9794:943;;;;;;;:::o;10743:115::-;10828:23;10845:5;10828:23;:::i;:::-;10823:3;10816:36;10743:115;;:::o;10864:218::-;10955:4;10993:2;10982:9;10978:18;10970:26;;11006:69;11072:1;11061:9;11057:17;11048:6;11006:69;:::i;:::-;10864:218;;;;:::o;11088:325::-;11145:6;11194:2;11182:9;11173:7;11169:23;11165:32;11162:119;;;11200:79;;:::i;:::-;11162:119;11320:1;11345:51;11388:7;11379:6;11368:9;11364:22;11345:51;:::i;:::-;11335:61;;11291:115;11088:325;;;;:::o;11419:112::-;11502:22;11518:5;11502:22;:::i;:::-;11497:3;11490:35;11419:112;;:::o;11537:214::-;11626:4;11664:2;11653:9;11649:18;11641:26;;11677:67;11741:1;11730:9;11726:17;11717:6;11677:67;:::i;:::-;11537:214;;;;:::o;11757:311::-;11834:4;11924:18;11916:6;11913:30;11910:56;;;11946:18;;:::i;:::-;11910:56;11996:4;11988:6;11984:17;11976:25;;12056:4;12050;12046:15;12038:23;;11757:311;;;:::o;12091:710::-;12187:5;12212:81;12228:64;12285:6;12228:64;:::i;:::-;12212:81;:::i;:::-;12203:90;;12313:5;12342:6;12335:5;12328:21;12376:4;12369:5;12365:16;12358:23;;12429:4;12421:6;12417:17;12409:6;12405:30;12458:3;12450:6;12447:15;12444:122;;;12477:79;;:::i;:::-;12444:122;12592:6;12575:220;12609:6;12604:3;12601:15;12575:220;;;12684:3;12713:37;12746:3;12734:10;12713:37;:::i;:::-;12708:3;12701:50;12780:4;12775:3;12771:14;12764:21;;12651:144;12635:4;12630:3;12626:14;12619:21;;12575:220;;;12579:21;12193:608;;12091:710;;;;;:::o;12824:370::-;12895:5;12944:3;12937:4;12929:6;12925:17;12921:27;12911:122;;12952:79;;:::i;:::-;12911:122;13069:6;13056:20;13094:94;13184:3;13176:6;13169:4;13161:6;13157:17;13094:94;:::i;:::-;13085:103;;12901:293;12824:370;;;;:::o;13200:890::-;13316:6;13324;13373:2;13361:9;13352:7;13348:23;13344:32;13341:119;;;13379:79;;:::i;:::-;13341:119;13527:1;13516:9;13512:17;13499:31;13557:18;13549:6;13546:30;13543:117;;;13579:79;;:::i;:::-;13543:117;13684:76;13752:7;13743:6;13732:9;13728:22;13684:76;:::i;:::-;13674:86;;13470:300;13837:2;13826:9;13822:18;13809:32;13868:18;13860:6;13857:30;13854:117;;;13890:79;;:::i;:::-;13854:117;13995:78;14065:7;14056:6;14045:9;14041:22;13995:78;:::i;:::-;13985:88;;13780:303;13200:890;;;;;:::o;14096:474::-;14164:6;14172;14221:2;14209:9;14200:7;14196:23;14192:32;14189:119;;;14227:79;;:::i;:::-;14189:119;14347:1;14372:53;14417:7;14408:6;14397:9;14393:22;14372:53;:::i;:::-;14362:63;;14318:117;14474:2;14500:53;14545:7;14536:6;14525:9;14521:22;14500:53;:::i;:::-;14490:63;;14445:118;14096:474;;;;;:::o;14576:118::-;14663:24;14681:5;14663:24;:::i;:::-;14658:3;14651:37;14576:118;;:::o;14700:332::-;14821:4;14859:2;14848:9;14844:18;14836:26;;14872:71;14940:1;14929:9;14925:17;14916:6;14872:71;:::i;:::-;14953:72;15021:2;15010:9;15006:18;14997:6;14953:72;:::i;:::-;14700:332;;;;;:::o;15038:1509::-;15192:6;15200;15208;15216;15224;15273:3;15261:9;15252:7;15248:23;15244:33;15241:120;;;15280:79;;:::i;:::-;15241:120;15400:1;15425:53;15470:7;15461:6;15450:9;15446:22;15425:53;:::i;:::-;15415:63;;15371:117;15527:2;15553:53;15598:7;15589:6;15578:9;15574:22;15553:53;:::i;:::-;15543:63;;15498:118;15683:2;15672:9;15668:18;15655:32;15714:18;15706:6;15703:30;15700:117;;;15736:79;;:::i;:::-;15700:117;15841:78;15911:7;15902:6;15891:9;15887:22;15841:78;:::i;:::-;15831:88;;15626:303;15996:2;15985:9;15981:18;15968:32;16027:18;16019:6;16016:30;16013:117;;;16049:79;;:::i;:::-;16013:117;16154:78;16224:7;16215:6;16204:9;16200:22;16154:78;:::i;:::-;16144:88;;15939:303;16309:3;16298:9;16294:19;16281:33;16341:18;16333:6;16330:30;16327:117;;;16363:79;;:::i;:::-;16327:117;16468:62;16522:7;16513:6;16502:9;16498:22;16468:62;:::i;:::-;16458:72;;16252:288;15038:1509;;;;;;;;:::o;16553:619::-;16630:6;16638;16646;16695:2;16683:9;16674:7;16670:23;16666:32;16663:119;;;16701:79;;:::i;:::-;16663:119;16821:1;16846:53;16891:7;16882:6;16871:9;16867:22;16846:53;:::i;:::-;16836:63;;16792:117;16948:2;16974:53;17019:7;17010:6;16999:9;16995:22;16974:53;:::i;:::-;16964:63;;16919:118;17076:2;17102:53;17147:7;17138:6;17127:9;17123:22;17102:53;:::i;:::-;17092:63;;17047:118;16553:619;;;;;:::o;17178:308::-;17240:4;17330:18;17322:6;17319:30;17316:56;;;17352:18;;:::i;:::-;17316:56;17390:29;17412:6;17390:29;:::i;:::-;17382:37;;17474:4;17468;17464:15;17456:23;;17178:308;;;:::o;17492:425::-;17570:5;17595:66;17611:49;17653:6;17611:49;:::i;:::-;17595:66;:::i;:::-;17586:75;;17684:6;17677:5;17670:21;17722:4;17715:5;17711:16;17760:3;17751:6;17746:3;17742:16;17739:25;17736:112;;;17767:79;;:::i;:::-;17736:112;17857:54;17904:6;17899:3;17894;17857:54;:::i;:::-;17576:341;17492:425;;;;;:::o;17937:340::-;17993:5;18042:3;18035:4;18027:6;18023:17;18019:27;18009:122;;18050:79;;:::i;:::-;18009:122;18167:6;18154:20;18192:79;18267:3;18259:6;18252:4;18244:6;18240:17;18192:79;:::i;:::-;18183:88;;17999:278;17937:340;;;;:::o;18283:509::-;18352:6;18401:2;18389:9;18380:7;18376:23;18372:32;18369:119;;;18407:79;;:::i;:::-;18369:119;18555:1;18544:9;18540:17;18527:31;18585:18;18577:6;18574:30;18571:117;;;18607:79;;:::i;:::-;18571:117;18712:63;18767:7;18758:6;18747:9;18743:22;18712:63;:::i;:::-;18702:73;;18498:287;18283:509;;;;:::o;18798:60::-;18826:3;18847:5;18840:12;;18798:60;;;:::o;18864:142::-;18914:9;18947:53;18965:34;18974:24;18992:5;18974:24;:::i;:::-;18965:34;:::i;:::-;18947:53;:::i;:::-;18934:66;;18864:142;;;:::o;19012:126::-;19062:9;19095:37;19126:5;19095:37;:::i;:::-;19082:50;;19012:126;;;:::o;19144:158::-;19226:9;19259:37;19290:5;19259:37;:::i;:::-;19246:50;;19144:158;;;:::o;19308:195::-;19427:69;19490:5;19427:69;:::i;:::-;19422:3;19415:82;19308:195;;:::o;19509:286::-;19634:4;19672:2;19661:9;19657:18;19649:26;;19685:103;19785:1;19774:9;19770:17;19761:6;19685:103;:::i;:::-;19509:286;;;;:::o;19801:117::-;19910:1;19907;19900:12;19941:568;20014:8;20024:6;20074:3;20067:4;20059:6;20055:17;20051:27;20041:122;;20082:79;;:::i;:::-;20041:122;20195:6;20182:20;20172:30;;20225:18;20217:6;20214:30;20211:117;;;20247:79;;:::i;:::-;20211:117;20361:4;20353:6;20349:17;20337:29;;20415:3;20407:4;20399:6;20395:17;20385:8;20381:32;20378:41;20375:128;;;20422:79;;:::i;:::-;20375:128;19941:568;;;;;:::o;20515:704::-;20610:6;20618;20626;20675:2;20663:9;20654:7;20650:23;20646:32;20643:119;;;20681:79;;:::i;:::-;20643:119;20801:1;20826:53;20871:7;20862:6;20851:9;20847:22;20826:53;:::i;:::-;20816:63;;20772:117;20956:2;20945:9;20941:18;20928:32;20987:18;20979:6;20976:30;20973:117;;;21009:79;;:::i;:::-;20973:117;21122:80;21194:7;21185:6;21174:9;21170:22;21122:80;:::i;:::-;21104:98;;;;20899:313;20515:704;;;;;:::o;21225:311::-;21302:4;21392:18;21384:6;21381:30;21378:56;;;21414:18;;:::i;:::-;21378:56;21464:4;21456:6;21452:17;21444:25;;21524:4;21518;21514:15;21506:23;;21225:311;;;:::o;21559:710::-;21655:5;21680:81;21696:64;21753:6;21696:64;:::i;:::-;21680:81;:::i;:::-;21671:90;;21781:5;21810:6;21803:5;21796:21;21844:4;21837:5;21833:16;21826:23;;21897:4;21889:6;21885:17;21877:6;21873:30;21926:3;21918:6;21915:15;21912:122;;;21945:79;;:::i;:::-;21912:122;22060:6;22043:220;22077:6;22072:3;22069:15;22043:220;;;22152:3;22181:37;22214:3;22202:10;22181:37;:::i;:::-;22176:3;22169:50;22248:4;22243:3;22239:14;22232:21;;22119:144;22103:4;22098:3;22094:14;22087:21;;22043:220;;;22047:21;21661:608;;21559:710;;;;;:::o;22292:370::-;22363:5;22412:3;22405:4;22397:6;22393:17;22389:27;22379:122;;22420:79;;:::i;:::-;22379:122;22537:6;22524:20;22562:94;22652:3;22644:6;22637:4;22629:6;22625:17;22562:94;:::i;:::-;22553:103;;22369:293;22292:370;;;;:::o;22668:894::-;22786:6;22794;22843:2;22831:9;22822:7;22818:23;22814:32;22811:119;;;22849:79;;:::i;:::-;22811:119;22997:1;22986:9;22982:17;22969:31;23027:18;23019:6;23016:30;23013:117;;;23049:79;;:::i;:::-;23013:117;23154:78;23224:7;23215:6;23204:9;23200:22;23154:78;:::i;:::-;23144:88;;22940:302;23309:2;23298:9;23294:18;23281:32;23340:18;23332:6;23329:30;23326:117;;;23362:79;;:::i;:::-;23326:117;23467:78;23537:7;23528:6;23517:9;23513:22;23467:78;:::i;:::-;23457:88;;23252:303;22668:894;;;;;:::o;23568:114::-;23635:6;23669:5;23663:12;23653:22;;23568:114;;;:::o;23688:184::-;23787:11;23821:6;23816:3;23809:19;23861:4;23856:3;23852:14;23837:29;;23688:184;;;;:::o;23878:132::-;23945:4;23968:3;23960:11;;23998:4;23993:3;23989:14;23981:22;;23878:132;;;:::o;24016:108::-;24093:24;24111:5;24093:24;:::i;:::-;24088:3;24081:37;24016:108;;:::o;24130:179::-;24199:10;24220:46;24262:3;24254:6;24220:46;:::i;:::-;24298:4;24293:3;24289:14;24275:28;;24130:179;;;;:::o;24315:113::-;24385:4;24417;24412:3;24408:14;24400:22;;24315:113;;;:::o;24464:732::-;24583:3;24612:54;24660:5;24612:54;:::i;:::-;24682:86;24761:6;24756:3;24682:86;:::i;:::-;24675:93;;24792:56;24842:5;24792:56;:::i;:::-;24871:7;24902:1;24887:284;24912:6;24909:1;24906:13;24887:284;;;24988:6;24982:13;25015:63;25074:3;25059:13;25015:63;:::i;:::-;25008:70;;25101:60;25154:6;25101:60;:::i;:::-;25091:70;;24947:224;24934:1;24931;24927:9;24922:14;;24887:284;;;24891:14;25187:3;25180:10;;24588:608;;;24464:732;;;;:::o;25202:373::-;25345:4;25383:2;25372:9;25368:18;25360:26;;25432:9;25426:4;25422:20;25418:1;25407:9;25403:17;25396:47;25460:108;25563:4;25554:6;25460:108;:::i;:::-;25452:116;;25202:373;;;;:::o;25581:116::-;25651:21;25666:5;25651:21;:::i;:::-;25644:5;25641:32;25631:60;;25687:1;25684;25677:12;25631:60;25581:116;:::o;25703:133::-;25746:5;25784:6;25771:20;25762:29;;25800:30;25824:5;25800:30;:::i;:::-;25703:133;;;;:::o;25842:464::-;25905:6;25913;25962:2;25950:9;25941:7;25937:23;25933:32;25930:119;;;25968:79;;:::i;:::-;25930:119;26088:1;26113:51;26156:7;26147:6;26136:9;26132:22;26113:51;:::i;:::-;26103:61;;26059:115;26213:2;26239:50;26281:7;26272:6;26261:9;26257:22;26239:50;:::i;:::-;26229:60;;26184:115;25842:464;;;;;:::o;26312:222::-;26405:4;26443:2;26432:9;26428:18;26420:26;;26456:71;26524:1;26513:9;26509:17;26500:6;26456:71;:::i;:::-;26312:222;;;;:::o;26540:468::-;26605:6;26613;26662:2;26650:9;26641:7;26637:23;26633:32;26630:119;;;26668:79;;:::i;:::-;26630:119;26788:1;26813:53;26858:7;26849:6;26838:9;26834:22;26813:53;:::i;:::-;26803:63;;26759:117;26915:2;26941:50;26983:7;26974:6;26963:9;26959:22;26941:50;:::i;:::-;26931:60;;26886:115;26540:468;;;;;:::o;27014:615::-;27089:6;27097;27105;27154:2;27142:9;27133:7;27129:23;27125:32;27122:119;;;27160:79;;:::i;:::-;27122:119;27280:1;27305:51;27348:7;27339:6;27328:9;27324:22;27305:51;:::i;:::-;27295:61;;27251:115;27405:2;27431:53;27476:7;27467:6;27456:9;27452:22;27431:53;:::i;:::-;27421:63;;27376:118;27533:2;27559:53;27604:7;27595:6;27584:9;27580:22;27559:53;:::i;:::-;27549:63;;27504:118;27014:615;;;;;:::o;27635:559::-;27721:6;27729;27778:2;27766:9;27757:7;27753:23;27749:32;27746:119;;;27784:79;;:::i;:::-;27746:119;27932:1;27921:9;27917:17;27904:31;27962:18;27954:6;27951:30;27948:117;;;27984:79;;:::i;:::-;27948:117;28097:80;28169:7;28160:6;28149:9;28145:22;28097:80;:::i;:::-;28079:98;;;;27875:312;27635:559;;;;;:::o;28217:568::-;28290:8;28300:6;28350:3;28343:4;28335:6;28331:17;28327:27;28317:122;;28358:79;;:::i;:::-;28317:122;28471:6;28458:20;28448:30;;28501:18;28493:6;28490:30;28487:117;;;28523:79;;:::i;:::-;28487:117;28637:4;28629:6;28625:17;28613:29;;28691:3;28683:4;28675:6;28671:17;28661:8;28657:32;28654:41;28651:128;;;28698:79;;:::i;:::-;28651:128;28217:568;;;;;:::o;28791:1269::-;28945:6;28953;28961;28969;29018:2;29006:9;28997:7;28993:23;28989:32;28986:119;;;29024:79;;:::i;:::-;28986:119;29172:1;29161:9;29157:17;29144:31;29202:18;29194:6;29191:30;29188:117;;;29224:79;;:::i;:::-;29188:117;29329:78;29399:7;29390:6;29379:9;29375:22;29329:78;:::i;:::-;29319:88;;29115:302;29484:2;29473:9;29469:18;29456:32;29515:18;29507:6;29504:30;29501:117;;;29537:79;;:::i;:::-;29501:117;29650:80;29722:7;29713:6;29702:9;29698:22;29650:80;:::i;:::-;29632:98;;;;29427:313;29807:2;29796:9;29792:18;29779:32;29838:18;29830:6;29827:30;29824:117;;;29860:79;;:::i;:::-;29824:117;29965:78;30035:7;30026:6;30015:9;30011:22;29965:78;:::i;:::-;29955:88;;29750:303;28791:1269;;;;;;;:::o;30066:474::-;30134:6;30142;30191:2;30179:9;30170:7;30166:23;30162:32;30159:119;;;30197:79;;:::i;:::-;30159:119;30317:1;30342:53;30387:7;30378:6;30367:9;30363:22;30342:53;:::i;:::-;30332:63;;30288:117;30444:2;30470:53;30515:7;30506:6;30495:9;30491:22;30470:53;:::i;:::-;30460:63;;30415:118;30066:474;;;;;:::o;30546:1089::-;30650:6;30658;30666;30674;30682;30731:3;30719:9;30710:7;30706:23;30702:33;30699:120;;;30738:79;;:::i;:::-;30699:120;30858:1;30883:53;30928:7;30919:6;30908:9;30904:22;30883:53;:::i;:::-;30873:63;;30829:117;30985:2;31011:53;31056:7;31047:6;31036:9;31032:22;31011:53;:::i;:::-;31001:63;;30956:118;31113:2;31139:53;31184:7;31175:6;31164:9;31160:22;31139:53;:::i;:::-;31129:63;;31084:118;31241:2;31267:53;31312:7;31303:6;31292:9;31288:22;31267:53;:::i;:::-;31257:63;;31212:118;31397:3;31386:9;31382:19;31369:33;31429:18;31421:6;31418:30;31415:117;;;31451:79;;:::i;:::-;31415:117;31556:62;31610:7;31601:6;31590:9;31586:22;31556:62;:::i;:::-;31546:72;;31340:288;30546:1089;;;;;;;;:::o;31641:757::-;31723:6;31731;31739;31747;31796:3;31784:9;31775:7;31771:23;31767:33;31764:120;;;31803:79;;:::i;:::-;31764:120;31923:1;31948:51;31991:7;31982:6;31971:9;31967:22;31948:51;:::i;:::-;31938:61;;31894:115;32048:2;32074:53;32119:7;32110:6;32099:9;32095:22;32074:53;:::i;:::-;32064:63;;32019:118;32176:2;32202:51;32245:7;32236:6;32225:9;32221:22;32202:51;:::i;:::-;32192:61;;32147:116;32302:2;32328:53;32373:7;32364:6;32353:9;32349:22;32328:53;:::i;:::-;32318:63;;32273:118;31641:757;;;;;;;:::o;32404:329::-;32463:6;32512:2;32500:9;32491:7;32487:23;32483:32;32480:119;;;32518:79;;:::i;:::-;32480:119;32638:1;32663:53;32708:7;32699:6;32688:9;32684:22;32663:53;:::i;:::-;32653:63;;32609:117;32404:329;;;;:::o;32739:619::-;32816:6;32824;32832;32881:2;32869:9;32860:7;32856:23;32852:32;32849:119;;;32887:79;;:::i;:::-;32849:119;33007:1;33032:53;33077:7;33068:6;33057:9;33053:22;33032:53;:::i;:::-;33022:63;;32978:117;33134:2;33160:53;33205:7;33196:6;33185:9;33181:22;33160:53;:::i;:::-;33150:63;;33105:118;33262:2;33288:53;33333:7;33324:6;33313:9;33309:22;33288:53;:::i;:::-;33278:63;;33233:118;32739:619;;;;;:::o;33364:229::-;33504:34;33500:1;33492:6;33488:14;33481:58;33573:12;33568:2;33560:6;33556:15;33549:37;33364:229;:::o;33599:366::-;33741:3;33762:67;33826:2;33821:3;33762:67;:::i;:::-;33755:74;;33838:93;33927:3;33838:93;:::i;:::-;33956:2;33951:3;33947:12;33940:19;;33599:366;;;:::o;33971:419::-;34137:4;34175:2;34164:9;34160:18;34152:26;;34224:9;34218:4;34214:20;34210:1;34199:9;34195:17;34188:47;34252:131;34378:4;34252:131;:::i;:::-;34244:139;;33971:419;;;:::o;34396:180::-;34444:77;34441:1;34434:88;34541:4;34538:1;34531:15;34565:4;34562:1;34555:15;34582:180;34630:77;34627:1;34620:88;34727:4;34724:1;34717:15;34751:4;34748:1;34741:15;34768:233;34807:3;34830:24;34848:5;34830:24;:::i;:::-;34821:33;;34876:66;34869:5;34866:77;34863:103;;34946:18;;:::i;:::-;34863:103;34993:1;34986:5;34982:13;34975:20;;34768:233;;;:::o;35007:180::-;35055:77;35052:1;35045:88;35152:4;35149:1;35142:15;35176:4;35173:1;35166:15;35193:320;35237:6;35274:1;35268:4;35264:12;35254:22;;35321:1;35315:4;35311:12;35342:18;35332:81;;35398:4;35390:6;35386:17;35376:27;;35332:81;35460:2;35452:6;35449:14;35429:18;35426:38;35423:84;;35479:18;;:::i;:::-;35423:84;35244:269;35193:320;;;:::o;35519:148::-;35621:11;35658:3;35643:18;;35519:148;;;;:::o;35673:141::-;35722:4;35745:3;35737:11;;35768:3;35765:1;35758:14;35802:4;35799:1;35789:18;35781:26;;35673:141;;;:::o;35844:874::-;35947:3;35984:5;35978:12;36013:36;36039:9;36013:36;:::i;:::-;36065:89;36147:6;36142:3;36065:89;:::i;:::-;36058:96;;36185:1;36174:9;36170:17;36201:1;36196:166;;;;36376:1;36371:341;;;;36163:549;;36196:166;36280:4;36276:9;36265;36261:25;36256:3;36249:38;36342:6;36335:14;36328:22;36320:6;36316:35;36311:3;36307:45;36300:52;;36196:166;;36371:341;36438:38;36470:5;36438:38;:::i;:::-;36498:1;36512:154;36526:6;36523:1;36520:13;36512:154;;;36600:7;36594:14;36590:1;36585:3;36581:11;36574:35;36650:1;36641:7;36637:15;36626:26;;36548:4;36545:1;36541:12;36536:17;;36512:154;;;36695:6;36690:3;36686:16;36679:23;;36378:334;;36163:549;;35951:767;;35844:874;;;;:::o;36724:390::-;36830:3;36858:39;36891:5;36858:39;:::i;:::-;36913:89;36995:6;36990:3;36913:89;:::i;:::-;36906:96;;37011:65;37069:6;37064:3;37057:4;37050:5;37046:16;37011:65;:::i;:::-;37101:6;37096:3;37092:16;37085:23;;36834:280;36724:390;;;;:::o;37120:155::-;37260:7;37256:1;37248:6;37244:14;37237:31;37120:155;:::o;37281:400::-;37441:3;37462:84;37544:1;37539:3;37462:84;:::i;:::-;37455:91;;37555:93;37644:3;37555:93;:::i;:::-;37673:1;37668:3;37664:11;37657:18;;37281:400;;;:::o;37687:695::-;37965:3;37987:92;38075:3;38066:6;37987:92;:::i;:::-;37980:99;;38096:95;38187:3;38178:6;38096:95;:::i;:::-;38089:102;;38208:148;38352:3;38208:148;:::i;:::-;38201:155;;38373:3;38366:10;;37687:695;;;;;:::o;38388:410::-;38428:7;38451:20;38469:1;38451:20;:::i;:::-;38446:25;;38485:20;38503:1;38485:20;:::i;:::-;38480:25;;38540:1;38537;38533:9;38562:30;38580:11;38562:30;:::i;:::-;38551:41;;38741:1;38732:7;38728:15;38725:1;38722:22;38702:1;38695:9;38675:83;38652:139;;38771:18;;:::i;:::-;38652:139;38436:362;38388:410;;;;:::o;38804:180::-;38852:77;38849:1;38842:88;38949:4;38946:1;38939:15;38973:4;38970:1;38963:15;38990:185;39030:1;39047:20;39065:1;39047:20;:::i;:::-;39042:25;;39081:20;39099:1;39081:20;:::i;:::-;39076:25;;39120:1;39110:35;;39125:18;;:::i;:::-;39110:35;39167:1;39164;39160:9;39155:14;;38990:185;;;;:::o;39181:332::-;39302:4;39340:2;39329:9;39325:18;39317:26;;39353:71;39421:1;39410:9;39406:17;39397:6;39353:71;:::i;:::-;39434:72;39502:2;39491:9;39487:18;39478:6;39434:72;:::i;:::-;39181:332;;;;;:::o;39519:137::-;39573:5;39604:6;39598:13;39589:22;;39620:30;39644:5;39620:30;:::i;:::-;39519:137;;;;:::o;39662:345::-;39729:6;39778:2;39766:9;39757:7;39753:23;39749:32;39746:119;;;39784:79;;:::i;:::-;39746:119;39904:1;39929:61;39982:7;39973:6;39962:9;39958:22;39929:61;:::i;:::-;39919:71;;39875:125;39662:345;;;;:::o;40013:93::-;40050:6;40097:2;40092;40085:5;40081:14;40077:23;40067:33;;40013:93;;;:::o;40112:107::-;40156:8;40206:5;40200:4;40196:16;40175:37;;40112:107;;;;:::o;40225:393::-;40294:6;40344:1;40332:10;40328:18;40367:97;40397:66;40386:9;40367:97;:::i;:::-;40485:39;40515:8;40504:9;40485:39;:::i;:::-;40473:51;;40557:4;40553:9;40546:5;40542:21;40533:30;;40606:4;40596:8;40592:19;40585:5;40582:30;40572:40;;40301:317;;40225:393;;;;;:::o;40624:142::-;40674:9;40707:53;40725:34;40734:24;40752:5;40734:24;:::i;:::-;40725:34;:::i;:::-;40707:53;:::i;:::-;40694:66;;40624:142;;;:::o;40772:75::-;40815:3;40836:5;40829:12;;40772:75;;;:::o;40853:269::-;40963:39;40994:7;40963:39;:::i;:::-;41024:91;41073:41;41097:16;41073:41;:::i;:::-;41065:6;41058:4;41052:11;41024:91;:::i;:::-;41018:4;41011:105;40929:193;40853:269;;;:::o;41128:73::-;41173:3;41128:73;:::o;41207:189::-;41284:32;;:::i;:::-;41325:65;41383:6;41375;41369:4;41325:65;:::i;:::-;41260:136;41207:189;;:::o;41402:186::-;41462:120;41479:3;41472:5;41469:14;41462:120;;;41533:39;41570:1;41563:5;41533:39;:::i;:::-;41506:1;41499:5;41495:13;41486:22;;41462:120;;;41402:186;;:::o;41594:543::-;41695:2;41690:3;41687:11;41684:446;;;41729:38;41761:5;41729:38;:::i;:::-;41813:29;41831:10;41813:29;:::i;:::-;41803:8;41799:44;41996:2;41984:10;41981:18;41978:49;;;42017:8;42002:23;;41978:49;42040:80;42096:22;42114:3;42096:22;:::i;:::-;42086:8;42082:37;42069:11;42040:80;:::i;:::-;41699:431;;41684:446;41594:543;;;:::o;42143:117::-;42197:8;42247:5;42241:4;42237:16;42216:37;;42143:117;;;;:::o;42266:169::-;42310:6;42343:51;42391:1;42387:6;42379:5;42376:1;42372:13;42343:51;:::i;:::-;42339:56;42424:4;42418;42414:15;42404:25;;42317:118;42266:169;;;;:::o;42440:295::-;42516:4;42662:29;42687:3;42681:4;42662:29;:::i;:::-;42654:37;;42724:3;42721:1;42717:11;42711:4;42708:21;42700:29;;42440:295;;;;:::o;42740:1395::-;42857:37;42890:3;42857:37;:::i;:::-;42959:18;42951:6;42948:30;42945:56;;;42981:18;;:::i;:::-;42945:56;43025:38;43057:4;43051:11;43025:38;:::i;:::-;43110:67;43170:6;43162;43156:4;43110:67;:::i;:::-;43204:1;43228:4;43215:17;;43260:2;43252:6;43249:14;43277:1;43272:618;;;;43934:1;43951:6;43948:77;;;44000:9;43995:3;43991:19;43985:26;43976:35;;43948:77;44051:67;44111:6;44104:5;44051:67;:::i;:::-;44045:4;44038:81;43907:222;43242:887;;43272:618;43324:4;43320:9;43312:6;43308:22;43358:37;43390:4;43358:37;:::i;:::-;43417:1;43431:208;43445:7;43442:1;43439:14;43431:208;;;43524:9;43519:3;43515:19;43509:26;43501:6;43494:42;43575:1;43567:6;43563:14;43553:24;;43622:2;43611:9;43607:18;43594:31;;43468:4;43465:1;43461:12;43456:17;;43431:208;;;43667:6;43658:7;43655:19;43652:179;;;43725:9;43720:3;43716:19;43710:26;43768:48;43810:4;43802:6;43798:17;43787:9;43768:48;:::i;:::-;43760:6;43753:64;43675:156;43652:179;43877:1;43873;43865:6;43861:14;43857:22;43851:4;43844:36;43279:611;;;43242:887;;42832:1303;;;42740:1395;;:::o;44141:269::-;44270:3;44292:92;44380:3;44371:6;44292:92;:::i;:::-;44285:99;;44401:3;44394:10;;44141:269;;;;:::o;44416:143::-;44473:5;44504:6;44498:13;44489:22;;44520:33;44547:5;44520:33;:::i;:::-;44416:143;;;;:::o;44565:351::-;44635:6;44684:2;44672:9;44663:7;44659:23;44655:32;44652:119;;;44690:79;;:::i;:::-;44652:119;44810:1;44835:64;44891:7;44882:6;44871:9;44867:22;44835:64;:::i;:::-;44825:74;;44781:128;44565:351;;;;:::o;44922:176::-;45062:28;45058:1;45050:6;45046:14;45039:52;44922:176;:::o;45104:366::-;45246:3;45267:67;45331:2;45326:3;45267:67;:::i;:::-;45260:74;;45343:93;45432:3;45343:93;:::i;:::-;45461:2;45456:3;45452:12;45445:19;;45104:366;;;:::o;45476:419::-;45642:4;45680:2;45669:9;45665:18;45657:26;;45729:9;45723:4;45719:20;45715:1;45704:9;45700:17;45693:47;45757:131;45883:4;45757:131;:::i;:::-;45749:139;;45476:419;;;:::o;45901:225::-;46041:34;46037:1;46029:6;46025:14;46018:58;46110:8;46105:2;46097:6;46093:15;46086:33;45901:225;:::o;46132:366::-;46274:3;46295:67;46359:2;46354:3;46295:67;:::i;:::-;46288:74;;46371:93;46460:3;46371:93;:::i;:::-;46489:2;46484:3;46480:12;46473:19;;46132:366;;;:::o;46504:419::-;46670:4;46708:2;46697:9;46693:18;46685:26;;46757:9;46751:4;46747:20;46743:1;46732:9;46728:17;46721:47;46785:131;46911:4;46785:131;:::i;:::-;46777:139;;46504:419;;;:::o;46929:221::-;47069:34;47065:1;47057:6;47053:14;47046:58;47138:4;47133:2;47125:6;47121:15;47114:29;46929:221;:::o;47156:366::-;47298:3;47319:67;47383:2;47378:3;47319:67;:::i;:::-;47312:74;;47395:93;47484:3;47395:93;:::i;:::-;47513:2;47508:3;47504:12;47497:19;;47156:366;;;:::o;47528:419::-;47694:4;47732:2;47721:9;47717:18;47709:26;;47781:9;47775:4;47771:20;47767:1;47756:9;47752:17;47745:47;47809:131;47935:4;47809:131;:::i;:::-;47801:139;;47528:419;;;:::o;47953:117::-;48062:1;48059;48052:12;48076:98;48160:6;48155:3;48150;48137:30;48076:98;;;:::o;48210:537::-;48338:3;48359:86;48438:6;48433:3;48359:86;:::i;:::-;48352:93;;48469:66;48461:6;48458:78;48455:165;;;48539:79;;:::i;:::-;48455:165;48651:4;48643:6;48639:17;48629:27;;48666:43;48702:6;48697:3;48690:5;48666:43;:::i;:::-;48734:6;48729:3;48725:16;48718:23;;48210:537;;;;;:::o;48753:503::-;48934:4;48972:2;48961:9;48957:18;48949:26;;48985:71;49053:1;49042:9;49038:17;49029:6;48985:71;:::i;:::-;49103:9;49097:4;49093:20;49088:2;49077:9;49073:18;49066:48;49131:118;49244:4;49235:6;49227;49131:118;:::i;:::-;49123:126;;48753:503;;;;;;:::o;49262:228::-;49402:34;49398:1;49390:6;49386:14;49379:58;49471:11;49466:2;49458:6;49454:15;49447:36;49262:228;:::o;49496:366::-;49638:3;49659:67;49723:2;49718:3;49659:67;:::i;:::-;49652:74;;49735:93;49824:3;49735:93;:::i;:::-;49853:2;49848:3;49844:12;49837:19;;49496:366;;;:::o;49868:419::-;50034:4;50072:2;50061:9;50057:18;50049:26;;50121:9;50115:4;50111:20;50107:1;50096:9;50092:17;50085:47;50149:131;50275:4;50149:131;:::i;:::-;50141:139;;49868:419;;;:::o;50293:181::-;50433:33;50429:1;50421:6;50417:14;50410:57;50293:181;:::o;50480:366::-;50622:3;50643:67;50707:2;50702:3;50643:67;:::i;:::-;50636:74;;50719:93;50808:3;50719:93;:::i;:::-;50837:2;50832:3;50828:12;50821:19;;50480:366;;;:::o;50852:419::-;51018:4;51056:2;51045:9;51041:18;51033:26;;51105:9;51099:4;51095:20;51091:1;51080:9;51076:17;51069:47;51133:131;51259:4;51133:131;:::i;:::-;51125:139;;50852:419;;;:::o;51277:442::-;51426:4;51464:2;51453:9;51449:18;51441:26;;51477:71;51545:1;51534:9;51530:17;51521:6;51477:71;:::i;:::-;51558:72;51626:2;51615:9;51611:18;51602:6;51558:72;:::i;:::-;51640;51708:2;51697:9;51693:18;51684:6;51640:72;:::i;:::-;51277:442;;;;;;:::o;51725:102::-;51767:8;51814:5;51811:1;51807:13;51786:34;;51725:102;;;:::o;51833:848::-;51894:5;51901:4;51925:6;51916:15;;51949:5;51940:14;;51963:712;51984:1;51974:8;51971:15;51963:712;;;52079:4;52074:3;52070:14;52064:4;52061:24;52058:50;;;52088:18;;:::i;:::-;52058:50;52138:1;52128:8;52124:16;52121:451;;;52553:4;52546:5;52542:16;52533:25;;52121:451;52603:4;52597;52593:15;52585:23;;52633:32;52656:8;52633:32;:::i;:::-;52621:44;;51963:712;;;51833:848;;;;;;;:::o;52687:1073::-;52741:5;52932:8;52922:40;;52953:1;52944:10;;52955:5;;52922:40;52981:4;52971:36;;52998:1;52989:10;;53000:5;;52971:36;53067:4;53115:1;53110:27;;;;53151:1;53146:191;;;;53060:277;;53110:27;53128:1;53119:10;;53130:5;;;53146:191;53191:3;53181:8;53178:17;53175:43;;;53198:18;;:::i;:::-;53175:43;53247:8;53244:1;53240:16;53231:25;;53282:3;53275:5;53272:14;53269:40;;;53289:18;;:::i;:::-;53269:40;53322:5;;;53060:277;;53446:2;53436:8;53433:16;53427:3;53421:4;53418:13;53414:36;53396:2;53386:8;53383:16;53378:2;53372:4;53369:12;53365:35;53349:111;53346:246;;;53502:8;53496:4;53492:19;53483:28;;53537:3;53530:5;53527:14;53524:40;;;53544:18;;:::i;:::-;53524:40;53577:5;;53346:246;53617:42;53655:3;53645:8;53639:4;53636:1;53617:42;:::i;:::-;53602:57;;;;53691:4;53686:3;53682:14;53675:5;53672:25;53669:51;;;53700:18;;:::i;:::-;53669:51;53749:4;53742:5;53738:16;53729:25;;52687:1073;;;;;;:::o;53766:285::-;53826:5;53850:23;53868:4;53850:23;:::i;:::-;53842:31;;53894:27;53912:8;53894:27;:::i;:::-;53882:39;;53940:104;53977:66;53967:8;53961:4;53940:104;:::i;:::-;53931:113;;53766:285;;;;:::o;54057:191::-;54097:3;54116:20;54134:1;54116:20;:::i;:::-;54111:25;;54150:20;54168:1;54150:20;:::i;:::-;54145:25;;54193:1;54190;54186:9;54179:16;;54214:3;54211:1;54208:10;54205:36;;;54221:18;;:::i;:::-;54205:36;54057:191;;;;:::o;54254:194::-;54294:4;54314:20;54332:1;54314:20;:::i;:::-;54309:25;;54348:20;54366:1;54348:20;:::i;:::-;54343:25;;54392:1;54389;54385:9;54377:17;;54416:1;54410:4;54407:11;54404:37;;;54421:18;;:::i;:::-;54404:37;54254:194;;;;:::o;54454:225::-;54594:34;54590:1;54582:6;54578:14;54571:58;54663:8;54658:2;54650:6;54646:15;54639:33;54454:225;:::o;54685:366::-;54827:3;54848:67;54912:2;54907:3;54848:67;:::i;:::-;54841:74;;54924:93;55013:3;54924:93;:::i;:::-;55042:2;55037:3;55033:12;55026:19;;54685:366;;;:::o;55057:419::-;55223:4;55261:2;55250:9;55246:18;55238:26;;55310:9;55304:4;55300:20;55296:1;55285:9;55281:17;55274:47;55338:131;55464:4;55338:131;:::i;:::-;55330:139;;55057:419;;;:::o;55482:182::-;55622:34;55618:1;55610:6;55606:14;55599:58;55482:182;:::o;55670:366::-;55812:3;55833:67;55897:2;55892:3;55833:67;:::i;:::-;55826:74;;55909:93;55998:3;55909:93;:::i;:::-;56027:2;56022:3;56018:12;56011:19;;55670:366;;;:::o;56042:419::-;56208:4;56246:2;56235:9;56231:18;56223:26;;56295:9;56289:4;56285:20;56281:1;56270:9;56266:17;56259:47;56323:131;56449:4;56323:131;:::i;:::-;56315:139;;56042:419;;;:::o;56467:176::-;56499:1;56516:20;56534:1;56516:20;:::i;:::-;56511:25;;56550:20;56568:1;56550:20;:::i;:::-;56545:25;;56589:1;56579:35;;56594:18;;:::i;:::-;56579:35;56635:1;56632;56628:9;56623:14;;56467:176;;;;:::o;56649:234::-;56789:34;56785:1;56777:6;56773:14;56766:58;56858:17;56853:2;56845:6;56841:15;56834:42;56649:234;:::o;56889:366::-;57031:3;57052:67;57116:2;57111:3;57052:67;:::i;:::-;57045:74;;57128:93;57217:3;57128:93;:::i;:::-;57246:2;57241:3;57237:12;57230:19;;56889:366;;;:::o;57261:419::-;57427:4;57465:2;57454:9;57450:18;57442:26;;57514:9;57508:4;57504:20;57500:1;57489:9;57485:17;57478:47;57542:131;57668:4;57542:131;:::i;:::-;57534:139;;57261:419;;;:::o;57686:220::-;57826:34;57822:1;57814:6;57810:14;57803:58;57895:3;57890:2;57882:6;57878:15;57871:28;57686:220;:::o;57912:366::-;58054:3;58075:67;58139:2;58134:3;58075:67;:::i;:::-;58068:74;;58151:93;58240:3;58151:93;:::i;:::-;58269:2;58264:3;58260:12;58253:19;;57912:366;;;:::o;58284:419::-;58450:4;58488:2;58477:9;58473:18;58465:26;;58537:9;58531:4;58527:20;58523:1;58512:9;58508:17;58501:47;58565:131;58691:4;58565:131;:::i;:::-;58557:139;;58284:419;;;:::o;58709:332::-;58830:4;58868:2;58857:9;58853:18;58845:26;;58881:71;58949:1;58938:9;58934:17;58925:6;58881:71;:::i;:::-;58962:72;59030:2;59019:9;59015:18;59006:6;58962:72;:::i;:::-;58709:332;;;;;:::o;59047:222::-;59187:34;59183:1;59175:6;59171:14;59164:58;59256:5;59251:2;59243:6;59239:15;59232:30;59047:222;:::o;59275:366::-;59417:3;59438:67;59502:2;59497:3;59438:67;:::i;:::-;59431:74;;59514:93;59603:3;59514:93;:::i;:::-;59632:2;59627:3;59623:12;59616:19;;59275:366;;;:::o;59647:419::-;59813:4;59851:2;59840:9;59836:18;59828:26;;59900:9;59894:4;59890:20;59886:1;59875:9;59871:17;59864:47;59928:131;60054:4;59928:131;:::i;:::-;59920:139;;59647:419;;;:::o;60072:223::-;60212:34;60208:1;60200:6;60196:14;60189:58;60281:6;60276:2;60268:6;60264:15;60257:31;60072:223;:::o;60301:366::-;60443:3;60464:67;60528:2;60523:3;60464:67;:::i;:::-;60457:74;;60540:93;60629:3;60540:93;:::i;:::-;60658:2;60653:3;60649:12;60642:19;;60301:366;;;:::o;60673:419::-;60839:4;60877:2;60866:9;60862:18;60854:26;;60926:9;60920:4;60916:20;60912:1;60901:9;60897:17;60890:47;60954:131;61080:4;60954:131;:::i;:::-;60946:139;;60673:419;;;:::o;61098:227::-;61238:34;61234:1;61226:6;61222:14;61215:58;61307:10;61302:2;61294:6;61290:15;61283:35;61098:227;:::o;61331:366::-;61473:3;61494:67;61558:2;61553:3;61494:67;:::i;:::-;61487:74;;61570:93;61659:3;61570:93;:::i;:::-;61688:2;61683:3;61679:12;61672:19;;61331:366;;;:::o;61703:419::-;61869:4;61907:2;61896:9;61892:18;61884:26;;61956:9;61950:4;61946:20;61942:1;61931:9;61927:17;61920:47;61984:131;62110:4;61984:131;:::i;:::-;61976:139;;61703:419;;;:::o;62128:224::-;62268:34;62264:1;62256:6;62252:14;62245:58;62337:7;62332:2;62324:6;62320:15;62313:32;62128:224;:::o;62358:366::-;62500:3;62521:67;62585:2;62580:3;62521:67;:::i;:::-;62514:74;;62597:93;62686:3;62597:93;:::i;:::-;62715:2;62710:3;62706:12;62699:19;;62358:366;;;:::o;62730:419::-;62896:4;62934:2;62923:9;62919:18;62911:26;;62983:9;62977:4;62973:20;62969:1;62958:9;62954:17;62947:47;63011:131;63137:4;63011:131;:::i;:::-;63003:139;;62730:419;;;:::o;63155:229::-;63295:34;63291:1;63283:6;63279:14;63272:58;63364:12;63359:2;63351:6;63347:15;63340:37;63155:229;:::o;63390:366::-;63532:3;63553:67;63617:2;63612:3;63553:67;:::i;:::-;63546:74;;63629:93;63718:3;63629:93;:::i;:::-;63747:2;63742:3;63738:12;63731:19;;63390:366;;;:::o;63762:419::-;63928:4;63966:2;63955:9;63951:18;63943:26;;64015:9;64009:4;64005:20;64001:1;63990:9;63986:17;63979:47;64043:131;64169:4;64043:131;:::i;:::-;64035:139;;63762:419;;;:::o;64187:634::-;64408:4;64446:2;64435:9;64431:18;64423:26;;64495:9;64489:4;64485:20;64481:1;64470:9;64466:17;64459:47;64523:108;64626:4;64617:6;64523:108;:::i;:::-;64515:116;;64678:9;64672:4;64668:20;64663:2;64652:9;64648:18;64641:48;64706:108;64809:4;64800:6;64706:108;:::i;:::-;64698:116;;64187:634;;;;;:::o;64827:98::-;64878:6;64912:5;64906:12;64896:22;;64827:98;;;:::o;64931:168::-;65014:11;65048:6;65043:3;65036:19;65088:4;65083:3;65079:14;65064:29;;64931:168;;;;:::o;65105:373::-;65191:3;65219:38;65251:5;65219:38;:::i;:::-;65273:70;65336:6;65331:3;65273:70;:::i;:::-;65266:77;;65352:65;65410:6;65405:3;65398:4;65391:5;65387:16;65352:65;:::i;:::-;65442:29;65464:6;65442:29;:::i;:::-;65437:3;65433:39;65426:46;;65195:283;65105:373;;;;:::o;65484:751::-;65707:4;65745:3;65734:9;65730:19;65722:27;;65759:71;65827:1;65816:9;65812:17;65803:6;65759:71;:::i;:::-;65840:72;65908:2;65897:9;65893:18;65884:6;65840:72;:::i;:::-;65922;65990:2;65979:9;65975:18;65966:6;65922:72;:::i;:::-;66004;66072:2;66061:9;66057:18;66048:6;66004:72;:::i;:::-;66124:9;66118:4;66114:20;66108:3;66097:9;66093:19;66086:49;66152:76;66223:4;66214:6;66152:76;:::i;:::-;66144:84;;65484:751;;;;;;;;:::o;66241:141::-;66297:5;66328:6;66322:13;66313:22;;66344:32;66370:5;66344:32;:::i;:::-;66241:141;;;;:::o;66388:349::-;66457:6;66506:2;66494:9;66485:7;66481:23;66477:32;66474:119;;;66512:79;;:::i;:::-;66474:119;66632:1;66657:63;66712:7;66703:6;66692:9;66688:22;66657:63;:::i;:::-;66647:73;;66603:127;66388:349;;;;:::o;66743:106::-;66787:8;66836:5;66831:3;66827:15;66806:36;;66743:106;;;:::o;66855:183::-;66890:3;66928:1;66910:16;66907:23;66904:128;;;66966:1;66963;66960;66945:23;66988:34;67019:1;67013:8;66988:34;:::i;:::-;66981:41;;66904:128;66855:183;:::o;67044:711::-;67083:3;67121:4;67103:16;67100:26;67129:5;67097:39;67158:20;;:::i;:::-;67233:1;67215:16;67211:24;67208:1;67202:4;67187:49;67266:4;67260:11;67365:16;67358:4;67350:6;67346:17;67343:39;67310:18;67302:6;67299:30;67283:113;67280:146;;;67411:5;;;;67280:146;67457:6;67451:4;67447:17;67493:3;67487:10;67520:18;67512:6;67509:30;67506:43;;;67542:5;;;;;;67506:43;67590:6;67583:4;67578:3;67574:14;67570:27;67649:1;67631:16;67627:24;67621:4;67617:35;67612:3;67609:44;67606:57;;;67656:5;;;;;;;67606:57;67673;67721:6;67715:4;67711:17;67703:6;67699:30;67693:4;67673:57;:::i;:::-;67746:3;67739:10;;67087:668;;;;;67044:711;;:::o;67761:239::-;67901:34;67897:1;67889:6;67885:14;67878:58;67970:22;67965:2;67957:6;67953:15;67946:47;67761:239;:::o;68006:366::-;68148:3;68169:67;68233:2;68228:3;68169:67;:::i;:::-;68162:74;;68245:93;68334:3;68245:93;:::i;:::-;68363:2;68358:3;68354:12;68347:19;;68006:366;;;:::o;68378:419::-;68544:4;68582:2;68571:9;68567:18;68559:26;;68631:9;68625:4;68621:20;68617:1;68606:9;68602:17;68595:47;68659:131;68785:4;68659:131;:::i;:::-;68651:139;;68378:419;;;:::o;68803:227::-;68943:34;68939:1;68931:6;68927:14;68920:58;69012:10;69007:2;68999:6;68995:15;68988:35;68803:227;:::o;69036:366::-;69178:3;69199:67;69263:2;69258:3;69199:67;:::i;:::-;69192:74;;69275:93;69364:3;69275:93;:::i;:::-;69393:2;69388:3;69384:12;69377:19;;69036:366;;;:::o;69408:419::-;69574:4;69612:2;69601:9;69597:18;69589:26;;69661:9;69655:4;69651:20;69647:1;69636:9;69632:17;69625:47;69689:131;69815:4;69689:131;:::i;:::-;69681:139;;69408:419;;;:::o;69833:228::-;69973:34;69969:1;69961:6;69957:14;69950:58;70042:11;70037:2;70029:6;70025:15;70018:36;69833:228;:::o;70067:366::-;70209:3;70230:67;70294:2;70289:3;70230:67;:::i;:::-;70223:74;;70306:93;70395:3;70306:93;:::i;:::-;70424:2;70419:3;70415:12;70408:19;;70067:366;;;:::o;70439:419::-;70605:4;70643:2;70632:9;70628:18;70620:26;;70692:9;70686:4;70682:20;70678:1;70667:9;70663:17;70656:47;70720:131;70846:4;70720:131;:::i;:::-;70712:139;;70439:419;;;:::o;70864:1053::-;71187:4;71225:3;71214:9;71210:19;71202:27;;71239:71;71307:1;71296:9;71292:17;71283:6;71239:71;:::i;:::-;71320:72;71388:2;71377:9;71373:18;71364:6;71320:72;:::i;:::-;71439:9;71433:4;71429:20;71424:2;71413:9;71409:18;71402:48;71467:108;71570:4;71561:6;71467:108;:::i;:::-;71459:116;;71622:9;71616:4;71612:20;71607:2;71596:9;71592:18;71585:48;71650:108;71753:4;71744:6;71650:108;:::i;:::-;71642:116;;71806:9;71800:4;71796:20;71790:3;71779:9;71775:19;71768:49;71834:76;71905:4;71896:6;71834:76;:::i;:::-;71826:84;;70864:1053;;;;;;;;:::o

Swarm Source

ipfs://49f5b158c39c51a68ee941e71c1c8b0eb230908d9e2a364f04c0e1c49c51a2db
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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