ETH Price: $3,277.72 (+0.82%)
Gas: 2 Gwei

Token

Loot Chests ()
 

Overview

Max Total Supply

673

Holders

149

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0xfebbB48C8f7A67Dc3DcEE19524A410E078e6A6a1
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:
LootChests

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.16;

/*
    _____           __  .__    .__
   /     \ ___.__._/  |_|  |__ |__| ____
  /  \ /  <   |  |\   __\  |  \|  |/ ___\
 /    Y    \___  | |  | |   Y  \  \  \___
 \____|__  / ____| |__| |___|  /__|\___  >
         \/\/                \/        \/

Standing on the shoulders of giants -- Yuga Labs & CryptoPunks
    * Written by Aleph 0ne for the ApeLiquid community *
 * Mythic Chests by ApeLiquid.io (with OpenSea Creator Fees) *
*/

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

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

// SafeMath
// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transfer.selector, to, value)
        );
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transferFrom.selector, from, to, value)
        );
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.approve.selector, spender, value)
        );
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(
                token.approve.selector,
                spender,
                newAllowance
            )
        );
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(
                oldAllowance >= value,
                "SafeERC20: decreased allowance below zero"
            );
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(
                token,
                abi.encodeWithSelector(
                    token.approve.selector,
                    spender,
                    newAllowance
                )
            );
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(
            data,
            "SafeERC20: low-level call failed"
        );
        if (returndata.length > 0) {
            // Return data is optional
            require(
                abi.decode(returndata, (bool)),
                "SafeERC20: ERC20 operation did not succeed"
            );
        }
    }
}

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastvalue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastvalue;
                // Update the index for the moved value
                set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value)
        private
        view
        returns (bool)
    {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index)
        private
        view
        returns (bytes32)
    {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value)
        internal
        returns (bool)
    {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value)
        internal
        returns (bool)
    {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value)
        internal
        view
        returns (bool)
    {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index)
        internal
        view
        returns (bytes32)
    {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set)
        internal
        view
        returns (bytes32[] memory)
    {
        return _values(set._inner);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value)
        internal
        returns (bool)
    {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value)
        internal
        returns (bool)
    {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value)
        internal
        view
        returns (bool)
    {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index)
        internal
        view
        returns (address)
    {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set)
        internal
        view
        returns (address[] memory)
    {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value)
        internal
        returns (bool)
    {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value)
        internal
        view
        returns (bool)
    {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index)
        internal
        view
        returns (uint256)
    {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set)
        internal
        view
        returns (uint256[] memory)
    {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        assembly {
            result := store
        }

        return result;
    }
}

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

// OPENSEA BULLSHIT
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.0;

