ETH Price: $3,311.41 (-3.57%)
Gas: 18 Gwei

Token

 

Overview

Max Total Supply

0

Holders

388

Total Transfers

-

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
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:
QMCapsule

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

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

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

pragma solidity ^0.8.0;

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


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

// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be 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.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/utils/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]

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

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: balance query for the zero address");
        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 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: transfer caller is not 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();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), 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);

        _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);

        _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();

        _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data);

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

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

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * 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);

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

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * 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();

        _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

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

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * 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);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "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 `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 _beforeTokenTransfer(
        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/token/ERC1155/extensions/[email protected]


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Burnable.sol)

pragma solidity ^0.8.0;

/**
 * @dev Extension of {ERC1155} that allows token holders to destroy both their
 * own tokens and those that they have been approved to use.
 *
 * _Available since v3.1._
 */
abstract contract ERC1155Burnable is ERC1155 {
    function burn(
        address account,
        uint256 id,
        uint256 value
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burn(account, id, value);
    }

    function burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory values
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burnBatch(account, ids, values);
    }
}


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

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

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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from,
        address to,
        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);
}


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

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

pragma solidity ^0.8.0;

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

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

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

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

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


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

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

pragma solidity ^0.8.0;

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

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

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

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

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


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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


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

// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

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


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

// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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


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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


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

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

pragma solidity ^0.8.0;


// File contracts/QMCapsule.sol

pragma solidity ^0.8.0;