/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 *
 * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
 * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
 * to run tests before sending real value to this contract.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event ERC20PaymentReleased(
        IERC20 indexed token,
        address to,
        uint256 amount
    );
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    mapping(IERC20 => uint256) private _erc20TotalReleased;
    mapping(IERC20 => mapping(address => uint256)) private _erc20Released;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(
            payees.length == shares_.length,
            "PaymentSplitter: payees and shares length mismatch"
        );
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20
     * contract.
     */
    function totalReleased(IERC20 token) public view returns (uint256) {
        return _erc20TotalReleased[token];
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an
     * IERC20 contract.
     */
    function released(IERC20 token, address account)
        public
        view
        returns (uint256)
    {
        return _erc20Released[token][account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + totalReleased();
        uint256 payment = _pendingPayment(
            account,
            totalReceived,
            released(account)
        );

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] += payment;
        _totalReleased += payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their
     * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20
     * contract.
     */
    function release(IERC20 token, address account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = token.balanceOf(address(this)) +
            totalReleased(token);
        uint256 payment = _pendingPayment(
            account,
            totalReceived,
            released(token, account)
        );

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _erc20Released[token][account] += payment;
        _erc20TotalReleased[token] += payment;

        SafeERC20.safeTransfer(token, account, payment);
        emit ERC20PaymentReleased(token, account, payment);
    }

    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        return
            (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(
            account != address(0),
            "PaymentSplitter: account is the zero address"
        );
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(
            _shares[account] == 0,
            "PaymentSplitter: account already has shares"
        );

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}

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

contract LootChests is
    Ownable,
    PaymentSplitter,
    DefaultOperatorFilterer,
    ReentrancyGuard,
    ERC1155
{
    using Strings for uint256;

    // Sale Status
    bool public saleIsActive = false;

    address public LiquidDeployer = 0x866cfDa1B7cD90Cd250485cd8b700211480845D7;
    uint256 public RandomNumberRange = 100;
    string private baseURI = "https://apeliquid.io/lootchests/json/";
    string public name = "Loot Chests";

    mapping(uint256 => bool) public validItem;
    uint256 private maxItemID = 6;

    // Liquid METL -- bang your head as you read this line of code
    address public METLToken = 0xFcbE615dEf610E806BB64427574A2c5c1fB55510;

    // Specify the IERC20 interface to the METL Token
    IERC20 METLTokenAddress = IERC20(address(METLToken));

    uint256 public mintMETLRequired = 10 ether;
    uint256 public mintETHRequired = 1000000000000000;

    event SetBaseURI(string indexed _baseURI);

    // Enumerate all the items for minting
    constructor() ERC1155("LootChests") PaymentSplitter(_payees, _shares) {
        validItem[1] = true; // Common
        validItem[2] = true; // Rare
        validItem[3] = true; // Mythic
        validItem[4] = true; // Legendary
        validItem[5] = true; // Divine
        validItem[6] = true; // Immortal

        emit SetBaseURI(baseURI);
    }

    // -------------------------------------------------------------------
    // Functions for setting variables and changing values (only by owner)
    // -------------------------------------------------------------------

    function setRandomNumberRange(uint256 r) external onlyOwner {
        RandomNumberRange = r;
    }

    /**
     * @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(_list[i], _tokenIds[i], _qty[i], "Drop-a-palooza error!");
        }
    }

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

    function uri(uint256 typeId) public view override returns (string memory) {
        require(validItem[typeId], "URI requested for invalid type");
        return
            bytes(baseURI).length > 0
                ? string(abi.encodePacked(baseURI, typeId.toString()))
                : baseURI;
    }

    // -------------------------------------------------------------------------------
    // MINT and Sale details
    // -------------------------------------------------------------------------------

    event SaleActivation(bool isActive);

    function toggleSaleStatus() external onlyOwner {
        saleIsActive = !saleIsActive;
        emit SaleActivation(saleIsActive);
    }

    event ItemMinted(
        address contractAddress,
        uint256 tokenId,
        uint256 timestamp
    );

    function newMints(uint256 _count) private {
        for (uint256 i = 0; i < _count; i++) {
            uint256 randomItem = RandomNumber(maxItemID);
            //wait(RandomNumber(3)); // wait up to 3 seconds between mints
            _mint(msg.sender, randomItem, 1, "Mint Failed");
            emit ItemMinted(msg.sender, randomItem, block.timestamp);
        }
    }

    // @notice mint The mint function, which can be done in ETH or METL
    // @params _count How many to mint
    // @params mintInMETL Boolean that determines if mint is in METL (or ETH)
    function mint(uint256 _count, bool mintInMETL) public payable nonReentrant {
        require(saleIsActive, "Sale not active!");
        if (mintInMETL) {
            require(
                METLTokenAddress.allowance(msg.sender, address(this)) >=
                    mintMETLRequired * _count,
                "Error: Transfer not approved"
            );
            METLTokenAddress.transferFrom(
                msg.sender,
                address(this),
                (mintMETLRequired) * _count
            );
        } else {
            require(
                mintETHRequired * _count <= msg.value,
                "Not Enough ETH to mint!"
            );
        }

        newMints(_count);
    }

    function wait(uint256 secondsToWait) public view {
        uint256 startTime = block.timestamp;
        while (block.timestamp < startTime + secondsToWait) {
            // Do nothing - just loop until the time has elapsed
        }
    }

    // @notice Generate random number based on totalnumbers
    // @param totalnumbers The Maximum number to return (i.e. 100 returns 0-99)
        // @notice Generate random number based on totalnumbers
    // @param totalnumbers The Maximum number to return (i.e. 100 returns 0-99)
    function RandomNumber(uint256 totalnumbers) public view returns (uint256) {
        uint256 seed = uint256(
            keccak256(
                abi.encodePacked(
                    block.timestamp +
                        block.difficulty +
                        ((
                            uint256(keccak256(abi.encodePacked(block.coinbase)))
                        ) / (block.timestamp)) +
                        block.gaslimit +
                        ((uint256(keccak256(abi.encodePacked(msg.sender)))) /
                            (block.timestamp)) +
                        block.number
                )
            )
        );

        return (seed % totalnumbers) + 1;
    }

    // -------------------------------------------------------------------------------
    // PRIVATE FUNCTIONS + ADDITIONAL REQUIREMENTS FOR CONTRACT
    // -------------------------------------------------------------------------------

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

    function changeMintETH(uint256 neweth) external onlyOwner {
        mintETHRequired = neweth;
    }

    function changeMintMETL(uint256 neweth) external onlyOwner {
        mintMETLRequired = neweth;
    }

    function receiveETH() public payable {
        require(msg.value > mintETHRequired, "Not enough ETH");
    }

    // Payments using splitter go here...
    address[] public _payees = [
        0x7FDE663601A53A6953bbb98F1Ab87E86dEE81b35, // Liquid Payments
        0x867Eb0804eACA9FEeda8a0E1d2B9a32eEF58AF8f,
        0x0C07747AB98EE84971C90Fbd353eda207B737c43,
        0xfebbB48C8f7A67Dc3DcEE19524A410E078e6A6a1
    ];
    uint256[] private _shares = [5, 65, 15, 15];

    // Payments
    function claim() external {
        release(payable(msg.sender));
    }

    /**
     * @notice Withdraw all tokens from the contract (emergency function)
     */
    function removeAllMETL() public onlyOwner {
        uint256 balance = METLTokenAddress.balanceOf(address(this));
        METLTokenAddress.transfer(LiquidDeployer, balance);
    }

    // OpenSea's new bullshit requirements, which violate my moral code, but
    // are nonetheless necessary to make this all work properly.
    function setApprovalForAll(address operator, bool approved)
        public
        override
        onlyAllowedOperatorApproval(operator)
    {
        super.setApprovalForAll(operator, approved);
    }

    // Take my love, take my land, Take me where I cannot stand.
    // I don't care, I'm still free, You can't take the sky from me.
    //
    function SelfDestruct() external onlyOwner {
        // Walk through all the keys and return them to the contract
        removeAllMETL();
        address payable os = payable(address(LiquidDeployer));
        selfdestruct(os);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ItemMinted","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":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isActive","type":"bool"}],"name":"SaleActivation","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":[{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"totalToBurn","type":"uint256"}],"name":"DestroyItems","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"LiquidDeployer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"METLToken","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":"totalnumbers","type":"uint256"}],"name":"RandomNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RandomNumberRange","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SelfDestruct","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_payees","outputs":[{"internalType":"address","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":[{"internalType":"uint256","name":"neweth","type":"uint256"}],"name":"changeMintETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"neweth","type":"uint256"}],"name":"changeMintMETL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"bool","name":"mintInMETL","type":"bool"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintETHRequired","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintMETLRequired","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"receiveETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeAllMETL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"r","type":"uint256"}],"name":"setRandomNumberRange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint256","name":"typeId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"validItem","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"secondsToWait","type":"uint256"}],"name":"wait","outputs":[],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526000600c60006101000a81548160ff02191690831515021790555073866cfda1b7cd90cd250485cd8b700211480845d7600c60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506064600d556040518060600160405280602581526020016200752f60259139600e9081620000a3919062000f91565b506040518060400160405280600b81526020017f4c6f6f7420436865737473000000000000000000000000000000000000000000815250600f9081620000ea919062000f91565b50600660115573fcbe615def610e806bb64427574a2c5c1fb55510601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550678ac7230489e8000060145566038d7ea4c680006015556040518060800160405280737fde663601a53a6953bbb98f1ab87e86dee81b3573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173867eb0804eaca9feeda8a0e1d2b9a32eef58af8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001730c07747ab98ee84971c90fbd353eda207b737c4373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173febbb48c8f7a67dc3dcee19524a410e078e6a6a173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152506016906004620002f292919062000c12565b506040518060800160405280600560ff168152602001604160ff168152602001600f60ff168152602001600f60ff1681525060179060046200033692919062000ca1565b503480156200034457600080fd5b506040518060400160405280600a81526020017f4c6f6f7443686573747300000000000000000000000000000000000000000000815250733cc6cdda760b79bafa08df41ecfa224f810dceb6600160168054806020026020016040519081016040528092919081815260200182805480156200041657602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311620003cb575b505050505060178054806020026020016040519081016040528092919081815260200182805480156200046957602002820191906000526020600020905b81548152602001906001019080831162000454575b50505050506200048e62000482620008f860201b60201c565b6200090060201b60201c565b8051825114620004d5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004cc90620010ff565b60405180910390fd5b60008251116200051c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005139062001171565b60405180910390fd5b60005b82518110156200058b576200057583828151811062000543576200054262001193565b5b602002602001015183838151811062000561576200056062001193565b5b6020026020010151620009c460201b60201c565b80806200058290620011f1565b9150506200051f565b50505060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200078357801562000649576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200060f92919062001283565b600060405180830381600087803b1580156200062a57600080fd5b505af11580156200063f573d6000803e3d6000fd5b5050505062000782565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000703576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620006c992919062001283565b600060405180830381600087803b158015620006e457600080fd5b505af1158015620006f9573d6000803e3d6000fd5b5050505062000781565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016200074c9190620012b0565b600060405180830381600087803b1580156200076757600080fd5b505af11580156200077c573d6000803e3d6000fd5b505050505b5b5b505060016008819055506200079e8162000bfd60201b60201c565b506001601060006001815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601060006002815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601060006003815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601060006004815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601060006005815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601060006006815260200190815260200160002060006101000a81548160ff021916908315150217905550600e604051620008be919062001367565b60405180910390207f23c8c9488efebfd474e85a7956de6f39b17c7ab88502d42a623db2d8e382bbaa60405160405180910390a26200159b565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000a36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a2d90620013f6565b60405180910390fd5b6000811162000a7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a739062001468565b60405180910390fd5b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541462000b01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000af89062001500565b60405180910390fd5b6005829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508060015462000bb8919062001522565b6001819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac828260405162000bf19291906200156e565b60405180910390a15050565b80600b908162000c0e919062000f91565b5050565b82805482825590600052602060002090810192821562000c8e579160200282015b8281111562000c8d5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000c33565b5b50905062000c9d919062000cf8565b5090565b82805482825590600052602060002090810192821562000ce5579160200282015b8281111562000ce4578251829060ff1690559160200191906001019062000cc2565b5b50905062000cf4919062000cf8565b5090565b5b8082111562000d1357600081600090555060010162000cf9565b5090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000d9957607f821691505b60208210810362000daf5762000dae62000d51565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000e197fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000dda565b62000e25868362000dda565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000e7262000e6c62000e668462000e3d565b62000e47565b62000e3d565b9050919050565b6000819050919050565b62000e8e8362000e51565b62000ea662000e9d8262000e79565b84845462000de7565b825550505050565b600090565b62000ebd62000eae565b62000eca81848462000e83565b505050565b5b8181101562000ef25762000ee660008262000eb3565b60018101905062000ed0565b5050565b601f82111562000f415762000f0b8162000db5565b62000f168462000dca565b8101602085101562000f26578190505b62000f3e62000f358562000dca565b83018262000ecf565b50505b505050565b600082821c905092915050565b600062000f666000198460080262000f46565b1980831691505092915050565b600062000f81838362000f53565b9150826002028217905092915050565b62000f9c8262000d17565b67ffffffffffffffff81111562000fb85762000fb762000d22565b5b62000fc4825462000d80565b62000fd182828562000ef6565b600060209050601f83116001811462001009576000841562000ff4578287015190505b62001000858262000f73565b86555062001070565b601f198416620010198662000db5565b60005b8281101562001043578489015182556001820191506020850194506020810190506200101c565b868310156200106357848901516200105f601f89168262000f53565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f5061796d656e7453706c69747465723a2070617965657320616e64207368617260008201527f6573206c656e677468206d69736d617463680000000000000000000000000000602082015250565b6000620010e760328362001078565b9150620010f48262001089565b604082019050919050565b600060208201905081810360008301526200111a81620010d8565b9050919050565b7f5061796d656e7453706c69747465723a206e6f20706179656573000000000000600082015250565b600062001159601a8362001078565b9150620011668262001121565b602082019050919050565b600060208201905081810360008301526200118c816200114a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620011fe8262000e3d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620012335762001232620011c2565b5b600182019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200126b826200123e565b9050919050565b6200127d816200125e565b82525050565b60006040820190506200129a600083018562001272565b620012a9602083018462001272565b9392505050565b6000602082019050620012c7600083018462001272565b92915050565b600081905092915050565b60008154620012e78162000d80565b620012f38186620012cd565b9450600182166000811462001311576001811462001327576200135e565b60ff19831686528115158202860193506200135e565b620013328562000db5565b60005b83811015620013565781548189015260018201915060208101905062001335565b838801955050505b50505092915050565b6000620013758284620012d8565b915081905092915050565b7f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b6000620013de602c8362001078565b9150620013eb8262001380565b604082019050919050565b600060208201905081810360008301526200141181620013cf565b9050919050565b7f5061796d656e7453706c69747465723a20736861726573206172652030000000600082015250565b600062001450601d8362001078565b91506200145d8262001418565b602082019050919050565b60006020820190508181036000830152620014838162001441565b9050919050565b7f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960008201527f2068617320736861726573000000000000000000000000000000000000000000602082015250565b6000620014e8602b8362001078565b9150620014f5826200148a565b604082019050919050565b600060208201905081810360008301526200151b81620014d9565b9050919050565b60006200152f8262000e3d565b91506200153c8362000e3d565b9250828201905080821115620015575762001556620011c2565b5b92915050565b620015688162000e3d565b82525050565b600060408201905062001585600083018562001272565b6200159460208301846200155d565b9392505050565b615f8480620015ab6000396000f3fe60806040526004361061026a5760003560e01c80637a52166411610144578063d3444b7b116100b6578063eb8d24441161007a578063eb8d24441461095c578063ec6cdc8e14610987578063f242432a146109c4578063f2fde38b146109ed578063f83e092a14610a16578063fcd662b614610a2d576102b1565b8063d3444b7b14610875578063d79779b2146108a0578063dba5e917146108dd578063e33b7de3146108f4578063e985e9c51461091f576102b1565b8063a22cb46511610108578063a22cb46514610755578063a37491501461077e578063a3c106fa146107a7578063c2985422146107d2578063ce7c2ac21461080f578063d10507a91461084c576102b1565b80637a5216641461065c5780638b83209b146106855780638da5cb5b146106c25780638dfc9b04146106ed5780639852595c14610718576102b1565b80633a98ef39116101dd57806348b75044116101a157806348b75044146105815780634e1273f4146105aa5780634e71d92d146105e7578063500c06f4146105fe57806367f68fac14610629578063715018a614610645576102b1565b80633a98ef39146104bb5780633ecfd51e146104e6578063406072a9146104f057806341f434341461052d578063452ca57414610558576102b1565b80630e89341c1161022f5780630e89341c1461039b57806319165587146103d857806326506ba414610401578063283248be1461042c5780632eb2c2d61461046957806339f7e37f14610492576102b1565b8062fdd58e146102b657806301ffc9a7146102f3578063049c5c4914610330578063059c14fb1461034757806306fdde0314610370576102b1565b366102b1577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be770610298610a56565b346040516102a7929190613931565b60405180910390a1005b600080fd5b3480156102c257600080fd5b506102dd60048036038101906102d891906139c6565b610a5e565b6040516102ea9190613a06565b60405180910390f35b3480156102ff57600080fd5b5061031a60048036038101906103159190613a79565b610b27565b6040516103279190613ac1565b60405180910390f35b34801561033c57600080fd5b50610345610c09565b005b34801561035357600080fd5b5061036e60048036038101906103699190613adc565b610c83565b005b34801561037c57600080fd5b50610385610c95565b6040516103929190613b99565b60405180910390f35b3480156103a757600080fd5b506103c260048036038101906103bd9190613adc565b610d23565b6040516103cf9190613b99565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa9190613bf9565b610e5e565b005b34801561040d57600080fd5b50610416611008565b6040516104239190613c26565b60405180910390f35b34801561043857600080fd5b50610453600480360381019061044e9190613adc565b61102e565b6040516104609190613c26565b60405180910390f35b34801561047557600080fd5b50610490600480360381019061048b9190613e3e565b61106d565b005b34801561049e57600080fd5b506104b960048036038101906104b49190613fae565b61110e565b005b3480156104c757600080fd5b506104d061116c565b6040516104dd9190613a06565b60405180910390f35b6104ee611176565b005b3480156104fc57600080fd5b5061051760048036038101906105129190614035565b6111bc565b6040516105249190613a06565b60405180910390f35b34801561053957600080fd5b50610542611243565b60405161054f91906140d4565b60405180910390f35b34801561056457600080fd5b5061057f600480360381019061057a9190613adc565b611255565b005b34801561058d57600080fd5b506105a860048036038101906105a39190614035565b611267565b005b3480156105b657600080fd5b506105d160048036038101906105cc91906141b2565b61151f565b6040516105de91906142e8565b60405180910390f35b3480156105f357600080fd5b506105fc611638565b005b34801561060a57600080fd5b50610613611643565b6040516106209190613a06565b60405180910390f35b610643600480360381019061063e9190614336565b611649565b005b34801561065157600080fd5b5061065a6118f3565b005b34801561066857600080fd5b50610683600480360381019061067e9190613adc565b611907565b005b34801561069157600080fd5b506106ac60048036038101906106a79190613adc565b611919565b6040516106b99190613c26565b60405180910390f35b3480156106ce57600080fd5b506106d7611961565b6040516106e49190613c26565b60405180910390f35b3480156106f957600080fd5b5061070261198a565b60405161070f9190613a06565b60405180910390f35b34801561072457600080fd5b5061073f600480360381019061073a9190614376565b611990565b60405161074c9190613a06565b60405180910390f35b34801561076157600080fd5b5061077c600480360381019061077791906143a3565b6119d9565b005b34801561078a57600080fd5b506107a560048036038101906107a091906143e3565b611ae3565b005b3480156107b357600080fd5b506107bc611afb565b6040516107c99190613a06565b60405180910390f35b3480156107de57600080fd5b506107f960048036038101906107f49190613adc565b611b01565b6040516108069190613ac1565b60405180910390f35b34801561081b57600080fd5b5061083660048036038101906108319190614376565b611b21565b6040516108439190613a06565b60405180910390f35b34801561085857600080fd5b50610873600480360381019061086e9190614491565b611b6a565b005b34801561088157600080fd5b5061088a611c36565b6040516108979190613c26565b60405180910390f35b3480156108ac57600080fd5b506108c760048036038101906108c2919061453d565b611c5c565b6040516108d49190613a06565b60405180910390f35b3480156108e957600080fd5b506108f2611ca5565b005b34801561090057600080fd5b50610909611cf5565b6040516109169190613a06565b60405180910390f35b34801561092b57600080fd5b506109466004803603810190610941919061456a565b611cff565b6040516109539190613ac1565b60405180910390f35b34801561096857600080fd5b50610971611d93565b60405161097e9190613ac1565b60405180910390f35b34801561099357600080fd5b506109ae60048036038101906109a99190613adc565b611da6565b6040516109bb9190613a06565b60405180910390f35b3480156109d057600080fd5b506109eb60048036038101906109e691906145aa565b611e94565b005b3480156109f957600080fd5b50610a146004803603810190610a0f9190614376565b611f35565b005b348015610a2257600080fd5b50610a2b611fb8565b005b348015610a3957600080fd5b50610a546004803603810190610a4f9190613adc565b612126565b005b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ace576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac5906146b3565b60405180910390fd5b6009600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bf257507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c025750610c0182612142565b5b9050919050565b610c116121ac565b600c60009054906101000a900460ff1615600c60006101000a81548160ff0219169083151502179055507f58655b75d3df612fe99ead00dbf0812d415d35078fe06217a94c0818bb13967f600c60009054906101000a900460ff16604051610c799190613ac1565b60405180910390a1565b610c8b6121ac565b8060148190555050565b600f8054610ca290614702565b80601f0160208091040260200160405190810160405280929190818152602001828054610cce90614702565b8015610d1b5780601f10610cf057610100808354040283529160200191610d1b565b820191906000526020600020905b815481529060010190602001808311610cfe57829003601f168201915b505050505081565b60606010600083815260200190815260200160002060009054906101000a900460ff16610d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7c9061477f565b60405180910390fd5b6000600e8054610d9490614702565b905011610e2b57600e8054610da890614702565b80601f0160208091040260200160405190810160405280929190818152602001828054610dd490614702565b8015610e215780601f10610df657610100808354040283529160200191610e21565b820191906000526020600020905b815481529060010190602001808311610e0457829003601f168201915b5050505050610e57565b600e610e368361222a565b604051602001610e47929190614873565b6040516020818303038152906040525b9050919050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed790614909565b60405180910390fd5b6000610eea611cf5565b47610ef59190614958565b90506000610f0c8383610f0786611990565b61238a565b905060008103610f51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f48906149fe565b60405180910390fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fa09190614958565b925050819055508060026000828254610fb99190614958565b92505081905550610fca83826123f8565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051610ffb929190614a3f565b60405180910390a1505050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6016818154811061103e57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611075610a56565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806110bb57506110ba856110b5610a56565b611cff565b5b6110fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f190614ada565b60405180910390fd5b61110785858585856124ec565b5050505050565b6111166121ac565b80600e90816111259190614c87565b50600e6040516111359190614d59565b60405180910390207f23c8c9488efebfd474e85a7956de6f39b17c7ab88502d42a623db2d8e382bbaa60405160405180910390a250565b6000600154905090565b60155434116111ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b190614dbc565b60405180910390fd5b565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6daaeb6d7670e522a718067333cd4e81565b61125d6121ac565b8060158190555050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116112e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e090614909565b60405180910390fd5b60006112f483611c5c565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161132d9190613c26565b602060405180830381865afa15801561134a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136e9190614df1565b6113789190614958565b90506000611390838361138b87876111bc565b61238a565b9050600081036113d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cc906149fe565b60405180910390fd5b80600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114619190614958565b9250508190555080600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114b79190614958565b925050819055506114c9848483612810565b8373ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a8483604051611511929190613931565b60405180910390a250505050565b60608151835114611565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155c90614e90565b60405180910390fd5b6000835167ffffffffffffffff81111561158257611581613c46565b5b6040519080825280602002602001820160405280156115b05781602001602082028036833780820191505090505b50905060005b845181101561162d576115fd8582815181106115d5576115d4614eb0565b5b60200260200101518583815181106115f0576115ef614eb0565b5b6020026020010151610a5e565b8282815181106116105761160f614eb0565b5b6020026020010181815250508061162690614edf565b90506115b6565b508091505092915050565b61164133610e5e565b565b60155481565b60026008540361168e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168590614f73565b60405180910390fd5b6002600881905550600c60009054906101000a900460ff166116e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dc90614fdf565b60405180910390fd5b801561188d57816014546116f99190614fff565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401611756929190615041565b602060405180830381865afa158015611773573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117979190614df1565b10156117d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cf906150b6565b60405180910390fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856014546118269190614fff565b6040518463ffffffff1660e01b8152600401611844939291906150d6565b6020604051808303816000875af1158015611863573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118879190615122565b506118de565b348260155461189c9190614fff565b11156118dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d49061519b565b60405180910390fd5b5b6118e782612896565b60016008819055505050565b6118fb6121ac565b6119056000612945565b565b61190f6121ac565b80600d8190555050565b60006005828154811061192f5761192e614eb0565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60145481565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611ad4576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611a51929190615041565b602060405180830381865afa158015611a6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a929190615122565b611ad357806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611aca9190613c26565b60405180910390fd5b5b611ade8383612a09565b505050565b611aeb6121ac565b611af6838383612a1f565b505050565b600d5481565b60106020528060005260406000206000915054906101000a900460ff1681565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611b726121ac565b60005b83839050811015611c2f57611c1c848483818110611b9657611b95614eb0565b5b9050602002016020810190611bab9190614376565b868381518110611bbe57611bbd614eb0565b5b6020026020010151848481518110611bd957611bd8614eb0565b5b60200260200101516040518060400160405280601581526020017f44726f702d612d70616c6f6f7a61206572726f72210000000000000000000000815250612c67565b8080611c2790614edf565b915050611b75565b5050505050565b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611cad6121ac565b611cb5611fb8565b6000600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff16ff5b6000600254905090565b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900460ff1681565b600080434233604051602001611dbc9190615203565b6040516020818303038152906040528051906020012060001c611ddf919061524d565b454241604051602001611df291906152a7565b6040516020818303038152906040528051906020012060001c611e15919061524d565b4442611e219190614958565b611e2b9190614958565b611e359190614958565b611e3f9190614958565b611e499190614958565b604051602001611e5991906152e3565b6040516020818303038152906040528051906020012060001c905060018382611e8291906152fe565b611e8c9190614958565b915050919050565b611e9c610a56565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611ee25750611ee185611edc610a56565b611cff565b5b611f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1890614ada565b60405180910390fd5b611f2e8585858585612e18565b5050505050565b611f3d6121ac565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa3906153a1565b60405180910390fd5b611fb581612945565b50565b611fc06121ac565b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161201d9190613c26565b602060405180830381865afa15801561203a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205e9190614df1565b9050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b81526004016120df929190613931565b6020604051808303816000875af11580156120fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121229190615122565b5050565b60004290505b81816121389190614958565b421061212c575050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6121b4610a56565b73ffffffffffffffffffffffffffffffffffffffff166121d2611961565b73ffffffffffffffffffffffffffffffffffffffff1614612228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221f9061540d565b60405180910390fd5b565b606060008203612271576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612385565b600082905060005b600082146122a357808061228c90614edf565b915050600a8261229c919061524d565b9150612279565b60008167ffffffffffffffff8111156122bf576122be613c46565b5b6040519080825280601f01601f1916602001820160405280156122f15781602001600182028036833780820191505090505b5090505b6000851461237e5760018261230a919061542d565b9150600a8561231991906152fe565b60306123259190614958565b60f81b81838151811061233b5761233a614eb0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612377919061524d565b94506122f5565b8093505050505b919050565b600081600154600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054856123db9190614fff565b6123e5919061524d565b6123ef919061542d565b90509392505050565b8047101561243b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612432906154ad565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612461906154fe565b60006040518083038185875af1925050503d806000811461249e576040519150601f19603f3d011682016040523d82523d6000602084013e6124a3565b606091505b50509050806124e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124de90615585565b60405180910390fd5b505050565b8151835114612530576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252790615617565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361259f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612596906156a9565b60405180910390fd5b60006125a9610a56565b90506125b98187878787876130b6565b60005b845181101561276d5760008582815181106125da576125d9614eb0565b5b6020026020010151905060008583815181106125f9576125f8614eb0565b5b6020026020010151905060006009600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561269b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126929061573b565b60405180910390fd5b8181036009600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816009600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127529190614958565b925050819055505050508061276690614edf565b90506125bc565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516127e492919061575b565b60405180910390a46127fa8187878787876130be565b6128088187878787876130c6565b505050505050565b6128918363a9059cbb60e01b848460405160240161282f929190613931565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061329d565b505050565b60005b818110156129415760006128ae601154611da6565b90506128f2338260016040518060400160405280600b81526020017f4d696e74204661696c6564000000000000000000000000000000000000000000815250612c67565b7fd9be9c40c7e99dfc974fa3fe3b790af02afd2939b5dedfccb1ba12933eb27a8e33824260405161292593929190615792565b60405180910390a150808061293990614edf565b915050612899565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612a1b612a14610a56565b8383613364565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a859061583b565b60405180910390fd5b6000612a98610a56565b90506000612aa5846134d0565b90506000612ab2846134d0565b9050612ad2838760008585604051806020016040528060008152506130b6565b60006009600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015612b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b61906158cd565b60405180910390fd5b8481036009600088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612c389291906158ed565b60405180910390a4612c5e848860008686604051806020016040528060008152506130be565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612cd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ccd90615988565b60405180910390fd5b6000612ce0610a56565b90506000612ced856134d0565b90506000612cfa856134d0565b9050612d0b836000898585896130b6565b846009600088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d6b9190614958565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612de99291906158ed565b60405180910390a4612e00836000898585896130be565b612e0f8360008989898961354a565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612e87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7e906156a9565b60405180910390fd5b6000612e91610a56565b90506000612e9e856134d0565b90506000612eab856134d0565b9050612ebb8389898585896130b6565b60006009600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015612f53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4a9061573b565b60405180910390fd5b8581036009600089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550856009600089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461300a9190614958565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a6040516130879291906158ed565b60405180910390a461309d848a8a86868a6130be565b6130ab848a8a8a8a8a61354a565b505050505050505050565b505050505050565b505050505050565b6130e58473ffffffffffffffffffffffffffffffffffffffff16613721565b15613295578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161312b9594939291906159fd565b6020604051808303816000875af192505050801561316757506040513d601f19601f820116820180604052508101906131649190615a7a565b60015b61320c57613173615ab4565b806308c379a0036131cf5750613187615ad6565b8061319257506131d1565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c69190613b99565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320390615bd8565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613293576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328a90615c6a565b60405180910390fd5b505b505050505050565b60006132ff826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166137449092919063ffffffff16565b905060008151111561335f578080602001905181019061331f9190615122565b61335e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335590615cfc565b60405180910390fd5b5b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036133d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133c990615d8e565b60405180910390fd5b80600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516134c39190613ac1565b60405180910390a3505050565b60606000600167ffffffffffffffff8111156134ef576134ee613c46565b5b60405190808252806020026020018201604052801561351d5781602001602082028036833780820191505090505b509050828160008151811061353557613534614eb0565b5b60200260200101818152505080915050919050565b6135698473ffffffffffffffffffffffffffffffffffffffff16613721565b15613719578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016135af959493929190615dae565b6020604051808303816000875af19250505080156135eb57506040513d601f19601f820116820180604052508101906135e89190615a7a565b60015b613690576135f7615ab4565b806308c379a003613653575061360b615ad6565b806136165750613655565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161364a9190613b99565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161368790615bd8565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161370e90615c6a565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060613753848460008561375c565b90509392505050565b6060824710156137a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161379890615e7a565b60405180910390fd5b6137aa85613721565b6137e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137e090615ee6565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516138129190615f37565b60006040518083038185875af1925050503d806000811461384f576040519150601f19603f3d011682016040523d82523d6000602084013e613854565b606091505b5091509150613864828286613870565b92505050949350505050565b60608315613880578290506138d0565b6000835111156138935782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138c79190613b99565b60405180910390fd5b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613902826138d7565b9050919050565b613912816138f7565b82525050565b6000819050919050565b61392b81613918565b82525050565b60006040820190506139466000830185613909565b6139536020830184613922565b9392505050565b6000604051905090565b600080fd5b600080fd5b613977816138f7565b811461398257600080fd5b50565b6000813590506139948161396e565b92915050565b6139a381613918565b81146139ae57600080fd5b50565b6000813590506139c08161399a565b92915050565b600080604083850312156139dd576139dc613964565b5b60006139eb85828601613985565b92505060206139fc858286016139b1565b9150509250929050565b6000602082019050613a1b6000830184613922565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613a5681613a21565b8114613a6157600080fd5b50565b600081359050613a7381613a4d565b92915050565b600060208284031215613a8f57613a8e613964565b5b6000613a9d84828501613a64565b91505092915050565b60008115159050919050565b613abb81613aa6565b82525050565b6000602082019050613ad66000830184613ab2565b92915050565b600060208284031215613af257613af1613964565b5b6000613b00848285016139b1565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613b43578082015181840152602081019050613b28565b60008484015250505050565b6000601f19601f8301169050919050565b6000613b6b82613b09565b613b758185613b14565b9350613b85818560208601613b25565b613b8e81613b4f565b840191505092915050565b60006020820190508181036000830152613bb38184613b60565b905092915050565b6000613bc6826138d7565b9050919050565b613bd681613bbb565b8114613be157600080fd5b50565b600081359050613bf381613bcd565b92915050565b600060208284031215613c0f57613c0e613964565b5b6000613c1d84828501613be4565b91505092915050565b6000602082019050613c3b6000830184613909565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613c7e82613b4f565b810181811067ffffffffffffffff82111715613c9d57613c9c613c46565b5b80604052505050565b6000613cb061395a565b9050613cbc8282613c75565b919050565b600067ffffffffffffffff821115613cdc57613cdb613c46565b5b602082029050602081019050919050565b600080fd5b6000613d05613d0084613cc1565b613ca6565b90508083825260208201905060208402830185811115613d2857613d27613ced565b5b835b81811015613d515780613d3d88826139b1565b845260208401935050602081019050613d2a565b5050509392505050565b600082601f830112613d7057613d6f613c41565b5b8135613d80848260208601613cf2565b91505092915050565b600080fd5b600067ffffffffffffffff821115613da957613da8613c46565b5b613db282613b4f565b9050602081019050919050565b82818337600083830152505050565b6000613de1613ddc84613d8e565b613ca6565b905082815260208101848484011115613dfd57613dfc613d89565b5b613e08848285613dbf565b509392505050565b600082601f830112613e2557613e24613c41565b5b8135613e35848260208601613dce565b91505092915050565b600080600080600060a08688031215613e5a57613e59613964565b5b6000613e6888828901613985565b9550506020613e7988828901613985565b945050604086013567ffffffffffffffff811115613e9a57613e99613969565b5b613ea688828901613d5b565b935050606086013567ffffffffffffffff811115613ec757613ec6613969565b5b613ed388828901613d5b565b925050608086013567ffffffffffffffff811115613ef457613ef3613969565b5b613f0088828901613e10565b9150509295509295909350565b600067ffffffffffffffff821115613f2857613f27613c46565b5b613f3182613b4f565b9050602081019050919050565b6000613f51613f4c84613f0d565b613ca6565b905082815260208101848484011115613f6d57613f6c613d89565b5b613f78848285613dbf565b509392505050565b600082601f830112613f9557613f94613c41565b5b8135613fa5848260208601613f3e565b91505092915050565b600060208284031215613fc457613fc3613964565b5b600082013567ffffffffffffffff811115613fe257613fe1613969565b5b613fee84828501613f80565b91505092915050565b6000614002826138f7565b9050919050565b61401281613ff7565b811461401d57600080fd5b50565b60008135905061402f81614009565b92915050565b6000806040838503121561404c5761404b613964565b5b600061405a85828601614020565b925050602061406b85828601613985565b9150509250929050565b6000819050919050565b600061409a614095614090846138d7565b614075565b6138d7565b9050919050565b60006140ac8261407f565b9050919050565b60006140be826140a1565b9050919050565b6140ce816140b3565b82525050565b60006020820190506140e960008301846140c5565b92915050565b600067ffffffffffffffff82111561410a57614109613c46565b5b602082029050602081019050919050565b600061412e614129846140ef565b613ca6565b9050808382526020820190506020840283018581111561415157614150613ced565b5b835b8181101561417a57806141668882613985565b845260208401935050602081019050614153565b5050509392505050565b600082601f83011261419957614198613c41565b5b81356141a984826020860161411b565b91505092915050565b600080604083850312156141c9576141c8613964565b5b600083013567ffffffffffffffff8111156141e7576141e6613969565b5b6141f385828601614184565b925050602083013567ffffffffffffffff81111561421457614213613969565b5b61422085828601613d5b565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61425f81613918565b82525050565b60006142718383614256565b60208301905092915050565b6000602082019050919050565b60006142958261422a565b61429f8185614235565b93506142aa83614246565b8060005b838110156142db5781516142c28882614265565b97506142cd8361427d565b9250506001810190506142ae565b5085935050505092915050565b60006020820190508181036000830152614302818461428a565b905092915050565b61431381613aa6565b811461431e57600080fd5b50565b6000813590506143308161430a565b92915050565b6000806040838503121561434d5761434c613964565b5b600061435b858286016139b1565b925050602061436c85828601614321565b9150509250929050565b60006020828403121561438c5761438b613964565b5b600061439a84828501613985565b91505092915050565b600080604083850312156143ba576143b9613964565b5b60006143c885828601613985565b92505060206143d985828601614321565b9150509250929050565b6000806000606084860312156143fc576143fb613964565b5b600061440a86828701613985565b935050602061441b868287016139b1565b925050604061442c868287016139b1565b9150509250925092565b600080fd5b60008083601f84011261445157614450613c41565b5b8235905067ffffffffffffffff81111561446e5761446d614436565b5b60208301915083602082028301111561448a57614489613ced565b5b9250929050565b600080600080606085870312156144ab576144aa613964565b5b600085013567ffffffffffffffff8111156144c9576144c8613969565b5b6144d587828801613d5b565b945050602085013567ffffffffffffffff8111156144f6576144f5613969565b5b6145028782880161443b565b9350935050604085013567ffffffffffffffff81111561452557614524613969565b5b61453187828801613d5b565b91505092959194509250565b60006020828403121561455357614552613964565b5b600061456184828501614020565b91505092915050565b6000806040838503121561458157614580613964565b5b600061458f85828601613985565b92505060206145a085828601613985565b9150509250929050565b600080600080600060a086880312156145c6576145c5613964565b5b60006145d488828901613985565b95505060206145e588828901613985565b94505060406145f6888289016139b1565b9350506060614607888289016139b1565b925050608086013567ffffffffffffffff81111561462857614627613969565b5b61463488828901613e10565b9150509295509295909350565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b600061469d602a83613b14565b91506146a882614641565b604082019050919050565b600060208201905081810360008301526146cc81614690565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061471a57607f821691505b60208210810361472d5761472c6146d3565b5b50919050565b7f5552492072657175657374656420666f7220696e76616c696420747970650000600082015250565b6000614769601e83613b14565b915061477482614733565b602082019050919050565b600060208201905081810360008301526147988161475c565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546147cc81614702565b6147d6818661479f565b945060018216600081146147f1576001811461480657614839565b60ff1983168652811515820286019350614839565b61480f856147aa565b60005b8381101561483157815481890152600182019150602081019050614812565b838801955050505b50505092915050565b600061484d82613b09565b614857818561479f565b9350614867818560208601613b25565b80840191505092915050565b600061487f82856147bf565b915061488b8284614842565b91508190509392505050565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b60006148f3602683613b14565b91506148fe82614897565b604082019050919050565b60006020820190508181036000830152614922816148e6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061496382613918565b915061496e83613918565b925082820190508082111561498657614985614929565b5b92915050565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b60006149e8602b83613b14565b91506149f38261498c565b604082019050919050565b60006020820190508181036000830152614a17816149db565b9050919050565b6000614a29826140a1565b9050919050565b614a3981614a1e565b82525050565b6000604082019050614a546000830185614a30565b614a616020830184613922565b9392505050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206e6f7220617070726f7665640000000000000000000000000000000000602082015250565b6000614ac4602f83613b14565b9150614acf82614a68565b604082019050919050565b60006020820190508181036000830152614af381614ab7565b9050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614b477fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614b0a565b614b518683614b0a565b95508019841693508086168417925050509392505050565b6000614b84614b7f614b7a84613918565b614075565b613918565b9050919050565b6000819050919050565b614b9e83614b69565b614bb2614baa82614b8b565b848454614b17565b825550505050565b600090565b614bc7614bba565b614bd2818484614b95565b505050565b5b81811015614bf657614beb600082614bbf565b600181019050614bd8565b5050565b601f821115614c3b57614c0c816147aa565b614c1584614afa565b81016020851015614c24578190505b614c38614c3085614afa565b830182614bd7565b50505b505050565b600082821c905092915050565b6000614c5e60001984600802614c40565b1980831691505092915050565b6000614c778383614c4d565b9150826002028217905092915050565b614c9082613b09565b67ffffffffffffffff811115614ca957614ca8613c46565b5b614cb38254614702565b614cbe828285614bfa565b600060209050601f831160018114614cf15760008415614cdf578287015190505b614ce98582614c6b565b865550614d51565b601f198416614cff866147aa565b60005b82811015614d2757848901518255600182019150602085019450602081019050614d02565b86831015614d445784890151614d40601f891682614c4d565b8355505b6001600288020188555050505b505050505050565b6000614d6582846147bf565b915081905092915050565b7f4e6f7420656e6f75676820455448000000000000000000000000000000000000600082015250565b6000614da6600e83613b14565b9150614db182614d70565b602082019050919050565b60006020820190508181036000830152614dd581614d99565b9050919050565b600081519050614deb8161399a565b92915050565b600060208284031215614e0757614e06613964565b5b6000614e1584828501614ddc565b91505092915050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b6000614e7a602983613b14565b9150614e8582614e1e565b604082019050919050565b60006020820190508181036000830152614ea981614e6d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614eea82613918565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614f1c57614f1b614929565b5b600182019050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614f5d601f83613b14565b9150614f6882614f27565b602082019050919050565b60006020820190508181036000830152614f8c81614f50565b9050919050565b7f53616c65206e6f74206163746976652100000000000000000000000000000000600082015250565b6000614fc9601083613b14565b9150614fd482614f93565b602082019050919050565b60006020820190508181036000830152614ff881614fbc565b9050919050565b600061500a82613918565b915061501583613918565b925082820261502381613918565b9150828204841483151761503a57615039614929565b5b5092915050565b60006040820190506150566000830185613909565b6150636020830184613909565b9392505050565b7f4572726f723a205472616e73666572206e6f7420617070726f76656400000000600082015250565b60006150a0601c83613b14565b91506150ab8261506a565b602082019050919050565b600060208201905081810360008301526150cf81615093565b9050919050565b60006060820190506150eb6000830186613909565b6150f86020830185613909565b6151056040830184613922565b949350505050565b60008151905061511c8161430a565b92915050565b60006020828403121561513857615137613964565b5b60006151468482850161510d565b91505092915050565b7f4e6f7420456e6f7567682045544820746f206d696e7421000000000000000000600082015250565b6000615185601783613b14565b91506151908261514f565b602082019050919050565b600060208201905081810360008301526151b481615178565b9050919050565b60008160601b9050919050565b60006151d3826151bb565b9050919050565b60006151e5826151c8565b9050919050565b6151fd6151f8826138f7565b6151da565b82525050565b600061520f82846151ec565b60148201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061525882613918565b915061526383613918565b9250826152735761527261521e565b5b828204905092915050565b6000615289826151c8565b9050919050565b6152a161529c82613bbb565b61527e565b82525050565b60006152b38284615290565b60148201915081905092915050565b6000819050919050565b6152dd6152d882613918565b6152c2565b82525050565b60006152ef82846152cc565b60208201915081905092915050565b600061530982613918565b915061531483613918565b9250826153245761532361521e565b5b828206905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061538b602683613b14565b91506153968261532f565b604082019050919050565b600060208201905081810360008301526153ba8161537e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006153f7602083613b14565b9150615402826153c1565b602082019050919050565b60006020820190508181036000830152615426816153ea565b9050919050565b600061543882613918565b915061544383613918565b925082820390508181111561545b5761545a614929565b5b92915050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000615497601d83613b14565b91506154a282615461565b602082019050919050565b600060208201905081810360008301526154c68161548a565b9050919050565b600081905092915050565b50565b60006154e86000836154cd565b91506154f3826154d8565b600082019050919050565b6000615509826154db565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b600061556f603a83613b14565b915061557a82615513565b604082019050919050565b6000602082019050818103600083015261559e81615562565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000615601602883613b14565b915061560c826155a5565b604082019050919050565b60006020820190508181036000830152615630816155f4565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615693602583613b14565b915061569e82615637565b604082019050919050565b600060208201905081810360008301526156c281615686565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000615725602a83613b14565b9150615730826156c9565b604082019050919050565b6000602082019050818103600083015261575481615718565b9050919050565b60006040820190508181036000830152615775818561428a565b90508181036020830152615789818461428a565b90509392505050565b60006060820190506157a76000830186613909565b6157b46020830185613922565b6157c16040830184613922565b949350505050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000615825602383613b14565b9150615830826157c9565b604082019050919050565b6000602082019050818103600083015261585481615818565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b60006158b7602483613b14565b91506158c28261585b565b604082019050919050565b600060208201905081810360008301526158e6816158aa565b9050919050565b60006040820190506159026000830185613922565b61590f6020830184613922565b9392505050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615972602183613b14565b915061597d82615916565b604082019050919050565b600060208201905081810360008301526159a181615965565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006159cf826159a8565b6159d981856159b3565b93506159e9818560208601613b25565b6159f281613b4f565b840191505092915050565b600060a082019050615a126000830188613909565b615a1f6020830187613909565b8181036040830152615a31818661428a565b90508181036060830152615a45818561428a565b90508181036080830152615a5981846159c4565b90509695505050505050565b600081519050615a7481613a4d565b92915050565b600060208284031215615a9057615a8f613964565b5b6000615a9e84828501615a65565b91505092915050565b60008160e01c9050919050565b600060033d1115615ad35760046000803e615ad0600051615aa7565b90505b90565b600060443d10615b6357615ae861395a565b60043d036004823e80513d602482011167ffffffffffffffff82111715615b10575050615b63565b808201805167ffffffffffffffff811115615b2e5750505050615b63565b80602083010160043d038501811115615b4b575050505050615b63565b615b5a82602001850186613c75565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000615bc2603483613b14565b9150615bcd82615b66565b604082019050919050565b60006020820190508181036000830152615bf181615bb5565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000615c54602883613b14565b9150615c5f82615bf8565b604082019050919050565b60006020820190508181036000830152615c8381615c47565b9050919050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000615ce6602a83613b14565b9150615cf182615c8a565b604082019050919050565b60006020820190508181036000830152615d1581615cd9565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000615d78602983613b14565b9150615d8382615d1c565b604082019050919050565b60006020820190508181036000830152615da781615d6b565b9050919050565b600060a082019050615dc36000830188613909565b615dd06020830187613909565b615ddd6040830186613922565b615dea6060830185613922565b8181036080830152615dfc81846159c4565b90509695505050505050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000615e64602683613b14565b9150615e6f82615e08565b604082019050919050565b60006020820190508181036000830152615e9381615e57565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000615ed0601d83613b14565b9150615edb82615e9a565b602082019050919050565b60006020820190508181036000830152615eff81615ec3565b9050919050565b6000615f11826159a8565b615f1b81856154cd565b9350615f2b818560208601613b25565b80840191505092915050565b6000615f438284615f06565b91508190509291505056fea2646970667358221220bfc7d3e826612d23ab5127ccd425b048687c96e560598e3af64ed27c18ec0ee064736f6c6343000811003368747470733a2f2f6170656c69717569642e696f2f6c6f6f746368657374732f6a736f6e2f

Deployed Bytecode

0x60806040526004361061026a5760003560e01c80637a52166411610144578063d3444b7b116100b6578063eb8d24441161007a578063eb8d24441461095c578063ec6cdc8e14610987578063f242432a146109c4578063f2fde38b146109ed578063f83e092a14610a16578063fcd662b614610a2d576102b1565b8063d3444b7b14610875578063d79779b2146108a0578063dba5e917146108dd578063e33b7de3146108f4578063e985e9c51461091f576102b1565b8063a22cb46511610108578063a22cb46514610755578063a37491501461077e578063a3c106fa146107a7578063c2985422146107d2578063ce7c2ac21461080f578063d10507a91461084c576102b1565b80637a5216641461065c5780638b83209b146106855780638da5cb5b146106c25780638dfc9b04146106ed5780639852595c14610718576102b1565b80633a98ef39116101dd57806348b75044116101a157806348b75044146105815780634e1273f4146105aa5780634e71d92d146105e7578063500c06f4146105fe57806367f68fac14610629578063715018a614610645576102b1565b80633a98ef39146104bb5780633ecfd51e146104e6578063406072a9146104f057806341f434341461052d578063452ca57414610558576102b1565b80630e89341c1161022f5780630e89341c1461039b57806319165587146103d857806326506ba414610401578063283248be1461042c5780632eb2c2d61461046957806339f7e37f14610492576102b1565b8062fdd58e146102b657806301ffc9a7146102f3578063049c5c4914610330578063059c14fb1461034757806306fdde0314610370576102b1565b366102b1577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be770610298610a56565b346040516102a7929190613931565b60405180910390a1005b600080fd5b3480156102c257600080fd5b506102dd60048036038101906102d891906139c6565b610a5e565b6040516102ea9190613a06565b60405180910390f35b3480156102ff57600080fd5b5061031a60048036038101906103159190613a79565b610b27565b6040516103279190613ac1565b60405180910390f35b34801561033c57600080fd5b50610345610c09565b005b34801561035357600080fd5b5061036e60048036038101906103699190613adc565b610c83565b005b34801561037c57600080fd5b50610385610c95565b6040516103929190613b99565b60405180910390f35b3480156103a757600080fd5b506103c260048036038101906103bd9190613adc565b610d23565b6040516103cf9190613b99565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa9190613bf9565b610e5e565b005b34801561040d57600080fd5b50610416611008565b6040516104239190613c26565b60405180910390f35b34801561043857600080fd5b50610453600480360381019061044e9190613adc565b61102e565b6040516104609190613c26565b60405180910390f35b34801561047557600080fd5b50610490600480360381019061048b9190613e3e565b61106d565b005b34801561049e57600080fd5b506104b960048036038101906104b49190613fae565b61110e565b005b3480156104c757600080fd5b506104d061116c565b6040516104dd9190613a06565b60405180910390f35b6104ee611176565b005b3480156104fc57600080fd5b5061051760048036038101906105129190614035565b6111bc565b6040516105249190613a06565b60405180910390f35b34801561053957600080fd5b50610542611243565b60405161054f91906140d4565b60405180910390f35b34801561056457600080fd5b5061057f600480360381019061057a9190613adc565b611255565b005b34801561058d57600080fd5b506105a860048036038101906105a39190614035565b611267565b005b3480156105b657600080fd5b506105d160048036038101906105cc91906141b2565b61151f565b6040516105de91906142e8565b60405180910390f35b3480156105f357600080fd5b506105fc611638565b005b34801561060a57600080fd5b50610613611643565b6040516106209190613a06565b60405180910390f35b610643600480360381019061063e9190614336565b611649565b005b34801561065157600080fd5b5061065a6118f3565b005b34801561066857600080fd5b50610683600480360381019061067e9190613adc565b611907565b005b34801561069157600080fd5b506106ac60048036038101906106a79190613adc565b611919565b6040516106b99190613c26565b60405180910390f35b3480156106ce57600080fd5b506106d7611961565b6040516106e49190613c26565b60405180910390f35b3480156106f957600080fd5b5061070261198a565b60405161070f9190613a06565b60405180910390f35b34801561072457600080fd5b5061073f600480360381019061073a9190614376565b611990565b60405161074c9190613a06565b60405180910390f35b34801561076157600080fd5b5061077c600480360381019061077791906143a3565b6119d9565b005b34801561078a57600080fd5b506107a560048036038101906107a091906143e3565b611ae3565b005b3480156107b357600080fd5b506107bc611afb565b6040516107c99190613a06565b60405180910390f35b3480156107de57600080fd5b506107f960048036038101906107f49190613adc565b611b01565b6040516108069190613ac1565b60405180910390f35b34801561081b57600080fd5b5061083660048036038101906108319190614376565b611b21565b6040516108439190613a06565b60405180910390f35b34801561085857600080fd5b50610873600480360381019061086e9190614491565b611b6a565b005b34801561088157600080fd5b5061088a611c36565b6040516108979190613c26565b60405180910390f35b3480156108ac57600080fd5b506108c760048036038101906108c2919061453d565b611c5c565b6040516108d49190613a06565b60405180910390f35b3480156108e957600080fd5b506108f2611ca5565b005b34801561090057600080fd5b50610909611cf5565b6040516109169190613a06565b60405180910390f35b34801561092b57600080fd5b506109466004803603810190610941919061456a565b611cff565b6040516109539190613ac1565b60405180910390f35b34801561096857600080fd5b50610971611d93565b60405161097e9190613ac1565b60405180910390f35b34801561099357600080fd5b506109ae60048036038101906109a99190613adc565b611da6565b6040516109bb9190613a06565b60405180910390f35b3480156109d057600080fd5b506109eb60048036038101906109e691906145aa565b611e94565b005b3480156109f957600080fd5b50610a146004803603810190610a0f9190614376565b611f35565b005b348015610a2257600080fd5b50610a2b611fb8565b005b348015610a3957600080fd5b50610a546004803603810190610a4f9190613adc565b612126565b005b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ace576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac5906146b3565b60405180910390fd5b6009600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bf257507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c025750610c0182612142565b5b9050919050565b610c116121ac565b600c60009054906101000a900460ff1615600c60006101000a81548160ff0219169083151502179055507f58655b75d3df612fe99ead00dbf0812d415d35078fe06217a94c0818bb13967f600c60009054906101000a900460ff16604051610c799190613ac1565b60405180910390a1565b610c8b6121ac565b8060148190555050565b600f8054610ca290614702565b80601f0160208091040260200160405190810160405280929190818152602001828054610cce90614702565b8015610d1b5780601f10610cf057610100808354040283529160200191610d1b565b820191906000526020600020905b815481529060010190602001808311610cfe57829003601f168201915b505050505081565b60606010600083815260200190815260200160002060009054906101000a900460ff16610d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7c9061477f565b60405180910390fd5b6000600e8054610d9490614702565b905011610e2b57600e8054610da890614702565b80601f0160208091040260200160405190810160405280929190818152602001828054610dd490614702565b8015610e215780601f10610df657610100808354040283529160200191610e21565b820191906000526020600020905b815481529060010190602001808311610e0457829003601f168201915b5050505050610e57565b600e610e368361222a565b604051602001610e47929190614873565b6040516020818303038152906040525b9050919050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed790614909565b60405180910390fd5b6000610eea611cf5565b47610ef59190614958565b90506000610f0c8383610f0786611990565b61238a565b905060008103610f51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f48906149fe565b60405180910390fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fa09190614958565b925050819055508060026000828254610fb99190614958565b92505081905550610fca83826123f8565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051610ffb929190614a3f565b60405180910390a1505050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6016818154811061103e57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611075610a56565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806110bb57506110ba856110b5610a56565b611cff565b5b6110fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f190614ada565b60405180910390fd5b61110785858585856124ec565b5050505050565b6111166121ac565b80600e90816111259190614c87565b50600e6040516111359190614d59565b60405180910390207f23c8c9488efebfd474e85a7956de6f39b17c7ab88502d42a623db2d8e382bbaa60405160405180910390a250565b6000600154905090565b60155434116111ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b190614dbc565b60405180910390fd5b565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6daaeb6d7670e522a718067333cd4e81565b61125d6121ac565b8060158190555050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116112e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e090614909565b60405180910390fd5b60006112f483611c5c565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161132d9190613c26565b602060405180830381865afa15801561134a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136e9190614df1565b6113789190614958565b90506000611390838361138b87876111bc565b61238a565b9050600081036113d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cc906149fe565b60405180910390fd5b80600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114619190614958565b9250508190555080600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114b79190614958565b925050819055506114c9848483612810565b8373ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a8483604051611511929190613931565b60405180910390a250505050565b60608151835114611565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155c90614e90565b60405180910390fd5b6000835167ffffffffffffffff81111561158257611581613c46565b5b6040519080825280602002602001820160405280156115b05781602001602082028036833780820191505090505b50905060005b845181101561162d576115fd8582815181106115d5576115d4614eb0565b5b60200260200101518583815181106115f0576115ef614eb0565b5b6020026020010151610a5e565b8282815181106116105761160f614eb0565b5b6020026020010181815250508061162690614edf565b90506115b6565b508091505092915050565b61164133610e5e565b565b60155481565b60026008540361168e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168590614f73565b60405180910390fd5b6002600881905550600c60009054906101000a900460ff166116e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dc90614fdf565b60405180910390fd5b801561188d57816014546116f99190614fff565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401611756929190615041565b602060405180830381865afa158015611773573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117979190614df1565b10156117d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cf906150b6565b60405180910390fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856014546118269190614fff565b6040518463ffffffff1660e01b8152600401611844939291906150d6565b6020604051808303816000875af1158015611863573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118879190615122565b506118de565b348260155461189c9190614fff565b11156118dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d49061519b565b60405180910390fd5b5b6118e782612896565b60016008819055505050565b6118fb6121ac565b6119056000612945565b565b61190f6121ac565b80600d8190555050565b60006005828154811061192f5761192e614eb0565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60145481565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611ad4576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611a51929190615041565b602060405180830381865afa158015611a6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a929190615122565b611ad357806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611aca9190613c26565b60405180910390fd5b5b611ade8383612a09565b505050565b611aeb6121ac565b611af6838383612a1f565b505050565b600d5481565b60106020528060005260406000206000915054906101000a900460ff1681565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611b726121ac565b60005b83839050811015611c2f57611c1c848483818110611b9657611b95614eb0565b5b9050602002016020810190611bab9190614376565b868381518110611bbe57611bbd614eb0565b5b6020026020010151848481518110611bd957611bd8614eb0565b5b60200260200101516040518060400160405280601581526020017f44726f702d612d70616c6f6f7a61206572726f72210000000000000000000000815250612c67565b8080611c2790614edf565b915050611b75565b5050505050565b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611cad6121ac565b611cb5611fb8565b6000600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff16ff5b6000600254905090565b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900460ff1681565b600080434233604051602001611dbc9190615203565b6040516020818303038152906040528051906020012060001c611ddf919061524d565b454241604051602001611df291906152a7565b6040516020818303038152906040528051906020012060001c611e15919061524d565b4442611e219190614958565b611e2b9190614958565b611e359190614958565b611e3f9190614958565b611e499190614958565b604051602001611e5991906152e3565b6040516020818303038152906040528051906020012060001c905060018382611e8291906152fe565b611e8c9190614958565b915050919050565b611e9c610a56565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611ee25750611ee185611edc610a56565b611cff565b5b611f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1890614ada565b60405180910390fd5b611f2e8585858585612e18565b5050505050565b611f3d6121ac565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa3906153a1565b60405180910390fd5b611fb581612945565b50565b611fc06121ac565b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161201d9190613c26565b602060405180830381865afa15801561203a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205e9190614df1565b9050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b81526004016120df929190613931565b6020604051808303816000875af11580156120fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121229190615122565b5050565b60004290505b81816121389190614958565b421061212c575050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6121b4610a56565b73ffffffffffffffffffffffffffffffffffffffff166121d2611961565b73ffffffffffffffffffffffffffffffffffffffff1614612228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221f9061540d565b60405180910390fd5b565b606060008203612271576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612385565b600082905060005b600082146122a357808061228c90614edf565b915050600a8261229c919061524d565b9150612279565b60008167ffffffffffffffff8111156122bf576122be613c46565b5b6040519080825280601f01601f1916602001820160405280156122f15781602001600182028036833780820191505090505b5090505b6000851461237e5760018261230a919061542d565b9150600a8561231991906152fe565b60306123259190614958565b60f81b81838151811061233b5761233a614eb0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612377919061524d565b94506122f5565b8093505050505b919050565b600081600154600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054856123db9190614fff565b6123e5919061524d565b6123ef919061542d565b90509392505050565b8047101561243b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612432906154ad565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612461906154fe565b60006040518083038185875af1925050503d806000811461249e576040519150601f19603f3d011682016040523d82523d6000602084013e6124a3565b606091505b50509050806124e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124de90615585565b60405180910390fd5b505050565b8151835114612530576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252790615617565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361259f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612596906156a9565b60405180910390fd5b60006125a9610a56565b90506125b98187878787876130b6565b60005b845181101561276d5760008582815181106125da576125d9614eb0565b5b6020026020010151905060008583815181106125f9576125f8614eb0565b5b6020026020010151905060006009600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561269b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126929061573b565b60405180910390fd5b8181036009600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816009600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127529190614958565b925050819055505050508061276690614edf565b90506125bc565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516127e492919061575b565b60405180910390a46127fa8187878787876130be565b6128088187878787876130c6565b505050505050565b6128918363a9059cbb60e01b848460405160240161282f929190613931565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061329d565b505050565b60005b818110156129415760006128ae601154611da6565b90506128f2338260016040518060400160405280600b81526020017f4d696e74204661696c6564000000000000000000000000000000000000000000815250612c67565b7fd9be9c40c7e99dfc974fa3fe3b790af02afd2939b5dedfccb1ba12933eb27a8e33824260405161292593929190615792565b60405180910390a150808061293990614edf565b915050612899565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612a1b612a14610a56565b8383613364565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a859061583b565b60405180910390fd5b6000612a98610a56565b90506000612aa5846134d0565b90506000612ab2846134d0565b9050612ad2838760008585604051806020016040528060008152506130b6565b60006009600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015612b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b61906158cd565b60405180910390fd5b8481036009600088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612c389291906158ed565b60405180910390a4612c5e848860008686604051806020016040528060008152506130be565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612cd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ccd90615988565b60405180910390fd5b6000612ce0610a56565b90506000612ced856134d0565b90506000612cfa856134d0565b9050612d0b836000898585896130b6565b846009600088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d6b9190614958565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612de99291906158ed565b60405180910390a4612e00836000898585896130be565b612e0f8360008989898961354a565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612e87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7e906156a9565b60405180910390fd5b6000612e91610a56565b90506000612e9e856134d0565b90506000612eab856134d0565b9050612ebb8389898585896130b6565b60006009600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015612f53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4a9061573b565b60405180910390fd5b8581036009600089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550856009600089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461300a9190614958565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a6040516130879291906158ed565b60405180910390a461309d848a8a86868a6130be565b6130ab848a8a8a8a8a61354a565b505050505050505050565b505050505050565b505050505050565b6130e58473ffffffffffffffffffffffffffffffffffffffff16613721565b15613295578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161312b9594939291906159fd565b6020604051808303816000875af192505050801561316757506040513d601f19601f820116820180604052508101906131649190615a7a565b60015b61320c57613173615ab4565b806308c379a0036131cf5750613187615ad6565b8061319257506131d1565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c69190613b99565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320390615bd8565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613293576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328a90615c6a565b60405180910390fd5b505b505050505050565b60006132ff826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166137449092919063ffffffff16565b905060008151111561335f578080602001905181019061331f9190615122565b61335e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335590615cfc565b60405180910390fd5b5b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036133d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133c990615d8e565b60405180910390fd5b80600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516134c39190613ac1565b60405180910390a3505050565b60606000600167ffffffffffffffff8111156134ef576134ee613c46565b5b60405190808252806020026020018201604052801561351d5781602001602082028036833780820191505090505b509050828160008151811061353557613534614eb0565b5b60200260200101818152505080915050919050565b6135698473ffffffffffffffffffffffffffffffffffffffff16613721565b15613719578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016135af959493929190615dae565b6020604051808303816000875af19250505080156135eb57506040513d601f19601f820116820180604052508101906135e89190615a7a565b60015b613690576135f7615ab4565b806308c379a003613653575061360b615ad6565b806136165750613655565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161364a9190613b99565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161368790615bd8565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161370e90615c6a565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060613753848460008561375c565b90509392505050565b6060824710156137a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161379890615e7a565b60405180910390fd5b6137aa85613721565b6137e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137e090615ee6565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516138129190615f37565b60006040518083038185875af1925050503d806000811461384f576040519150601f19603f3d011682016040523d82523d6000602084013e613854565b606091505b5091509150613864828286613870565b92505050949350505050565b60608315613880578290506138d0565b6000835111156138935782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138c79190613b99565b60405180910390fd5b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613902826138d7565b9050919050565b613912816138f7565b82525050565b6000819050919050565b61392b81613918565b82525050565b60006040820190506139466000830185613909565b6139536020830184613922565b9392505050565b6000604051905090565b600080fd5b600080fd5b613977816138f7565b811461398257600080fd5b50565b6000813590506139948161396e565b92915050565b6139a381613918565b81146139ae57600080fd5b50565b6000813590506139c08161399a565b92915050565b600080604083850312156139dd576139dc613964565b5b60006139eb85828601613985565b92505060206139fc858286016139b1565b9150509250929050565b6000602082019050613a1b6000830184613922565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613a5681613a21565b8114613a6157600080fd5b50565b600081359050613a7381613a4d565b92915050565b600060208284031215613a8f57613a8e613964565b5b6000613a9d84828501613a64565b91505092915050565b60008115159050919050565b613abb81613aa6565b82525050565b6000602082019050613ad66000830184613ab2565b92915050565b600060208284031215613af257613af1613964565b5b6000613b00848285016139b1565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613b43578082015181840152602081019050613b28565b60008484015250505050565b6000601f19601f8301169050919050565b6000613b6b82613b09565b613b758185613b14565b9350613b85818560208601613b25565b613b8e81613b4f565b840191505092915050565b60006020820190508181036000830152613bb38184613b60565b905092915050565b6000613bc6826138d7565b9050919050565b613bd681613bbb565b8114613be157600080fd5b50565b600081359050613bf381613bcd565b92915050565b600060208284031215613c0f57613c0e613964565b5b6000613c1d84828501613be4565b91505092915050565b6000602082019050613c3b6000830184613909565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613c7e82613b4f565b810181811067ffffffffffffffff82111715613c9d57613c9c613c46565b5b80604052505050565b6000613cb061395a565b9050613cbc8282613c75565b919050565b600067ffffffffffffffff821115613cdc57613cdb613c46565b5b602082029050602081019050919050565b600080fd5b6000613d05613d0084613cc1565b613ca6565b90508083825260208201905060208402830185811115613d2857613d27613ced565b5b835b81811015613d515780613d3d88826139b1565b845260208401935050602081019050613d2a565b5050509392505050565b600082601f830112613d7057613d6f613c41565b5b8135613d80848260208601613cf2565b91505092915050565b600080fd5b600067ffffffffffffffff821115613da957613da8613c46565b5b613db282613b4f565b9050602081019050919050565b82818337600083830152505050565b6000613de1613ddc84613d8e565b613ca6565b905082815260208101848484011115613dfd57613dfc613d89565b5b613e08848285613dbf565b509392505050565b600082601f830112613e2557613e24613c41565b5b8135613e35848260208601613dce565b91505092915050565b600080600080600060a08688031215613e5a57613e59613964565b5b6000613e6888828901613985565b9550506020613e7988828901613985565b945050604086013567ffffffffffffffff811115613e9a57613e99613969565b5b613ea688828901613d5b565b935050606086013567ffffffffffffffff811115613ec757613ec6613969565b5b613ed388828901613d5b565b925050608086013567ffffffffffffffff811115613ef457613ef3613969565b5b613f0088828901613e10565b9150509295509295909350565b600067ffffffffffffffff821115613f2857613f27613c46565b5b613f3182613b4f565b9050602081019050919050565b6000613f51613f4c84613f0d565b613ca6565b905082815260208101848484011115613f6d57613f6c613d89565b5b613f78848285613dbf565b509392505050565b600082601f830112613f9557613f94613c41565b5b8135613fa5848260208601613f3e565b91505092915050565b600060208284031215613fc457613fc3613964565b5b600082013567ffffffffffffffff811115613fe257613fe1613969565b5b613fee84828501613f80565b91505092915050565b6000614002826138f7565b9050919050565b61401281613ff7565b811461401d57600080fd5b50565b60008135905061402f81614009565b92915050565b6000806040838503121561404c5761404b613964565b5b600061405a85828601614020565b925050602061406b85828601613985565b9150509250929050565b6000819050919050565b600061409a614095614090846138d7565b614075565b6138d7565b9050919050565b60006140ac8261407f565b9050919050565b60006140be826140a1565b9050919050565b6140ce816140b3565b82525050565b60006020820190506140e960008301846140c5565b92915050565b600067ffffffffffffffff82111561410a57614109613c46565b5b602082029050602081019050919050565b600061412e614129846140ef565b613ca6565b9050808382526020820190506020840283018581111561415157614150613ced565b5b835b8181101561417a57806141668882613985565b845260208401935050602081019050614153565b5050509392505050565b600082601f83011261419957614198613c41565b5b81356141a984826020860161411b565b91505092915050565b600080604083850312156141c9576141c8613964565b5b600083013567ffffffffffffffff8111156141e7576141e6613969565b5b6141f385828601614184565b925050602083013567ffffffffffffffff81111561421457614213613969565b5b61422085828601613d5b565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61425f81613918565b82525050565b60006142718383614256565b60208301905092915050565b6000602082019050919050565b60006142958261422a565b61429f8185614235565b93506142aa83614246565b8060005b838110156142db5781516142c28882614265565b97506142cd8361427d565b9250506001810190506142ae565b5085935050505092915050565b60006020820190508181036000830152614302818461428a565b905092915050565b61431381613aa6565b811461431e57600080fd5b50565b6000813590506143308161430a565b92915050565b6000806040838503121561434d5761434c613964565b5b600061435b858286016139b1565b925050602061436c85828601614321565b9150509250929050565b60006020828403121561438c5761438b613964565b5b600061439a84828501613985565b91505092915050565b600080604083850312156143ba576143b9613964565b5b60006143c885828601613985565b92505060206143d985828601614321565b9150509250929050565b6000806000606084860312156143fc576143fb613964565b5b600061440a86828701613985565b935050602061441b868287016139b1565b925050604061442c868287016139b1565b9150509250925092565b600080fd5b60008083601f84011261445157614450613c41565b5b8235905067ffffffffffffffff81111561446e5761446d614436565b5b60208301915083602082028301111561448a57614489613ced565b5b9250929050565b600080600080606085870312156144ab576144aa613964565b5b600085013567ffffffffffffffff8111156144c9576144c8613969565b5b6144d587828801613d5b565b945050602085013567ffffffffffffffff8111156144f6576144f5613969565b5b6145028782880161443b565b9350935050604085013567ffffffffffffffff81111561452557614524613969565b5b61453187828801613d5b565b91505092959194509250565b60006020828403121561455357614552613964565b5b600061456184828501614020565b91505092915050565b6000806040838503121561458157614580613964565b5b600061458f85828601613985565b92505060206145a085828601613985565b9150509250929050565b600080600080600060a086880312156145c6576145c5613964565b5b60006145d488828901613985565b95505060206145e588828901613985565b94505060406145f6888289016139b1565b9350506060614607888289016139b1565b925050608086013567ffffffffffffffff81111561462857614627613969565b5b61463488828901613e10565b9150509295509295909350565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b600061469d602a83613b14565b91506146a882614641565b604082019050919050565b600060208201905081810360008301526146cc81614690565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061471a57607f821691505b60208210810361472d5761472c6146d3565b5b50919050565b7f5552492072657175657374656420666f7220696e76616c696420747970650000600082015250565b6000614769601e83613b14565b915061477482614733565b602082019050919050565b600060208201905081810360008301526147988161475c565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546147cc81614702565b6147d6818661479f565b945060018216600081146147f1576001811461480657614839565b60ff1983168652811515820286019350614839565b61480f856147aa565b60005b8381101561483157815481890152600182019150602081019050614812565b838801955050505b50505092915050565b600061484d82613b09565b614857818561479f565b9350614867818560208601613b25565b80840191505092915050565b600061487f82856147bf565b915061488b8284614842565b91508190509392505050565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b60006148f3602683613b14565b91506148fe82614897565b604082019050919050565b60006020820190508181036000830152614922816148e6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061496382613918565b915061496e83613918565b925082820190508082111561498657614985614929565b5b92915050565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b60006149e8602b83613b14565b91506149f38261498c565b604082019050919050565b60006020820190508181036000830152614a17816149db565b9050919050565b6000614a29826140a1565b9050919050565b614a3981614a1e565b82525050565b6000604082019050614a546000830185614a30565b614a616020830184613922565b9392505050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206e6f7220617070726f7665640000000000000000000000000000000000602082015250565b6000614ac4602f83613b14565b9150614acf82614a68565b604082019050919050565b60006020820190508181036000830152614af381614ab7565b9050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614b477fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614b0a565b614b518683614b0a565b95508019841693508086168417925050509392505050565b6000614b84614b7f614b7a84613918565b614075565b613918565b9050919050565b6000819050919050565b614b9e83614b69565b614bb2614baa82614b8b565b848454614b17565b825550505050565b600090565b614bc7614bba565b614bd2818484614b95565b505050565b5b81811015614bf657614beb600082614bbf565b600181019050614bd8565b5050565b601f821115614c3b57614c0c816147aa565b614c1584614afa565b81016020851015614c24578190505b614c38614c3085614afa565b830182614bd7565b50505b505050565b600082821c905092915050565b6000614c5e60001984600802614c40565b1980831691505092915050565b6000614c778383614c4d565b9150826002028217905092915050565b614c9082613b09565b67ffffffffffffffff811115614ca957614ca8613c46565b5b614cb38254614702565b614cbe828285614bfa565b600060209050601f831160018114614cf15760008415614cdf578287015190505b614ce98582614c6b565b865550614d51565b601f198416614cff866147aa565b60005b82811015614d2757848901518255600182019150602085019450602081019050614d02565b86831015614d445784890151614d40601f891682614c4d565b8355505b6001600288020188555050505b505050505050565b6000614d6582846147bf565b915081905092915050565b7f4e6f7420656e6f75676820455448000000000000000000000000000000000000600082015250565b6000614da6600e83613b14565b9150614db182614d70565b602082019050919050565b60006020820190508181036000830152614dd581614d99565b9050919050565b600081519050614deb8161399a565b92915050565b600060208284031215614e0757614e06613964565b5b6000614e1584828501614ddc565b91505092915050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b6000614e7a602983613b14565b9150614e8582614e1e565b604082019050919050565b60006020820190508181036000830152614ea981614e6d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614eea82613918565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614f1c57614f1b614929565b5b600182019050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614f5d601f83613b14565b9150614f6882614f27565b602082019050919050565b60006020820190508181036000830152614f8c81614f50565b9050919050565b7f53616c65206e6f74206163746976652100000000000000000000000000000000600082015250565b6000614fc9601083613b14565b9150614fd482614f93565b602082019050919050565b60006020820190508181036000830152614ff881614fbc565b9050919050565b600061500a82613918565b915061501583613918565b925082820261502381613918565b9150828204841483151761503a57615039614929565b5b5092915050565b60006040820190506150566000830185613909565b6150636020830184613909565b9392505050565b7f4572726f723a205472616e73666572206e6f7420617070726f76656400000000600082015250565b60006150a0601c83613b14565b91506150ab8261506a565b602082019050919050565b600060208201905081810360008301526150cf81615093565b9050919050565b60006060820190506150eb6000830186613909565b6150f86020830185613909565b6151056040830184613922565b949350505050565b60008151905061511c8161430a565b92915050565b60006020828403121561513857615137613964565b5b60006151468482850161510d565b91505092915050565b7f4e6f7420456e6f7567682045544820746f206d696e7421000000000000000000600082015250565b6000615185601783613b14565b91506151908261514f565b602082019050919050565b600060208201905081810360008301526151b481615178565b9050919050565b60008160601b9050919050565b60006151d3826151bb565b9050919050565b60006151e5826151c8565b9050919050565b6151fd6151f8826138f7565b6151da565b82525050565b600061520f82846151ec565b60148201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061525882613918565b915061526383613918565b9250826152735761527261521e565b5b828204905092915050565b6000615289826151c8565b9050919050565b6152a161529c82613bbb565b61527e565b82525050565b60006152b38284615290565b60148201915081905092915050565b6000819050919050565b6152dd6152d882613918565b6152c2565b82525050565b60006152ef82846152cc565b60208201915081905092915050565b600061530982613918565b915061531483613918565b9250826153245761532361521e565b5b828206905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061538b602683613b14565b91506153968261532f565b604082019050919050565b600060208201905081810360008301526153ba8161537e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006153f7602083613b14565b9150615402826153c1565b602082019050919050565b60006020820190508181036000830152615426816153ea565b9050919050565b600061543882613918565b915061544383613918565b925082820390508181111561545b5761545a614929565b5b92915050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000615497601d83613b14565b91506154a282615461565b602082019050919050565b600060208201905081810360008301526154c68161548a565b9050919050565b600081905092915050565b50565b60006154e86000836154cd565b91506154f3826154d8565b600082019050919050565b6000615509826154db565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b600061556f603a83613b14565b915061557a82615513565b604082019050919050565b6000602082019050818103600083015261559e81615562565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000615601602883613b14565b915061560c826155a5565b604082019050919050565b60006020820190508181036000830152615630816155f4565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615693602583613b14565b915061569e82615637565b604082019050919050565b600060208201905081810360008301526156c281615686565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000615725602a83613b14565b9150615730826156c9565b604082019050919050565b6000602082019050818103600083015261575481615718565b9050919050565b60006040820190508181036000830152615775818561428a565b90508181036020830152615789818461428a565b90509392505050565b60006060820190506157a76000830186613909565b6157b46020830185613922565b6157c16040830184613922565b949350505050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000615825602383613b14565b9150615830826157c9565b604082019050919050565b6000602082019050818103600083015261585481615818565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b60006158b7602483613b14565b91506158c28261585b565b604082019050919050565b600060208201905081810360008301526158e6816158aa565b9050919050565b60006040820190506159026000830185613922565b61590f6020830184613922565b9392505050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615972602183613b14565b915061597d82615916565b604082019050919050565b600060208201905081810360008301526159a181615965565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006159cf826159a8565b6159d981856159b3565b93506159e9818560208601613b25565b6159f281613b4f565b840191505092915050565b600060a082019050615a126000830188613909565b615a1f6020830187613909565b8181036040830152615a31818661428a565b90508181036060830152615a45818561428a565b90508181036080830152615a5981846159c4565b90509695505050505050565b600081519050615a7481613a4d565b92915050565b600060208284031215615a9057615a8f613964565b5b6000615a9e84828501615a65565b91505092915050565b60008160e01c9050919050565b600060033d1115615ad35760046000803e615ad0600051615aa7565b90505b90565b600060443d10615b6357615ae861395a565b60043d036004823e80513d602482011167ffffffffffffffff82111715615b10575050615b63565b808201805167ffffffffffffffff811115615b2e5750505050615b63565b80602083010160043d038501811115615b4b575050505050615b63565b615b5a82602001850186613c75565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000615bc2603483613b14565b9150615bcd82615b66565b604082019050919050565b60006020820190508181036000830152615bf181615bb5565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000615c54602883613b14565b9150615c5f82615bf8565b604082019050919050565b60006020820190508181036000830152615c8381615c47565b9050919050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000615ce6602a83613b14565b9150615cf182615c8a565b604082019050919050565b60006020820190508181036000830152615d1581615cd9565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000615d78602983613b14565b9150615d8382615d1c565b604082019050919050565b60006020820190508181036000830152615da781615d6b565b9050919050565b600060a082019050615dc36000830188613909565b615dd06020830187613909565b615ddd6040830186613922565b615dea6060830185613922565b8181036080830152615dfc81846159c4565b90509695505050505050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000615e64602683613b14565b9150615e6f82615e08565b604082019050919050565b60006020820190508181036000830152615e9381615e57565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000615ed0601d83613b14565b9150615edb82615e9a565b602082019050919050565b60006020820190508181036000830152615eff81615ec3565b9050919050565b6000615f11826159a8565b615f1b81856154cd565b9350615f2b818560208601613b25565b80840191505092915050565b6000615f438284615f06565b91508190509291505056fea2646970667358221220bfc7d3e826612d23ab5127ccd425b048687c96e560598e3af64ed27c18ec0ee064736f6c63430008110033

Deployed Bytecode Sourcemap

92074:8521:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84357:40;84373:12;:10;:12::i;:::-;84387:9;84357:40;;;;;;;:::i;:::-;;;;;;;;92074:8521;;;;;21868:317;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20841:360;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;95477:138;;;;;;;;;;;;;:::i;:::-;;98874:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92498:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;94909:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86175:616;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92695:69;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99146:265;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24018:439;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;94763:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84488:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;98985:110;;;:::i;:::-;;85617:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78619:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;98765:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87059:704;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22351:561;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99487:73;;;;;;;;;;;;;:::i;:::-;;92938:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;96320:731;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42901:103;;;;;;;;;;;;;:::i;:::-;;93686:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85875;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42253:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92889:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85339:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99994:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;98566:191;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92382:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92541:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85135:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;94457:298;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92301:74;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84925:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100354:238;;;;;;;;;;;;;:::i;:::-;;84673:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23244:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92260:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;97598:717;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23534:407;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43159:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99661:181;;;;;;;;;;;;;:::i;:::-;;97059:243;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18543:98;18596:7;18623:10;18616:17;;18543:98;:::o;21868:317::-;21999:7;22065:1;22046:21;;:7;:21;;;22024:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;22155:9;:13;22165:2;22155:13;;;;;;;;;;;:22;22169:7;22155:22;;;;;;;;;;;;;;;;22148:29;;21868:317;;;;:::o;20841:360::-;20988:4;21045:26;21030:41;;;:11;:41;;;;:110;;;;21103:37;21088:52;;;:11;:52;;;;21030:110;:163;;;;21157:36;21181:11;21157:23;:36::i;:::-;21030:163;21010:183;;20841:360;;;:::o;95477:138::-;42139:13;:11;:13::i;:::-;95551:12:::1;;;;;;;;;;;95550:13;95535:12;;:28;;;;;;;;;;;;;;;;;;95579;95594:12;;;;;;;;;;;95579:28;;;;;;:::i;:::-;;;;;;;;95477:138::o:0;98874:103::-;42139:13;:11;:13::i;:::-;98963:6:::1;98944:16;:25;;;;98874:103:::0;:::o;92498:34::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;94909:308::-;94968:13;95002:9;:17;95012:6;95002:17;;;;;;;;;;;;;;;;;;;;;94994:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;95109:1;95091:7;95085:21;;;;;:::i;:::-;;;:25;:124;;95202:7;95085:124;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;95154:7;95163:17;:6;:15;:17::i;:::-;95137:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;95085:124;95065:144;;94909:308;;;:::o;86175:616::-;86270:1;86251:7;:16;86259:7;86251:16;;;;;;;;;;;;;;;;:20;86243:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;86327:21;86375:15;:13;:15::i;:::-;86351:21;:39;;;;:::i;:::-;86327:63;;86401:15;86419:108;86449:7;86471:13;86499:17;86508:7;86499:8;:17::i;:::-;86419:15;:108::i;:::-;86401:126;;86559:1;86548:7;:12;86540:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;86643:7;86621:9;:18;86631:7;86621:18;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;86679:7;86661:14;;:25;;;;;;;:::i;:::-;;;;;;;;86699:35;86717:7;86726;86699:17;:35::i;:::-;86750:33;86766:7;86775;86750:33;;;;;;;:::i;:::-;;;;;;;;86232:559;;86175:616;:::o;92695:69::-;;;;;;;;;;;;;:::o;99146:265::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24018:439::-;24259:12;:10;:12::i;:::-;24251:20;;:4;:20;;;:60;;;;24275:36;24292:4;24298:12;:10;:12::i;:::-;24275:16;:36::i;:::-;24251:60;24229:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;24397:52;24420:4;24426:2;24430:3;24435:7;24444:4;24397:22;:52::i;:::-;24018:439;;;;;:::o;94763:138::-;42139:13;:11;:13::i;:::-;94850:8:::1;94840:7;:18;;;;;;:::i;:::-;;94885:7;94874:19;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;94763:138:::0;:::o;84488:91::-;84532:7;84559:12;;84552:19;;84488:91;:::o;98985:110::-;99053:15;;99041:9;:27;99033:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;98985:110::o;85617:167::-;85714:7;85746:14;:21;85761:5;85746:21;;;;;;;;;;;;;;;:30;85768:7;85746:30;;;;;;;;;;;;;;;;85739:37;;85617:167;;;;:::o;78619:143::-;78719:42;78619:143;:::o;98765:101::-;42139:13;:11;:13::i;:::-;98852:6:::1;98834:15;:24;;;;98765:101:::0;:::o;87059:704::-;87160:1;87141:7;:16;87149:7;87141:16;;;;;;;;;;;;;;;;:20;87133:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;87217:21;87287:20;87301:5;87287:13;:20::i;:::-;87241:5;:15;;;87265:4;87241:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:66;;;;:::i;:::-;87217:90;;87318:15;87336:115;87366:7;87388:13;87416:24;87425:5;87432:7;87416:8;:24::i;:::-;87336:15;:115::i;:::-;87318:133;;87483:1;87472:7;:12;87464:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;87579:7;87545:14;:21;87560:5;87545:21;;;;;;;;;;;;;;;:30;87567:7;87545:30;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;87627:7;87597:19;:26;87617:5;87597:26;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;87647:47;87670:5;87677:7;87686;87647:22;:47::i;:::-;87731:5;87710:45;;;87738:7;87747;87710:45;;;;;;;:::i;:::-;;;;;;;;87122:641;;87059:704;;:::o;22351:561::-;22507:16;22582:3;:10;22563:8;:15;:29;22541:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;22674:30;22721:8;:15;22707:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22674:63;;22755:9;22750:122;22774:8;:15;22770:1;:19;22750:122;;;22830:30;22840:8;22849:1;22840:11;;;;;;;;:::i;:::-;;;;;;;;22853:3;22857:1;22853:6;;;;;;;;:::i;:::-;;;;;;;;22830:9;:30::i;:::-;22811:13;22825:1;22811:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;22791:3;;;;:::i;:::-;;;22750:122;;;;22891:13;22884:20;;;22351:561;;;;:::o;99487:73::-;99524:28;99540:10;99524:7;:28::i;:::-;99487:73::o;92938:49::-;;;;:::o;96320:731::-;91129:1;91725:7;;:19;91717:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;91129:1;91858:7;:18;;;;96414:12:::1;;;;;;;;;;;96406:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;96462:10;96458:557;;;96612:6;96593:16;;:25;;;;:::i;:::-;96515:16;;;;;;;;;;;:26;;;96542:10;96562:4;96515:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:103;;96489:193;;;;;;;;;;;;:::i;:::-;;;;;;;;;96697:16;;;;;;;;;;;:29;;;96745:10;96782:4;96827:6;96807:16;;96806:27;;;;:::i;:::-;96697:151;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;96458:557;;;96935:9;96925:6;96907:15;;:24;;;;:::i;:::-;:37;;96881:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;96458:557;97027:16;97036:6;97027:8;:16::i;:::-;91085:1:::0;92037:7;:22;;;;96320:731;;:::o;42901:103::-;42139:13;:11;:13::i;:::-;42966:30:::1;42993:1;42966:18;:30::i;:::-;42901:103::o:0;93686:100::-;42139:13;:11;:13::i;:::-;93777:1:::1;93757:17;:21;;;;93686:100:::0;:::o;85875:::-;85926:7;85953;85961:5;85953:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;85946:21;;85875:100;;;:::o;42253:87::-;42299:7;42326:6;;;;;;;;;;;42319:13;;42253:87;:::o;92889:42::-;;;;:::o;85339:109::-;85395:7;85422:9;:18;85432:7;85422:18;;;;;;;;;;;;;;;;85415:25;;85339:109;;;:::o;99994:208::-;100125:8;80888:1;78719:42;80840:45;;;:49;80836:318;;;78719:42;80929;;;81002:4;81030:8;80929:128;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80906:237;;81118:8;81099:28;;;;;;;;;;;:::i;:::-;;;;;;;;80906:237;80836:318;100151:43:::1;100175:8;100185;100151:23;:43::i;:::-;99994:208:::0;;;:::o;98566:191::-;42139:13;:11;:13::i;:::-;98710:39:::1;98716:10;98728:7;98737:11;98710:5;:39::i;:::-;98566:191:::0;;;:::o;92382:38::-;;;;:::o;92541:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;85135:105::-;85189:7;85216;:16;85224:7;85216:16;;;;;;;;;;;;;;;;85209:23;;85135:105;;;:::o;94457:298::-;42139:13;:11;:13::i;:::-;94620:9:::1;94615:133;94639:5;;:12;;94635:1;:16;94615:133;;;94673:63;94679:5;;94685:1;94679:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;94689:9;94699:1;94689:12;;;;;;;;:::i;:::-;;;;;;;;94703:4;94708:1;94703:7;;;;;;;;:::i;:::-;;;;;;;;94673:63;;;;;;;;;;;;;;;;::::0;:5:::1;:63::i;:::-;94653:3;;;;;:::i;:::-;;;;94615:133;;;;94457:298:::0;;;;:::o;92301:74::-;;;;;;;;;;;;;:::o;84925:119::-;84983:7;85010:19;:26;85030:5;85010:26;;;;;;;;;;;;;;;;85003:33;;84925:119;;;:::o;100354:238::-;42139:13;:11;:13::i;:::-;100478:15:::1;:13;:15::i;:::-;100504:18;100541:14;;;;;;;;;;;100504:53;;100581:2;100568:16;;;84673:95:::0;84719:7;84746:14;;84739:21;;84673:95;:::o;23244:218::-;23388:4;23417:18;:27;23436:7;23417:27;;;;;;;;;;;;;;;:37;23445:8;23417:37;;;;;;;;;;;;;;;;;;;;;;;;;23410:44;;23244:218;;;;:::o;92260:32::-;;;;;;;;;;;;;:::o;97598:717::-;97663:7;97683:12;98205;98160:15;98113:10;98096:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;98086:39;;;;;;98078:48;;98077:99;;;;:::i;:::-;98034:14;97989:15;97941:14;97924:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;97914:43;;;;;;97906:52;;97875:130;;;;:::i;:::-;97830:16;97787:15;:59;;;;:::i;:::-;:219;;;;:::i;:::-;:261;;;;:::i;:::-;:390;;;;:::i;:::-;:430;;;;:::i;:::-;97748:488;;;;;;;;:::i;:::-;;;;;;;;;;;;;97720:531;;;;;;97698:564;;97683:579;;98306:1;98290:12;98283:4;:19;;;;:::i;:::-;98282:25;;;;:::i;:::-;98275:32;;;97598:717;;;:::o;23534:407::-;23750:12;:10;:12::i;:::-;23742:20;;:4;:20;;;:60;;;;23766:36;23783:4;23789:12;:10;:12::i;:::-;23766:16;:36::i;:::-;23742:60;23720:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;23888:45;23906:4;23912:2;23916;23920:6;23928:4;23888:17;:45::i;:::-;23534:407;;;;;:::o;43159:238::-;42139:13;:11;:13::i;:::-;43282:1:::1;43262:22;;:8;:22;;::::0;43240:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;43361:28;43380:8;43361:18;:28::i;:::-;43159:238:::0;:::o;99661:181::-;42139:13;:11;:13::i;:::-;99714:15:::1;99732:16;;;;;;;;;;;:26;;;99767:4;99732:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;99714:59;;99784:16;;;;;;;;;;;:25;;;99810:14;;;;;;;;;;;99826:7;99784:50;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;99703:139;99661:181::o:0;97059:243::-;97119:17;97139:15;97119:35;;97165:130;97202:13;97190:9;:25;;;;:::i;:::-;97172:15;:43;97165:130;;97108:194;97059:243;:::o;19622:207::-;19752:4;19796:25;19781:40;;;:11;:40;;;;19774:47;;19622:207;;;:::o;42418:132::-;42493:12;:10;:12::i;:::-;42482:23;;:7;:5;:7::i;:::-;:23;;;42474:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42418:132::o;38894:723::-;38950:13;39180:1;39171:5;:10;39167:53;;39198:10;;;;;;;;;;;;;;;;;;;;;39167:53;39230:12;39245:5;39230:20;;39261:14;39286:78;39301:1;39293:4;:9;39286:78;;39319:8;;;;;:::i;:::-;;;;39350:2;39342:10;;;;;:::i;:::-;;;39286:78;;;39374:19;39406:6;39396:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39374:39;;39424:154;39440:1;39431:5;:10;39424:154;;39468:1;39458:11;;;;;:::i;:::-;;;39535:2;39527:5;:10;;;;:::i;:::-;39514:2;:24;;;;:::i;:::-;39501:39;;39484:6;39491;39484:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;39564:2;39555:11;;;;;:::i;:::-;;;39424:154;;;39602:6;39588:21;;;;;38894:723;;;;:::o;87941:261::-;88087:7;88179:15;88164:12;;88144:7;:16;88152:7;88144:16;;;;;;;;;;;;;;;;88128:13;:32;;;;:::i;:::-;88127:49;;;;:::i;:::-;:67;;;;:::i;:::-;88107:87;;87941:261;;;;;:::o;11336:391::-;11465:6;11440:21;:31;;11418:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;11542:12;11560:9;:14;;11582:6;11560:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11541:52;;;11626:7;11604:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;11407:320;11336:391;;:::o;26290:1321::-;26531:7;:14;26517:3;:10;:28;26495:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;26646:1;26632:16;;:2;:16;;;26624:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;26703:16;26722:12;:10;:12::i;:::-;26703:31;;26747:60;26768:8;26778:4;26784:2;26788:3;26793:7;26802:4;26747:20;:60::i;:::-;26825:9;26820:470;26844:3;:10;26840:1;:14;26820:470;;;26876:10;26889:3;26893:1;26889:6;;;;;;;;:::i;:::-;;;;;;;;26876:19;;26910:14;26927:7;26935:1;26927:10;;;;;;;;:::i;:::-;;;;;;;;26910:27;;26954:19;26976:9;:13;26986:2;26976:13;;;;;;;;;;;:19;26990:4;26976:19;;;;;;;;;;;;;;;;26954:41;;27051:6;27036:11;:21;;27010:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;27215:6;27201:11;:20;27179:9;:13;27189:2;27179:13;;;;;;;;;;;:19;27193:4;27179:19;;;;;;;;;;;;;;;:42;;;;27272:6;27251:9;:13;27261:2;27251:13;;;;;;;;;;;:17;27265:2;27251:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;26861:429;;;26856:3;;;;:::i;:::-;;;26820:470;;;;27337:2;27307:47;;27331:4;27307:47;;27321:8;27307:47;;;27341:3;27346:7;27307:47;;;;;;;:::i;:::-;;;;;;;;27367:59;27387:8;27397:4;27403:2;27407:3;27412:7;27421:4;27367:19;:59::i;:::-;27439:164;27489:8;27512:4;27531:2;27548:3;27566:7;27588:4;27439:35;:164::i;:::-;26484:1127;26290:1321;;;;;:::o;55776:248::-;55893:123;55927:5;55970:23;;;55995:2;55999:5;55947:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55893:19;:123::i;:::-;55776:248;;;:::o;95743:377::-;95801:9;95796:317;95820:6;95816:1;:10;95796:317;;;95848:18;95869:23;95882:9;;95869:12;:23::i;:::-;95848:44;;95983:47;95989:10;96001;96013:1;95983:47;;;;;;;;;;;;;;;;;:5;:47::i;:::-;96050:51;96061:10;96073;96085:15;96050:51;;;;;;;;:::i;:::-;;;;;;;;95833:280;95828:3;;;;;:::i;:::-;;;;95796:317;;;;95743:377;:::o;43557:191::-;43631:16;43650:6;;;;;;;;;;;43631:25;;43676:8;43667:6;;:17;;;;;;;;;;;;;;;;;;43731:8;43700:40;;43721:8;43700:40;;;;;;;;;;;;43620:128;43557:191;:::o;22985:187::-;23112:52;23131:12;:10;:12::i;:::-;23145:8;23155;23112:18;:52::i;:::-;22985:187;;:::o;31387:808::-;31530:1;31514:18;;:4;:18;;;31506:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;31585:16;31604:12;:10;:12::i;:::-;31585:31;;31627:20;31650:21;31668:2;31650:17;:21::i;:::-;31627:44;;31682:24;31709:25;31727:6;31709:17;:25::i;:::-;31682:52;;31747:66;31768:8;31778:4;31792:1;31796:3;31801:7;31747:66;;;;;;;;;;;;:20;:66::i;:::-;31826:19;31848:9;:13;31858:2;31848:13;;;;;;;;;;;:19;31862:4;31848:19;;;;;;;;;;;;;;;;31826:41;;31901:6;31886:11;:21;;31878:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;32020:6;32006:11;:20;31984:9;:13;31994:2;31984:13;;;;;;;;;;;:19;31998:4;31984:19;;;;;;;;;;;;;;;:42;;;;32094:1;32055:54;;32080:4;32055:54;;32070:8;32055:54;;;32098:2;32102:6;32055:54;;;;;;;:::i;:::-;;;;;;;;32122:65;32142:8;32152:4;32166:1;32170:3;32175:7;32122:65;;;;;;;;;;;;:19;:65::i;:::-;31495:700;;;;31387:808;;;:::o;28929:818::-;29096:1;29082:16;;:2;:16;;;29074:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;29149:16;29168:12;:10;:12::i;:::-;29149:31;;29191:20;29214:21;29232:2;29214:17;:21::i;:::-;29191:44;;29246:24;29273:25;29291:6;29273:17;:25::i;:::-;29246:52;;29311:66;29332:8;29350:1;29354:2;29358:3;29363:7;29372:4;29311:20;:66::i;:::-;29411:6;29390:9;:13;29400:2;29390:13;;;;;;;;;;;:17;29404:2;29390:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;29470:2;29433:52;;29466:1;29433:52;;29448:8;29433:52;;;29474:2;29478:6;29433:52;;;;;;;:::i;:::-;;;;;;;;29498:65;29518:8;29536:1;29540:2;29544:3;29549:7;29558:4;29498:19;:65::i;:::-;29576:163;29621:8;29652:1;29669:2;29686;29703:6;29724:4;29576:30;:163::i;:::-;29063:684;;;28929:818;;;;:::o;24921:1011::-;25123:1;25109:16;;:2;:16;;;25101:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;25180:16;25199:12;:10;:12::i;:::-;25180:31;;25222:20;25245:21;25263:2;25245:17;:21::i;:::-;25222:44;;25277:24;25304:25;25322:6;25304:17;:25::i;:::-;25277:52;;25342:60;25363:8;25373:4;25379:2;25383:3;25388:7;25397:4;25342:20;:60::i;:::-;25415:19;25437:9;:13;25447:2;25437:13;;;;;;;;;;;:19;25451:4;25437:19;;;;;;;;;;;;;;;;25415:41;;25504:6;25489:11;:21;;25467:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;25652:6;25638:11;:20;25616:9;:13;25626:2;25616:13;;;;;;;;;;;:19;25630:4;25616:19;;;;;;;;;;;;;;;:42;;;;25701:6;25680:9;:13;25690:2;25680:13;;;;;;;;;;;:17;25694:2;25680:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;25756:2;25725:46;;25750:4;25725:46;;25740:8;25725:46;;;25760:2;25764:6;25725:46;;;;;;;:::i;:::-;;;;;;;;25784:59;25804:8;25814:4;25820:2;25824:3;25829:7;25838:4;25784:19;:59::i;:::-;25856:68;25887:8;25897:4;25903:2;25907;25911:6;25919:4;25856:30;:68::i;:::-;25090:842;;;;24921:1011;;;;;:::o;34932:221::-;;;;;;;:::o;36108:220::-;;;;;;;:::o;37242:975::-;37482:15;:2;:13;;;:15::i;:::-;37478:732;;;37552:2;37535:43;;;37601:8;37632:4;37659:3;37685:7;37715:4;37535:203;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37514:685;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;38072:6;38065:14;;;;;;;;;;;:::i;:::-;;;;;;;;37514:685;;;38121:62;;;;;;;;;;:::i;:::-;;;;;;;;37514:685;37835:48;;;37823:60;;;:8;:60;;;;37797:199;;37926:50;;;;;;;;;;:::i;:::-;;;;;;;;37797:199;37752:259;37478:732;37242:975;;;;;;:::o;58743:802::-;59167:23;59193:106;59235:4;59193:106;;;;;;;;;;;;;;;;;59201:5;59193:27;;;;:106;;;;;:::i;:::-;59167:132;;59334:1;59314:10;:17;:21;59310:228;;;59429:10;59418:30;;;;;;;;;;;;:::i;:::-;59392:134;;;;;;;;;;;;:::i;:::-;;;;;;;;;59310:228;58813:732;58743:802;;:::o;33643:331::-;33798:8;33789:17;;:5;:17;;;33781:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;33901:8;33863:18;:25;33882:5;33863:25;;;;;;;;;;;;;;;:35;33889:8;33863:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;33947:8;33925:41;;33940:5;33925:41;;;33957:8;33925:41;;;;;;:::i;:::-;;;;;;;;33643:331;;;:::o;38225:230::-;38318:16;38352:22;38391:1;38377:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38352:41;;38415:7;38404:5;38410:1;38404:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;38442:5;38435:12;;;38225:230;;;:::o;36336:898::-;36551:15;:2;:13;;;:15::i;:::-;36547:680;;;36621:2;36604:38;;;36665:8;36696:4;36723:2;36748:6;36777:4;36604:196;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36583:633;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;37089:6;37082:14;;;;;;;;;;;:::i;:::-;;;;;;;;36583:633;;;37138:62;;;;;;;;;;:::i;:::-;;;;;;;;36583:633;36875:43;;;36863:55;;;:8;:55;;;;36859:154;;36943:50;;;;;;;;;;:::i;:::-;;;;;;;;36859:154;36814:214;36547:680;36336:898;;;;;;:::o;10075:326::-;10135:4;10392:1;10370:7;:19;;;:23;10363:30;;10075:326;;;:::o;12917:229::-;13054:12;13086:52;13108:6;13116:4;13122:1;13125:12;13086:21;:52::i;:::-;13079:59;;12917:229;;;;;:::o;14133:571::-;14303:12;14375:5;14350:21;:30;;14328:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;14465:18;14476:6;14465:10;:18::i;:::-;14457:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;14531:12;14545:23;14572:6;:11;;14591:5;14612:4;14572:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14530:97;;;;14645:51;14662:7;14671:10;14683:12;14645:16;:51::i;:::-;14638:58;;;;14133:571;;;;;;:::o;17093:762::-;17243:12;17272:7;17268:580;;;17303:10;17296:17;;;;17268:580;17437:1;17417:10;:17;:21;17413:424;;;17665:10;17659:17;17726:15;17713:10;17709:2;17705:19;17698:44;17413:424;17808:12;17801:20;;;;;;;;;;;:::i;:::-;;;;;;;;17093:762;;;;;;:::o;7:126:1:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:96::-;176:7;205:24;223:5;205:24;:::i;:::-;194:35;;139:96;;;:::o;241:118::-;328:24;346:5;328:24;:::i;:::-;323:3;316:37;241:118;;:::o;365:77::-;402:7;431:5;420:16;;365:77;;;:::o;448:118::-;535:24;553:5;535:24;:::i;:::-;530:3;523:37;448:118;;:::o;572:332::-;693:4;731:2;720:9;716:18;708:26;;744:71;812:1;801:9;797:17;788:6;744:71;:::i;:::-;825:72;893:2;882:9;878:18;869:6;825:72;:::i;:::-;572:332;;;;;:::o;910:75::-;943:6;976:2;970:9;960:19;;910:75;:::o;991:117::-;1100:1;1097;1090:12;1114:117;1223:1;1220;1213:12;1237:122;1310:24;1328:5;1310:24;:::i;:::-;1303:5;1300:35;1290:63;;1349:1;1346;1339:12;1290:63;1237:122;:::o;1365:139::-;1411:5;1449:6;1436:20;1427:29;;1465:33;1492:5;1465:33;:::i;:::-;1365:139;;;;:::o;1510:122::-;1583:24;1601:5;1583:24;:::i;:::-;1576:5;1573:35;1563:63;;1622:1;1619;1612:12;1563:63;1510:122;:::o;1638:139::-;1684:5;1722:6;1709:20;1700:29;;1738:33;1765:5;1738:33;:::i;:::-;1638:139;;;;:::o;1783:474::-;1851:6;1859;1908:2;1896:9;1887:7;1883:23;1879:32;1876:119;;;1914:79;;:::i;:::-;1876:119;2034:1;2059:53;2104:7;2095:6;2084:9;2080:22;2059:53;:::i;:::-;2049:63;;2005:117;2161:2;2187:53;2232:7;2223:6;2212:9;2208:22;2187:53;:::i;:::-;2177:63;;2132:118;1783:474;;;;;:::o;2263:222::-;2356:4;2394:2;2383:9;2379:18;2371:26;;2407:71;2475:1;2464:9;2460:17;2451:6;2407:71;:::i;:::-;2263:222;;;;:::o;2491:149::-;2527:7;2567:66;2560:5;2556:78;2545:89;;2491:149;;;:::o;2646:120::-;2718:23;2735:5;2718:23;:::i;:::-;2711:5;2708:34;2698:62;;2756:1;2753;2746:12;2698:62;2646:120;:::o;2772:137::-;2817:5;2855:6;2842:20;2833:29;;2871:32;2897:5;2871:32;:::i;:::-;2772:137;;;;:::o;2915:327::-;2973:6;3022:2;3010:9;3001:7;2997:23;2993:32;2990:119;;;3028:79;;:::i;:::-;2990:119;3148:1;3173:52;3217:7;3208:6;3197:9;3193:22;3173:52;:::i;:::-;3163:62;;3119:116;2915:327;;;;:::o;3248:90::-;3282:7;3325:5;3318:13;3311:21;3300:32;;3248:90;;;:::o;3344:109::-;3425:21;3440:5;3425:21;:::i;:::-;3420:3;3413:34;3344:109;;:::o;3459:210::-;3546:4;3584:2;3573:9;3569:18;3561:26;;3597:65;3659:1;3648:9;3644:17;3635:6;3597:65;:::i;:::-;3459:210;;;;:::o;3675:329::-;3734:6;3783:2;3771:9;3762:7;3758:23;3754:32;3751:119;;;3789:79;;:::i;:::-;3751:119;3909:1;3934:53;3979:7;3970:6;3959:9;3955:22;3934:53;:::i;:::-;3924:63;;3880:117;3675:329;;;;:::o;4010:99::-;4062:6;4096:5;4090:12;4080:22;;4010:99;;;:::o;4115:169::-;4199:11;4233:6;4228:3;4221:19;4273:4;4268:3;4264:14;4249:29;;4115:169;;;;:::o;4290:246::-;4371:1;4381:113;4395:6;4392:1;4389:13;4381:113;;;4480:1;4475:3;4471:11;4465:18;4461:1;4456:3;4452:11;4445:39;4417:2;4414:1;4410:10;4405:15;;4381:113;;;4528:1;4519:6;4514:3;4510:16;4503:27;4352:184;4290:246;;;:::o;4542:102::-;4583:6;4634:2;4630:7;4625:2;4618:5;4614:14;4610:28;4600:38;;4542:102;;;:::o;4650:377::-;4738:3;4766:39;4799:5;4766:39;:::i;:::-;4821:71;4885:6;4880:3;4821:71;:::i;:::-;4814:78;;4901:65;4959:6;4954:3;4947:4;4940:5;4936:16;4901:65;:::i;:::-;4991:29;5013:6;4991:29;:::i;:::-;4986:3;4982:39;4975:46;;4742:285;4650:377;;;;:::o;5033:313::-;5146:4;5184:2;5173:9;5169:18;5161:26;;5233:9;5227:4;5223:20;5219:1;5208:9;5204:17;5197:47;5261:78;5334:4;5325:6;5261:78;:::i;:::-;5253:86;;5033:313;;;;:::o;5352:104::-;5397:7;5426:24;5444:5;5426:24;:::i;:::-;5415:35;;5352:104;;;:::o;5462:138::-;5543:32;5569:5;5543:32;:::i;:::-;5536:5;5533:43;5523:71;;5590:1;5587;5580:12;5523:71;5462:138;:::o;5606:155::-;5660:5;5698:6;5685:20;5676:29;;5714:41;5749:5;5714:41;:::i;:::-;5606:155;;;;:::o;5767:345::-;5834:6;5883:2;5871:9;5862:7;5858:23;5854:32;5851:119;;;5889:79;;:::i;:::-;5851:119;6009:1;6034:61;6087:7;6078:6;6067:9;6063:22;6034:61;:::i;:::-;6024:71;;5980:125;5767:345;;;;:::o;6118:222::-;6211:4;6249:2;6238:9;6234:18;6226:26;;6262:71;6330:1;6319:9;6315:17;6306:6;6262:71;:::i;:::-;6118:222;;;;:::o;6346:117::-;6455:1;6452;6445:12;6469:180;6517:77;6514:1;6507:88;6614:4;6611:1;6604:15;6638:4;6635:1;6628:15;6655:281;6738:27;6760:4;6738:27;:::i;:::-;6730:6;6726:40;6868:6;6856:10;6853:22;6832:18;6820:10;6817:34;6814:62;6811:88;;;6879:18;;:::i;:::-;6811:88;6919:10;6915:2;6908:22;6698:238;6655:281;;:::o;6942:129::-;6976:6;7003:20;;:::i;:::-;6993:30;;7032:33;7060:4;7052:6;7032:33;:::i;:::-;6942:129;;;:::o;7077:311::-;7154:4;7244:18;7236:6;7233:30;7230:56;;;7266:18;;:::i;:::-;7230:56;7316:4;7308:6;7304:17;7296:25;;7376:4;7370;7366:15;7358:23;;7077:311;;;:::o;7394:117::-;7503:1;7500;7493:12;7534:710;7630:5;7655:81;7671:64;7728:6;7671:64;:::i;:::-;7655:81;:::i;:::-;7646:90;;7756:5;7785:6;7778:5;7771:21;7819:4;7812:5;7808:16;7801:23;;7872:4;7864:6;7860:17;7852:6;7848:30;7901:3;7893:6;7890:15;7887:122;;;7920:79;;:::i;:::-;7887:122;8035:6;8018:220;8052:6;8047:3;8044:15;8018:220;;;8127:3;8156:37;8189:3;8177:10;8156:37;:::i;:::-;8151:3;8144:50;8223:4;8218:3;8214:14;8207:21;;8094:144;8078:4;8073:3;8069:14;8062:21;;8018:220;;;8022:21;7636:608;;7534:710;;;;;:::o;8267:370::-;8338:5;8387:3;8380:4;8372:6;8368:17;8364:27;8354:122;;8395:79;;:::i;:::-;8354:122;8512:6;8499:20;8537:94;8627:3;8619:6;8612:4;8604:6;8600:17;8537:94;:::i;:::-;8528:103;;8344:293;8267:370;;;;:::o;8643:117::-;8752:1;8749;8742:12;8766:307;8827:4;8917:18;8909:6;8906:30;8903:56;;;8939:18;;:::i;:::-;8903:56;8977:29;8999:6;8977:29;:::i;:::-;8969:37;;9061:4;9055;9051:15;9043:23;;8766:307;;;:::o;9079:146::-;9176:6;9171:3;9166;9153:30;9217:1;9208:6;9203:3;9199:16;9192:27;9079:146;;;:::o;9231:423::-;9308:5;9333:65;9349:48;9390:6;9349:48;:::i;:::-;9333:65;:::i;:::-;9324:74;;9421:6;9414:5;9407:21;9459:4;9452:5;9448:16;9497:3;9488:6;9483:3;9479:16;9476:25;9473:112;;;9504:79;;:::i;:::-;9473:112;9594:54;9641:6;9636:3;9631;9594:54;:::i;:::-;9314:340;9231:423;;;;;:::o;9673:338::-;9728:5;9777:3;9770:4;9762:6;9758:17;9754:27;9744:122;;9785:79;;:::i;:::-;9744:122;9902:6;9889:20;9927:78;10001:3;9993:6;9986:4;9978:6;9974:17;9927:78;:::i;:::-;9918:87;;9734:277;9673:338;;;;:::o;10017:1509::-;10171:6;10179;10187;10195;10203;10252:3;10240:9;10231:7;10227:23;10223:33;10220:120;;;10259:79;;:::i;:::-;10220:120;10379:1;10404:53;10449:7;10440:6;10429:9;10425:22;10404:53;:::i;:::-;10394:63;;10350:117;10506:2;10532:53;10577:7;10568:6;10557:9;10553:22;10532:53;:::i;:::-;10522:63;;10477:118;10662:2;10651:9;10647:18;10634:32;10693:18;10685:6;10682:30;10679:117;;;10715:79;;:::i;:::-;10679:117;10820:78;10890:7;10881:6;10870:9;10866:22;10820:78;:::i;:::-;10810:88;;10605:303;10975:2;10964:9;10960:18;10947:32;11006:18;10998:6;10995:30;10992:117;;;11028:79;;:::i;:::-;10992:117;11133:78;11203:7;11194:6;11183:9;11179:22;11133:78;:::i;:::-;11123:88;;10918:303;11288:3;11277:9;11273:19;11260:33;11320:18;11312:6;11309:30;11306:117;;;11342:79;;:::i;:::-;11306:117;11447:62;11501:7;11492:6;11481:9;11477:22;11447:62;:::i;:::-;11437:72;;11231:288;10017:1509;;;;;;;;:::o;11532:308::-;11594:4;11684:18;11676:6;11673:30;11670:56;;;11706:18;;:::i;:::-;11670:56;11744:29;11766:6;11744:29;:::i;:::-;11736:37;;11828:4;11822;11818:15;11810:23;;11532:308;;;:::o;11846:425::-;11924:5;11949:66;11965:49;12007:6;11965:49;:::i;:::-;11949:66;:::i;:::-;11940:75;;12038:6;12031:5;12024:21;12076:4;12069:5;12065:16;12114:3;12105:6;12100:3;12096:16;12093:25;12090:112;;;12121:79;;:::i;:::-;12090:112;12211:54;12258:6;12253:3;12248;12211:54;:::i;:::-;11930:341;11846:425;;;;;:::o;12291:340::-;12347:5;12396:3;12389:4;12381:6;12377:17;12373:27;12363:122;;12404:79;;:::i;:::-;12363:122;12521:6;12508:20;12546:79;12621:3;12613:6;12606:4;12598:6;12594:17;12546:79;:::i;:::-;12537:88;;12353:278;12291:340;;;;:::o;12637:509::-;12706:6;12755:2;12743:9;12734:7;12730:23;12726:32;12723:119;;;12761:79;;:::i;:::-;12723:119;12909:1;12898:9;12894:17;12881:31;12939:18;12931:6;12928:30;12925:117;;;12961:79;;:::i;:::-;12925:117;13066:63;13121:7;13112:6;13101:9;13097:22;13066:63;:::i;:::-;13056:73;;12852:287;12637:509;;;;:::o;13152:111::-;13204:7;13233:24;13251:5;13233:24;:::i;:::-;13222:35;;13152:111;;;:::o;13269:152::-;13357:39;13390:5;13357:39;:::i;:::-;13350:5;13347:50;13337:78;;13411:1;13408;13401:12;13337:78;13269:152;:::o;13427:169::-;13488:5;13526:6;13513:20;13504:29;;13542:48;13584:5;13542:48;:::i;:::-;13427:169;;;;:::o;13602:504::-;13685:6;13693;13742:2;13730:9;13721:7;13717:23;13713:32;13710:119;;;13748:79;;:::i;:::-;13710:119;13868:1;13893:68;13953:7;13944:6;13933:9;13929:22;13893:68;:::i;:::-;13883:78;;13839:132;14010:2;14036:53;14081:7;14072:6;14061:9;14057:22;14036:53;:::i;:::-;14026:63;;13981:118;13602:504;;;;;:::o;14112:60::-;14140:3;14161:5;14154:12;;14112:60;;;:::o;14178:142::-;14228:9;14261:53;14279:34;14288:24;14306:5;14288:24;:::i;:::-;14279:34;:::i;:::-;14261:53;:::i;:::-;14248:66;;14178:142;;;:::o;14326:126::-;14376:9;14409:37;14440:5;14409:37;:::i;:::-;14396:50;;14326:126;;;:::o;14458:158::-;14540:9;14573:37;14604:5;14573:37;:::i;:::-;14560:50;;14458:158;;;:::o;14622:195::-;14741:69;14804:5;14741:69;:::i;:::-;14736:3;14729:82;14622:195;;:::o;14823:286::-;14948:4;14986:2;14975:9;14971:18;14963:26;;14999:103;15099:1;15088:9;15084:17;15075:6;14999:103;:::i;:::-;14823:286;;;;:::o;15115:311::-;15192:4;15282:18;15274:6;15271:30;15268:56;;;15304:18;;:::i;:::-;15268:56;15354:4;15346:6;15342:17;15334:25;;15414:4;15408;15404:15;15396:23;;15115:311;;;:::o;15449:710::-;15545:5;15570:81;15586:64;15643:6;15586:64;:::i;:::-;15570:81;:::i;:::-;15561:90;;15671:5;15700:6;15693:5;15686:21;15734:4;15727:5;15723:16;15716:23;;15787:4;15779:6;15775:17;15767:6;15763:30;15816:3;15808:6;15805:15;15802:122;;;15835:79;;:::i;:::-;15802:122;15950:6;15933:220;15967:6;15962:3;15959:15;15933:220;;;16042:3;16071:37;16104:3;16092:10;16071:37;:::i;:::-;16066:3;16059:50;16138:4;16133:3;16129:14;16122:21;;16009:144;15993:4;15988:3;15984:14;15977:21;;15933:220;;;15937:21;15551:608;;15449:710;;;;;:::o;16182:370::-;16253:5;16302:3;16295:4;16287:6;16283:17;16279:27;16269:122;;16310:79;;:::i;:::-;16269:122;16427:6;16414:20;16452:94;16542:3;16534:6;16527:4;16519:6;16515:17;16452:94;:::i;:::-;16443:103;;16259:293;16182:370;;;;:::o;16558:894::-;16676:6;16684;16733:2;16721:9;16712:7;16708:23;16704:32;16701:119;;;16739:79;;:::i;:::-;16701:119;16887:1;16876:9;16872:17;16859:31;16917:18;16909:6;16906:30;16903:117;;;16939:79;;:::i;:::-;16903:117;17044:78;17114:7;17105:6;17094:9;17090:22;17044:78;:::i;:::-;17034:88;;16830:302;17199:2;17188:9;17184:18;17171:32;17230:18;17222:6;17219:30;17216:117;;;17252:79;;:::i;:::-;17216:117;17357:78;17427:7;17418:6;17407:9;17403:22;17357:78;:::i;:::-;17347:88;;17142:303;16558:894;;;;;:::o;17458:114::-;17525:6;17559:5;17553:12;17543:22;;17458:114;;;:::o;17578:184::-;17677:11;17711:6;17706:3;17699:19;17751:4;17746:3;17742:14;17727:29;;17578:184;;;;:::o;17768:132::-;17835:4;17858:3;17850:11;;17888:4;17883:3;17879:14;17871:22;;17768:132;;;:::o;17906:108::-;17983:24;18001:5;17983:24;:::i;:::-;17978:3;17971:37;17906:108;;:::o;18020:179::-;18089:10;18110:46;18152:3;18144:6;18110:46;:::i;:::-;18188:4;18183:3;18179:14;18165:28;;18020:179;;;;:::o;18205:113::-;18275:4;18307;18302:3;18298:14;18290:22;;18205:113;;;:::o;18354:732::-;18473:3;18502:54;18550:5;18502:54;:::i;:::-;18572:86;18651:6;18646:3;18572:86;:::i;:::-;18565:93;;18682:56;18732:5;18682:56;:::i;:::-;18761:7;18792:1;18777:284;18802:6;18799:1;18796:13;18777:284;;;18878:6;18872:13;18905:63;18964:3;18949:13;18905:63;:::i;:::-;18898:70;;18991:60;19044:6;18991:60;:::i;:::-;18981:70;;18837:224;18824:1;18821;18817:9;18812:14;;18777:284;;;18781:14;19077:3;19070:10;;18478:608;;;18354:732;;;;:::o;19092:373::-;19235:4;19273:2;19262:9;19258:18;19250:26;;19322:9;19316:4;19312:20;19308:1;19297:9;19293:17;19286:47;19350:108;19453:4;19444:6;19350:108;:::i;:::-;19342:116;;19092:373;;;;:::o;19471:116::-;19541:21;19556:5;19541:21;:::i;:::-;19534:5;19531:32;19521:60;;19577:1;19574;19567:12;19521:60;19471:116;:::o;19593:133::-;19636:5;19674:6;19661:20;19652:29;;19690:30;19714:5;19690:30;:::i;:::-;19593:133;;;;:::o;19732:468::-;19797:6;19805;19854:2;19842:9;19833:7;19829:23;19825:32;19822:119;;;19860:79;;:::i;:::-;19822:119;19980:1;20005:53;20050:7;20041:6;20030:9;20026:22;20005:53;:::i;:::-;19995:63;;19951:117;20107:2;20133:50;20175:7;20166:6;20155:9;20151:22;20133:50;:::i;:::-;20123:60;;20078:115;19732:468;;;;;:::o;20206:329::-;20265:6;20314:2;20302:9;20293:7;20289:23;20285:32;20282:119;;;20320:79;;:::i;:::-;20282:119;20440:1;20465:53;20510:7;20501:6;20490:9;20486:22;20465:53;:::i;:::-;20455:63;;20411:117;20206:329;;;;:::o;20541:468::-;20606:6;20614;20663:2;20651:9;20642:7;20638:23;20634:32;20631:119;;;20669:79;;:::i;:::-;20631:119;20789:1;20814:53;20859:7;20850:6;20839:9;20835:22;20814:53;:::i;:::-;20804:63;;20760:117;20916:2;20942:50;20984:7;20975:6;20964:9;20960:22;20942:50;:::i;:::-;20932:60;;20887:115;20541:468;;;;;:::o;21015:619::-;21092:6;21100;21108;21157:2;21145:9;21136:7;21132:23;21128:32;21125:119;;;21163:79;;:::i;:::-;21125:119;21283:1;21308:53;21353:7;21344:6;21333:9;21329:22;21308:53;:::i;:::-;21298:63;;21254:117;21410:2;21436:53;21481:7;21472:6;21461:9;21457:22;21436:53;:::i;:::-;21426:63;;21381:118;21538:2;21564:53;21609:7;21600:6;21589:9;21585:22;21564:53;:::i;:::-;21554:63;;21509:118;21015:619;;;;;:::o;21640:117::-;21749:1;21746;21739:12;21780:568;21853:8;21863:6;21913:3;21906:4;21898:6;21894:17;21890:27;21880:122;;21921:79;;:::i;:::-;21880:122;22034:6;22021:20;22011:30;;22064:18;22056:6;22053:30;22050:117;;;22086:79;;:::i;:::-;22050:117;22200:4;22192:6;22188:17;22176:29;;22254:3;22246:4;22238:6;22234:17;22224:8;22220:32;22217:41;22214:128;;;22261:79;;:::i;:::-;22214:128;21780:568;;;;;:::o;22354:1269::-;22508:6;22516;22524;22532;22581:2;22569:9;22560:7;22556:23;22552:32;22549:119;;;22587:79;;:::i;:::-;22549:119;22735:1;22724:9;22720:17;22707:31;22765:18;22757:6;22754:30;22751:117;;;22787:79;;:::i;:::-;22751:117;22892:78;22962:7;22953:6;22942:9;22938:22;22892:78;:::i;:::-;22882:88;;22678:302;23047:2;23036:9;23032:18;23019:32;23078:18;23070:6;23067:30;23064:117;;;23100:79;;:::i;:::-;23064:117;23213:80;23285:7;23276:6;23265:9;23261:22;23213:80;:::i;:::-;23195:98;;;;22990:313;23370:2;23359:9;23355:18;23342:32;23401:18;23393:6;23390:30;23387:117;;;23423:79;;:::i;:::-;23387:117;23528:78;23598:7;23589:6;23578:9;23574:22;23528:78;:::i;:::-;23518:88;;23313:303;22354:1269;;;;;;;:::o;23629:359::-;23703:6;23752:2;23740:9;23731:7;23727:23;23723:32;23720:119;;;23758:79;;:::i;:::-;23720:119;23878:1;23903:68;23963:7;23954:6;23943:9;23939:22;23903:68;:::i;:::-;23893:78;;23849:132;23629:359;;;;:::o;23994:474::-;24062:6;24070;24119:2;24107:9;24098:7;24094:23;24090:32;24087:119;;;24125:79;;:::i;:::-;24087:119;24245:1;24270:53;24315:7;24306:6;24295:9;24291:22;24270:53;:::i;:::-;24260:63;;24216:117;24372:2;24398:53;24443:7;24434:6;24423:9;24419:22;24398:53;:::i;:::-;24388:63;;24343:118;23994:474;;;;;:::o;24474:1089::-;24578:6;24586;24594;24602;24610;24659:3;24647:9;24638:7;24634:23;24630:33;24627:120;;;24666:79;;:::i;:::-;24627:120;24786:1;24811:53;24856:7;24847:6;24836:9;24832:22;24811:53;:::i;:::-;24801:63;;24757:117;24913:2;24939:53;24984:7;24975:6;24964:9;24960:22;24939:53;:::i;:::-;24929:63;;24884:118;25041:2;25067:53;25112:7;25103:6;25092:9;25088:22;25067:53;:::i;:::-;25057:63;;25012:118;25169:2;25195:53;25240:7;25231:6;25220:9;25216:22;25195:53;:::i;:::-;25185:63;;25140:118;25325:3;25314:9;25310:19;25297:33;25357:18;25349:6;25346:30;25343:117;;;25379:79;;:::i;:::-;25343:117;25484:62;25538:7;25529:6;25518:9;25514:22;25484:62;:::i;:::-;25474:72;;25268:288;24474:1089;;;;;;;;:::o;25569:229::-;25709:34;25705:1;25697:6;25693:14;25686:58;25778:12;25773:2;25765:6;25761:15;25754:37;25569:229;:::o;25804:366::-;25946:3;25967:67;26031:2;26026:3;25967:67;:::i;:::-;25960:74;;26043:93;26132:3;26043:93;:::i;:::-;26161:2;26156:3;26152:12;26145:19;;25804:366;;;:::o;26176:419::-;26342:4;26380:2;26369:9;26365:18;26357:26;;26429:9;26423:4;26419:20;26415:1;26404:9;26400:17;26393:47;26457:131;26583:4;26457:131;:::i;:::-;26449:139;;26176:419;;;:::o;26601:180::-;26649:77;26646:1;26639:88;26746:4;26743:1;26736:15;26770:4;26767:1;26760:15;26787:320;26831:6;26868:1;26862:4;26858:12;26848:22;;26915:1;26909:4;26905:12;26936:18;26926:81;;26992:4;26984:6;26980:17;26970:27;;26926:81;27054:2;27046:6;27043:14;27023:18;27020:38;27017:84;;27073:18;;:::i;:::-;27017:84;26838:269;26787:320;;;:::o;27113:180::-;27253:32;27249:1;27241:6;27237:14;27230:56;27113:180;:::o;27299:366::-;27441:3;27462:67;27526:2;27521:3;27462:67;:::i;:::-;27455:74;;27538:93;27627:3;27538:93;:::i;:::-;27656:2;27651:3;27647:12;27640:19;;27299:366;;;:::o;27671:419::-;27837:4;27875:2;27864:9;27860:18;27852:26;;27924:9;27918:4;27914:20;27910:1;27899:9;27895:17;27888:47;27952:131;28078:4;27952:131;:::i;:::-;27944:139;;27671:419;;;:::o;28096:148::-;28198:11;28235:3;28220:18;;28096:148;;;;:::o;28250:141::-;28299:4;28322:3;28314:11;;28345:3;28342:1;28335:14;28379:4;28376:1;28366:18;28358:26;;28250:141;;;:::o;28421:874::-;28524:3;28561:5;28555:12;28590:36;28616:9;28590:36;:::i;:::-;28642:89;28724:6;28719:3;28642:89;:::i;:::-;28635:96;;28762:1;28751:9;28747:17;28778:1;28773:166;;;;28953:1;28948:341;;;;28740:549;;28773:166;28857:4;28853:9;28842;28838:25;28833:3;28826:38;28919:6;28912:14;28905:22;28897:6;28893:35;28888:3;28884:45;28877:52;;28773:166;;28948:341;29015:38;29047:5;29015:38;:::i;:::-;29075:1;29089:154;29103:6;29100:1;29097:13;29089:154;;;29177:7;29171:14;29167:1;29162:3;29158:11;29151:35;29227:1;29218:7;29214:15;29203:26;;29125:4;29122:1;29118:12;29113:17;;29089:154;;;29272:6;29267:3;29263:16;29256:23;;28955:334;;28740:549;;28528:767;;28421:874;;;;:::o;29301:390::-;29407:3;29435:39;29468:5;29435:39;:::i;:::-;29490:89;29572:6;29567:3;29490:89;:::i;:::-;29483:96;;29588:65;29646:6;29641:3;29634:4;29627:5;29623:16;29588:65;:::i;:::-;29678:6;29673:3;29669:16;29662:23;;29411:280;29301:390;;;;:::o;29697:429::-;29874:3;29896:92;29984:3;29975:6;29896:92;:::i;:::-;29889:99;;30005:95;30096:3;30087:6;30005:95;:::i;:::-;29998:102;;30117:3;30110:10;;29697:429;;;;;:::o;30132:225::-;30272:34;30268:1;30260:6;30256:14;30249:58;30341:8;30336:2;30328:6;30324:15;30317:33;30132:225;:::o;30363:366::-;30505:3;30526:67;30590:2;30585:3;30526:67;:::i;:::-;30519:74;;30602:93;30691:3;30602:93;:::i;:::-;30720:2;30715:3;30711:12;30704:19;;30363:366;;;:::o;30735:419::-;30901:4;30939:2;30928:9;30924:18;30916:26;;30988:9;30982:4;30978:20;30974:1;30963:9;30959:17;30952:47;31016:131;31142:4;31016:131;:::i;:::-;31008:139;;30735:419;;;:::o;31160:180::-;31208:77;31205:1;31198:88;31305:4;31302:1;31295:15;31329:4;31326:1;31319:15;31346:191;31386:3;31405:20;31423:1;31405:20;:::i;:::-;31400:25;;31439:20;31457:1;31439:20;:::i;:::-;31434:25;;31482:1;31479;31475:9;31468:16;;31503:3;31500:1;31497:10;31494:36;;;31510:18;;:::i;:::-;31494:36;31346:191;;;;:::o;31543:230::-;31683:34;31679:1;31671:6;31667:14;31660:58;31752:13;31747:2;31739:6;31735:15;31728:38;31543:230;:::o;31779:366::-;31921:3;31942:67;32006:2;32001:3;31942:67;:::i;:::-;31935:74;;32018:93;32107:3;32018:93;:::i;:::-;32136:2;32131:3;32127:12;32120:19;;31779:366;;;:::o;32151:419::-;32317:4;32355:2;32344:9;32340:18;32332:26;;32404:9;32398:4;32394:20;32390:1;32379:9;32375:17;32368:47;32432:131;32558:4;32432:131;:::i;:::-;32424:139;;32151:419;;;:::o;32576:134::-;32634:9;32667:37;32698:5;32667:37;:::i;:::-;32654:50;;32576:134;;;:::o;32716:147::-;32811:45;32850:5;32811:45;:::i;:::-;32806:3;32799:58;32716:147;;:::o;32869:348::-;32998:4;33036:2;33025:9;33021:18;33013:26;;33049:79;33125:1;33114:9;33110:17;33101:6;33049:79;:::i;:::-;33138:72;33206:2;33195:9;33191:18;33182:6;33138:72;:::i;:::-;32869:348;;;;;:::o;33223:234::-;33363:34;33359:1;33351:6;33347:14;33340:58;33432:17;33427:2;33419:6;33415:15;33408:42;33223:234;:::o;33463:366::-;33605:3;33626:67;33690:2;33685:3;33626:67;:::i;:::-;33619:74;;33702:93;33791:3;33702:93;:::i;:::-;33820:2;33815:3;33811:12;33804:19;;33463:366;;;:::o;33835:419::-;34001:4;34039:2;34028:9;34024:18;34016:26;;34088:9;34082:4;34078:20;34074:1;34063:9;34059:17;34052:47;34116:131;34242:4;34116:131;:::i;:::-;34108:139;;33835:419;;;:::o;34260:93::-;34297:6;34344:2;34339;34332:5;34328:14;34324:23;34314:33;;34260:93;;;:::o;34359:107::-;34403:8;34453:5;34447:4;34443:16;34422:37;;34359:107;;;;:::o;34472:393::-;34541:6;34591:1;34579:10;34575:18;34614:97;34644:66;34633:9;34614:97;:::i;:::-;34732:39;34762:8;34751:9;34732:39;:::i;:::-;34720:51;;34804:4;34800:9;34793:5;34789:21;34780:30;;34853:4;34843:8;34839:19;34832:5;34829:30;34819:40;;34548:317;;34472:393;;;;;:::o;34871:142::-;34921:9;34954:53;34972:34;34981:24;34999:5;34981:24;:::i;:::-;34972:34;:::i;:::-;34954:53;:::i;:::-;34941:66;;34871:142;;;:::o;35019:75::-;35062:3;35083:5;35076:12;;35019:75;;;:::o;35100:269::-;35210:39;35241:7;35210:39;:::i;:::-;35271:91;35320:41;35344:16;35320:41;:::i;:::-;35312:6;35305:4;35299:11;35271:91;:::i;:::-;35265:4;35258:105;35176:193;35100:269;;;:::o;35375:73::-;35420:3;35375:73;:::o;35454:189::-;35531:32;;:::i;:::-;35572:65;35630:6;35622;35616:4;35572:65;:::i;:::-;35507:136;35454:189;;:::o;35649:186::-;35709:120;35726:3;35719:5;35716:14;35709:120;;;35780:39;35817:1;35810:5;35780:39;:::i;:::-;35753:1;35746:5;35742:13;35733:22;;35709:120;;;35649:186;;:::o;35841:543::-;35942:2;35937:3;35934:11;35931:446;;;35976:38;36008:5;35976:38;:::i;:::-;36060:29;36078:10;36060:29;:::i;:::-;36050:8;36046:44;36243:2;36231:10;36228:18;36225:49;;;36264:8;36249:23;;36225:49;36287:80;36343:22;36361:3;36343:22;:::i;:::-;36333:8;36329:37;36316:11;36287:80;:::i;:::-;35946:431;;35931:446;35841:543;;;:::o;36390:117::-;36444:8;36494:5;36488:4;36484:16;36463:37;;36390:117;;;;:::o;36513:169::-;36557:6;36590:51;36638:1;36634:6;36626:5;36623:1;36619:13;36590:51;:::i;:::-;36586:56;36671:4;36665;36661:15;36651:25;;36564:118;36513:169;;;;:::o;36687:295::-;36763:4;36909:29;36934:3;36928:4;36909:29;:::i;:::-;36901:37;;36971:3;36968:1;36964:11;36958:4;36955:21;36947:29;;36687:295;;;;:::o;36987:1395::-;37104:37;37137:3;37104:37;:::i;:::-;37206:18;37198:6;37195:30;37192:56;;;37228:18;;:::i;:::-;37192:56;37272:38;37304:4;37298:11;37272:38;:::i;:::-;37357:67;37417:6;37409;37403:4;37357:67;:::i;:::-;37451:1;37475:4;37462:17;;37507:2;37499:6;37496:14;37524:1;37519:618;;;;38181:1;38198:6;38195:77;;;38247:9;38242:3;38238:19;38232:26;38223:35;;38195:77;38298:67;38358:6;38351:5;38298:67;:::i;:::-;38292:4;38285:81;38154:222;37489:887;;37519:618;37571:4;37567:9;37559:6;37555:22;37605:37;37637:4;37605:37;:::i;:::-;37664:1;37678:208;37692:7;37689:1;37686:14;37678:208;;;37771:9;37766:3;37762:19;37756:26;37748:6;37741:42;37822:1;37814:6;37810:14;37800:24;;37869:2;37858:9;37854:18;37841:31;;37715:4;37712:1;37708:12;37703:17;;37678:208;;;37914:6;37905:7;37902:19;37899:179;;;37972:9;37967:3;37963:19;37957:26;38015:48;38057:4;38049:6;38045:17;38034:9;38015:48;:::i;:::-;38007:6;38000:64;37922:156;37899:179;38124:1;38120;38112:6;38108:14;38104:22;38098:4;38091:36;37526:611;;;37489:887;;37079:1303;;;36987:1395;;:::o;38388:269::-;38517:3;38539:92;38627:3;38618:6;38539:92;:::i;:::-;38532:99;;38648:3;38641:10;;38388:269;;;;:::o;38663:164::-;38803:16;38799:1;38791:6;38787:14;38780:40;38663:164;:::o;38833:366::-;38975:3;38996:67;39060:2;39055:3;38996:67;:::i;:::-;38989:74;;39072:93;39161:3;39072:93;:::i;:::-;39190:2;39185:3;39181:12;39174:19;;38833:366;;;:::o;39205:419::-;39371:4;39409:2;39398:9;39394:18;39386:26;;39458:9;39452:4;39448:20;39444:1;39433:9;39429:17;39422:47;39486:131;39612:4;39486:131;:::i;:::-;39478:139;;39205:419;;;:::o;39630:143::-;39687:5;39718:6;39712:13;39703:22;;39734:33;39761:5;39734:33;:::i;:::-;39630:143;;;;:::o;39779:351::-;39849:6;39898:2;39886:9;39877:7;39873:23;39869:32;39866:119;;;39904:79;;:::i;:::-;39866:119;40024:1;40049:64;40105:7;40096:6;40085:9;40081:22;40049:64;:::i;:::-;40039:74;;39995:128;39779:351;;;;:::o;40136:228::-;40276:34;40272:1;40264:6;40260:14;40253:58;40345:11;40340:2;40332:6;40328:15;40321:36;40136:228;:::o;40370:366::-;40512:3;40533:67;40597:2;40592:3;40533:67;:::i;:::-;40526:74;;40609:93;40698:3;40609:93;:::i;:::-;40727:2;40722:3;40718:12;40711:19;;40370:366;;;:::o;40742:419::-;40908:4;40946:2;40935:9;40931:18;40923:26;;40995:9;40989:4;40985:20;40981:1;40970:9;40966:17;40959:47;41023:131;41149:4;41023:131;:::i;:::-;41015:139;;40742:419;;;:::o;41167:180::-;41215:77;41212:1;41205:88;41312:4;41309:1;41302:15;41336:4;41333:1;41326:15;41353:233;41392:3;41415:24;41433:5;41415:24;:::i;:::-;41406:33;;41461:66;41454:5;41451:77;41448:103;;41531:18;;:::i;:::-;41448:103;41578:1;41571:5;41567:13;41560:20;;41353:233;;;:::o;41592:181::-;41732:33;41728:1;41720:6;41716:14;41709:57;41592:181;:::o;41779:366::-;41921:3;41942:67;42006:2;42001:3;41942:67;:::i;:::-;41935:74;;42018:93;42107:3;42018:93;:::i;:::-;42136:2;42131:3;42127:12;42120:19;;41779:366;;;:::o;42151:419::-;42317:4;42355:2;42344:9;42340:18;42332:26;;42404:9;42398:4;42394:20;42390:1;42379:9;42375:17;42368:47;42432:131;42558:4;42432:131;:::i;:::-;42424:139;;42151:419;;;:::o;42576:166::-;42716:18;42712:1;42704:6;42700:14;42693:42;42576:166;:::o;42748:366::-;42890:3;42911:67;42975:2;42970:3;42911:67;:::i;:::-;42904:74;;42987:93;43076:3;42987:93;:::i;:::-;43105:2;43100:3;43096:12;43089:19;;42748:366;;;:::o;43120:419::-;43286:4;43324:2;43313:9;43309:18;43301:26;;43373:9;43367:4;43363:20;43359:1;43348:9;43344:17;43337:47;43401:131;43527:4;43401:131;:::i;:::-;43393:139;;43120:419;;;:::o;43545:410::-;43585:7;43608:20;43626:1;43608:20;:::i;:::-;43603:25;;43642:20;43660:1;43642:20;:::i;:::-;43637:25;;43697:1;43694;43690:9;43719:30;43737:11;43719:30;:::i;:::-;43708:41;;43898:1;43889:7;43885:15;43882:1;43879:22;43859:1;43852:9;43832:83;43809:139;;43928:18;;:::i;:::-;43809:139;43593:362;43545:410;;;;:::o;43961:332::-;44082:4;44120:2;44109:9;44105:18;44097:26;;44133:71;44201:1;44190:9;44186:17;44177:6;44133:71;:::i;:::-;44214:72;44282:2;44271:9;44267:18;44258:6;44214:72;:::i;:::-;43961:332;;;;;:::o;44299:178::-;44439:30;44435:1;44427:6;44423:14;44416:54;44299:178;:::o;44483:366::-;44625:3;44646:67;44710:2;44705:3;44646:67;:::i;:::-;44639:74;;44722:93;44811:3;44722:93;:::i;:::-;44840:2;44835:3;44831:12;44824:19;;44483:366;;;:::o;44855:419::-;45021:4;45059:2;45048:9;45044:18;45036:26;;45108:9;45102:4;45098:20;45094:1;45083:9;45079:17;45072:47;45136:131;45262:4;45136:131;:::i;:::-;45128:139;;44855:419;;;:::o;45280:442::-;45429:4;45467:2;45456:9;45452:18;45444:26;;45480:71;45548:1;45537:9;45533:17;45524:6;45480:71;:::i;:::-;45561:72;45629:2;45618:9;45614:18;45605:6;45561:72;:::i;:::-;45643;45711:2;45700:9;45696:18;45687:6;45643:72;:::i;:::-;45280:442;;;;;;:::o;45728:137::-;45782:5;45813:6;45807:13;45798:22;;45829:30;45853:5;45829:30;:::i;:::-;45728:137;;;;:::o;45871:345::-;45938:6;45987:2;45975:9;45966:7;45962:23;45958:32;45955:119;;;45993:79;;:::i;:::-;45955:119;46113:1;46138:61;46191:7;46182:6;46171:9;46167:22;46138:61;:::i;:::-;46128:71;;46084:125;45871:345;;;;:::o;46222:173::-;46362:25;46358:1;46350:6;46346:14;46339:49;46222:173;:::o;46401:366::-;46543:3;46564:67;46628:2;46623:3;46564:67;:::i;:::-;46557:74;;46640:93;46729:3;46640:93;:::i;:::-;46758:2;46753:3;46749:12;46742:19;;46401:366;;;:::o;46773:419::-;46939:4;46977:2;46966:9;46962:18;46954:26;;47026:9;47020:4;47016:20;47012:1;47001:9;46997:17;46990:47;47054:131;47180:4;47054:131;:::i;:::-;47046:139;;46773:419;;;:::o;47198:94::-;47231:8;47279:5;47275:2;47271:14;47250:35;;47198:94;;;:::o;47298:::-;47337:7;47366:20;47380:5;47366:20;:::i;:::-;47355:31;;47298:94;;;:::o;47398:100::-;47437:7;47466:26;47486:5;47466:26;:::i;:::-;47455:37;;47398:100;;;:::o;47504:157::-;47609:45;47629:24;47647:5;47629:24;:::i;:::-;47609:45;:::i;:::-;47604:3;47597:58;47504:157;;:::o;47667:256::-;47779:3;47794:75;47865:3;47856:6;47794:75;:::i;:::-;47894:2;47889:3;47885:12;47878:19;;47914:3;47907:10;;47667:256;;;;:::o;47929:180::-;47977:77;47974:1;47967:88;48074:4;48071:1;48064:15;48098:4;48095:1;48088:15;48115:185;48155:1;48172:20;48190:1;48172:20;:::i;:::-;48167:25;;48206:20;48224:1;48206:20;:::i;:::-;48201:25;;48245:1;48235:35;;48250:18;;:::i;:::-;48235:35;48292:1;48289;48285:9;48280:14;;48115:185;;;;:::o;48306:108::-;48353:7;48382:26;48402:5;48382:26;:::i;:::-;48371:37;;48306:108;;;:::o;48420:189::-;48541:61;48569:32;48595:5;48569:32;:::i;:::-;48541:61;:::i;:::-;48536:3;48529:74;48420:189;;:::o;48615:288::-;48743:3;48758:91;48845:3;48836:6;48758:91;:::i;:::-;48874:2;48869:3;48865:12;48858:19;;48894:3;48887:10;;48615:288;;;;:::o;48909:79::-;48948:7;48977:5;48966:16;;48909:79;;;:::o;48994:157::-;49099:45;49119:24;49137:5;49119:24;:::i;:::-;49099:45;:::i;:::-;49094:3;49087:58;48994:157;;:::o;49157:256::-;49269:3;49284:75;49355:3;49346:6;49284:75;:::i;:::-;49384:2;49379:3;49375:12;49368:19;;49404:3;49397:10;;49157:256;;;;:::o;49419:176::-;49451:1;49468:20;49486:1;49468:20;:::i;:::-;49463:25;;49502:20;49520:1;49502:20;:::i;:::-;49497:25;;49541:1;49531:35;;49546:18;;:::i;:::-;49531:35;49587:1;49584;49580:9;49575:14;;49419:176;;;;:::o;49601:225::-;49741:34;49737:1;49729:6;49725:14;49718:58;49810:8;49805:2;49797:6;49793:15;49786:33;49601:225;:::o;49832:366::-;49974:3;49995:67;50059:2;50054:3;49995:67;:::i;:::-;49988:74;;50071:93;50160:3;50071:93;:::i;:::-;50189:2;50184:3;50180:12;50173:19;;49832:366;;;:::o;50204:419::-;50370:4;50408:2;50397:9;50393:18;50385:26;;50457:9;50451:4;50447:20;50443:1;50432:9;50428:17;50421:47;50485:131;50611:4;50485:131;:::i;:::-;50477:139;;50204:419;;;:::o;50629:182::-;50769:34;50765:1;50757:6;50753:14;50746:58;50629:182;:::o;50817:366::-;50959:3;50980:67;51044:2;51039:3;50980:67;:::i;:::-;50973:74;;51056:93;51145:3;51056:93;:::i;:::-;51174:2;51169:3;51165:12;51158:19;;50817:366;;;:::o;51189:419::-;51355:4;51393:2;51382:9;51378:18;51370:26;;51442:9;51436:4;51432:20;51428:1;51417:9;51413:17;51406:47;51470:131;51596:4;51470:131;:::i;:::-;51462:139;;51189:419;;;:::o;51614:194::-;51654:4;51674:20;51692:1;51674:20;:::i;:::-;51669:25;;51708:20;51726:1;51708:20;:::i;:::-;51703:25;;51752:1;51749;51745:9;51737:17;;51776:1;51770:4;51767:11;51764:37;;;51781:18;;:::i;:::-;51764:37;51614:194;;;;:::o;51814:179::-;51954:31;51950:1;51942:6;51938:14;51931:55;51814:179;:::o;51999:366::-;52141:3;52162:67;52226:2;52221:3;52162:67;:::i;:::-;52155:74;;52238:93;52327:3;52238:93;:::i;:::-;52356:2;52351:3;52347:12;52340:19;;51999:366;;;:::o;52371:419::-;52537:4;52575:2;52564:9;52560:18;52552:26;;52624:9;52618:4;52614:20;52610:1;52599:9;52595:17;52588:47;52652:131;52778:4;52652:131;:::i;:::-;52644:139;;52371:419;;;:::o;52796:147::-;52897:11;52934:3;52919:18;;52796:147;;;;:::o;52949:114::-;;:::o;53069:398::-;53228:3;53249:83;53330:1;53325:3;53249:83;:::i;:::-;53242:90;;53341:93;53430:3;53341:93;:::i;:::-;53459:1;53454:3;53450:11;53443:18;;53069:398;;;:::o;53473:379::-;53657:3;53679:147;53822:3;53679:147;:::i;:::-;53672:154;;53843:3;53836:10;;53473:379;;;:::o;53858:245::-;53998:34;53994:1;53986:6;53982:14;53975:58;54067:28;54062:2;54054:6;54050:15;54043:53;53858:245;:::o;54109:366::-;54251:3;54272:67;54336:2;54331:3;54272:67;:::i;:::-;54265:74;;54348:93;54437:3;54348:93;:::i;:::-;54466:2;54461:3;54457:12;54450:19;;54109:366;;;:::o;54481:419::-;54647:4;54685:2;54674:9;54670:18;54662:26;;54734:9;54728:4;54724:20;54720:1;54709:9;54705:17;54698:47;54762:131;54888:4;54762:131;:::i;:::-;54754:139;;54481:419;;;:::o;54906:227::-;55046:34;55042:1;55034:6;55030:14;55023:58;55115:10;55110:2;55102:6;55098:15;55091:35;54906:227;:::o;55139:366::-;55281:3;55302:67;55366:2;55361:3;55302:67;:::i;:::-;55295:74;;55378:93;55467:3;55378:93;:::i;:::-;55496:2;55491:3;55487:12;55480:19;;55139:366;;;:::o;55511:419::-;55677:4;55715:2;55704:9;55700:18;55692:26;;55764:9;55758:4;55754:20;55750:1;55739:9;55735:17;55728:47;55792:131;55918:4;55792:131;:::i;:::-;55784:139;;55511:419;;;:::o;55936:224::-;56076:34;56072:1;56064:6;56060:14;56053:58;56145:7;56140:2;56132:6;56128:15;56121:32;55936:224;:::o;56166:366::-;56308:3;56329:67;56393:2;56388:3;56329:67;:::i;:::-;56322:74;;56405:93;56494:3;56405:93;:::i;:::-;56523:2;56518:3;56514:12;56507:19;;56166:366;;;:::o;56538:419::-;56704:4;56742:2;56731:9;56727:18;56719:26;;56791:9;56785:4;56781:20;56777:1;56766:9;56762:17;56755:47;56819:131;56945:4;56819:131;:::i;:::-;56811:139;;56538:419;;;:::o;56963:229::-;57103:34;57099:1;57091:6;57087:14;57080:58;57172:12;57167:2;57159:6;57155:15;57148:37;56963:229;:::o;57198:366::-;57340:3;57361:67;57425:2;57420:3;57361:67;:::i;:::-;57354:74;;57437:93;57526:3;57437:93;:::i;:::-;57555:2;57550:3;57546:12;57539:19;;57198:366;;;:::o;57570:419::-;57736:4;57774:2;57763:9;57759:18;57751:26;;57823:9;57817:4;57813:20;57809:1;57798:9;57794:17;57787:47;57851:131;57977:4;57851:131;:::i;:::-;57843:139;;57570:419;;;:::o;57995:634::-;58216:4;58254:2;58243:9;58239:18;58231:26;;58303:9;58297:4;58293:20;58289:1;58278:9;58274:17;58267:47;58331:108;58434:4;58425:6;58331:108;:::i;:::-;58323:116;;58486:9;58480:4;58476:20;58471:2;58460:9;58456:18;58449:48;58514:108;58617:4;58608:6;58514:108;:::i;:::-;58506:116;;57995:634;;;;;:::o;58635:442::-;58784:4;58822:2;58811:9;58807:18;58799:26;;58835:71;58903:1;58892:9;58888:17;58879:6;58835:71;:::i;:::-;58916:72;58984:2;58973:9;58969:18;58960:6;58916:72;:::i;:::-;58998;59066:2;59055:9;59051:18;59042:6;58998:72;:::i;:::-;58635:442;;;;;;:::o;59083:222::-;59223:34;59219:1;59211:6;59207:14;59200:58;59292:5;59287:2;59279:6;59275:15;59268:30;59083:222;:::o;59311:366::-;59453:3;59474:67;59538:2;59533:3;59474:67;:::i;:::-;59467:74;;59550:93;59639:3;59550:93;:::i;:::-;59668:2;59663:3;59659:12;59652:19;;59311:366;;;:::o;59683:419::-;59849:4;59887:2;59876:9;59872:18;59864:26;;59936:9;59930:4;59926:20;59922:1;59911:9;59907:17;59900:47;59964:131;60090:4;59964:131;:::i;:::-;59956:139;;59683:419;;;:::o;60108:223::-;60248:34;60244:1;60236:6;60232:14;60225:58;60317:6;60312:2;60304:6;60300:15;60293:31;60108:223;:::o;60337:366::-;60479:3;60500:67;60564:2;60559:3;60500:67;:::i;:::-;60493:74;;60576:93;60665:3;60576:93;:::i;:::-;60694:2;60689:3;60685:12;60678:19;;60337:366;;;:::o;60709:419::-;60875:4;60913:2;60902:9;60898:18;60890:26;;60962:9;60956:4;60952:20;60948:1;60937:9;60933:17;60926:47;60990:131;61116:4;60990:131;:::i;:::-;60982:139;;60709:419;;;:::o;61134:332::-;61255:4;61293:2;61282:9;61278:18;61270:26;;61306:71;61374:1;61363:9;61359:17;61350:6;61306:71;:::i;:::-;61387:72;61455:2;61444:9;61440:18;61431:6;61387:72;:::i;:::-;61134:332;;;;;:::o;61472:220::-;61612:34;61608:1;61600:6;61596:14;61589:58;61681:3;61676:2;61668:6;61664:15;61657:28;61472:220;:::o;61698:366::-;61840:3;61861:67;61925:2;61920:3;61861:67;:::i;:::-;61854:74;;61937:93;62026:3;61937:93;:::i;:::-;62055:2;62050:3;62046:12;62039:19;;61698:366;;;:::o;62070:419::-;62236:4;62274:2;62263:9;62259:18;62251:26;;62323:9;62317:4;62313:20;62309:1;62298:9;62294:17;62287:47;62351:131;62477:4;62351:131;:::i;:::-;62343:139;;62070:419;;;:::o;62495:98::-;62546:6;62580:5;62574:12;62564:22;;62495:98;;;:::o;62599:168::-;62682:11;62716:6;62711:3;62704:19;62756:4;62751:3;62747:14;62732:29;;62599:168;;;;:::o;62773:373::-;62859:3;62887:38;62919:5;62887:38;:::i;:::-;62941:70;63004:6;62999:3;62941:70;:::i;:::-;62934:77;;63020:65;63078:6;63073:3;63066:4;63059:5;63055:16;63020:65;:::i;:::-;63110:29;63132:6;63110:29;:::i;:::-;63105:3;63101:39;63094:46;;62863:283;62773:373;;;;:::o;63152:1053::-;63475:4;63513:3;63502:9;63498:19;63490:27;;63527:71;63595:1;63584:9;63580:17;63571:6;63527:71;:::i;:::-;63608:72;63676:2;63665:9;63661:18;63652:6;63608:72;:::i;:::-;63727:9;63721:4;63717:20;63712:2;63701:9;63697:18;63690:48;63755:108;63858:4;63849:6;63755:108;:::i;:::-;63747:116;;63910:9;63904:4;63900:20;63895:2;63884:9;63880:18;63873:48;63938:108;64041:4;64032:6;63938:108;:::i;:::-;63930:116;;64094:9;64088:4;64084:20;64078:3;64067:9;64063:19;64056:49;64122:76;64193:4;64184:6;64122:76;:::i;:::-;64114:84;;63152:1053;;;;;;;;:::o;64211:141::-;64267:5;64298:6;64292:13;64283:22;;64314:32;64340:5;64314:32;:::i;:::-;64211:141;;;;:::o;64358:349::-;64427:6;64476:2;64464:9;64455:7;64451:23;64447:32;64444:119;;;64482:79;;:::i;:::-;64444:119;64602:1;64627:63;64682:7;64673:6;64662:9;64658:22;64627:63;:::i;:::-;64617:73;;64573:127;64358:349;;;;:::o;64713:106::-;64757:8;64806:5;64801:3;64797:15;64776:36;;64713:106;;;:::o;64825:183::-;64860:3;64898:1;64880:16;64877:23;64874:128;;;64936:1;64933;64930;64915:23;64958:34;64989:1;64983:8;64958:34;:::i;:::-;64951:41;;64874:128;64825:183;:::o;65014:711::-;65053:3;65091:4;65073:16;65070:26;65099:5;65067:39;65128:20;;:::i;:::-;65203:1;65185:16;65181:24;65178:1;65172:4;65157:49;65236:4;65230:11;65335:16;65328:4;65320:6;65316:17;65313:39;65280:18;65272:6;65269:30;65253:113;65250:146;;;65381:5;;;;65250:146;65427:6;65421:4;65417:17;65463:3;65457:10;65490:18;65482:6;65479:30;65476:43;;;65512:5;;;;;;65476:43;65560:6;65553:4;65548:3;65544:14;65540:27;65619:1;65601:16;65597:24;65591:4;65587:35;65582:3;65579:44;65576:57;;;65626:5;;;;;;;65576:57;65643;65691:6;65685:4;65681:17;65673:6;65669:30;65663:4;65643:57;:::i;:::-;65716:3;65709:10;;65057:668;;;;;65014:711;;:::o;65731:239::-;65871:34;65867:1;65859:6;65855:14;65848:58;65940:22;65935:2;65927:6;65923:15;65916:47;65731:239;:::o;65976:366::-;66118:3;66139:67;66203:2;66198:3;66139:67;:::i;:::-;66132:74;;66215:93;66304:3;66215:93;:::i;:::-;66333:2;66328:3;66324:12;66317:19;;65976:366;;;:::o;66348:419::-;66514:4;66552:2;66541:9;66537:18;66529:26;;66601:9;66595:4;66591:20;66587:1;66576:9;66572:17;66565:47;66629:131;66755:4;66629:131;:::i;:::-;66621:139;;66348:419;;;:::o;66773:227::-;66913:34;66909:1;66901:6;66897:14;66890:58;66982:10;66977:2;66969:6;66965:15;66958:35;66773:227;:::o;67006:366::-;67148:3;67169:67;67233:2;67228:3;67169:67;:::i;:::-;67162:74;;67245:93;67334:3;67245:93;:::i;:::-;67363:2;67358:3;67354:12;67347:19;;67006:366;;;:::o;67378:419::-;67544:4;67582:2;67571:9;67567:18;67559:26;;67631:9;67625:4;67621:20;67617:1;67606:9;67602:17;67595:47;67659:131;67785:4;67659:131;:::i;:::-;67651:139;;67378:419;;;:::o;67803:229::-;67943:34;67939:1;67931:6;67927:14;67920:58;68012:12;68007:2;67999:6;67995:15;67988:37;67803:229;:::o;68038:366::-;68180:3;68201:67;68265:2;68260:3;68201:67;:::i;:::-;68194:74;;68277:93;68366:3;68277:93;:::i;:::-;68395:2;68390:3;68386:12;68379:19;;68038:366;;;:::o;68410:419::-;68576:4;68614:2;68603:9;68599:18;68591:26;;68663:9;68657:4;68653:20;68649:1;68638:9;68634:17;68627:47;68691:131;68817:4;68691:131;:::i;:::-;68683:139;;68410:419;;;:::o;68835:228::-;68975:34;68971:1;68963:6;68959:14;68952:58;69044:11;69039:2;69031:6;69027:15;69020:36;68835:228;:::o;69069:366::-;69211:3;69232:67;69296:2;69291:3;69232:67;:::i;:::-;69225:74;;69308:93;69397:3;69308:93;:::i;:::-;69426:2;69421:3;69417:12;69410:19;;69069:366;;;:::o;69441:419::-;69607:4;69645:2;69634:9;69630:18;69622:26;;69694:9;69688:4;69684:20;69680:1;69669:9;69665:17;69658:47;69722:131;69848:4;69722:131;:::i;:::-;69714:139;;69441:419;;;:::o;69866:751::-;70089:4;70127:3;70116:9;70112:19;70104:27;;70141:71;70209:1;70198:9;70194:17;70185:6;70141:71;:::i;:::-;70222:72;70290:2;70279:9;70275:18;70266:6;70222:72;:::i;:::-;70304;70372:2;70361:9;70357:18;70348:6;70304:72;:::i;:::-;70386;70454:2;70443:9;70439:18;70430:6;70386:72;:::i;:::-;70506:9;70500:4;70496:20;70490:3;70479:9;70475:19;70468:49;70534:76;70605:4;70596:6;70534:76;:::i;:::-;70526:84;;69866:751;;;;;;;;:::o;70623:225::-;70763:34;70759:1;70751:6;70747:14;70740:58;70832:8;70827:2;70819:6;70815:15;70808:33;70623:225;:::o;70854:366::-;70996:3;71017:67;71081:2;71076:3;71017:67;:::i;:::-;71010:74;;71093:93;71182:3;71093:93;:::i;:::-;71211:2;71206:3;71202:12;71195:19;;70854:366;;;:::o;71226:419::-;71392:4;71430:2;71419:9;71415:18;71407:26;;71479:9;71473:4;71469:20;71465:1;71454:9;71450:17;71443:47;71507:131;71633:4;71507:131;:::i;:::-;71499:139;;71226:419;;;:::o;71651:179::-;71791:31;71787:1;71779:6;71775:14;71768:55;71651:179;:::o;71836:366::-;71978:3;71999:67;72063:2;72058:3;71999:67;:::i;:::-;71992:74;;72075:93;72164:3;72075:93;:::i;:::-;72193:2;72188:3;72184:12;72177:19;;71836:366;;;:::o;72208:419::-;72374:4;72412:2;72401:9;72397:18;72389:26;;72461:9;72455:4;72451:20;72447:1;72436:9;72432:17;72425:47;72489:131;72615:4;72489:131;:::i;:::-;72481:139;;72208:419;;;:::o;72633:386::-;72737:3;72765:38;72797:5;72765:38;:::i;:::-;72819:88;72900:6;72895:3;72819:88;:::i;:::-;72812:95;;72916:65;72974:6;72969:3;72962:4;72955:5;72951:16;72916:65;:::i;:::-;73006:6;73001:3;72997:16;72990:23;;72741:278;72633:386;;;;:::o;73025:271::-;73155:3;73177:93;73266:3;73257:6;73177:93;:::i;:::-;73170:100;;73287:3;73280:10;;73025:271;;;;:::o

Swarm Source

ipfs://bfc7d3e826612d23ab5127ccd425b048687c96e560598e3af64ed27c18ec0ee0
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.