contract QMCapsule is ERC1155, ERC1155Burnable, Ownable, Pausable, ReentrancyGuard {

    using Strings for uint256;
    using Counters for Counters.Counter;

    string public baseExtension = ".json";

    uint private constant PAIRED_CAP_RED = 1;
    uint private constant PAIRED_CAP_ORANGE = 2;
    uint private constant PAIRED_CAP_YELLOW = 3;
    uint private constant PAIRED_CAP_GREEN = 4;
    uint private constant PAIRED_CAP_BLUE = 5;
    uint private constant PAIRED_CAP_PURPLE = 6;
    uint private constant PAIRED_CAP_BLACK = 7;
    uint private constant PAIRED_CAP_SILVER = 8;
    uint private constant PAIRED_CAP_GOLD = 9;
    
    uint public constant MAX_TOKEN_COUNT = 9;
    uint private constant BATCH_LIMIT = 20;

    uint256 private nonce;

    string public baseURI = "";

    mapping(address => bool) public approvedContractList;
    mapping(address => mapping(uint => bool)) public claimList;

    event Claim(address indexed _nftContract, uint256 _tokenId, address _claimant, uint256 _mintedId);
    event BatchClaim(address[] _nftContracts, uint256[] _tokenIds, address _claimant, uint256[] _mintedIds);
    event BatchOwnerClaim(address[] _nftContracts, uint256[] _tokenIds, address[] _claimants, uint256[] _mintedIds);
    event ApprovedContractAdded(address indexed _nftContract);

    constructor() ERC1155(baseURI) {
        pauseClaim();
    }

    function uri(uint _tokenId) public view override returns (string memory) {
        require(_tokenId > 0 && _tokenId <= MAX_TOKEN_COUNT, "URI requested for invalid token");
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, _tokenId.toString(), baseExtension)) : baseURI;
    }

    function isClaimed(address _contract, uint _tokenId) public view returns (bool) {
        return claimList[_contract][_tokenId] ? true : false;
    }

    function batchClaim(address[] calldata _contracts, uint[] calldata _tokenIds)  public whenNotPaused nonReentrant returns (uint[] memory) {
        require(_contracts.length <= BATCH_LIMIT, "QM: Batch Contracts more than limit");
        require(_tokenIds.length <= BATCH_LIMIT, "QM: Token IDs more than limit");
        require(_contracts.length == _tokenIds.length, "QM: Size should be the same");

        uint[] memory tokenIdsMinted = new uint[](_contracts.length);

        for (uint i = 0; i < _contracts.length; ++i) {
            uint id = _claim(_contracts[i], _tokenIds[i]);
            tokenIdsMinted[i] = id;
        }

        emit BatchClaim(_contracts, _tokenIds, msg.sender, tokenIdsMinted);
        
        return tokenIdsMinted;
    }


    function ownerBatchClaim(address[] calldata _owners, address[] calldata _contracts, uint[] calldata _tokenIds)  public nonReentrant onlyOwner returns (uint[] memory) {
        require(_contracts.length <= BATCH_LIMIT, "QM: Batch more than limit");
        require(_contracts.length == _tokenIds.length && _owners.length == _tokenIds.length, "QM: Size should be the same");

        uint[] memory tokenIdsMinted = new uint[](_contracts.length);

        for (uint i = 0; i < _contracts.length; ++i) {
            uint id = _ownerOnlyclaim(_owners[i], _contracts[i], _tokenIds[i]);
            tokenIdsMinted[i] = id;
        }

        emit BatchOwnerClaim(_contracts, _tokenIds, _owners, tokenIdsMinted);
        
        return tokenIdsMinted;
    }

    function claim(address _contract, uint _tokenId) public whenNotPaused nonReentrant returns (uint) {

        uint tokenIdMinted = _claim(_contract, _tokenId);

        emit Claim(_contract, _tokenId, msg.sender, tokenIdMinted);
        return tokenIdMinted;
    }

    function _claim(address _contract, uint _tokenId) private returns (uint) {

        require(approvedContractList[_contract], "QM: Not on approved list");
        require(claimList[_contract][_tokenId] == false, "QM: Capsule already claimed");
        
        address tokenOwner = IERC721(_contract).ownerOf(_tokenId);
        require(tokenOwner == msg.sender, "QM: Sender not owner");

        claimList[_contract][_tokenId] = true;
        uint tokenIdMinted = _randomMintCapsule(msg.sender);

        return tokenIdMinted;
    }

    function _ownerOnlyclaim(address _owner, address _contract, uint _tokenId) private returns (uint) {

        require(approvedContractList[_contract], "QM: Not on approved list");
        require(claimList[_contract][_tokenId] == false, "QM: Capsule already claimed");

        claimList[_contract][_tokenId] = true;
        uint tokenIdMinted = _randomMintCapsule(_owner);

        return tokenIdMinted;
    }

    function _randomMintCapsule(address _recipient) private returns(uint){

        uint randomnumber = uint(keccak256(abi.encodePacked(block.timestamp, msg.sender, nonce))) % MAX_TOKEN_COUNT;
        randomnumber = randomnumber + 1;
        nonce++;

        _mint(_recipient, randomnumber, 1, "");

        return randomnumber;
    }

    function ownerMint(uint _tokenId, uint256 qty) public onlyOwner{
        require(_tokenId > 0 && _tokenId <= MAX_TOKEN_COUNT, "QM: Invalid Token ID");
        _mint(owner(), _tokenId, qty, "");
    }

    function addApproveContract(address _contract) public onlyOwner {
        approvedContractList[_contract] = true;
        emit ApprovedContractAdded(_contract);
    }

    function pauseClaim() public onlyOwner {
        _pause();
    }

    function unpauseClaim() public onlyOwner {
        _unpause();
    }

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

    function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
        baseExtension = _newBaseExtension;
    }
    
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) override internal virtual {}

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_nftContract","type":"address"}],"name":"ApprovedContractAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"_nftContracts","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"_claimant","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"_mintedIds","type":"uint256[]"}],"name":"BatchClaim","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"_nftContracts","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"address[]","name":"_claimants","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"_mintedIds","type":"uint256[]"}],"name":"BatchOwnerClaim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_nftContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"_claimant","type":"address"},{"indexed":false,"internalType":"uint256","name":"_mintedId","type":"uint256"}],"name":"Claim","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"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MAX_TOKEN_COUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"addApproveContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"approvedContractList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_contracts","type":"address[]"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"batchClaim","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"claim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"address","name":"_contract","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_owners","type":"address[]"},{"internalType":"address[]","name":"_contracts","type":"address[]"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"ownerBatchClaim","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpauseClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060059080519060200190620000519291906200040a565b506040518060200160405280600081525060079080519060200190620000799291906200040a565b503480156200008757600080fd5b50600780546200009790620005bf565b80601f0160208091040260200160405190810160405280929190818152602001828054620000c590620005bf565b8015620001165780601f10620000ea5761010080835404028352916020019162000116565b820191906000526020600020905b815481529060010190602001808311620000f857829003601f168201915b50505050506200012c816200018660201b60201c565b506200014d62000141620001a260201b60201c565b620001aa60201b60201c565b6000600360146101000a81548160ff0219169083151502179055506001600481905550620001806200027060201b60201c565b62000676565b80600290805190602001906200019e9291906200040a565b5050565b600033905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000280620001a260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002a66200031160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002ff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002f69062000558565b60405180910390fd5b6200030f6200033b60201b60201c565b565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6200034b620003f360201b60201c565b156200038e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003859062000536565b60405180910390fd5b6001600360146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620003da620001a260201b60201c565b604051620003e9919062000519565b60405180910390a1565b6000600360149054906101000a900460ff16905090565b8280546200041890620005bf565b90600052602060002090601f0160209004810192826200043c576000855562000488565b82601f106200045757805160ff191683800117855562000488565b8280016001018555821562000488579182015b82811115620004875782518255916020019190600101906200046a565b5b5090506200049791906200049b565b5090565b5b80821115620004b65760008160009055506001016200049c565b5090565b620004c5816200058b565b82525050565b6000620004da6010836200057a565b9150620004e78262000624565b602082019050919050565b6000620005016020836200057a565b91506200050e826200064d565b602082019050919050565b6000602082019050620005306000830184620004ba565b92915050565b600060208201905081810360008301526200055181620004cb565b9050919050565b600060208201905081810360008301526200057381620004f2565b9050919050565b600082825260208201905092915050565b600062000598826200059f565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006002820490506001821680620005d857607f821691505b60208210811415620005ef57620005ee620005f5565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b615a2380620006866000396000f3fe608060405234801561001057600080fd5b50600436106101ce5760003560e01c80638da5cb5b11610104578063d47573d4116100a2578063ea54536011610071578063ea5453601461052b578063f242432a1461055b578063f2fde38b14610577578063f5298aca14610593576101ce565b8063d47573d4146104b9578063da3ef23f146104d5578063de065caa146104f1578063e985e9c5146104fb576101ce565b8063aad3ec96116100de578063aad3ec961461041d578063bcca57181461044d578063c66828621461047d578063d0bbb0d71461049b576101ce565b80638da5cb5b146103d95780638ff095f9146103f7578063a22cb46514610401576101ce565b8063562beba8116101715780636b20c4541161014b5780636b20c454146103655780636c0360eb14610381578063715018a61461039f57806379f67c5a146103a9576101ce565b8063562beba8146102e75780635c975abb146103175780636003760914610335576101ce565b80631c4b52ca116101ad5780631c4b52ca146102635780632eb2c2d61461027f5780634e1273f41461029b57806355f804b3146102cb576101ce565b8062fdd58e146101d357806301ffc9a7146102035780630e89341c14610233575b600080fd5b6101ed60048036038101906101e89190613c84565b6105af565b6040516101fa9190614c6d565b60405180910390f35b61021d60048036038101906102189190613ec4565b610678565b60405161022a91906148d0565b60405180910390f35b61024d60048036038101906102489190613f67565b61075a565b60405161025a91906148eb565b60405180910390f35b61027d600480360381019061027891906139b9565b610888565b005b61029960048036038101906102949190613a53565b6109a2565b005b6102b560048036038101906102b09190613e4c565b610a43565b6040516102c29190614877565b60405180910390f35b6102e560048036038101906102e09190613f1e565b610b5c565b005b61030160048036038101906102fc9190613c84565b610bf2565b60405161030e91906148d0565b60405180910390f35b61031f610c68565b60405161032c91906148d0565b60405180910390f35b61034f600480360381019061034a9190613c84565b610c7f565b60405161035c91906148d0565b60405180910390f35b61037f600480360381019061037a9190613bb9565b610cae565b005b610389610d4b565b60405161039691906148eb565b60405180910390f35b6103a7610dd9565b005b6103c360048036038101906103be9190613dcb565b610e61565b6040516103d09190614877565b60405180910390f35b6103e1611103565b6040516103ee91906146d5565b60405180910390f35b6103ff61112d565b005b61041b60048036038101906104169190613c44565b6111b3565b005b61043760048036038101906104329190613c84565b6111c9565b6040516104449190614c6d565b60405180910390f35b610467600480360381019061046291906139b9565b6112d3565b60405161047491906148d0565b60405180910390f35b6104856112f3565b60405161049291906148eb565b60405180910390f35b6104a3611381565b6040516104b09190614c6d565b60405180910390f35b6104d360048036038101906104ce9190613f94565b611386565b005b6104ef60048036038101906104ea9190613f1e565b611478565b005b6104f961150e565b005b61051560048036038101906105109190613a13565b611594565b60405161052291906148d0565b60405180910390f35b61054560048036038101906105409190613d17565b611628565b6040516105529190614877565b60405180910390f35b61057560048036038101906105709190613b22565b6118f4565b005b610591600480360381019061058c91906139b9565b611995565b005b6105ad60048036038101906105a89190613cc4565b611a8d565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610620576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610617906149ad565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061074357507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610753575061075282611b2a565b5b9050919050565b606060008211801561076d575060098211155b6107ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a390614b8d565b60405180910390fd5b6000600780546107bb90615008565b90501161085257600780546107cf90615008565b80601f01602080910402602001604051908101604052809291908181526020018280546107fb90615008565b80156108485780601f1061081d57610100808354040283529160200191610848565b820191906000526020600020905b81548152906001019060200180831161082b57829003601f168201915b5050505050610881565b600761085d83611b94565b600560405160200161087193929190614667565b6040516020818303038152906040525b9050919050565b610890611cf5565b73ffffffffffffffffffffffffffffffffffffffff166108ae611103565b73ffffffffffffffffffffffffffffffffffffffff1614610904576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fb90614b4d565b60405180910390fd5b6001600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f5683d1953e05cdddcad1418c4d742e8aba319cbbe48a31f7501f3f83f061048560405160405180910390a250565b6109aa611cf5565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806109f057506109ef856109ea611cf5565b611594565b5b610a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2690614aad565b60405180910390fd5b610a3c8585858585611cfd565b5050505050565b60608151835114610a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8090614bcd565b60405180910390fd5b6000835167ffffffffffffffff811115610aa657610aa56151cf565b5b604051908082528060200260200182016040528015610ad45781602001602082028036833780820191505090505b50905060005b8451811015610b5157610b21858281518110610af957610af86151a0565b5b6020026020010151858381518110610b1457610b136151a0565b5b60200260200101516105af565b828281518110610b3457610b336151a0565b5b60200260200101818152505080610b4a9061506b565b9050610ada565b508091505092915050565b610b64611cf5565b73ffffffffffffffffffffffffffffffffffffffff16610b82611103565b73ffffffffffffffffffffffffffffffffffffffff1614610bd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcf90614b4d565b60405180910390fd5b8060079080519060200190610bee9291906135d0565b5050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff16610c5d576000610c60565b60015b905092915050565b6000600360149054906101000a900460ff16905090565b60096020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b610cb6611cf5565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610cfc5750610cfb83610cf6611cf5565b611594565b5b610d3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3290614a0d565b60405180910390fd5b610d46838383612011565b505050565b60078054610d5890615008565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8490615008565b8015610dd15780601f10610da657610100808354040283529160200191610dd1565b820191906000526020600020905b815481529060010190602001808311610db457829003601f168201915b505050505081565b610de1611cf5565b73ffffffffffffffffffffffffffffffffffffffff16610dff611103565b73ffffffffffffffffffffffffffffffffffffffff1614610e55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4c90614b4d565b60405180910390fd5b610e5f60006122c2565b565b6060610e6b610c68565b15610eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea290614a6d565b60405180910390fd5b60026004541415610ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee890614c2d565b60405180910390fd5b60026004819055506014858590501115610f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3790614b6d565b60405180910390fd5b6014838390501115610f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7e9061496d565b60405180910390fd5b828290508585905014610fcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc690614c4d565b60405180910390fd5b60008585905067ffffffffffffffff811115610fee57610fed6151cf565b5b60405190808252806020026020018201604052801561101c5781602001602082028036833780820191505090505b50905060005b868690508110156110ad576000611079888884818110611045576110446151a0565b5b905060200201602081019061105a91906139b9565b87878581811061106d5761106c6151a0565b5b90506020020135612388565b90508083838151811061108f5761108e6151a0565b5b60200260200101818152505050806110a69061506b565b9050611022565b507ff63aafb5b06b7fe2813bb6a6de57fb20175e5195c68a769206542b77a65843758686868633866040516110e7969594939291906147b2565b60405180910390a1809150506001600481905550949350505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611135611cf5565b73ffffffffffffffffffffffffffffffffffffffff16611153611103565b73ffffffffffffffffffffffffffffffffffffffff16146111a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a090614b4d565b60405180910390fd5b6111b1612636565b565b6111c56111be611cf5565b83836126d9565b5050565b60006111d3610c68565b15611213576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120a90614a6d565b60405180910390fd5b60026004541415611259576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125090614c2d565b60405180910390fd5b6002600481905550600061126d8484612388565b90508373ffffffffffffffffffffffffffffffffffffffff167fad03f837a9207e368d73ec028e1f54428184da8cfea258cc116da2225f3ac5eb8433846040516112b993929190614c88565b60405180910390a280915050600160048190555092915050565b60086020528060005260406000206000915054906101000a900460ff1681565b6005805461130090615008565b80601f016020809104026020016040519081016040528092919081815260200182805461132c90615008565b80156113795780601f1061134e57610100808354040283529160200191611379565b820191906000526020600020905b81548152906001019060200180831161135c57829003601f168201915b505050505081565b600981565b61138e611cf5565b73ffffffffffffffffffffffffffffffffffffffff166113ac611103565b73ffffffffffffffffffffffffffffffffffffffff1614611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f990614b4d565b60405180910390fd5b600082118015611413575060098211155b611452576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144990614a4d565b60405180910390fd5b61147461145d611103565b838360405180602001604052806000815250612846565b5050565b611480611cf5565b73ffffffffffffffffffffffffffffffffffffffff1661149e611103565b73ffffffffffffffffffffffffffffffffffffffff16146114f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114eb90614b4d565b60405180910390fd5b806005908051906020019061150a9291906135d0565b5050565b611516611cf5565b73ffffffffffffffffffffffffffffffffffffffff16611534611103565b73ffffffffffffffffffffffffffffffffffffffff161461158a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158190614b4d565b60405180910390fd5b6115926129dc565b565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060026004541415611670576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166790614c2d565b60405180910390fd5b6002600481905550611680611cf5565b73ffffffffffffffffffffffffffffffffffffffff1661169e611103565b73ffffffffffffffffffffffffffffffffffffffff16146116f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116eb90614b4d565b60405180910390fd5b601485859050111561173b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173290614b2d565b60405180910390fd5b828290508585905014801561175557508282905087879050145b611794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178b90614c4d565b60405180910390fd5b60008585905067ffffffffffffffff8111156117b3576117b26151cf565b5b6040519080825280602002602001820160405280156117e15781602001602082028036833780820191505090505b50905060005b8686905081101561189a5760006118668a8a8481811061180a576118096151a0565b5b905060200201602081019061181f91906139b9565b898985818110611832576118316151a0565b5b905060200201602081019061184791906139b9565b88888681811061185a576118596151a0565b5b90506020020135612a7e565b90508083838151811061187c5761187b6151a0565b5b60200260200101818152505050806118939061506b565b90506117e7565b507f91faccc84ac1b7731d83328fab3bc63766fee9f4ae4b6e2ecb57a24d5eaaaf22868686868c8c876040516118d69796959493929190614810565b60405180910390a18091505060016004819055509695505050505050565b6118fc611cf5565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061194257506119418561193c611cf5565b611594565b5b611981576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197890614a0d565b60405180910390fd5b61198e8585858585612c31565b5050505050565b61199d611cf5565b73ffffffffffffffffffffffffffffffffffffffff166119bb611103565b73ffffffffffffffffffffffffffffffffffffffff1614611a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0890614b4d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a78906149cd565b60405180910390fd5b611a8a816122c2565b50565b611a95611cf5565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480611adb5750611ada83611ad5611cf5565b611594565b5b611b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1190614a0d565b60405180910390fd5b611b25838383612eb3565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60606000821415611bdc576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611cf0565b600082905060005b60008214611c0e578080611bf79061506b565b915050600a82611c079190614eed565b9150611be4565b60008167ffffffffffffffff811115611c2a57611c296151cf565b5b6040519080825280601f01601f191660200182016040528015611c5c5781602001600182028036833780820191505090505b5090505b60008514611ce957600182611c759190614f1e565b9150600a85611c8491906150e2565b6030611c909190614e97565b60f81b818381518110611ca657611ca56151a0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ce29190614eed565b9450611c60565b8093505050505b919050565b600033905090565b8151835114611d41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3890614bed565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611db1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da890614a8d565b60405180910390fd5b6000611dbb611cf5565b9050611dcb8187878787876130d0565b60005b8451811015611f7c576000858281518110611dec57611deb6151a0565b5b602002602001015190506000858381518110611e0b57611e0a6151a0565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea390614b0d565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f619190614e97565b9250508190555050505080611f759061506b565b9050611dce565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611ff3929190614899565b60405180910390a46120098187878787876130d8565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612081576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207890614aed565b60405180910390fd5b80518251146120c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bc90614bed565b60405180910390fd5b60006120cf611cf5565b90506120ef818560008686604051806020016040528060008152506130d0565b60005b835181101561223c5760008482815181106121105761210f6151a0565b5b60200260200101519050600084838151811061212f5761212e6151a0565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156121d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c7906149ed565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505080806122349061506b565b9150506120f2565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516122b4929190614899565b60405180910390a450505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612416576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240d9061498d565b60405180910390fd5b60001515600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060009054906101000a900460ff161515146124ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b190614a2d565b60405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b81526004016124f59190614c6d565b60206040518083038186803b15801561250d57600080fd5b505afa158015612521573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061254591906139e6565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146125b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ac90614acd565b60405180910390fd5b6001600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060006101000a81548160ff0219169083151502179055506000612629336132bf565b9050809250505092915050565b61263e610c68565b1561267e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267590614a6d565b60405180910390fd5b6001600360146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586126c2611cf5565b6040516126cf91906146d5565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273f90614bad565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161283991906148d0565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156128b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ad90614c0d565b60405180910390fd5b60006128c0611cf5565b90506128e1816000876128d28861334c565b6128db8861334c565b876130d0565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129409190614e97565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6287876040516129be929190614cbf565b60405180910390a46129d5816000878787876133c6565b5050505050565b6129e4610c68565b612a23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1a9061494d565b60405180910390fd5b6000600360146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612a67611cf5565b604051612a7491906146d5565b60405180910390a1565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612b0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b039061498d565b60405180910390fd5b60001515600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060009054906101000a900460ff16151514612bb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba790614a2d565b60405180910390fd5b6001600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060006101000a81548160ff0219169083151502179055506000612c24856132bf565b9050809150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612ca1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9890614a8d565b60405180910390fd5b6000612cab611cf5565b9050612ccb818787612cbc8861334c565b612cc58861334c565b876130d0565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015612d62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5990614b0d565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e179190614e97565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051612e94929190614cbf565b60405180910390a4612eaa8288888888886133c6565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1a90614aed565b60405180910390fd5b6000612f2d611cf5565b9050612f5d81856000612f3f8761334c565b612f488761334c565b604051806020016040528060008152506130d0565b600080600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015612ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612feb906149ed565b60405180910390fd5b82810360008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6287876040516130c1929190614cbf565b60405180910390a45050505050565b505050505050565b6130f78473ffffffffffffffffffffffffffffffffffffffff166135ad565b156132b7578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161313d9594939291906146f0565b602060405180830381600087803b15801561315757600080fd5b505af192505050801561318857506040513d601f19601f820116820180604052508101906131859190613ef1565b60015b61322e576131946151fe565b806308c379a014156131f157506131a96158fb565b806131b457506131f3565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131e891906148eb565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132259061490d565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146132b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ac9061492d565b60405180910390fd5b505b505050505050565b600080600942336006546040516020016132db93929190614698565b6040516020818303038152906040528051906020012060001c6132fe91906150e2565b905060018161330d9190614e97565b9050600660008154809291906133229061506b565b91905055506133438382600160405180602001604052806000815250612846565b80915050919050565b60606000600167ffffffffffffffff81111561336b5761336a6151cf565b5b6040519080825280602002602001820160405280156133995781602001602082028036833780820191505090505b50905082816000815181106133b1576133b06151a0565b5b60200260200101818152505080915050919050565b6133e58473ffffffffffffffffffffffffffffffffffffffff166135ad565b156135a5578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b815260040161342b959493929190614758565b602060405180830381600087803b15801561344557600080fd5b505af192505050801561347657506040513d601f19601f820116820180604052508101906134739190613ef1565b60015b61351c576134826151fe565b806308c379a014156134df57506134976158fb565b806134a257506134e1565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134d691906148eb565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135139061490d565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146135a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161359a9061492d565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546135dc90615008565b90600052602060002090601f0160209004810192826135fe5760008555613645565b82601f1061361757805160ff1916838001178555613645565b82800160010185558215613645579182015b82811115613644578251825591602001919060010190613629565b5b5090506136529190613656565b5090565b5b8082111561366f576000816000905550600101613657565b5090565b600061368661368184614d0d565b614ce8565b905080838252602082019050828560208602820111156136a9576136a861522a565b5b60005b858110156136d957816136bf88826137d7565b8452602084019350602083019250506001810190506136ac565b5050509392505050565b60006136f66136f184614d39565b614ce8565b905080838252602082019050828560208602820111156137195761371861522a565b5b60005b85811015613749578161372f88826139a4565b84526020840193506020830192505060018101905061371c565b5050509392505050565b600061376661376184614d65565b614ce8565b9050828152602081018484840111156137825761378161522f565b5b61378d848285614fc6565b509392505050565b60006137a86137a384614d96565b614ce8565b9050828152602081018484840111156137c4576137c361522f565b5b6137cf848285614fc6565b509392505050565b6000813590506137e681615991565b92915050565b6000815190506137fb81615991565b92915050565b60008083601f84011261381757613816615225565b5b8235905067ffffffffffffffff81111561383457613833615220565b5b6020830191508360208202830111156138505761384f61522a565b5b9250929050565b600082601f83011261386c5761386b615225565b5b813561387c848260208601613673565b91505092915050565b60008083601f84011261389b5761389a615225565b5b8235905067ffffffffffffffff8111156138b8576138b7615220565b5b6020830191508360208202830111156138d4576138d361522a565b5b9250929050565b600082601f8301126138f0576138ef615225565b5b81356139008482602086016136e3565b91505092915050565b600081359050613918816159a8565b92915050565b60008135905061392d816159bf565b92915050565b600081519050613942816159bf565b92915050565b600082601f83011261395d5761395c615225565b5b813561396d848260208601613753565b91505092915050565b600082601f83011261398b5761398a615225565b5b813561399b848260208601613795565b91505092915050565b6000813590506139b3816159d6565b92915050565b6000602082840312156139cf576139ce61523e565b5b60006139dd848285016137d7565b91505092915050565b6000602082840312156139fc576139fb61523e565b5b6000613a0a848285016137ec565b91505092915050565b60008060408385031215613a2a57613a2961523e565b5b6000613a38858286016137d7565b9250506020613a49858286016137d7565b9150509250929050565b600080600080600060a08688031215613a6f57613a6e61523e565b5b6000613a7d888289016137d7565b9550506020613a8e888289016137d7565b945050604086013567ffffffffffffffff811115613aaf57613aae615234565b5b613abb888289016138db565b935050606086013567ffffffffffffffff811115613adc57613adb615234565b5b613ae8888289016138db565b925050608086013567ffffffffffffffff811115613b0957613b08615234565b5b613b1588828901613948565b9150509295509295909350565b600080600080600060a08688031215613b3e57613b3d61523e565b5b6000613b4c888289016137d7565b9550506020613b5d888289016137d7565b9450506040613b6e888289016139a4565b9350506060613b7f888289016139a4565b925050608086013567ffffffffffffffff811115613ba057613b9f615234565b5b613bac88828901613948565b9150509295509295909350565b600080600060608486031215613bd257613bd161523e565b5b6000613be0868287016137d7565b935050602084013567ffffffffffffffff811115613c0157613c00615234565b5b613c0d868287016138db565b925050604084013567ffffffffffffffff811115613c2e57613c2d615234565b5b613c3a868287016138db565b9150509250925092565b60008060408385031215613c5b57613c5a61523e565b5b6000613c69858286016137d7565b9250506020613c7a85828601613909565b9150509250929050565b60008060408385031215613c9b57613c9a61523e565b5b6000613ca9858286016137d7565b9250506020613cba858286016139a4565b9150509250929050565b600080600060608486031215613cdd57613cdc61523e565b5b6000613ceb868287016137d7565b9350506020613cfc868287016139a4565b9250506040613d0d868287016139a4565b9150509250925092565b60008060008060008060608789031215613d3457613d3361523e565b5b600087013567ffffffffffffffff811115613d5257613d51615234565b5b613d5e89828a01613801565b9650965050602087013567ffffffffffffffff811115613d8157613d80615234565b5b613d8d89828a01613801565b9450945050604087013567ffffffffffffffff811115613db057613daf615234565b5b613dbc89828a01613885565b92509250509295509295509295565b60008060008060408587031215613de557613de461523e565b5b600085013567ffffffffffffffff811115613e0357613e02615234565b5b613e0f87828801613801565b9450945050602085013567ffffffffffffffff811115613e3257613e31615234565b5b613e3e87828801613885565b925092505092959194509250565b60008060408385031215613e6357613e6261523e565b5b600083013567ffffffffffffffff811115613e8157613e80615234565b5b613e8d85828601613857565b925050602083013567ffffffffffffffff811115613eae57613ead615234565b5b613eba858286016138db565b9150509250929050565b600060208284031215613eda57613ed961523e565b5b6000613ee88482850161391e565b91505092915050565b600060208284031215613f0757613f0661523e565b5b6000613f1584828501613933565b91505092915050565b600060208284031215613f3457613f3361523e565b5b600082013567ffffffffffffffff811115613f5257613f51615234565b5b613f5e84828501613976565b91505092915050565b600060208284031215613f7d57613f7c61523e565b5b6000613f8b848285016139a4565b91505092915050565b60008060408385031215613fab57613faa61523e565b5b6000613fb9858286016139a4565b9250506020613fca858286016139a4565b9150509250929050565b6000613fe08383614004565b60208301905092915050565b6000613ff88383614632565b60208301905092915050565b61400d81614f52565b82525050565b61401c81614f52565b82525050565b61403361402e82614f52565b6150b4565b82525050565b60006140458385614e31565b935061405082614dc7565b8060005b85811015614089576140668284614e80565b6140708882613fd4565b975061407b83614e17565b925050600181019050614054565b5085925050509392505050565b60006140a28385614e42565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156140d5576140d4615239565b5b6020830292506140e6838584614fc6565b82840190509392505050565b60006140fd82614df6565b6141078185614e42565b935061411283614dd1565b8060005b8381101561414357815161412a8882613fec565b975061413583614e24565b925050600181019050614116565b5085935050505092915050565b61415981614f64565b82525050565b600061416a82614e01565b6141748185614e53565b9350614184818560208601614fd5565b61418d81615243565b840191505092915050565b60006141a382614e0c565b6141ad8185614e64565b93506141bd818560208601614fd5565b6141c681615243565b840191505092915050565b60006141dc82614e0c565b6141e68185614e75565b93506141f6818560208601614fd5565b80840191505092915050565b6000815461420f81615008565b6142198186614e75565b94506001821660008114614234576001811461424557614278565b60ff19831686528186019350614278565b61424e85614de1565b60005b8381101561427057815481890152600182019150602081019050614251565b838801955050505b50505092915050565b600061428e603483614e64565b91506142998261526e565b604082019050919050565b60006142b1602883614e64565b91506142bc826152bd565b604082019050919050565b60006142d4601483614e64565b91506142df8261530c565b602082019050919050565b60006142f7601d83614e64565b915061430282615335565b602082019050919050565b600061431a601883614e64565b91506143258261535e565b602082019050919050565b600061433d602b83614e64565b915061434882615387565b604082019050919050565b6000614360602683614e64565b915061436b826153d6565b604082019050919050565b6000614383602483614e64565b915061438e82615425565b604082019050919050565b60006143a6602983614e64565b91506143b182615474565b604082019050919050565b60006143c9601b83614e64565b91506143d4826154c3565b602082019050919050565b60006143ec601483614e64565b91506143f7826154ec565b602082019050919050565b600061440f601083614e64565b915061441a82615515565b602082019050919050565b6000614432602583614e64565b915061443d8261553e565b604082019050919050565b6000614455603283614e64565b91506144608261558d565b604082019050919050565b6000614478601483614e64565b9150614483826155dc565b602082019050919050565b600061449b602383614e64565b91506144a682615605565b604082019050919050565b60006144be602a83614e64565b91506144c982615654565b604082019050919050565b60006144e1601983614e64565b91506144ec826156a3565b602082019050919050565b6000614504602083614e64565b915061450f826156cc565b602082019050919050565b6000614527602383614e64565b9150614532826156f5565b604082019050919050565b600061454a601f83614e64565b915061455582615744565b602082019050919050565b600061456d602983614e64565b91506145788261576d565b604082019050919050565b6000614590602983614e64565b915061459b826157bc565b604082019050919050565b60006145b3602883614e64565b91506145be8261580b565b604082019050919050565b60006145d6602183614e64565b91506145e18261585a565b604082019050919050565b60006145f9601f83614e64565b9150614604826158a9565b602082019050919050565b600061461c601b83614e64565b9150614627826158d2565b602082019050919050565b61463b81614fbc565b82525050565b61464a81614fbc565b82525050565b61466161465c82614fbc565b6150d8565b82525050565b60006146738286614202565b915061467f82856141d1565b915061468b8284614202565b9150819050949350505050565b60006146a48286614650565b6020820191506146b48285614022565b6014820191506146c48284614650565b602082019150819050949350505050565b60006020820190506146ea6000830184614013565b92915050565b600060a0820190506147056000830188614013565b6147126020830187614013565b818103604083015261472481866140f2565b9050818103606083015261473881856140f2565b9050818103608083015261474c818461415f565b90509695505050505050565b600060a08201905061476d6000830188614013565b61477a6020830187614013565b6147876040830186614641565b6147946060830185614641565b81810360808301526147a6818461415f565b90509695505050505050565b600060808201905081810360008301526147cd81888a614039565b905081810360208301526147e2818688614096565b90506147f16040830185614013565b818103606083015261480381846140f2565b9050979650505050505050565b6000608082019050818103600083015261482b81898b614039565b90508181036020830152614840818789614096565b90508181036040830152614855818587614039565b9050818103606083015261486981846140f2565b905098975050505050505050565b6000602082019050818103600083015261489181846140f2565b905092915050565b600060408201905081810360008301526148b381856140f2565b905081810360208301526148c781846140f2565b90509392505050565b60006020820190506148e56000830184614150565b92915050565b600060208201905081810360008301526149058184614198565b905092915050565b6000602082019050818103600083015261492681614281565b9050919050565b60006020820190508181036000830152614946816142a4565b9050919050565b60006020820190508181036000830152614966816142c7565b9050919050565b60006020820190508181036000830152614986816142ea565b9050919050565b600060208201905081810360008301526149a68161430d565b9050919050565b600060208201905081810360008301526149c681614330565b9050919050565b600060208201905081810360008301526149e681614353565b9050919050565b60006020820190508181036000830152614a0681614376565b9050919050565b60006020820190508181036000830152614a2681614399565b9050919050565b60006020820190508181036000830152614a46816143bc565b9050919050565b60006020820190508181036000830152614a66816143df565b9050919050565b60006020820190508181036000830152614a8681614402565b9050919050565b60006020820190508181036000830152614aa681614425565b9050919050565b60006020820190508181036000830152614ac681614448565b9050919050565b60006020820190508181036000830152614ae68161446b565b9050919050565b60006020820190508181036000830152614b068161448e565b9050919050565b60006020820190508181036000830152614b26816144b1565b9050919050565b60006020820190508181036000830152614b46816144d4565b9050919050565b60006020820190508181036000830152614b66816144f7565b9050919050565b60006020820190508181036000830152614b868161451a565b9050919050565b60006020820190508181036000830152614ba68161453d565b9050919050565b60006020820190508181036000830152614bc681614560565b9050919050565b60006020820190508181036000830152614be681614583565b9050919050565b60006020820190508181036000830152614c06816145a6565b9050919050565b60006020820190508181036000830152614c26816145c9565b9050919050565b60006020820190508181036000830152614c46816145ec565b9050919050565b60006020820190508181036000830152614c668161460f565b9050919050565b6000602082019050614c826000830184614641565b92915050565b6000606082019050614c9d6000830186614641565b614caa6020830185614013565b614cb76040830184614641565b949350505050565b6000604082019050614cd46000830185614641565b614ce16020830184614641565b9392505050565b6000614cf2614d03565b9050614cfe828261503a565b919050565b6000604051905090565b600067ffffffffffffffff821115614d2857614d276151cf565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614d5457614d536151cf565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614d8057614d7f6151cf565b5b614d8982615243565b9050602081019050919050565b600067ffffffffffffffff821115614db157614db06151cf565b5b614dba82615243565b9050602081019050919050565b6000819050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e8f60208401846137d7565b905092915050565b6000614ea282614fbc565b9150614ead83614fbc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ee257614ee1615113565b5b828201905092915050565b6000614ef882614fbc565b9150614f0383614fbc565b925082614f1357614f12615142565b5b828204905092915050565b6000614f2982614fbc565b9150614f3483614fbc565b925082821015614f4757614f46615113565b5b828203905092915050565b6000614f5d82614f9c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614ff3578082015181840152602081019050614fd8565b83811115615002576000848401525b50505050565b6000600282049050600182168061502057607f821691505b6020821081141561503457615033615171565b5b50919050565b61504382615243565b810181811067ffffffffffffffff82111715615062576150616151cf565b5b80604052505050565b600061507682614fbc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156150a9576150a8615113565b5b600182019050919050565b60006150bf826150c6565b9050919050565b60006150d182615254565b9050919050565b6000819050919050565b60006150ed82614fbc565b91506150f883614fbc565b92508261510857615107615142565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d111561521d5760046000803e61521a600051615261565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f514d3a20546f6b656e20494473206d6f7265207468616e206c696d6974000000600082015250565b7f514d3a204e6f74206f6e20617070726f766564206c6973740000000000000000600082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f514d3a2043617073756c6520616c726561647920636c61696d65640000000000600082015250565b7f514d3a20496e76616c696420546f6b656e204944000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f514d3a2053656e646572206e6f74206f776e6572000000000000000000000000600082015250565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f514d3a204261746368206d6f7265207468616e206c696d697400000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f514d3a20426174636820436f6e747261637473206d6f7265207468616e206c6960008201527f6d69740000000000000000000000000000000000000000000000000000000000602082015250565b7f5552492072657175657374656420666f7220696e76616c696420746f6b656e00600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f514d3a2053697a652073686f756c64206265207468652073616d650000000000600082015250565b600060443d101561590b5761598e565b615913614d03565b60043d036004823e80513d602482011167ffffffffffffffff8211171561593b57505061598e565b808201805167ffffffffffffffff811115615959575050505061598e565b80602083010160043d03850181111561597657505050505061598e565b6159858260200185018661503a565b82955050505050505b90565b61599a81614f52565b81146159a557600080fd5b50565b6159b181614f64565b81146159bc57600080fd5b50565b6159c881614f70565b81146159d357600080fd5b50565b6159df81614fbc565b81146159ea57600080fd5b5056fea26469706673582212201d3c269d228b23a294bece286cf5da1dd1af6ce8cb35baa502d2e5b3af91b4ef64736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101ce5760003560e01c80638da5cb5b11610104578063d47573d4116100a2578063ea54536011610071578063ea5453601461052b578063f242432a1461055b578063f2fde38b14610577578063f5298aca14610593576101ce565b8063d47573d4146104b9578063da3ef23f146104d5578063de065caa146104f1578063e985e9c5146104fb576101ce565b8063aad3ec96116100de578063aad3ec961461041d578063bcca57181461044d578063c66828621461047d578063d0bbb0d71461049b576101ce565b80638da5cb5b146103d95780638ff095f9146103f7578063a22cb46514610401576101ce565b8063562beba8116101715780636b20c4541161014b5780636b20c454146103655780636c0360eb14610381578063715018a61461039f57806379f67c5a146103a9576101ce565b8063562beba8146102e75780635c975abb146103175780636003760914610335576101ce565b80631c4b52ca116101ad5780631c4b52ca146102635780632eb2c2d61461027f5780634e1273f41461029b57806355f804b3146102cb576101ce565b8062fdd58e146101d357806301ffc9a7146102035780630e89341c14610233575b600080fd5b6101ed60048036038101906101e89190613c84565b6105af565b6040516101fa9190614c6d565b60405180910390f35b61021d60048036038101906102189190613ec4565b610678565b60405161022a91906148d0565b60405180910390f35b61024d60048036038101906102489190613f67565b61075a565b60405161025a91906148eb565b60405180910390f35b61027d600480360381019061027891906139b9565b610888565b005b61029960048036038101906102949190613a53565b6109a2565b005b6102b560048036038101906102b09190613e4c565b610a43565b6040516102c29190614877565b60405180910390f35b6102e560048036038101906102e09190613f1e565b610b5c565b005b61030160048036038101906102fc9190613c84565b610bf2565b60405161030e91906148d0565b60405180910390f35b61031f610c68565b60405161032c91906148d0565b60405180910390f35b61034f600480360381019061034a9190613c84565b610c7f565b60405161035c91906148d0565b60405180910390f35b61037f600480360381019061037a9190613bb9565b610cae565b005b610389610d4b565b60405161039691906148eb565b60405180910390f35b6103a7610dd9565b005b6103c360048036038101906103be9190613dcb565b610e61565b6040516103d09190614877565b60405180910390f35b6103e1611103565b6040516103ee91906146d5565b60405180910390f35b6103ff61112d565b005b61041b60048036038101906104169190613c44565b6111b3565b005b61043760048036038101906104329190613c84565b6111c9565b6040516104449190614c6d565b60405180910390f35b610467600480360381019061046291906139b9565b6112d3565b60405161047491906148d0565b60405180910390f35b6104856112f3565b60405161049291906148eb565b60405180910390f35b6104a3611381565b6040516104b09190614c6d565b60405180910390f35b6104d360048036038101906104ce9190613f94565b611386565b005b6104ef60048036038101906104ea9190613f1e565b611478565b005b6104f961150e565b005b61051560048036038101906105109190613a13565b611594565b60405161052291906148d0565b60405180910390f35b61054560048036038101906105409190613d17565b611628565b6040516105529190614877565b60405180910390f35b61057560048036038101906105709190613b22565b6118f4565b005b610591600480360381019061058c91906139b9565b611995565b005b6105ad60048036038101906105a89190613cc4565b611a8d565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610620576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610617906149ad565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061074357507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610753575061075282611b2a565b5b9050919050565b606060008211801561076d575060098211155b6107ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a390614b8d565b60405180910390fd5b6000600780546107bb90615008565b90501161085257600780546107cf90615008565b80601f01602080910402602001604051908101604052809291908181526020018280546107fb90615008565b80156108485780601f1061081d57610100808354040283529160200191610848565b820191906000526020600020905b81548152906001019060200180831161082b57829003601f168201915b5050505050610881565b600761085d83611b94565b600560405160200161087193929190614667565b6040516020818303038152906040525b9050919050565b610890611cf5565b73ffffffffffffffffffffffffffffffffffffffff166108ae611103565b73ffffffffffffffffffffffffffffffffffffffff1614610904576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fb90614b4d565b60405180910390fd5b6001600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f5683d1953e05cdddcad1418c4d742e8aba319cbbe48a31f7501f3f83f061048560405160405180910390a250565b6109aa611cf5565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806109f057506109ef856109ea611cf5565b611594565b5b610a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2690614aad565b60405180910390fd5b610a3c8585858585611cfd565b5050505050565b60608151835114610a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8090614bcd565b60405180910390fd5b6000835167ffffffffffffffff811115610aa657610aa56151cf565b5b604051908082528060200260200182016040528015610ad45781602001602082028036833780820191505090505b50905060005b8451811015610b5157610b21858281518110610af957610af86151a0565b5b6020026020010151858381518110610b1457610b136151a0565b5b60200260200101516105af565b828281518110610b3457610b336151a0565b5b60200260200101818152505080610b4a9061506b565b9050610ada565b508091505092915050565b610b64611cf5565b73ffffffffffffffffffffffffffffffffffffffff16610b82611103565b73ffffffffffffffffffffffffffffffffffffffff1614610bd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcf90614b4d565b60405180910390fd5b8060079080519060200190610bee9291906135d0565b5050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff16610c5d576000610c60565b60015b905092915050565b6000600360149054906101000a900460ff16905090565b60096020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b610cb6611cf5565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610cfc5750610cfb83610cf6611cf5565b611594565b5b610d3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3290614a0d565b60405180910390fd5b610d46838383612011565b505050565b60078054610d5890615008565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8490615008565b8015610dd15780601f10610da657610100808354040283529160200191610dd1565b820191906000526020600020905b815481529060010190602001808311610db457829003601f168201915b505050505081565b610de1611cf5565b73ffffffffffffffffffffffffffffffffffffffff16610dff611103565b73ffffffffffffffffffffffffffffffffffffffff1614610e55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4c90614b4d565b60405180910390fd5b610e5f60006122c2565b565b6060610e6b610c68565b15610eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea290614a6d565b60405180910390fd5b60026004541415610ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee890614c2d565b60405180910390fd5b60026004819055506014858590501115610f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3790614b6d565b60405180910390fd5b6014838390501115610f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7e9061496d565b60405180910390fd5b828290508585905014610fcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc690614c4d565b60405180910390fd5b60008585905067ffffffffffffffff811115610fee57610fed6151cf565b5b60405190808252806020026020018201604052801561101c5781602001602082028036833780820191505090505b50905060005b868690508110156110ad576000611079888884818110611045576110446151a0565b5b905060200201602081019061105a91906139b9565b87878581811061106d5761106c6151a0565b5b90506020020135612388565b90508083838151811061108f5761108e6151a0565b5b60200260200101818152505050806110a69061506b565b9050611022565b507ff63aafb5b06b7fe2813bb6a6de57fb20175e5195c68a769206542b77a65843758686868633866040516110e7969594939291906147b2565b60405180910390a1809150506001600481905550949350505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611135611cf5565b73ffffffffffffffffffffffffffffffffffffffff16611153611103565b73ffffffffffffffffffffffffffffffffffffffff16146111a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a090614b4d565b60405180910390fd5b6111b1612636565b565b6111c56111be611cf5565b83836126d9565b5050565b60006111d3610c68565b15611213576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120a90614a6d565b60405180910390fd5b60026004541415611259576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125090614c2d565b60405180910390fd5b6002600481905550600061126d8484612388565b90508373ffffffffffffffffffffffffffffffffffffffff167fad03f837a9207e368d73ec028e1f54428184da8cfea258cc116da2225f3ac5eb8433846040516112b993929190614c88565b60405180910390a280915050600160048190555092915050565b60086020528060005260406000206000915054906101000a900460ff1681565b6005805461130090615008565b80601f016020809104026020016040519081016040528092919081815260200182805461132c90615008565b80156113795780601f1061134e57610100808354040283529160200191611379565b820191906000526020600020905b81548152906001019060200180831161135c57829003601f168201915b505050505081565b600981565b61138e611cf5565b73ffffffffffffffffffffffffffffffffffffffff166113ac611103565b73ffffffffffffffffffffffffffffffffffffffff1614611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f990614b4d565b60405180910390fd5b600082118015611413575060098211155b611452576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144990614a4d565b60405180910390fd5b61147461145d611103565b838360405180602001604052806000815250612846565b5050565b611480611cf5565b73ffffffffffffffffffffffffffffffffffffffff1661149e611103565b73ffffffffffffffffffffffffffffffffffffffff16146114f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114eb90614b4d565b60405180910390fd5b806005908051906020019061150a9291906135d0565b5050565b611516611cf5565b73ffffffffffffffffffffffffffffffffffffffff16611534611103565b73ffffffffffffffffffffffffffffffffffffffff161461158a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158190614b4d565b60405180910390fd5b6115926129dc565b565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060026004541415611670576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166790614c2d565b60405180910390fd5b6002600481905550611680611cf5565b73ffffffffffffffffffffffffffffffffffffffff1661169e611103565b73ffffffffffffffffffffffffffffffffffffffff16146116f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116eb90614b4d565b60405180910390fd5b601485859050111561173b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173290614b2d565b60405180910390fd5b828290508585905014801561175557508282905087879050145b611794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178b90614c4d565b60405180910390fd5b60008585905067ffffffffffffffff8111156117b3576117b26151cf565b5b6040519080825280602002602001820160405280156117e15781602001602082028036833780820191505090505b50905060005b8686905081101561189a5760006118668a8a8481811061180a576118096151a0565b5b905060200201602081019061181f91906139b9565b898985818110611832576118316151a0565b5b905060200201602081019061184791906139b9565b88888681811061185a576118596151a0565b5b90506020020135612a7e565b90508083838151811061187c5761187b6151a0565b5b60200260200101818152505050806118939061506b565b90506117e7565b507f91faccc84ac1b7731d83328fab3bc63766fee9f4ae4b6e2ecb57a24d5eaaaf22868686868c8c876040516118d69796959493929190614810565b60405180910390a18091505060016004819055509695505050505050565b6118fc611cf5565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061194257506119418561193c611cf5565b611594565b5b611981576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197890614a0d565b60405180910390fd5b61198e8585858585612c31565b5050505050565b61199d611cf5565b73ffffffffffffffffffffffffffffffffffffffff166119bb611103565b73ffffffffffffffffffffffffffffffffffffffff1614611a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0890614b4d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a78906149cd565b60405180910390fd5b611a8a816122c2565b50565b611a95611cf5565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480611adb5750611ada83611ad5611cf5565b611594565b5b611b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1190614a0d565b60405180910390fd5b611b25838383612eb3565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60606000821415611bdc576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611cf0565b600082905060005b60008214611c0e578080611bf79061506b565b915050600a82611c079190614eed565b9150611be4565b60008167ffffffffffffffff811115611c2a57611c296151cf565b5b6040519080825280601f01601f191660200182016040528015611c5c5781602001600182028036833780820191505090505b5090505b60008514611ce957600182611c759190614f1e565b9150600a85611c8491906150e2565b6030611c909190614e97565b60f81b818381518110611ca657611ca56151a0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ce29190614eed565b9450611c60565b8093505050505b919050565b600033905090565b8151835114611d41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3890614bed565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611db1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da890614a8d565b60405180910390fd5b6000611dbb611cf5565b9050611dcb8187878787876130d0565b60005b8451811015611f7c576000858281518110611dec57611deb6151a0565b5b602002602001015190506000858381518110611e0b57611e0a6151a0565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea390614b0d565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f619190614e97565b9250508190555050505080611f759061506b565b9050611dce565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611ff3929190614899565b60405180910390a46120098187878787876130d8565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612081576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207890614aed565b60405180910390fd5b80518251146120c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bc90614bed565b60405180910390fd5b60006120cf611cf5565b90506120ef818560008686604051806020016040528060008152506130d0565b60005b835181101561223c5760008482815181106121105761210f6151a0565b5b60200260200101519050600084838151811061212f5761212e6151a0565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156121d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c7906149ed565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505080806122349061506b565b9150506120f2565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516122b4929190614899565b60405180910390a450505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612416576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240d9061498d565b60405180910390fd5b60001515600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060009054906101000a900460ff161515146124ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b190614a2d565b60405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b81526004016124f59190614c6d565b60206040518083038186803b15801561250d57600080fd5b505afa158015612521573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061254591906139e6565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146125b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ac90614acd565b60405180910390fd5b6001600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060006101000a81548160ff0219169083151502179055506000612629336132bf565b9050809250505092915050565b61263e610c68565b1561267e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267590614a6d565b60405180910390fd5b6001600360146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586126c2611cf5565b6040516126cf91906146d5565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273f90614bad565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161283991906148d0565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156128b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ad90614c0d565b60405180910390fd5b60006128c0611cf5565b90506128e1816000876128d28861334c565b6128db8861334c565b876130d0565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129409190614e97565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6287876040516129be929190614cbf565b60405180910390a46129d5816000878787876133c6565b5050505050565b6129e4610c68565b612a23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1a9061494d565b60405180910390fd5b6000600360146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612a67611cf5565b604051612a7491906146d5565b60405180910390a1565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612b0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b039061498d565b60405180910390fd5b60001515600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060009054906101000a900460ff16151514612bb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba790614a2d565b60405180910390fd5b6001600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060006101000a81548160ff0219169083151502179055506000612c24856132bf565b9050809150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612ca1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9890614a8d565b60405180910390fd5b6000612cab611cf5565b9050612ccb818787612cbc8861334c565b612cc58861334c565b876130d0565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015612d62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5990614b0d565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e179190614e97565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051612e94929190614cbf565b60405180910390a4612eaa8288888888886133c6565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1a90614aed565b60405180910390fd5b6000612f2d611cf5565b9050612f5d81856000612f3f8761334c565b612f488761334c565b604051806020016040528060008152506130d0565b600080600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015612ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612feb906149ed565b60405180910390fd5b82810360008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6287876040516130c1929190614cbf565b60405180910390a45050505050565b505050505050565b6130f78473ffffffffffffffffffffffffffffffffffffffff166135ad565b156132b7578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161313d9594939291906146f0565b602060405180830381600087803b15801561315757600080fd5b505af192505050801561318857506040513d601f19601f820116820180604052508101906131859190613ef1565b60015b61322e576131946151fe565b806308c379a014156131f157506131a96158fb565b806131b457506131f3565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131e891906148eb565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132259061490d565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146132b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ac9061492d565b60405180910390fd5b505b505050505050565b600080600942336006546040516020016132db93929190614698565b6040516020818303038152906040528051906020012060001c6132fe91906150e2565b905060018161330d9190614e97565b9050600660008154809291906133229061506b565b91905055506133438382600160405180602001604052806000815250612846565b80915050919050565b60606000600167ffffffffffffffff81111561336b5761336a6151cf565b5b6040519080825280602002602001820160405280156133995781602001602082028036833780820191505090505b50905082816000815181106133b1576133b06151a0565b5b60200260200101818152505080915050919050565b6133e58473ffffffffffffffffffffffffffffffffffffffff166135ad565b156135a5578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b815260040161342b959493929190614758565b602060405180830381600087803b15801561344557600080fd5b505af192505050801561347657506040513d601f19601f820116820180604052508101906134739190613ef1565b60015b61351c576134826151fe565b806308c379a014156134df57506134976158fb565b806134a257506134e1565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134d691906148eb565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135139061490d565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146135a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161359a9061492d565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546135dc90615008565b90600052602060002090601f0160209004810192826135fe5760008555613645565b82601f1061361757805160ff1916838001178555613645565b82800160010185558215613645579182015b82811115613644578251825591602001919060010190613629565b5b5090506136529190613656565b5090565b5b8082111561366f576000816000905550600101613657565b5090565b600061368661368184614d0d565b614ce8565b905080838252602082019050828560208602820111156136a9576136a861522a565b5b60005b858110156136d957816136bf88826137d7565b8452602084019350602083019250506001810190506136ac565b5050509392505050565b60006136f66136f184614d39565b614ce8565b905080838252602082019050828560208602820111156137195761371861522a565b5b60005b85811015613749578161372f88826139a4565b84526020840193506020830192505060018101905061371c565b5050509392505050565b600061376661376184614d65565b614ce8565b9050828152602081018484840111156137825761378161522f565b5b61378d848285614fc6565b509392505050565b60006137a86137a384614d96565b614ce8565b9050828152602081018484840111156137c4576137c361522f565b5b6137cf848285614fc6565b509392505050565b6000813590506137e681615991565b92915050565b6000815190506137fb81615991565b92915050565b60008083601f84011261381757613816615225565b5b8235905067ffffffffffffffff81111561383457613833615220565b5b6020830191508360208202830111156138505761384f61522a565b5b9250929050565b600082601f83011261386c5761386b615225565b5b813561387c848260208601613673565b91505092915050565b60008083601f84011261389b5761389a615225565b5b8235905067ffffffffffffffff8111156138b8576138b7615220565b5b6020830191508360208202830111156138d4576138d361522a565b5b9250929050565b600082601f8301126138f0576138ef615225565b5b81356139008482602086016136e3565b91505092915050565b600081359050613918816159a8565b92915050565b60008135905061392d816159bf565b92915050565b600081519050613942816159bf565b92915050565b600082601f83011261395d5761395c615225565b5b813561396d848260208601613753565b91505092915050565b600082601f83011261398b5761398a615225565b5b813561399b848260208601613795565b91505092915050565b6000813590506139b3816159d6565b92915050565b6000602082840312156139cf576139ce61523e565b5b60006139dd848285016137d7565b91505092915050565b6000602082840312156139fc576139fb61523e565b5b6000613a0a848285016137ec565b91505092915050565b60008060408385031215613a2a57613a2961523e565b5b6000613a38858286016137d7565b9250506020613a49858286016137d7565b9150509250929050565b600080600080600060a08688031215613a6f57613a6e61523e565b5b6000613a7d888289016137d7565b9550506020613a8e888289016137d7565b945050604086013567ffffffffffffffff811115613aaf57613aae615234565b5b613abb888289016138db565b935050606086013567ffffffffffffffff811115613adc57613adb615234565b5b613ae8888289016138db565b925050608086013567ffffffffffffffff811115613b0957613b08615234565b5b613b1588828901613948565b9150509295509295909350565b600080600080600060a08688031215613b3e57613b3d61523e565b5b6000613b4c888289016137d7565b9550506020613b5d888289016137d7565b9450506040613b6e888289016139a4565b9350506060613b7f888289016139a4565b925050608086013567ffffffffffffffff811115613ba057613b9f615234565b5b613bac88828901613948565b9150509295509295909350565b600080600060608486031215613bd257613bd161523e565b5b6000613be0868287016137d7565b935050602084013567ffffffffffffffff811115613c0157613c00615234565b5b613c0d868287016138db565b925050604084013567ffffffffffffffff811115613c2e57613c2d615234565b5b613c3a868287016138db565b9150509250925092565b60008060408385031215613c5b57613c5a61523e565b5b6000613c69858286016137d7565b9250506020613c7a85828601613909565b9150509250929050565b60008060408385031215613c9b57613c9a61523e565b5b6000613ca9858286016137d7565b9250506020613cba858286016139a4565b9150509250929050565b600080600060608486031215613cdd57613cdc61523e565b5b6000613ceb868287016137d7565b9350506020613cfc868287016139a4565b9250506040613d0d868287016139a4565b9150509250925092565b60008060008060008060608789031215613d3457613d3361523e565b5b600087013567ffffffffffffffff811115613d5257613d51615234565b5b613d5e89828a01613801565b9650965050602087013567ffffffffffffffff811115613d8157613d80615234565b5b613d8d89828a01613801565b9450945050604087013567ffffffffffffffff811115613db057613daf615234565b5b613dbc89828a01613885565b92509250509295509295509295565b60008060008060408587031215613de557613de461523e565b5b600085013567ffffffffffffffff811115613e0357613e02615234565b5b613e0f87828801613801565b9450945050602085013567ffffffffffffffff811115613e3257613e31615234565b5b613e3e87828801613885565b925092505092959194509250565b60008060408385031215613e6357613e6261523e565b5b600083013567ffffffffffffffff811115613e8157613e80615234565b5b613e8d85828601613857565b925050602083013567ffffffffffffffff811115613eae57613ead615234565b5b613eba858286016138db565b9150509250929050565b600060208284031215613eda57613ed961523e565b5b6000613ee88482850161391e565b91505092915050565b600060208284031215613f0757613f0661523e565b5b6000613f1584828501613933565b91505092915050565b600060208284031215613f3457613f3361523e565b5b600082013567ffffffffffffffff811115613f5257613f51615234565b5b613f5e84828501613976565b91505092915050565b600060208284031215613f7d57613f7c61523e565b5b6000613f8b848285016139a4565b91505092915050565b60008060408385031215613fab57613faa61523e565b5b6000613fb9858286016139a4565b9250506020613fca858286016139a4565b9150509250929050565b6000613fe08383614004565b60208301905092915050565b6000613ff88383614632565b60208301905092915050565b61400d81614f52565b82525050565b61401c81614f52565b82525050565b61403361402e82614f52565b6150b4565b82525050565b60006140458385614e31565b935061405082614dc7565b8060005b85811015614089576140668284614e80565b6140708882613fd4565b975061407b83614e17565b925050600181019050614054565b5085925050509392505050565b60006140a28385614e42565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156140d5576140d4615239565b5b6020830292506140e6838584614fc6565b82840190509392505050565b60006140fd82614df6565b6141078185614e42565b935061411283614dd1565b8060005b8381101561414357815161412a8882613fec565b975061413583614e24565b925050600181019050614116565b5085935050505092915050565b61415981614f64565b82525050565b600061416a82614e01565b6141748185614e53565b9350614184818560208601614fd5565b61418d81615243565b840191505092915050565b60006141a382614e0c565b6141ad8185614e64565b93506141bd818560208601614fd5565b6141c681615243565b840191505092915050565b60006141dc82614e0c565b6141e68185614e75565b93506141f6818560208601614fd5565b80840191505092915050565b6000815461420f81615008565b6142198186614e75565b94506001821660008114614234576001811461424557614278565b60ff19831686528186019350614278565b61424e85614de1565b60005b8381101561427057815481890152600182019150602081019050614251565b838801955050505b50505092915050565b600061428e603483614e64565b91506142998261526e565b604082019050919050565b60006142b1602883614e64565b91506142bc826152bd565b604082019050919050565b60006142d4601483614e64565b91506142df8261530c565b602082019050919050565b60006142f7601d83614e64565b915061430282615335565b602082019050919050565b600061431a601883614e64565b91506143258261535e565b602082019050919050565b600061433d602b83614e64565b915061434882615387565b604082019050919050565b6000614360602683614e64565b915061436b826153d6565b604082019050919050565b6000614383602483614e64565b915061438e82615425565b604082019050919050565b60006143a6602983614e64565b91506143b182615474565b604082019050919050565b60006143c9601b83614e64565b91506143d4826154c3565b602082019050919050565b60006143ec601483614e64565b91506143f7826154ec565b602082019050919050565b600061440f601083614e64565b915061441a82615515565b602082019050919050565b6000614432602583614e64565b915061443d8261553e565b604082019050919050565b6000614455603283614e64565b91506144608261558d565b604082019050919050565b6000614478601483614e64565b9150614483826155dc565b602082019050919050565b600061449b602383614e64565b91506144a682615605565b604082019050919050565b60006144be602a83614e64565b91506144c982615654565b604082019050919050565b60006144e1601983614e64565b91506144ec826156a3565b602082019050919050565b6000614504602083614e64565b915061450f826156cc565b602082019050919050565b6000614527602383614e64565b9150614532826156f5565b604082019050919050565b600061454a601f83614e64565b915061455582615744565b602082019050919050565b600061456d602983614e64565b91506145788261576d565b604082019050919050565b6000614590602983614e64565b915061459b826157bc565b604082019050919050565b60006145b3602883614e64565b91506145be8261580b565b604082019050919050565b60006145d6602183614e64565b91506145e18261585a565b604082019050919050565b60006145f9601f83614e64565b9150614604826158a9565b602082019050919050565b600061461c601b83614e64565b9150614627826158d2565b602082019050919050565b61463b81614fbc565b82525050565b61464a81614fbc565b82525050565b61466161465c82614fbc565b6150d8565b82525050565b60006146738286614202565b915061467f82856141d1565b915061468b8284614202565b9150819050949350505050565b60006146a48286614650565b6020820191506146b48285614022565b6014820191506146c48284614650565b602082019150819050949350505050565b60006020820190506146ea6000830184614013565b92915050565b600060a0820190506147056000830188614013565b6147126020830187614013565b818103604083015261472481866140f2565b9050818103606083015261473881856140f2565b9050818103608083015261474c818461415f565b90509695505050505050565b600060a08201905061476d6000830188614013565b61477a6020830187614013565b6147876040830186614641565b6147946060830185614641565b81810360808301526147a6818461415f565b90509695505050505050565b600060808201905081810360008301526147cd81888a614039565b905081810360208301526147e2818688614096565b90506147f16040830185614013565b818103606083015261480381846140f2565b9050979650505050505050565b6000608082019050818103600083015261482b81898b614039565b90508181036020830152614840818789614096565b90508181036040830152614855818587614039565b9050818103606083015261486981846140f2565b905098975050505050505050565b6000602082019050818103600083015261489181846140f2565b905092915050565b600060408201905081810360008301526148b381856140f2565b905081810360208301526148c781846140f2565b90509392505050565b60006020820190506148e56000830184614150565b92915050565b600060208201905081810360008301526149058184614198565b905092915050565b6000602082019050818103600083015261492681614281565b9050919050565b60006020820190508181036000830152614946816142a4565b9050919050565b60006020820190508181036000830152614966816142c7565b9050919050565b60006020820190508181036000830152614986816142ea565b9050919050565b600060208201905081810360008301526149a68161430d565b9050919050565b600060208201905081810360008301526149c681614330565b9050919050565b600060208201905081810360008301526149e681614353565b9050919050565b60006020820190508181036000830152614a0681614376565b9050919050565b60006020820190508181036000830152614a2681614399565b9050919050565b60006020820190508181036000830152614a46816143bc565b9050919050565b60006020820190508181036000830152614a66816143df565b9050919050565b60006020820190508181036000830152614a8681614402565b9050919050565b60006020820190508181036000830152614aa681614425565b9050919050565b60006020820190508181036000830152614ac681614448565b9050919050565b60006020820190508181036000830152614ae68161446b565b9050919050565b60006020820190508181036000830152614b068161448e565b9050919050565b60006020820190508181036000830152614b26816144b1565b9050919050565b60006020820190508181036000830152614b46816144d4565b9050919050565b60006020820190508181036000830152614b66816144f7565b9050919050565b60006020820190508181036000830152614b868161451a565b9050919050565b60006020820190508181036000830152614ba68161453d565b9050919050565b60006020820190508181036000830152614bc681614560565b9050919050565b60006020820190508181036000830152614be681614583565b9050919050565b60006020820190508181036000830152614c06816145a6565b9050919050565b60006020820190508181036000830152614c26816145c9565b9050919050565b60006020820190508181036000830152614c46816145ec565b9050919050565b60006020820190508181036000830152614c668161460f565b9050919050565b6000602082019050614c826000830184614641565b92915050565b6000606082019050614c9d6000830186614641565b614caa6020830185614013565b614cb76040830184614641565b949350505050565b6000604082019050614cd46000830185614641565b614ce16020830184614641565b9392505050565b6000614cf2614d03565b9050614cfe828261503a565b919050565b6000604051905090565b600067ffffffffffffffff821115614d2857614d276151cf565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614d5457614d536151cf565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614d8057614d7f6151cf565b5b614d8982615243565b9050602081019050919050565b600067ffffffffffffffff821115614db157614db06151cf565b5b614dba82615243565b9050602081019050919050565b6000819050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e8f60208401846137d7565b905092915050565b6000614ea282614fbc565b9150614ead83614fbc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ee257614ee1615113565b5b828201905092915050565b6000614ef882614fbc565b9150614f0383614fbc565b925082614f1357614f12615142565b5b828204905092915050565b6000614f2982614fbc565b9150614f3483614fbc565b925082821015614f4757614f46615113565b5b828203905092915050565b6000614f5d82614f9c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614ff3578082015181840152602081019050614fd8565b83811115615002576000848401525b50505050565b6000600282049050600182168061502057607f821691505b6020821081141561503457615033615171565b5b50919050565b61504382615243565b810181811067ffffffffffffffff82111715615062576150616151cf565b5b80604052505050565b600061507682614fbc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156150a9576150a8615113565b5b600182019050919050565b60006150bf826150c6565b9050919050565b60006150d182615254565b9050919050565b6000819050919050565b60006150ed82614fbc565b91506150f883614fbc565b92508261510857615107615142565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d111561521d5760046000803e61521a600051615261565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f514d3a20546f6b656e20494473206d6f7265207468616e206c696d6974000000600082015250565b7f514d3a204e6f74206f6e20617070726f766564206c6973740000000000000000600082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f514d3a2043617073756c6520616c726561647920636c61696d65640000000000600082015250565b7f514d3a20496e76616c696420546f6b656e204944000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f514d3a2053656e646572206e6f74206f776e6572000000000000000000000000600082015250565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f514d3a204261746368206d6f7265207468616e206c696d697400000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f514d3a20426174636820436f6e747261637473206d6f7265207468616e206c6960008201527f6d69740000000000000000000000000000000000000000000000000000000000602082015250565b7f5552492072657175657374656420666f7220696e76616c696420746f6b656e00600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f514d3a2053697a652073686f756c64206265207468652073616d650000000000600082015250565b600060443d101561590b5761598e565b615913614d03565b60043d036004823e80513d602482011167ffffffffffffffff8211171561593b57505061598e565b808201805167ffffffffffffffff811115615959575050505061598e565b80602083010160043d03850181111561597657505050505061598e565b6159858260200185018661503a565b82955050505050505b90565b61599a81614f52565b81146159a557600080fd5b50565b6159b181614f64565b81146159bc57600080fd5b50565b6159c881614f70565b81146159d357600080fd5b50565b6159df81614fbc565b81146159ea57600080fd5b5056fea26469706673582212201d3c269d228b23a294bece286cf5da1dd1af6ce8cb35baa502d2e5b3af91b4ef64736f6c63430008070033

Deployed Bytecode Sourcemap

54817:6057:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20980:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20003:310;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56231:304;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60064:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22919:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21377:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60393:98;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56543:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45765:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55696:58;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35249:353;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55602:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43812:103;;;:::i;:::-;;56702:768;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43161:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60241:66;;;:::i;:::-;;21974:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58252:269;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55637:52;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54985:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55478:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59854:202;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60499:128;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60315:70;;;:::i;:::-;;22201:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57480:764;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22441:401;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44070:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34920:321;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20980:231;21066:7;21113:1;21094:21;;:7;:21;;;;21086:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;21181:9;:13;21191:2;21181:13;;;;;;;;;;;:22;21195:7;21181:22;;;;;;;;;;;;;;;;21174:29;;20980:231;;;;:::o;20003:310::-;20105:4;20157:26;20142:41;;;:11;:41;;;;:110;;;;20215:37;20200:52;;;:11;:52;;;;20142:110;:163;;;;20269:36;20293:11;20269:23;:36::i;:::-;20142:163;20122:183;;20003:310;;;:::o;56231:304::-;56289:13;56334:1;56323:8;:12;:43;;;;;55517:1;56339:8;:27;;56323:43;56315:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;56444:1;56426:7;56420:21;;;;;:::i;:::-;;;:25;:107;;56520:7;56420:107;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56472:7;56481:19;:8;:17;:19::i;:::-;56502:13;56455:61;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56420:107;56413:114;;56231:304;;;:::o;60064:169::-;43392:12;:10;:12::i;:::-;43381:23;;:7;:5;:7::i;:::-;:23;;;43373:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60173:4:::1;60139:20;:31;60160:9;60139:31;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;60215:9;60193:32;;;;;;;;;;;;60064:169:::0;:::o;22919:442::-;23160:12;:10;:12::i;:::-;23152:20;;:4;:20;;;:60;;;;23176:36;23193:4;23199:12;:10;:12::i;:::-;23176:16;:36::i;:::-;23152:60;23130:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;23301:52;23324:4;23330:2;23334:3;23339:7;23348:4;23301:22;:52::i;:::-;22919:442;;;;;:::o;21377:524::-;21533:16;21594:3;:10;21575:8;:15;:29;21567:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;21663:30;21710:8;:15;21696:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21663:63;;21744:9;21739:122;21763:8;:15;21759:1;:19;21739:122;;;21819:30;21829:8;21838:1;21829:11;;;;;;;;:::i;:::-;;;;;;;;21842:3;21846:1;21842:6;;;;;;;;:::i;:::-;;;;;;;;21819:9;:30::i;:::-;21800:13;21814:1;21800:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;21780:3;;;;:::i;:::-;;;21739:122;;;;21880:13;21873:20;;;21377:524;;;;:::o;60393:98::-;43392:12;:10;:12::i;:::-;43381:23;;:7;:5;:7::i;:::-;:23;;;43373:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60475:8:::1;60465:7;:18;;;;;;;;;;;;:::i;:::-;;60393:98:::0;:::o;56543:151::-;56617:4;56641:9;:20;56651:9;56641:20;;;;;;;;;;;;;;;:30;56662:8;56641:30;;;;;;;;;;;;;;;;;;;;;:45;;56681:5;56641:45;;;56674:4;56641:45;56634:52;;56543:151;;;;:::o;45765:86::-;45812:4;45836:7;;;;;;;;;;;45829:14;;45765:86;:::o;55696:58::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35249:353::-;35425:12;:10;:12::i;:::-;35414:23;;:7;:23;;;:66;;;;35441:39;35458:7;35467:12;:10;:12::i;:::-;35441:16;:39::i;:::-;35414:66;35392:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;35562:32;35573:7;35582:3;35587:6;35562:10;:32::i;:::-;35249:353;;;:::o;55602:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43812:103::-;43392:12;:10;:12::i;:::-;43381:23;;:7;:5;:7::i;:::-;:23;;;43373:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43877:30:::1;43904:1;43877:18;:30::i;:::-;43812:103::o:0;56702:768::-;56824:13;46091:8;:6;:8::i;:::-;46090:9;46082:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;48769:1:::1;49367:7;;:19;;49359:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;48769:1;49500:7;:18;;;;55561:2:::2;56858:10;;:17;;:32;;56850:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;55561:2;56949:9;;:16;;:31;;56941:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;57054:9;;:16;;57033:10;;:17;;:37;57025:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;57115:28;57157:10;;:17;;57146:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57115:60;;57193:6;57188:154;57209:10;;:17;;57205:1;:21;57188:154;;;57248:7;57258:35;57265:10;;57276:1;57265:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;57280:9;;57290:1;57280:12;;;;;;;:::i;:::-;;;;;;;;57258:6;:35::i;:::-;57248:45;;57328:2;57308:14;57323:1;57308:17;;;;;;;;:::i;:::-;;;;;;;:22;;;::::0;::::2;57233:109;57228:3;;;;:::i;:::-;;;57188:154;;;;57359:61;57370:10;;57382:9;;57393:10;57405:14;57359:61;;;;;;;;;;;:::i;:::-;;;;;;;;57448:14;57441:21;;;48725:1:::1;49679:7;:22;;;;56702:768:::0;;;;;;:::o;43161:87::-;43207:7;43234:6;;;;;;;;;;;43227:13;;43161:87;:::o;60241:66::-;43392:12;:10;:12::i;:::-;43381:23;;:7;:5;:7::i;:::-;:23;;;43373:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60291:8:::1;:6;:8::i;:::-;60241:66::o:0;21974:155::-;22069:52;22088:12;:10;:12::i;:::-;22102:8;22112;22069:18;:52::i;:::-;21974:155;;:::o;58252:269::-;58344:4;46091:8;:6;:8::i;:::-;46090:9;46082:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;48769:1:::1;49367:7;;:19;;49359:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;48769:1;49500:7;:18;;;;58363::::2;58384:27;58391:9;58402:8;58384:6;:27::i;:::-;58363:48;;58435:9;58429:53;;;58446:8;58456:10;58468:13;58429:53;;;;;;;;:::i;:::-;;;;;;;;58500:13;58493:20;;;48725:1:::1;49679:7;:22;;;;58252:269:::0;;;;:::o;55637:52::-;;;;;;;;;;;;;;;;;;;;;;:::o;54985:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55478:40::-;55517:1;55478:40;:::o;59854:202::-;43392:12;:10;:12::i;:::-;43381:23;;:7;:5;:7::i;:::-;:23;;;43373:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59947:1:::1;59936:8;:12;:43;;;;;55517:1;59952:8;:27;;59936:43;59928:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;60015:33;60021:7;:5;:7::i;:::-;60030:8;60040:3;60015:33;;;;;;;;;;;::::0;:5:::1;:33::i;:::-;59854:202:::0;;:::o;60499:128::-;43392:12;:10;:12::i;:::-;43381:23;;:7;:5;:7::i;:::-;:23;;;43373:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60602:17:::1;60586:13;:33;;;;;;;;;;;;:::i;:::-;;60499:128:::0;:::o;60315:70::-;43392:12;:10;:12::i;:::-;43381:23;;:7;:5;:7::i;:::-;:23;;;43373:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60367:10:::1;:8;:10::i;:::-;60315:70::o:0;22201:168::-;22300:4;22324:18;:27;22343:7;22324:27;;;;;;;;;;;;;;;:37;22352:8;22324:37;;;;;;;;;;;;;;;;;;;;;;;;;22317:44;;22201:168;;;;:::o;57480:764::-;57631:13;48769:1;49367:7;;:19;;49359:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;48769:1;49500:7;:18;;;;43392:12:::1;:10;:12::i;:::-;43381:23;;:7;:5;:7::i;:::-;:23;;;43373:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55561:2:::2;57665:10;;:17;;:32;;57657:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;57767:9;;:16;;57746:10;;:17;;:37;:75;;;;;57805:9;;:16;;57787:7;;:14;;:34;57746:75;57738:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;57866:28;57908:10;;:17;;57897:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57866:60;;57944:6;57939:175;57960:10;;:17;;57956:1;:21;57939:175;;;57999:7;58009:56;58025:7;;58033:1;58025:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;58037;;58048:1;58037:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;58052:9;;58062:1;58052:12;;;;;;;:::i;:::-;;;;;;;;58009:15;:56::i;:::-;57999:66;;58100:2;58080:14;58095:1;58080:17;;;;;;;;:::i;:::-;;;;;;;:22;;;::::0;::::2;57984:130;57979:3;;;;:::i;:::-;;;57939:175;;;;58131:63;58147:10;;58159:9;;58170:7;;58179:14;58131:63;;;;;;;;;;;;:::i;:::-;;;;;;;;58222:14;58215:21;;;48725:1:::0;49679:7;:22;;;;57480:764;;;;;;;;:::o;22441:401::-;22657:12;:10;:12::i;:::-;22649:20;;:4;:20;;;:60;;;;22673:36;22690:4;22696:12;:10;:12::i;:::-;22673:16;:36::i;:::-;22649:60;22627:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;22789:45;22807:4;22813:2;22817;22821:6;22829:4;22789:17;:45::i;:::-;22441:401;;;;;:::o;44070:201::-;43392:12;:10;:12::i;:::-;43381:23;;:7;:5;:7::i;:::-;:23;;;43373:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44179:1:::1;44159:22;;:8;:22;;;;44151:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44235:28;44254:8;44235:18;:28::i;:::-;44070:201:::0;:::o;34920:321::-;35071:12;:10;:12::i;:::-;35060:23;;:7;:23;;;:66;;;;35087:39;35104:7;35113:12;:10;:12::i;:::-;35087:16;:39::i;:::-;35060:66;35038:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;35208:25;35214:7;35223:2;35227:5;35208;:25::i;:::-;34920:321;;;:::o;18758:157::-;18843:4;18882:25;18867:40;;;:11;:40;;;;18860:47;;18758:157;;;:::o;38865:723::-;38921:13;39151:1;39142:5;:10;39138:53;;;39169:10;;;;;;;;;;;;;;;;;;;;;39138:53;39201:12;39216:5;39201:20;;39232:14;39257:78;39272:1;39264:4;:9;39257:78;;39290:8;;;;;:::i;:::-;;;;39321:2;39313:10;;;;;:::i;:::-;;;39257:78;;;39345:19;39377:6;39367:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39345:39;;39395:154;39411:1;39402:5;:10;39395:154;;39439:1;39429:11;;;;;:::i;:::-;;;39506:2;39498:5;:10;;;;:::i;:::-;39485:2;:24;;;;:::i;:::-;39472:39;;39455:6;39462;39455:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;39535:2;39526:11;;;;;:::i;:::-;;;39395:154;;;39573:6;39559:21;;;;;38865:723;;;;:::o;17675:98::-;17728:7;17755:10;17748:17;;17675:98;:::o;25003:1074::-;25230:7;:14;25216:3;:10;:28;25208:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;25322:1;25308:16;;:2;:16;;;;25300:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;25379:16;25398:12;:10;:12::i;:::-;25379:31;;25423:60;25444:8;25454:4;25460:2;25464:3;25469:7;25478:4;25423:20;:60::i;:::-;25501:9;25496:421;25520:3;:10;25516:1;:14;25496:421;;;25552:10;25565:3;25569:1;25565:6;;;;;;;;:::i;:::-;;;;;;;;25552:19;;25586:14;25603:7;25611:1;25603:10;;;;;;;;:::i;:::-;;;;;;;;25586:27;;25630:19;25652:9;:13;25662:2;25652:13;;;;;;;;;;;:19;25666:4;25652:19;;;;;;;;;;;;;;;;25630:41;;25709:6;25694:11;:21;;25686:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;25842:6;25828:11;:20;25806:9;:13;25816:2;25806:13;;;;;;;;;;;:19;25820:4;25806:19;;;;;;;;;;;;;;;:42;;;;25899:6;25878:9;:13;25888:2;25878:13;;;;;;;;;;;:17;25892:2;25878:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;25537:380;;;25532:3;;;;:::i;:::-;;;25496:421;;;;25964:2;25934:47;;25958:4;25934:47;;25948:8;25934:47;;;25968:3;25973:7;25934:47;;;;;;;:::i;:::-;;;;;;;;25994:75;26030:8;26040:4;26046:2;26050:3;26055:7;26064:4;25994:35;:75::i;:::-;25197:880;25003:1074;;;;;:::o;30156:891::-;30324:1;30308:18;;:4;:18;;;;30300:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;30399:7;:14;30385:3;:10;:28;30377:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;30471:16;30490:12;:10;:12::i;:::-;30471:31;;30515:66;30536:8;30546:4;30560:1;30564:3;30569:7;30515:66;;;;;;;;;;;;:20;:66::i;:::-;30599:9;30594:373;30618:3;:10;30614:1;:14;30594:373;;;30650:10;30663:3;30667:1;30663:6;;;;;;;;:::i;:::-;;;;;;;;30650:19;;30684:14;30701:7;30709:1;30701:10;;;;;;;;:::i;:::-;;;;;;;;30684:27;;30728:19;30750:9;:13;30760:2;30750:13;;;;;;;;;;;:19;30764:4;30750:19;;;;;;;;;;;;;;;;30728:41;;30807:6;30792:11;:21;;30784:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;30934:6;30920:11;:20;30898:9;:13;30908:2;30898:13;;;;;;;;;;;:19;30912:4;30898:19;;;;;;;;;;;;;;;:42;;;;30635:332;;;30630:3;;;;;:::i;:::-;;;;30594:373;;;;31022:1;30984:55;;31008:4;30984:55;;30998:8;30984:55;;;31026:3;31031:7;30984:55;;;;;;;:::i;:::-;;;;;;;;30289:758;30156:891;;;:::o;44431:191::-;44505:16;44524:6;;;;;;;;;;;44505:25;;44550:8;44541:6;;:17;;;;;;;;;;;;;;;;;;44605:8;44574:40;;44595:8;44574:40;;;;;;;;;;;;44494:128;44431:191;:::o;58529:543::-;58596:4;58623:20;:31;58644:9;58623:31;;;;;;;;;;;;;;;;;;;;;;;;;58615:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58736:5;58702:39;;:9;:20;58712:9;58702:20;;;;;;;;;;;;;;;:30;58723:8;58702:30;;;;;;;;;;;;;;;;;;;;;:39;;;58694:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;58794:18;58823:9;58815:26;;;58842:8;58815:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58794:57;;58884:10;58870:24;;:10;:24;;;58862:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;58965:4;58932:9;:20;58942:9;58932:20;;;;;;;;;;;;;;;:30;58953:8;58932:30;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;58980:18;59001:30;59020:10;59001:18;:30::i;:::-;58980:51;;59051:13;59044:20;;;;58529:543;;;;:::o;46565:118::-;46091:8;:6;:8::i;:::-;46090:9;46082:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;46635:4:::1;46625:7;;:14;;;;;;;;;;;;;;;;;;46655:20;46662:12;:10;:12::i;:::-;46655:20;;;;;;:::i;:::-;;;;;;;;46565:118::o:0;31189:331::-;31344:8;31335:17;;:5;:17;;;;31327:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;31447:8;31409:18;:25;31428:5;31409:25;;;;;;;;;;;;;;;:35;31435:8;31409:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;31493:8;31471:41;;31486:5;31471:41;;;31503:8;31471:41;;;;;;:::i;:::-;;;;;;;;31189:331;;;:::o;27395:569::-;27562:1;27548:16;;:2;:16;;;;27540:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;27615:16;27634:12;:10;:12::i;:::-;27615:31;;27659:102;27680:8;27698:1;27702:2;27706:21;27724:2;27706:17;:21::i;:::-;27729:25;27747:6;27729:17;:25::i;:::-;27756:4;27659:20;:102::i;:::-;27795:6;27774:9;:13;27784:2;27774:13;;;;;;;;;;;:17;27788:2;27774:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;27854:2;27817:52;;27850:1;27817:52;;27832:8;27817:52;;;27858:2;27862:6;27817:52;;;;;;;:::i;:::-;;;;;;;;27882:74;27913:8;27931:1;27935:2;27939;27943:6;27951:4;27882:30;:74::i;:::-;27529:435;27395:569;;;;:::o;46824:120::-;46368:8;:6;:8::i;:::-;46360:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;46893:5:::1;46883:7;;:15;;;;;;;;;;;;;;;;;;46914:22;46923:12;:10;:12::i;:::-;46914:22;;;;;;:::i;:::-;;;;;;;;46824:120::o:0;59080:418::-;59172:4;59199:20;:31;59220:9;59199:31;;;;;;;;;;;;;;;;;;;;;;;;;59191:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59312:5;59278:39;;:9;:20;59288:9;59278:20;;;;;;;;;;;;;;;:30;59299:8;59278:30;;;;;;;;;;;;;;;;;;;;;:39;;;59270:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;59395:4;59362:9;:20;59372:9;59362:20;;;;;;;;;;;;;;;:30;59383:8;59362:30;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;59410:18;59431:26;59450:6;59431:18;:26::i;:::-;59410:47;;59477:13;59470:20;;;59080:418;;;;;:::o;23825:820::-;24027:1;24013:16;;:2;:16;;;;24005:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;24084:16;24103:12;:10;:12::i;:::-;24084:31;;24128:96;24149:8;24159:4;24165:2;24169:21;24187:2;24169:17;:21::i;:::-;24192:25;24210:6;24192:17;:25::i;:::-;24219:4;24128:20;:96::i;:::-;24237:19;24259:9;:13;24269:2;24259:13;;;;;;;;;;;:19;24273:4;24259:19;;;;;;;;;;;;;;;;24237:41;;24312:6;24297:11;:21;;24289:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;24437:6;24423:11;:20;24401:9;:13;24411:2;24401:13;;;;;;;;;;;:19;24415:4;24401:19;;;;;;;;;;;;;;;:42;;;;24486:6;24465:9;:13;24475:2;24465:13;;;;;;;;;;;:17;24479:2;24465:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;24541:2;24510:46;;24535:4;24510:46;;24525:8;24510:46;;;24545:2;24549:6;24510:46;;;;;;;:::i;:::-;;;;;;;;24569:68;24600:8;24610:4;24616:2;24620;24624:6;24632:4;24569:30;:68::i;:::-;23994:651;;23825:820;;;;;:::o;29305:648::-;29448:1;29432:18;;:4;:18;;;;29424:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;29503:16;29522:12;:10;:12::i;:::-;29503:31;;29547:102;29568:8;29578:4;29592:1;29596:21;29614:2;29596:17;:21::i;:::-;29619:25;29637:6;29619:17;:25::i;:::-;29547:102;;;;;;;;;;;;:20;:102::i;:::-;29662:19;29684:9;:13;29694:2;29684:13;;;;;;;;;;;:19;29698:4;29684:19;;;;;;;;;;;;;;;;29662:41;;29737:6;29722:11;:21;;29714:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;29856:6;29842:11;:20;29820:9;:13;29830:2;29820:13;;;;;;;;;;;:19;29834:4;29820:19;;;;;;;;;;;;;;;:42;;;;29930:1;29891:54;;29916:4;29891:54;;29906:8;29891:54;;;29934:2;29938:6;29891:54;;;;;;;:::i;:::-;;;;;;;;29413:540;;29305:648;;;:::o;60639:230::-;;;;;;;:::o;33457:813::-;33697:15;:2;:13;;;:15::i;:::-;33693:570;;;33750:2;33733:43;;;33777:8;33787:4;33793:3;33798:7;33807:4;33733:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33729:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;34125:6;34118:14;;;;;;;;;;;:::i;:::-;;;;;;;;33729:523;;;34174:62;;;;;;;;;;:::i;:::-;;;;;;;;33729:523;33906:48;;;33894:60;;;:8;:60;;;;33890:159;;33979:50;;;;;;;;;;:::i;:::-;;;;;;;;33890:159;33813:251;33693:570;33457:813;;;;;;:::o;59506:340::-;59570:4;59588:17;55517:1;59640:15;59657:10;59669:5;;59623:52;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59613:63;;;;;;59608:69;;:87;;;;:::i;:::-;59588:107;;59736:1;59721:12;:16;;;;:::i;:::-;59706:31;;59748:5;;:7;;;;;;;;;:::i;:::-;;;;;;59768:38;59774:10;59786:12;59800:1;59768:38;;;;;;;;;;;;:5;:38::i;:::-;59826:12;59819:19;;;59506:340;;;:::o;34278:198::-;34344:16;34373:22;34412:1;34398:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34373:41;;34436:7;34425:5;34431:1;34425:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;34463:5;34456:12;;;34278:198;;;:::o;32705:744::-;32920:15;:2;:13;;;:15::i;:::-;32916:526;;;32973:2;32956:38;;;32995:8;33005:4;33011:2;33015:6;33023:4;32956:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32952:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;33304:6;33297:14;;;;;;;;;;;:::i;:::-;;;;;;;;32952:479;;;33353:62;;;;;;;;;;:::i;:::-;;;;;;;;32952:479;33090:43;;;33078:55;;;:8;:55;;;;33074:154;;33158:50;;;;;;;;;;:::i;:::-;;;;;;;;33074:154;33029:214;32916:526;32705:744;;;;;;:::o;9720:326::-;9780:4;10037:1;10015:7;:19;;;:23;10008:30;;9720:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:412::-;1991:5;2016:66;2032:49;2074:6;2032:49;:::i;:::-;2016:66;:::i;:::-;2007:75;;2105:6;2098:5;2091:21;2143:4;2136:5;2132:16;2181:3;2172:6;2167:3;2163:16;2160:25;2157:112;;;2188:79;;:::i;:::-;2157:112;2278:41;2312:6;2307:3;2302;2278:41;:::i;:::-;1997:328;1913:412;;;;;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2476:143::-;2533:5;2564:6;2558:13;2549:22;;2580:33;2607:5;2580:33;:::i;:::-;2476:143;;;;:::o;2642:568::-;2715:8;2725:6;2775:3;2768:4;2760:6;2756:17;2752:27;2742:122;;2783:79;;:::i;:::-;2742:122;2896:6;2883:20;2873:30;;2926:18;2918:6;2915:30;2912:117;;;2948:79;;:::i;:::-;2912:117;3062:4;3054:6;3050:17;3038:29;;3116:3;3108:4;3100:6;3096:17;3086:8;3082:32;3079:41;3076:128;;;3123:79;;:::i;:::-;3076:128;2642:568;;;;;:::o;3233:370::-;3304:5;3353:3;3346:4;3338:6;3334:17;3330:27;3320:122;;3361:79;;:::i;:::-;3320:122;3478:6;3465:20;3503:94;3593:3;3585:6;3578:4;3570:6;3566:17;3503:94;:::i;:::-;3494:103;;3310:293;3233:370;;;;:::o;3626:568::-;3699:8;3709:6;3759:3;3752:4;3744:6;3740:17;3736:27;3726:122;;3767:79;;:::i;:::-;3726:122;3880:6;3867:20;3857:30;;3910:18;3902:6;3899:30;3896:117;;;3932:79;;:::i;:::-;3896:117;4046:4;4038:6;4034:17;4022:29;;4100:3;4092:4;4084:6;4080:17;4070:8;4066:32;4063:41;4060:128;;;4107:79;;:::i;:::-;4060:128;3626:568;;;;;:::o;4217:370::-;4288:5;4337:3;4330:4;4322:6;4318:17;4314:27;4304:122;;4345:79;;:::i;:::-;4304:122;4462:6;4449:20;4487:94;4577:3;4569:6;4562:4;4554:6;4550:17;4487:94;:::i;:::-;4478:103;;4294:293;4217:370;;;;:::o;4593:133::-;4636:5;4674:6;4661:20;4652:29;;4690:30;4714:5;4690:30;:::i;:::-;4593:133;;;;:::o;4732:137::-;4777:5;4815:6;4802:20;4793:29;;4831:32;4857:5;4831:32;:::i;:::-;4732:137;;;;:::o;4875:141::-;4931:5;4962:6;4956:13;4947:22;;4978:32;5004:5;4978:32;:::i;:::-;4875:141;;;;:::o;5035:338::-;5090:5;5139:3;5132:4;5124:6;5120:17;5116:27;5106:122;;5147:79;;:::i;:::-;5106:122;5264:6;5251:20;5289:78;5363:3;5355:6;5348:4;5340:6;5336:17;5289:78;:::i;:::-;5280:87;;5096:277;5035:338;;;;:::o;5393:340::-;5449:5;5498:3;5491:4;5483:6;5479:17;5475:27;5465:122;;5506:79;;:::i;:::-;5465:122;5623:6;5610:20;5648:79;5723:3;5715:6;5708:4;5700:6;5696:17;5648:79;:::i;:::-;5639:88;;5455:278;5393:340;;;;:::o;5739:139::-;5785:5;5823:6;5810:20;5801:29;;5839:33;5866:5;5839:33;:::i;:::-;5739:139;;;;:::o;5884:329::-;5943:6;5992:2;5980:9;5971:7;5967:23;5963:32;5960:119;;;5998:79;;:::i;:::-;5960:119;6118:1;6143:53;6188:7;6179:6;6168:9;6164:22;6143:53;:::i;:::-;6133:63;;6089:117;5884:329;;;;:::o;6219:351::-;6289:6;6338:2;6326:9;6317:7;6313:23;6309:32;6306:119;;;6344:79;;:::i;:::-;6306:119;6464:1;6489:64;6545:7;6536:6;6525:9;6521:22;6489:64;:::i;:::-;6479:74;;6435:128;6219:351;;;;:::o;6576:474::-;6644:6;6652;6701:2;6689:9;6680:7;6676:23;6672:32;6669:119;;;6707:79;;:::i;:::-;6669:119;6827:1;6852:53;6897:7;6888:6;6877:9;6873:22;6852:53;:::i;:::-;6842:63;;6798:117;6954:2;6980:53;7025:7;7016:6;7005:9;7001:22;6980:53;:::i;:::-;6970:63;;6925:118;6576:474;;;;;:::o;7056:1509::-;7210:6;7218;7226;7234;7242;7291:3;7279:9;7270:7;7266:23;7262:33;7259:120;;;7298:79;;:::i;:::-;7259:120;7418:1;7443:53;7488:7;7479:6;7468:9;7464:22;7443:53;:::i;:::-;7433:63;;7389:117;7545:2;7571:53;7616:7;7607:6;7596:9;7592:22;7571:53;:::i;:::-;7561:63;;7516:118;7701:2;7690:9;7686:18;7673:32;7732:18;7724:6;7721:30;7718:117;;;7754:79;;:::i;:::-;7718:117;7859:78;7929:7;7920:6;7909:9;7905:22;7859:78;:::i;:::-;7849:88;;7644:303;8014:2;8003:9;7999:18;7986:32;8045:18;8037:6;8034:30;8031:117;;;8067:79;;:::i;:::-;8031:117;8172:78;8242:7;8233:6;8222:9;8218:22;8172:78;:::i;:::-;8162:88;;7957:303;8327:3;8316:9;8312:19;8299:33;8359:18;8351:6;8348:30;8345:117;;;8381:79;;:::i;:::-;8345:117;8486:62;8540:7;8531:6;8520:9;8516:22;8486:62;:::i;:::-;8476:72;;8270:288;7056:1509;;;;;;;;:::o;8571:1089::-;8675:6;8683;8691;8699;8707;8756:3;8744:9;8735:7;8731:23;8727:33;8724:120;;;8763:79;;:::i;:::-;8724:120;8883:1;8908:53;8953:7;8944:6;8933:9;8929:22;8908:53;:::i;:::-;8898:63;;8854:117;9010:2;9036:53;9081:7;9072:6;9061:9;9057:22;9036:53;:::i;:::-;9026:63;;8981:118;9138:2;9164:53;9209:7;9200:6;9189:9;9185:22;9164:53;:::i;:::-;9154:63;;9109:118;9266:2;9292:53;9337:7;9328:6;9317:9;9313:22;9292:53;:::i;:::-;9282:63;;9237:118;9422:3;9411:9;9407:19;9394:33;9454:18;9446:6;9443:30;9440:117;;;9476:79;;:::i;:::-;9440:117;9581:62;9635:7;9626:6;9615:9;9611:22;9581:62;:::i;:::-;9571:72;;9365:288;8571:1089;;;;;;;;:::o;9666:1039::-;9793:6;9801;9809;9858:2;9846:9;9837:7;9833:23;9829:32;9826:119;;;9864:79;;:::i;:::-;9826:119;9984:1;10009:53;10054:7;10045:6;10034:9;10030:22;10009:53;:::i;:::-;9999:63;;9955:117;10139:2;10128:9;10124:18;10111:32;10170:18;10162:6;10159:30;10156:117;;;10192:79;;:::i;:::-;10156:117;10297:78;10367:7;10358:6;10347:9;10343:22;10297:78;:::i;:::-;10287:88;;10082:303;10452:2;10441:9;10437:18;10424:32;10483:18;10475:6;10472:30;10469:117;;;10505:79;;:::i;:::-;10469:117;10610:78;10680:7;10671:6;10660:9;10656:22;10610:78;:::i;:::-;10600:88;;10395:303;9666:1039;;;;;:::o;10711:468::-;10776:6;10784;10833:2;10821:9;10812:7;10808:23;10804:32;10801:119;;;10839:79;;:::i;:::-;10801:119;10959:1;10984:53;11029:7;11020:6;11009:9;11005:22;10984:53;:::i;:::-;10974:63;;10930:117;11086:2;11112:50;11154:7;11145:6;11134:9;11130:22;11112:50;:::i;:::-;11102:60;;11057:115;10711:468;;;;;:::o;11185:474::-;11253:6;11261;11310:2;11298:9;11289:7;11285:23;11281:32;11278:119;;;11316:79;;:::i;:::-;11278:119;11436:1;11461:53;11506:7;11497:6;11486:9;11482:22;11461:53;:::i;:::-;11451:63;;11407:117;11563:2;11589:53;11634:7;11625:6;11614:9;11610:22;11589:53;:::i;:::-;11579:63;;11534:118;11185:474;;;;;:::o;11665:619::-;11742:6;11750;11758;11807:2;11795:9;11786:7;11782:23;11778:32;11775:119;;;11813:79;;:::i;:::-;11775:119;11933:1;11958:53;12003:7;11994:6;11983:9;11979:22;11958:53;:::i;:::-;11948:63;;11904:117;12060:2;12086:53;12131:7;12122:6;12111:9;12107:22;12086:53;:::i;:::-;12076:63;;12031:118;12188:2;12214:53;12259:7;12250:6;12239:9;12235:22;12214:53;:::i;:::-;12204:63;;12159:118;11665:619;;;;;:::o;12290:1309::-;12448:6;12456;12464;12472;12480;12488;12537:2;12525:9;12516:7;12512:23;12508:32;12505:119;;;12543:79;;:::i;:::-;12505:119;12691:1;12680:9;12676:17;12663:31;12721:18;12713:6;12710:30;12707:117;;;12743:79;;:::i;:::-;12707:117;12856:80;12928:7;12919:6;12908:9;12904:22;12856:80;:::i;:::-;12838:98;;;;12634:312;13013:2;13002:9;12998:18;12985:32;13044:18;13036:6;13033:30;13030:117;;;13066:79;;:::i;:::-;13030:117;13179:80;13251:7;13242:6;13231:9;13227:22;13179:80;:::i;:::-;13161:98;;;;12956:313;13336:2;13325:9;13321:18;13308:32;13367:18;13359:6;13356:30;13353:117;;;13389:79;;:::i;:::-;13353:117;13502:80;13574:7;13565:6;13554:9;13550:22;13502:80;:::i;:::-;13484:98;;;;13279:313;12290:1309;;;;;;;;:::o;13605:934::-;13727:6;13735;13743;13751;13800:2;13788:9;13779:7;13775:23;13771:32;13768:119;;;13806:79;;:::i;:::-;13768:119;13954:1;13943:9;13939:17;13926:31;13984:18;13976:6;13973:30;13970:117;;;14006:79;;:::i;:::-;13970:117;14119:80;14191:7;14182:6;14171:9;14167:22;14119:80;:::i;:::-;14101:98;;;;13897:312;14276:2;14265:9;14261:18;14248:32;14307:18;14299:6;14296:30;14293:117;;;14329:79;;:::i;:::-;14293:117;14442:80;14514:7;14505:6;14494:9;14490:22;14442:80;:::i;:::-;14424:98;;;;14219:313;13605:934;;;;;;;:::o;14545:894::-;14663:6;14671;14720:2;14708:9;14699:7;14695:23;14691:32;14688:119;;;14726:79;;:::i;:::-;14688:119;14874:1;14863:9;14859:17;14846:31;14904:18;14896:6;14893:30;14890:117;;;14926:79;;:::i;:::-;14890:117;15031:78;15101:7;15092:6;15081:9;15077:22;15031:78;:::i;:::-;15021:88;;14817:302;15186:2;15175:9;15171:18;15158:32;15217:18;15209:6;15206:30;15203:117;;;15239:79;;:::i;:::-;15203:117;15344:78;15414:7;15405:6;15394:9;15390:22;15344:78;:::i;:::-;15334:88;;15129:303;14545:894;;;;;:::o;15445:327::-;15503:6;15552:2;15540:9;15531:7;15527:23;15523:32;15520:119;;;15558:79;;:::i;:::-;15520:119;15678:1;15703:52;15747:7;15738:6;15727:9;15723:22;15703:52;:::i;:::-;15693:62;;15649:116;15445:327;;;;:::o;15778:349::-;15847:6;15896:2;15884:9;15875:7;15871:23;15867:32;15864:119;;;15902:79;;:::i;:::-;15864:119;16022:1;16047:63;16102:7;16093:6;16082:9;16078:22;16047:63;:::i;:::-;16037:73;;15993:127;15778:349;;;;:::o;16133:509::-;16202:6;16251:2;16239:9;16230:7;16226:23;16222:32;16219:119;;;16257:79;;:::i;:::-;16219:119;16405:1;16394:9;16390:17;16377:31;16435:18;16427:6;16424:30;16421:117;;;16457:79;;:::i;:::-;16421:117;16562:63;16617:7;16608:6;16597:9;16593:22;16562:63;:::i;:::-;16552:73;;16348:287;16133:509;;;;:::o;16648:329::-;16707:6;16756:2;16744:9;16735:7;16731:23;16727:32;16724:119;;;16762:79;;:::i;:::-;16724:119;16882:1;16907:53;16952:7;16943:6;16932:9;16928:22;16907:53;:::i;:::-;16897:63;;16853:117;16648:329;;;;:::o;16983:474::-;17051:6;17059;17108:2;17096:9;17087:7;17083:23;17079:32;17076:119;;;17114:79;;:::i;:::-;17076:119;17234:1;17259:53;17304:7;17295:6;17284:9;17280:22;17259:53;:::i;:::-;17249:63;;17205:117;17361:2;17387:53;17432:7;17423:6;17412:9;17408:22;17387:53;:::i;:::-;17377:63;;17332:118;16983:474;;;;;:::o;17463:179::-;17532:10;17553:46;17595:3;17587:6;17553:46;:::i;:::-;17631:4;17626:3;17622:14;17608:28;;17463:179;;;;:::o;17648:::-;17717:10;17738:46;17780:3;17772:6;17738:46;:::i;:::-;17816:4;17811:3;17807:14;17793:28;;17648:179;;;;:::o;17833:108::-;17910:24;17928:5;17910:24;:::i;:::-;17905:3;17898:37;17833:108;;:::o;17947:118::-;18034:24;18052:5;18034:24;:::i;:::-;18029:3;18022:37;17947:118;;:::o;18071:157::-;18176:45;18196:24;18214:5;18196:24;:::i;:::-;18176:45;:::i;:::-;18171:3;18164:58;18071:157;;:::o;18264:699::-;18393:3;18416:86;18495:6;18490:3;18416:86;:::i;:::-;18409:93;;18526:58;18578:5;18526:58;:::i;:::-;18607:7;18638:1;18623:315;18648:6;18645:1;18642:13;18623:315;;;18718:42;18753:6;18744:7;18718:42;:::i;:::-;18780:63;18839:3;18824:13;18780:63;:::i;:::-;18773:70;;18866:62;18921:6;18866:62;:::i;:::-;18856:72;;18683:255;18670:1;18667;18663:9;18658:14;;18623:315;;;18627:14;18954:3;18947:10;;18398:565;;18264:699;;;;;:::o;18999:537::-;19127:3;19148:86;19227:6;19222:3;19148:86;:::i;:::-;19141:93;;19258:66;19250:6;19247:78;19244:165;;;19328:79;;:::i;:::-;19244:165;19440:4;19432:6;19428:17;19418:27;;19455:43;19491:6;19486:3;19479:5;19455:43;:::i;:::-;19523:6;19518:3;19514:16;19507:23;;18999:537;;;;;:::o;19572:732::-;19691:3;19720:54;19768:5;19720:54;:::i;:::-;19790:86;19869:6;19864:3;19790:86;:::i;:::-;19783:93;;19900:56;19950:5;19900:56;:::i;:::-;19979:7;20010:1;19995:284;20020:6;20017:1;20014:13;19995:284;;;20096:6;20090:13;20123:63;20182:3;20167:13;20123:63;:::i;:::-;20116:70;;20209:60;20262:6;20209:60;:::i;:::-;20199:70;;20055:224;20042:1;20039;20035:9;20030:14;;19995:284;;;19999:14;20295:3;20288:10;;19696:608;;;19572:732;;;;:::o;20310:109::-;20391:21;20406:5;20391:21;:::i;:::-;20386:3;20379:34;20310:109;;:::o;20425:360::-;20511:3;20539:38;20571:5;20539:38;:::i;:::-;20593:70;20656:6;20651:3;20593:70;:::i;:::-;20586:77;;20672:52;20717:6;20712:3;20705:4;20698:5;20694:16;20672:52;:::i;:::-;20749:29;20771:6;20749:29;:::i;:::-;20744:3;20740:39;20733:46;;20515:270;20425:360;;;;:::o;20791:364::-;20879:3;20907:39;20940:5;20907:39;:::i;:::-;20962:71;21026:6;21021:3;20962:71;:::i;:::-;20955:78;;21042:52;21087:6;21082:3;21075:4;21068:5;21064:16;21042:52;:::i;:::-;21119:29;21141:6;21119:29;:::i;:::-;21114:3;21110:39;21103:46;;20883:272;20791:364;;;;:::o;21161:377::-;21267:3;21295:39;21328:5;21295:39;:::i;:::-;21350:89;21432:6;21427:3;21350:89;:::i;:::-;21343:96;;21448:52;21493:6;21488:3;21481:4;21474:5;21470:16;21448:52;:::i;:::-;21525:6;21520:3;21516:16;21509:23;;21271:267;21161:377;;;;:::o;21568:845::-;21671:3;21708:5;21702:12;21737:36;21763:9;21737:36;:::i;:::-;21789:89;21871:6;21866:3;21789:89;:::i;:::-;21782:96;;21909:1;21898:9;21894:17;21925:1;21920:137;;;;22071:1;22066:341;;;;21887:520;;21920:137;22004:4;22000:9;21989;21985:25;21980:3;21973:38;22040:6;22035:3;22031:16;22024:23;;21920:137;;22066:341;22133:38;22165:5;22133:38;:::i;:::-;22193:1;22207:154;22221:6;22218:1;22215:13;22207:154;;;22295:7;22289:14;22285:1;22280:3;22276:11;22269:35;22345:1;22336:7;22332:15;22321:26;;22243:4;22240:1;22236:12;22231:17;;22207:154;;;22390:6;22385:3;22381:16;22374:23;;22073:334;;21887:520;;21675:738;;21568:845;;;;:::o;22419:366::-;22561:3;22582:67;22646:2;22641:3;22582:67;:::i;:::-;22575:74;;22658:93;22747:3;22658:93;:::i;:::-;22776:2;22771:3;22767:12;22760:19;;22419:366;;;:::o;22791:::-;22933:3;22954:67;23018:2;23013:3;22954:67;:::i;:::-;22947:74;;23030:93;23119:3;23030:93;:::i;:::-;23148:2;23143:3;23139:12;23132:19;;22791:366;;;:::o;23163:::-;23305:3;23326:67;23390:2;23385:3;23326:67;:::i;:::-;23319:74;;23402:93;23491:3;23402:93;:::i;:::-;23520:2;23515:3;23511:12;23504:19;;23163:366;;;:::o;23535:::-;23677:3;23698:67;23762:2;23757:3;23698:67;:::i;:::-;23691:74;;23774:93;23863:3;23774:93;:::i;:::-;23892:2;23887:3;23883:12;23876:19;;23535:366;;;:::o;23907:::-;24049:3;24070:67;24134:2;24129:3;24070:67;:::i;:::-;24063:74;;24146:93;24235:3;24146:93;:::i;:::-;24264:2;24259:3;24255:12;24248:19;;23907:366;;;:::o;24279:::-;24421:3;24442:67;24506:2;24501:3;24442:67;:::i;:::-;24435:74;;24518:93;24607:3;24518:93;:::i;:::-;24636:2;24631:3;24627:12;24620:19;;24279:366;;;:::o;24651:::-;24793:3;24814:67;24878:2;24873:3;24814:67;:::i;:::-;24807:74;;24890:93;24979:3;24890:93;:::i;:::-;25008:2;25003:3;24999:12;24992:19;;24651:366;;;:::o;25023:::-;25165:3;25186:67;25250:2;25245:3;25186:67;:::i;:::-;25179:74;;25262:93;25351:3;25262:93;:::i;:::-;25380:2;25375:3;25371:12;25364:19;;25023:366;;;:::o;25395:::-;25537:3;25558:67;25622:2;25617:3;25558:67;:::i;:::-;25551:74;;25634:93;25723:3;25634:93;:::i;:::-;25752:2;25747:3;25743:12;25736:19;;25395:366;;;:::o;25767:::-;25909:3;25930:67;25994:2;25989:3;25930:67;:::i;:::-;25923:74;;26006:93;26095:3;26006:93;:::i;:::-;26124:2;26119:3;26115:12;26108:19;;25767:366;;;:::o;26139:::-;26281:3;26302:67;26366:2;26361:3;26302:67;:::i;:::-;26295:74;;26378:93;26467:3;26378:93;:::i;:::-;26496:2;26491:3;26487:12;26480:19;;26139:366;;;:::o;26511:::-;26653:3;26674:67;26738:2;26733:3;26674:67;:::i;:::-;26667:74;;26750:93;26839:3;26750:93;:::i;:::-;26868:2;26863:3;26859:12;26852:19;;26511:366;;;:::o;26883:::-;27025:3;27046:67;27110:2;27105:3;27046:67;:::i;:::-;27039:74;;27122:93;27211:3;27122:93;:::i;:::-;27240:2;27235:3;27231:12;27224:19;;26883:366;;;:::o;27255:::-;27397:3;27418:67;27482:2;27477:3;27418:67;:::i;:::-;27411:74;;27494:93;27583:3;27494:93;:::i;:::-;27612:2;27607:3;27603:12;27596:19;;27255:366;;;:::o;27627:::-;27769:3;27790:67;27854:2;27849:3;27790:67;:::i;:::-;27783:74;;27866:93;27955:3;27866:93;:::i;:::-;27984:2;27979:3;27975:12;27968:19;;27627:366;;;:::o;27999:::-;28141:3;28162:67;28226:2;28221:3;28162:67;:::i;:::-;28155:74;;28238:93;28327:3;28238:93;:::i;:::-;28356:2;28351:3;28347:12;28340:19;;27999:366;;;:::o;28371:::-;28513:3;28534:67;28598:2;28593:3;28534:67;:::i;:::-;28527:74;;28610:93;28699:3;28610:93;:::i;:::-;28728:2;28723:3;28719:12;28712:19;;28371:366;;;:::o;28743:::-;28885:3;28906:67;28970:2;28965:3;28906:67;:::i;:::-;28899:74;;28982:93;29071:3;28982:93;:::i;:::-;29100:2;29095:3;29091:12;29084:19;;28743:366;;;:::o;29115:::-;29257:3;29278:67;29342:2;29337:3;29278:67;:::i;:::-;29271:74;;29354:93;29443:3;29354:93;:::i;:::-;29472:2;29467:3;29463:12;29456:19;;29115:366;;;:::o;29487:::-;29629:3;29650:67;29714:2;29709:3;29650:67;:::i;:::-;29643:74;;29726:93;29815:3;29726:93;:::i;:::-;29844:2;29839:3;29835:12;29828:19;;29487:366;;;:::o;29859:::-;30001:3;30022:67;30086:2;30081:3;30022:67;:::i;:::-;30015:74;;30098:93;30187:3;30098:93;:::i;:::-;30216:2;30211:3;30207:12;30200:19;;29859:366;;;:::o;30231:::-;30373:3;30394:67;30458:2;30453:3;30394:67;:::i;:::-;30387:74;;30470:93;30559:3;30470:93;:::i;:::-;30588:2;30583:3;30579:12;30572:19;;30231:366;;;:::o;30603:::-;30745:3;30766:67;30830:2;30825:3;30766:67;:::i;:::-;30759:74;;30842:93;30931:3;30842:93;:::i;:::-;30960:2;30955:3;30951:12;30944:19;;30603:366;;;:::o;30975:::-;31117:3;31138:67;31202:2;31197:3;31138:67;:::i;:::-;31131:74;;31214:93;31303:3;31214:93;:::i;:::-;31332:2;31327:3;31323:12;31316:19;;30975:366;;;:::o;31347:::-;31489:3;31510:67;31574:2;31569:3;31510:67;:::i;:::-;31503:74;;31586:93;31675:3;31586:93;:::i;:::-;31704:2;31699:3;31695:12;31688:19;;31347:366;;;:::o;31719:::-;31861:3;31882:67;31946:2;31941:3;31882:67;:::i;:::-;31875:74;;31958:93;32047:3;31958:93;:::i;:::-;32076:2;32071:3;32067:12;32060:19;;31719:366;;;:::o;32091:::-;32233:3;32254:67;32318:2;32313:3;32254:67;:::i;:::-;32247:74;;32330:93;32419:3;32330:93;:::i;:::-;32448:2;32443:3;32439:12;32432:19;;32091:366;;;:::o;32463:108::-;32540:24;32558:5;32540:24;:::i;:::-;32535:3;32528:37;32463:108;;:::o;32577:118::-;32664:24;32682:5;32664:24;:::i;:::-;32659:3;32652:37;32577:118;;:::o;32701:157::-;32806:45;32826:24;32844:5;32826:24;:::i;:::-;32806:45;:::i;:::-;32801:3;32794:58;32701:157;;:::o;32864:583::-;33086:3;33108:92;33196:3;33187:6;33108:92;:::i;:::-;33101:99;;33217:95;33308:3;33299:6;33217:95;:::i;:::-;33210:102;;33329:92;33417:3;33408:6;33329:92;:::i;:::-;33322:99;;33438:3;33431:10;;32864:583;;;;;;:::o;33453:538::-;33621:3;33636:75;33707:3;33698:6;33636:75;:::i;:::-;33736:2;33731:3;33727:12;33720:19;;33749:75;33820:3;33811:6;33749:75;:::i;:::-;33849:2;33844:3;33840:12;33833:19;;33862:75;33933:3;33924:6;33862:75;:::i;:::-;33962:2;33957:3;33953:12;33946:19;;33982:3;33975:10;;33453:538;;;;;;:::o;33997:222::-;34090:4;34128:2;34117:9;34113:18;34105:26;;34141:71;34209:1;34198:9;34194:17;34185:6;34141:71;:::i;:::-;33997:222;;;;:::o;34225:1053::-;34548:4;34586:3;34575:9;34571:19;34563:27;;34600:71;34668:1;34657:9;34653:17;34644:6;34600:71;:::i;:::-;34681:72;34749:2;34738:9;34734:18;34725:6;34681:72;:::i;:::-;34800:9;34794:4;34790:20;34785:2;34774:9;34770:18;34763:48;34828:108;34931:4;34922:6;34828:108;:::i;:::-;34820:116;;34983:9;34977:4;34973:20;34968:2;34957:9;34953:18;34946:48;35011:108;35114:4;35105:6;35011:108;:::i;:::-;35003:116;;35167:9;35161:4;35157:20;35151:3;35140:9;35136:19;35129:49;35195:76;35266:4;35257:6;35195:76;:::i;:::-;35187:84;;34225:1053;;;;;;;;:::o;35284:751::-;35507:4;35545:3;35534:9;35530:19;35522:27;;35559:71;35627:1;35616:9;35612:17;35603:6;35559:71;:::i;:::-;35640:72;35708:2;35697:9;35693:18;35684:6;35640:72;:::i;:::-;35722;35790:2;35779:9;35775:18;35766:6;35722:72;:::i;:::-;35804;35872:2;35861:9;35857:18;35848:6;35804:72;:::i;:::-;35924:9;35918:4;35914:20;35908:3;35897:9;35893:19;35886:49;35952:76;36023:4;36014:6;35952:76;:::i;:::-;35944:84;;35284:751;;;;;;;;:::o;36041:1046::-;36388:4;36426:3;36415:9;36411:19;36403:27;;36476:9;36470:4;36466:20;36462:1;36451:9;36447:17;36440:47;36504:118;36617:4;36608:6;36600;36504:118;:::i;:::-;36496:126;;36669:9;36663:4;36659:20;36654:2;36643:9;36639:18;36632:48;36697:118;36810:4;36801:6;36793;36697:118;:::i;:::-;36689:126;;36825:72;36893:2;36882:9;36878:18;36869:6;36825:72;:::i;:::-;36944:9;36938:4;36934:20;36929:2;36918:9;36914:18;36907:48;36972:108;37075:4;37066:6;36972:108;:::i;:::-;36964:116;;36041:1046;;;;;;;;;:::o;37093:1217::-;37500:4;37538:3;37527:9;37523:19;37515:27;;37588:9;37582:4;37578:20;37574:1;37563:9;37559:17;37552:47;37616:118;37729:4;37720:6;37712;37616:118;:::i;:::-;37608:126;;37781:9;37775:4;37771:20;37766:2;37755:9;37751:18;37744:48;37809:118;37922:4;37913:6;37905;37809:118;:::i;:::-;37801:126;;37974:9;37968:4;37964:20;37959:2;37948:9;37944:18;37937:48;38002:118;38115:4;38106:6;38098;38002:118;:::i;:::-;37994:126;;38167:9;38161:4;38157:20;38152:2;38141:9;38137:18;38130:48;38195:108;38298:4;38289:6;38195:108;:::i;:::-;38187:116;;37093:1217;;;;;;;;;;:::o;38316:373::-;38459:4;38497:2;38486:9;38482:18;38474:26;;38546:9;38540:4;38536:20;38532:1;38521:9;38517:17;38510:47;38574:108;38677:4;38668:6;38574:108;:::i;:::-;38566:116;;38316:373;;;;:::o;38695:634::-;38916:4;38954:2;38943:9;38939:18;38931:26;;39003:9;38997:4;38993:20;38989:1;38978:9;38974:17;38967:47;39031:108;39134:4;39125:6;39031:108;:::i;:::-;39023:116;;39186:9;39180:4;39176:20;39171:2;39160:9;39156:18;39149:48;39214:108;39317:4;39308:6;39214:108;:::i;:::-;39206:116;;38695:634;;;;;:::o;39335:210::-;39422:4;39460:2;39449:9;39445:18;39437:26;;39473:65;39535:1;39524:9;39520:17;39511:6;39473:65;:::i;:::-;39335:210;;;;:::o;39551:313::-;39664:4;39702:2;39691:9;39687:18;39679:26;;39751:9;39745:4;39741:20;39737:1;39726:9;39722:17;39715:47;39779:78;39852:4;39843:6;39779:78;:::i;:::-;39771:86;;39551:313;;;;:::o;39870:419::-;40036:4;40074:2;40063:9;40059:18;40051:26;;40123:9;40117:4;40113:20;40109:1;40098:9;40094:17;40087:47;40151:131;40277:4;40151:131;:::i;:::-;40143:139;;39870:419;;;:::o;40295:::-;40461:4;40499:2;40488:9;40484:18;40476:26;;40548:9;40542:4;40538:20;40534:1;40523:9;40519:17;40512:47;40576:131;40702:4;40576:131;:::i;:::-;40568:139;;40295:419;;;:::o;40720:::-;40886:4;40924:2;40913:9;40909:18;40901:26;;40973:9;40967:4;40963:20;40959:1;40948:9;40944:17;40937:47;41001:131;41127:4;41001:131;:::i;:::-;40993:139;;40720:419;;;:::o;41145:::-;41311:4;41349:2;41338:9;41334:18;41326:26;;41398:9;41392:4;41388:20;41384:1;41373:9;41369:17;41362:47;41426:131;41552:4;41426:131;:::i;:::-;41418:139;;41145:419;;;:::o;41570:::-;41736:4;41774:2;41763:9;41759:18;41751:26;;41823:9;41817:4;41813:20;41809:1;41798:9;41794:17;41787:47;41851:131;41977:4;41851:131;:::i;:::-;41843:139;;41570:419;;;:::o;41995:::-;42161:4;42199:2;42188:9;42184:18;42176:26;;42248:9;42242:4;42238:20;42234:1;42223:9;42219:17;42212:47;42276:131;42402:4;42276:131;:::i;:::-;42268:139;;41995:419;;;:::o;42420:::-;42586:4;42624:2;42613:9;42609:18;42601:26;;42673:9;42667:4;42663:20;42659:1;42648:9;42644:17;42637:47;42701:131;42827:4;42701:131;:::i;:::-;42693:139;;42420:419;;;:::o;42845:::-;43011:4;43049:2;43038:9;43034:18;43026:26;;43098:9;43092:4;43088:20;43084:1;43073:9;43069:17;43062:47;43126:131;43252:4;43126:131;:::i;:::-;43118:139;;42845:419;;;:::o;43270:::-;43436:4;43474:2;43463:9;43459:18;43451:26;;43523:9;43517:4;43513:20;43509:1;43498:9;43494:17;43487:47;43551:131;43677:4;43551:131;:::i;:::-;43543:139;;43270:419;;;:::o;43695:::-;43861:4;43899:2;43888:9;43884:18;43876:26;;43948:9;43942:4;43938:20;43934:1;43923:9;43919:17;43912:47;43976:131;44102:4;43976:131;:::i;:::-;43968:139;;43695:419;;;:::o;44120:::-;44286:4;44324:2;44313:9;44309:18;44301:26;;44373:9;44367:4;44363:20;44359:1;44348:9;44344:17;44337:47;44401:131;44527:4;44401:131;:::i;:::-;44393:139;;44120:419;;;:::o;44545:::-;44711:4;44749:2;44738:9;44734:18;44726:26;;44798:9;44792:4;44788:20;44784:1;44773:9;44769:17;44762:47;44826:131;44952:4;44826:131;:::i;:::-;44818:139;;44545:419;;;:::o;44970:::-;45136:4;45174:2;45163:9;45159:18;45151:26;;45223:9;45217:4;45213:20;45209:1;45198:9;45194:17;45187:47;45251:131;45377:4;45251:131;:::i;:::-;45243:139;;44970:419;;;:::o;45395:::-;45561:4;45599:2;45588:9;45584:18;45576:26;;45648:9;45642:4;45638:20;45634:1;45623:9;45619:17;45612:47;45676:131;45802:4;45676:131;:::i;:::-;45668:139;;45395:419;;;:::o;45820:::-;45986:4;46024:2;46013:9;46009:18;46001:26;;46073:9;46067:4;46063:20;46059:1;46048:9;46044:17;46037:47;46101:131;46227:4;46101:131;:::i;:::-;46093:139;;45820:419;;;:::o;46245:::-;46411:4;46449:2;46438:9;46434:18;46426:26;;46498:9;46492:4;46488:20;46484:1;46473:9;46469:17;46462:47;46526:131;46652:4;46526:131;:::i;:::-;46518:139;;46245:419;;;:::o;46670:::-;46836:4;46874:2;46863:9;46859:18;46851:26;;46923:9;46917:4;46913:20;46909:1;46898:9;46894:17;46887:47;46951:131;47077:4;46951:131;:::i;:::-;46943:139;;46670:419;;;:::o;47095:::-;47261:4;47299:2;47288:9;47284:18;47276:26;;47348:9;47342:4;47338:20;47334:1;47323:9;47319:17;47312:47;47376:131;47502:4;47376:131;:::i;:::-;47368:139;;47095:419;;;:::o;47520:::-;47686:4;47724:2;47713:9;47709:18;47701:26;;47773:9;47767:4;47763:20;47759:1;47748:9;47744:17;47737:47;47801:131;47927:4;47801:131;:::i;:::-;47793:139;;47520:419;;;:::o;47945:::-;48111:4;48149:2;48138:9;48134:18;48126:26;;48198:9;48192:4;48188:20;48184:1;48173:9;48169:17;48162:47;48226:131;48352:4;48226:131;:::i;:::-;48218:139;;47945:419;;;:::o;48370:::-;48536:4;48574:2;48563:9;48559:18;48551:26;;48623:9;48617:4;48613:20;48609:1;48598:9;48594:17;48587:47;48651:131;48777:4;48651:131;:::i;:::-;48643:139;;48370:419;;;:::o;48795:::-;48961:4;48999:2;48988:9;48984:18;48976:26;;49048:9;49042:4;49038:20;49034:1;49023:9;49019:17;49012:47;49076:131;49202:4;49076:131;:::i;:::-;49068:139;;48795:419;;;:::o;49220:::-;49386:4;49424:2;49413:9;49409:18;49401:26;;49473:9;49467:4;49463:20;49459:1;49448:9;49444:17;49437:47;49501:131;49627:4;49501:131;:::i;:::-;49493:139;;49220:419;;;:::o;49645:::-;49811:4;49849:2;49838:9;49834:18;49826:26;;49898:9;49892:4;49888:20;49884:1;49873:9;49869:17;49862:47;49926:131;50052:4;49926:131;:::i;:::-;49918:139;;49645:419;;;:::o;50070:::-;50236:4;50274:2;50263:9;50259:18;50251:26;;50323:9;50317:4;50313:20;50309:1;50298:9;50294:17;50287:47;50351:131;50477:4;50351:131;:::i;:::-;50343:139;;50070:419;;;:::o;50495:::-;50661:4;50699:2;50688:9;50684:18;50676:26;;50748:9;50742:4;50738:20;50734:1;50723:9;50719:17;50712:47;50776:131;50902:4;50776:131;:::i;:::-;50768:139;;50495:419;;;:::o;50920:::-;51086:4;51124:2;51113:9;51109:18;51101:26;;51173:9;51167:4;51163:20;51159:1;51148:9;51144:17;51137:47;51201:131;51327:4;51201:131;:::i;:::-;51193:139;;50920:419;;;:::o;51345:222::-;51438:4;51476:2;51465:9;51461:18;51453:26;;51489:71;51557:1;51546:9;51542:17;51533:6;51489:71;:::i;:::-;51345:222;;;;:::o;51573:442::-;51722:4;51760:2;51749:9;51745:18;51737:26;;51773:71;51841:1;51830:9;51826:17;51817:6;51773:71;:::i;:::-;51854:72;51922:2;51911:9;51907:18;51898:6;51854:72;:::i;:::-;51936;52004:2;51993:9;51989:18;51980:6;51936:72;:::i;:::-;51573:442;;;;;;:::o;52021:332::-;52142:4;52180:2;52169:9;52165:18;52157:26;;52193:71;52261:1;52250:9;52246:17;52237:6;52193:71;:::i;:::-;52274:72;52342:2;52331:9;52327:18;52318:6;52274:72;:::i;:::-;52021:332;;;;;:::o;52359:129::-;52393:6;52420:20;;:::i;:::-;52410:30;;52449:33;52477:4;52469:6;52449:33;:::i;:::-;52359:129;;;:::o;52494:75::-;52527:6;52560:2;52554:9;52544:19;;52494:75;:::o;52575:311::-;52652:4;52742:18;52734:6;52731:30;52728:56;;;52764:18;;:::i;:::-;52728:56;52814:4;52806:6;52802:17;52794:25;;52874:4;52868;52864:15;52856:23;;52575:311;;;:::o;52892:::-;52969:4;53059:18;53051:6;53048:30;53045:56;;;53081:18;;:::i;:::-;53045:56;53131:4;53123:6;53119:17;53111:25;;53191:4;53185;53181:15;53173:23;;52892:311;;;:::o;53209:307::-;53270:4;53360:18;53352:6;53349:30;53346:56;;;53382:18;;:::i;:::-;53346:56;53420:29;53442:6;53420:29;:::i;:::-;53412:37;;53504:4;53498;53494:15;53486:23;;53209:307;;;:::o;53522:308::-;53584:4;53674:18;53666:6;53663:30;53660:56;;;53696:18;;:::i;:::-;53660:56;53734:29;53756:6;53734:29;:::i;:::-;53726:37;;53818:4;53812;53808:15;53800:23;;53522:308;;;:::o;53836:102::-;53905:4;53928:3;53920:11;;53836:102;;;:::o;53944:132::-;54011:4;54034:3;54026:11;;54064:4;54059:3;54055:14;54047:22;;53944:132;;;:::o;54082:141::-;54131:4;54154:3;54146:11;;54177:3;54174:1;54167:14;54211:4;54208:1;54198:18;54190:26;;54082:141;;;:::o;54229:114::-;54296:6;54330:5;54324:12;54314:22;;54229:114;;;:::o;54349:98::-;54400:6;54434:5;54428:12;54418:22;;54349:98;;;:::o;54453:99::-;54505:6;54539:5;54533:12;54523:22;;54453:99;;;:::o;54558:115::-;54630:4;54662;54657:3;54653:14;54645:22;;54558:115;;;:::o;54679:113::-;54749:4;54781;54776:3;54772:14;54764:22;;54679:113;;;:::o;54798:184::-;54897:11;54931:6;54926:3;54919:19;54971:4;54966:3;54962:14;54947:29;;54798:184;;;;:::o;54988:::-;55087:11;55121:6;55116:3;55109:19;55161:4;55156:3;55152:14;55137:29;;54988:184;;;;:::o;55178:168::-;55261:11;55295:6;55290:3;55283:19;55335:4;55330:3;55326:14;55311:29;;55178:168;;;;:::o;55352:169::-;55436:11;55470:6;55465:3;55458:19;55510:4;55505:3;55501:14;55486:29;;55352:169;;;;:::o;55527:148::-;55629:11;55666:3;55651:18;;55527:148;;;;:::o;55681:122::-;55733:5;55758:39;55793:2;55788:3;55784:12;55779:3;55758:39;:::i;:::-;55749:48;;55681:122;;;;:::o;55809:305::-;55849:3;55868:20;55886:1;55868:20;:::i;:::-;55863:25;;55902:20;55920:1;55902:20;:::i;:::-;55897:25;;56056:1;55988:66;55984:74;55981:1;55978:81;55975:107;;;56062:18;;:::i;:::-;55975:107;56106:1;56103;56099:9;56092:16;;55809:305;;;;:::o;56120:185::-;56160:1;56177:20;56195:1;56177:20;:::i;:::-;56172:25;;56211:20;56229:1;56211:20;:::i;:::-;56206:25;;56250:1;56240:35;;56255:18;;:::i;:::-;56240:35;56297:1;56294;56290:9;56285:14;;56120:185;;;;:::o;56311:191::-;56351:4;56371:20;56389:1;56371:20;:::i;:::-;56366:25;;56405:20;56423:1;56405:20;:::i;:::-;56400:25;;56444:1;56441;56438:8;56435:34;;;56449:18;;:::i;:::-;56435:34;56494:1;56491;56487:9;56479:17;;56311:191;;;;:::o;56508:96::-;56545:7;56574:24;56592:5;56574:24;:::i;:::-;56563:35;;56508:96;;;:::o;56610:90::-;56644:7;56687:5;56680:13;56673:21;56662:32;;56610:90;;;:::o;56706:149::-;56742:7;56782:66;56775:5;56771:78;56760:89;;56706:149;;;:::o;56861:126::-;56898:7;56938:42;56931:5;56927:54;56916:65;;56861:126;;;:::o;56993:77::-;57030:7;57059:5;57048:16;;56993:77;;;:::o;57076:154::-;57160:6;57155:3;57150;57137:30;57222:1;57213:6;57208:3;57204:16;57197:27;57076:154;;;:::o;57236:307::-;57304:1;57314:113;57328:6;57325:1;57322:13;57314:113;;;57413:1;57408:3;57404:11;57398:18;57394:1;57389:3;57385:11;57378:39;57350:2;57347:1;57343:10;57338:15;;57314:113;;;57445:6;57442:1;57439:13;57436:101;;;57525:1;57516:6;57511:3;57507:16;57500:27;57436:101;57285:258;57236:307;;;:::o;57549:320::-;57593:6;57630:1;57624:4;57620:12;57610:22;;57677:1;57671:4;57667:12;57698:18;57688:81;;57754:4;57746:6;57742:17;57732:27;;57688:81;57816:2;57808:6;57805:14;57785:18;57782:38;57779:84;;;57835:18;;:::i;:::-;57779:84;57600:269;57549:320;;;:::o;57875:281::-;57958:27;57980:4;57958:27;:::i;:::-;57950:6;57946:40;58088:6;58076:10;58073:22;58052:18;58040:10;58037:34;58034:62;58031:88;;;58099:18;;:::i;:::-;58031:88;58139:10;58135:2;58128:22;57918:238;57875:281;;:::o;58162:233::-;58201:3;58224:24;58242:5;58224:24;:::i;:::-;58215:33;;58270:66;58263:5;58260:77;58257:103;;;58340:18;;:::i;:::-;58257:103;58387:1;58380:5;58376:13;58369:20;;58162:233;;;:::o;58401:100::-;58440:7;58469:26;58489:5;58469:26;:::i;:::-;58458:37;;58401:100;;;:::o;58507:94::-;58546:7;58575:20;58589:5;58575:20;:::i;:::-;58564:31;;58507:94;;;:::o;58607:79::-;58646:7;58675:5;58664:16;;58607:79;;;:::o;58692:176::-;58724:1;58741:20;58759:1;58741:20;:::i;:::-;58736:25;;58775:20;58793:1;58775:20;:::i;:::-;58770:25;;58814:1;58804:35;;58819:18;;:::i;:::-;58804:35;58860:1;58857;58853:9;58848:14;;58692:176;;;;:::o;58874:180::-;58922:77;58919:1;58912:88;59019:4;59016:1;59009:15;59043:4;59040:1;59033:15;59060:180;59108:77;59105:1;59098:88;59205:4;59202:1;59195:15;59229:4;59226:1;59219:15;59246:180;59294:77;59291:1;59284:88;59391:4;59388:1;59381:15;59415:4;59412:1;59405:15;59432:180;59480:77;59477:1;59470:88;59577:4;59574:1;59567:15;59601:4;59598:1;59591:15;59618:180;59666:77;59663:1;59656:88;59763:4;59760:1;59753:15;59787:4;59784:1;59777:15;59804:183;59839:3;59877:1;59859:16;59856:23;59853:128;;;59915:1;59912;59909;59894:23;59937:34;59968:1;59962:8;59937:34;:::i;:::-;59930:41;;59853:128;59804:183;:::o;59993:117::-;60102:1;60099;60092:12;60116:117;60225:1;60222;60215:12;60239:117;60348:1;60345;60338:12;60362:117;60471:1;60468;60461:12;60485:117;60594:1;60591;60584:12;60608:117;60717:1;60714;60707:12;60731:117;60840:1;60837;60830:12;60854:102;60895:6;60946:2;60942:7;60937:2;60930:5;60926:14;60922:28;60912:38;;60854:102;;;:::o;60962:94::-;60995:8;61043:5;61039:2;61035:14;61014:35;;60962:94;;;:::o;61062:106::-;61106:8;61155:5;61150:3;61146:15;61125:36;;61062:106;;;:::o;61174:239::-;61314:34;61310:1;61302:6;61298:14;61291:58;61383:22;61378:2;61370:6;61366:15;61359:47;61174:239;:::o;61419:227::-;61559:34;61555:1;61547:6;61543:14;61536:58;61628:10;61623:2;61615:6;61611:15;61604:35;61419:227;:::o;61652:170::-;61792:22;61788:1;61780:6;61776:14;61769:46;61652:170;:::o;61828:179::-;61968:31;61964:1;61956:6;61952:14;61945:55;61828:179;:::o;62013:174::-;62153:26;62149:1;62141:6;62137:14;62130:50;62013:174;:::o;62193:230::-;62333:34;62329:1;62321:6;62317:14;62310:58;62402:13;62397:2;62389:6;62385:15;62378:38;62193:230;:::o;62429:225::-;62569:34;62565:1;62557:6;62553:14;62546:58;62638:8;62633:2;62625:6;62621:15;62614:33;62429:225;:::o;62660:223::-;62800:34;62796:1;62788:6;62784:14;62777:58;62869:6;62864:2;62856:6;62852:15;62845:31;62660:223;:::o;62889:228::-;63029:34;63025:1;63017:6;63013:14;63006:58;63098:11;63093:2;63085:6;63081:15;63074:36;62889:228;:::o;63123:177::-;63263:29;63259:1;63251:6;63247:14;63240:53;63123:177;:::o;63306:170::-;63446:22;63442:1;63434:6;63430:14;63423:46;63306:170;:::o;63482:166::-;63622:18;63618:1;63610:6;63606:14;63599:42;63482:166;:::o;63654:224::-;63794:34;63790:1;63782:6;63778:14;63771:58;63863:7;63858:2;63850:6;63846:15;63839:32;63654:224;:::o;63884:237::-;64024:34;64020:1;64012:6;64008:14;64001:58;64093:20;64088:2;64080:6;64076:15;64069:45;63884:237;:::o;64127:170::-;64267:22;64263:1;64255:6;64251:14;64244:46;64127:170;:::o;64303:222::-;64443:34;64439:1;64431:6;64427:14;64420:58;64512:5;64507:2;64499:6;64495:15;64488:30;64303:222;:::o;64531:229::-;64671:34;64667:1;64659:6;64655:14;64648:58;64740:12;64735:2;64727:6;64723:15;64716:37;64531:229;:::o;64766:175::-;64906:27;64902:1;64894:6;64890:14;64883:51;64766:175;:::o;64947:182::-;65087:34;65083:1;65075:6;65071:14;65064:58;64947:182;:::o;65135:222::-;65275:34;65271:1;65263:6;65259:14;65252:58;65344:5;65339:2;65331:6;65327:15;65320:30;65135:222;:::o;65363:181::-;65503:33;65499:1;65491:6;65487:14;65480:57;65363:181;:::o;65550:228::-;65690:34;65686:1;65678:6;65674:14;65667:58;65759:11;65754:2;65746:6;65742:15;65735:36;65550:228;:::o;65784:::-;65924:34;65920:1;65912:6;65908:14;65901:58;65993:11;65988:2;65980:6;65976:15;65969:36;65784:228;:::o;66018:227::-;66158:34;66154:1;66146:6;66142:14;66135:58;66227:10;66222:2;66214:6;66210:15;66203:35;66018:227;:::o;66251:220::-;66391:34;66387:1;66379:6;66375:14;66368:58;66460:3;66455:2;66447:6;66443:15;66436:28;66251:220;:::o;66477:181::-;66617:33;66613:1;66605:6;66601:14;66594:57;66477:181;:::o;66664:177::-;66804:29;66800:1;66792:6;66788:14;66781:53;66664:177;:::o;66847:711::-;66886:3;66924:4;66906:16;66903:26;66900:39;;;66932:5;;66900:39;66961:20;;:::i;:::-;67036:1;67018:16;67014:24;67011:1;67005:4;66990:49;67069:4;67063:11;67168:16;67161:4;67153:6;67149:17;67146:39;67113:18;67105:6;67102:30;67086:113;67083:146;;;67214:5;;;;67083:146;67260:6;67254:4;67250:17;67296:3;67290:10;67323:18;67315:6;67312:30;67309:43;;;67345:5;;;;;;67309:43;67393:6;67386:4;67381:3;67377:14;67373:27;67452:1;67434:16;67430:24;67424:4;67420:35;67415:3;67412:44;67409:57;;;67459:5;;;;;;;67409:57;67476;67524:6;67518:4;67514:17;67506:6;67502:30;67496:4;67476:57;:::i;:::-;67549:3;67542:10;;66890:668;;;;;66847:711;;:::o;67564:122::-;67637:24;67655:5;67637:24;:::i;:::-;67630:5;67627:35;67617:63;;67676:1;67673;67666:12;67617:63;67564:122;:::o;67692:116::-;67762:21;67777:5;67762:21;:::i;:::-;67755:5;67752:32;67742:60;;67798:1;67795;67788:12;67742:60;67692:116;:::o;67814:120::-;67886:23;67903:5;67886:23;:::i;:::-;67879:5;67876:34;67866:62;;67924:1;67921;67914:12;67866:62;67814:120;:::o;67940:122::-;68013:24;68031:5;68013:24;:::i;:::-;68006:5;68003:35;67993:63;;68052:1;68049;68042:12;67993:63;67940:122;:::o

Swarm Source

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