ETH Price: $2,673.61 (+2.02%)

Token

 

Overview

Max Total Supply

498

Holders

146

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x2CE55667462e85B5D7A7a28BFaF5772199DcB666
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:
CommunityDjContract

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
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 contracts/metaNightClubStake.sol


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



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



/**
 * @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/utils/introspection/[email protected]


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



/**
 * @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/access/[email protected]


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)



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

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

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

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

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

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

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

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

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


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


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)



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

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

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

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

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

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

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

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

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

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


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


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



/**
 * @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/token/ERC1155/[email protected]


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



/**
 * @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/utils/[email protected]


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

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


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



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

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

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

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

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

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

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

        return batchBalances;
    }

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

        return array;
    }
}
// File @openzeppelin/contracts/utils/cryptography/[email protected]


// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)



/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


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

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



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

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


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

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

contract MncStakeContract is Ownable {

    event Staked(address owner, uint256 tokenId, uint256 timestamp);
    event Unstaked(address owner, uint256 tokenId, uint256 timestamp);


    struct Stake {
        uint256 tokenId;
        uint256 timestamp;
    }

    IERC721 private mncNftContract;

    mapping(address => Stake[]) public stakes;

    bool public isPaused = true;
    uint256 public stakingPeriod = 90;

    constructor() {
        mncNftContract = IERC721(0x973Ba18431E1c366Ac7D002c6FB0f524dEAb7727);
    }

    function onERC721Received(
        address,
        address,
        uint256,
        bytes calldata
    ) external pure returns (bytes4) {
        return bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"));
    }

    function stake(uint256[] memory _tokens) external {
        require(!isPaused, "Staking is paused.");
        require(mncNftContract.balanceOf(msg.sender) >= _tokens.length, "You don't have enough NFTs");

        uint256 timestamp = block.timestamp;

        for (uint256 i = 0; i < _tokens.length; i++) {
            mncNftContract.safeTransferFrom(msg.sender, address(this), _tokens[i]);
            stakes[msg.sender].push(Stake(_tokens[i], timestamp));
            emit Staked(msg.sender, _tokens[i], timestamp);
        }

    }


    function unstake(uint256[] memory _tokenIds) external {
        uint256 senderStakes = stakes[msg.sender].length;

        require(senderStakes > 0, "Address has no stakes.");

        for (uint256 tokenIdsIndex = 0; tokenIdsIndex < _tokenIds.length; tokenIdsIndex++) {
            uint256 _tokenId = _tokenIds[tokenIdsIndex];
            for (uint256 i = 0; i < senderStakes; i++) {
                if (stakes[msg.sender][i].tokenId == _tokenId && stakes[msg.sender][i].timestamp != 0) {
                    uint256 elapsedMins = (block.timestamp - stakes[msg.sender][i].timestamp) / 60;
                    uint256 elapsedDays = elapsedMins / 1440;
                    require(elapsedDays >= stakingPeriod, "Can not unstake before stakingPeriod.");
                    mncNftContract.safeTransferFrom(address(this), msg.sender, _tokenId);

                    //remove staked nft from stake list
                    stakes[msg.sender][i] = stakes[msg.sender][stakes[msg.sender].length - 1];
                    stakes[msg.sender].pop();
                    emit Unstaked(msg.sender, _tokenId, block.timestamp);

                    break;
                }
                if (i == senderStakes - 1) {
                    revert("Provided token id not staked.");
                }
            }
        }
    }

    function ownerStake(address userAddress, uint256 _tokenId) external onlyOwner {
        require(!isPaused, "Staking is paused.");
        uint256 timestamp = block.timestamp;
        mncNftContract.safeTransferFrom(msg.sender, address(this), _tokenId);
        stakes[userAddress].push(Stake(_tokenId, timestamp));
        emit Staked(userAddress, _tokenId, timestamp);
    }


    function getStakes(address _address) external view returns (Stake[] memory) {
        uint256 addressStakes = stakes[_address].length;

        require(addressStakes > 0, "Address has no stakes.");

        Stake[] memory res = new Stake[](addressStakes);

        for (uint256 i = 0; i < addressStakes; i++) {
            if (stakes[_address][i].timestamp != 0) {
                res[i] = Stake(stakes[_address][i].tokenId, stakes[_address][i].timestamp);
            }
        }

        return res;
    }

    function getStakesCount(address _address) public view returns(uint) {
        return stakes[_address].length;
    }

    function getStake(address _address, uint256 index) public view returns(uint256, uint256) {
        Stake storage addressStake = stakes[_address][index];
        return (addressStake.tokenId, addressStake.timestamp);
    }

    function togglePause(bool _state) external onlyOwner {
        isPaused = _state;
    }

    function setStakingPeriod(uint256 _stakingPeriod) external onlyOwner {
        stakingPeriod = _stakingPeriod;
    }

}

contract CommunityDjContract is ERC1155, Ownable {

    struct DjCollection {
        uint256 collectionId;
        uint256 supply;
        uint256 stakersPrice;
        uint256 wlPrice;
        uint256 publicPrice;
        bool reserveIsActive;
        bool mintIsActive;
        bool publicSale;
        bytes32 MERKLE_ROOT;
        uint256 maxTokensPerAddress;
        uint256 supplyMinted;
        uint256 supplyReserved;
    }

    MncStakeContract private mncStakeContract;

    mapping(uint256 => DjCollection) public djCollections;
    mapping(uint256 => mapping (address => uint256)) public collectionWalletReserveAmount;
    mapping(uint256 => mapping (address => uint256)) public collectionWalletMintAmount;

    constructor() {
        mncStakeContract = MncStakeContract(0x91217E1CD876DF94AAFA282F8285575469F015d0);
    }

    function reserveDjCollection(bytes32[] calldata _merkleProof, uint256 collectionId, uint256 amount) public payable {
        require(amount > 0, "Amount should be greater than 0");
        require(djCollections[collectionId].supply > 0, "Collection id not existing");
        require(djCollections[collectionId].reserveIsActive, "Reserve is not active");
        require(collectionWalletReserveAmount[collectionId][msg.sender] + amount + collectionWalletMintAmount[collectionId][msg.sender] <= djCollections[collectionId].maxTokensPerAddress, "Amount exceeds the already max tokens per address");
        require(amount + djCollections[collectionId].supplyReserved <= djCollections[collectionId].supply, "reserve amount exceeds the total collection supply");
        if (mncStakeContract.getStakesCount(msg.sender) > 0) {
            require(djCollections[collectionId].stakersPrice * amount <= msg.value, "Staker wrong ether value sent");
        } else {
            if (djCollections[collectionId].MERKLE_ROOT != "") {
                bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
                require(MerkleProof.verify(_merkleProof, djCollections[collectionId].MERKLE_ROOT, leaf), "Invalid Proof");
            }
            require(djCollections[collectionId].wlPrice * amount <= msg.value, "WL wrong ether value sent");
        }
        djCollections[collectionId].supplyReserved = djCollections[collectionId].supplyReserved + amount;
        collectionWalletReserveAmount[collectionId][msg.sender] = collectionWalletReserveAmount[collectionId][msg.sender] + amount;
    }

    function claimDjCollectionTokens(uint256 collectionId) public {
        require(djCollections[collectionId].supply > 0, "Collection id not existing");
        require(collectionWalletReserveAmount[collectionId][msg.sender] > 0, "Address does not have any reserve tokens");
        require(djCollections[collectionId].mintIsActive, "Mint is not active");
        uint256 amount = collectionWalletReserveAmount[collectionId][msg.sender];
        require(amount + djCollections[collectionId].supplyMinted <= djCollections[collectionId].supply, "amount exceeds the total collection supply");
        collectionWalletReserveAmount[collectionId][msg.sender] = 0;
        djCollections[collectionId].supplyReserved = djCollections[collectionId].supplyReserved - amount;
        djCollections[collectionId].supplyMinted = djCollections[collectionId].supplyMinted + amount;
        collectionWalletMintAmount[collectionId][msg.sender] = collectionWalletMintAmount[collectionId][msg.sender] + amount;
        _mint(msg.sender, collectionId, amount, "");
    }

    function mintDjCollection(bytes32[] calldata _merkleProof, uint256 collectionId, uint256 amount) public payable {
        require(amount > 0, "Amount should be greater than 0");
        require(djCollections[collectionId].supply > 0, "Collection id not existing");
        require(djCollections[collectionId].mintIsActive, "Mint is not active");
        require(collectionWalletMintAmount[collectionId][msg.sender] + collectionWalletReserveAmount[collectionId][msg.sender] + amount <= djCollections[collectionId].maxTokensPerAddress, "Mint amount exceeds the max tokens per address");
        if (djCollections[collectionId].reserveIsActive) {
            require(amount + djCollections[collectionId].supplyMinted + djCollections[collectionId].supplyReserved <= djCollections[collectionId].supply, "amount exceeds the total collection supply");
        } else {
            require(amount + djCollections[collectionId].supplyMinted <= djCollections[collectionId].supply, "amount exceeds the total collection supply");
        }
        if (djCollections[collectionId].publicSale) {
            require(djCollections[collectionId].publicPrice * amount <= msg.value, "Wrong ether value send");
        } else {
            if (mncStakeContract.getStakesCount(msg.sender) > 0) {
                require(djCollections[collectionId].stakersPrice * amount <= msg.value, "Wrong ether value send");
            } else {
                if (djCollections[collectionId].MERKLE_ROOT != "") {
                     bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
                     require(MerkleProof.verify(_merkleProof, djCollections[collectionId].MERKLE_ROOT, leaf), "Invalid Proof");
                }
                require(djCollections[collectionId].wlPrice * amount <= msg.value, "Wrong ether value send");
            }
        }
        djCollections[collectionId].supplyMinted = djCollections[collectionId].supplyMinted + amount;
        collectionWalletMintAmount[collectionId][msg.sender] = collectionWalletMintAmount[collectionId][msg.sender] + amount;
        _mint(msg.sender, collectionId, amount, "");
    }

    function addDjCollection(uint256 collectionId, uint256 supply, uint256 stakersPrice, uint256 wlPrice, uint256 publicPrice, bool reserveIsActive, bool mintIsActive, bool publicSale, bytes32 MERKLE_ROOT, uint256 maxTokensPerAddress) public onlyOwner {
        require(supply > 0, "Supply can not be 0");
        require(djCollections[collectionId].supply == 0, "Already exists a collection with this collectionId");
        DjCollection memory newDjCollection = DjCollection( collectionId, supply, stakersPrice, wlPrice, publicPrice, reserveIsActive, mintIsActive, publicSale, MERKLE_ROOT, maxTokensPerAddress, 0, 0);
        djCollections[collectionId] = newDjCollection;
    }

    function changeTokenURI(string memory tokenURI) public onlyOwner {
        _setURI(tokenURI);
    }

    function changeCollectionSupply(uint256 collectionId, uint256 newSupply) public onlyOwner {
        require(djCollections[collectionId].supply > 0, "Collection id not existing");
        require(djCollections[collectionId].supplyMinted <= newSupply, "Supply can not be lower than minted.");
        djCollections[collectionId].supply = newSupply;
    }

    function changeCollectionPrices(uint256 collectionId, uint256 stakersPrice, uint256 wlPrice, uint256 publicPrice) public onlyOwner {
        require(djCollections[collectionId].supply > 0, "Collection id not existing");
        djCollections[collectionId].stakersPrice = stakersPrice;
        djCollections[collectionId].wlPrice = wlPrice;
        djCollections[collectionId].publicPrice = publicPrice;
    }

    function flipReserveState(uint256 collectionId) public onlyOwner {
        require(djCollections[collectionId].supply > 0, "Collection id not existing");
        djCollections[collectionId].reserveIsActive = !djCollections[collectionId].reserveIsActive;
    }

    function flipMintIsActive(uint256 collectionId) public onlyOwner {
        require(djCollections[collectionId].supply > 0, "Collection id not existing");
        djCollections[collectionId].mintIsActive = !djCollections[collectionId].mintIsActive;
    }

    function flipPublicSale(uint256 collectionId) public onlyOwner {
        require(djCollections[collectionId].supply > 0, "Collection id not existing");
        djCollections[collectionId].publicSale = !djCollections[collectionId].publicSale;
    }

    function changePresaleMerkleRoot(uint256 collectionId, bytes32 newMerkleRoot) public onlyOwner {
        require(djCollections[collectionId].supply > 0, "Collection id not existing");
        djCollections[collectionId].MERKLE_ROOT = newMerkleRoot;
    }

    function changeMaxTokensPerAddress(uint256 collectionId, uint256 maxTokens) public onlyOwner {
        require(djCollections[collectionId].supply > 0, "Collection id not existing");
        djCollections[collectionId].maxTokensPerAddress = maxTokens;
    }

    function airDropNft(uint256 collectionId, address ownerAddress, uint256 amount) public onlyOwner {
        if (djCollections[collectionId].reserveIsActive) {
            require(amount + djCollections[collectionId].supplyMinted + djCollections[collectionId].supplyReserved <= djCollections[collectionId].supply, "amount exceeds the total collection supply");
        } else {
            require(amount + djCollections[collectionId].supplyMinted <= djCollections[collectionId].supply, "amount exceeds the total collection supply");
        }
        djCollections[collectionId].supplyMinted = djCollections[collectionId].supplyMinted + amount;
        _mint(ownerAddress, collectionId, amount, "");
    }

    function withdraw() public onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

    function uri(uint256 _id) public view override returns (string memory) {
        require(djCollections[_id].supply > 0, "Collection id not existing");
        return string(abi.encodePacked(super.uri(_id), Strings.toString(_id)));
    }
}

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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"stakersPrice","type":"uint256"},{"internalType":"uint256","name":"wlPrice","type":"uint256"},{"internalType":"uint256","name":"publicPrice","type":"uint256"},{"internalType":"bool","name":"reserveIsActive","type":"bool"},{"internalType":"bool","name":"mintIsActive","type":"bool"},{"internalType":"bool","name":"publicSale","type":"bool"},{"internalType":"bytes32","name":"MERKLE_ROOT","type":"bytes32"},{"internalType":"uint256","name":"maxTokensPerAddress","type":"uint256"}],"name":"addDjCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"},{"internalType":"address","name":"ownerAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"airDropNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"},{"internalType":"uint256","name":"stakersPrice","type":"uint256"},{"internalType":"uint256","name":"wlPrice","type":"uint256"},{"internalType":"uint256","name":"publicPrice","type":"uint256"}],"name":"changeCollectionPrices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"},{"internalType":"uint256","name":"newSupply","type":"uint256"}],"name":"changeCollectionSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"},{"internalType":"uint256","name":"maxTokens","type":"uint256"}],"name":"changeMaxTokensPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"},{"internalType":"bytes32","name":"newMerkleRoot","type":"bytes32"}],"name":"changePresaleMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenURI","type":"string"}],"name":"changeTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"}],"name":"claimDjCollectionTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"collectionWalletMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"collectionWalletReserveAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"djCollections","outputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"stakersPrice","type":"uint256"},{"internalType":"uint256","name":"wlPrice","type":"uint256"},{"internalType":"uint256","name":"publicPrice","type":"uint256"},{"internalType":"bool","name":"reserveIsActive","type":"bool"},{"internalType":"bool","name":"mintIsActive","type":"bool"},{"internalType":"bool","name":"publicSale","type":"bool"},{"internalType":"bytes32","name":"MERKLE_ROOT","type":"bytes32"},{"internalType":"uint256","name":"maxTokensPerAddress","type":"uint256"},{"internalType":"uint256","name":"supplyMinted","type":"uint256"},{"internalType":"uint256","name":"supplyReserved","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"}],"name":"flipMintIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"}],"name":"flipPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"}],"name":"flipReserveState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"collectionId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintDjCollection","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"collectionId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"reserveDjCollection","outputs":[],"stateMutability":"payable","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":"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":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5062000032620000266200008d60201b60201c565b6200009560201b60201c565b7391217e1cd876df94aafa282f8285575469f015d0600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200015b565b600033905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b615bc9806200016b6000396000f3fe6080604052600436106101b65760003560e01c806362eee469116100ec578063a22cb4651161008a578063e985e9c511610064578063e985e9c5146105cf578063ec1b49f01461060c578063f242432a14610654578063f2fde38b1461067d576101b6565b8063a22cb46514610561578063dba089811461058a578063e23a53a7146105a6576101b6565b8063715018a6116100c6578063715018a6146104cd5780637d7b17a1146104e45780638da5cb5b1461050d5780639b5fdaf314610538576101b6565b806362eee4691461044b578063656658fc1461047457806370121471146104b1576101b6565b80633ccfd60b116101595780634e1273f4116101335780634e1273f4146103935780634eb78a6c146103d057806351283541146103f95780635b6b369614610422576101b6565b80633ccfd60b1461032a5780633d1e789214610341578063402564bc1461036a576101b6565b80630daf2096116101955780630daf2096146102725780630e8691e11461029b5780630e89341c146102c45780632eb2c2d614610301576101b6565b8062fdd58e146101bb57806301ffc9a7146101f857806303cd29b014610235575b600080fd5b3480156101c757600080fd5b506101e260048036038101906101dd9190613fe8565b6106a6565b6040516101ef919061547b565b60405180910390f35b34801561020457600080fd5b5061021f600480360381019061021a91906140fc565b61076f565b60405161022c91906150be565b60405180910390f35b34801561024157600080fd5b5061025c600480360381019061025791906141e1565b610851565b604051610269919061547b565b60405180910390f35b34801561027e57600080fd5b506102996004803603810190610294919061418f565b610876565b005b3480156102a757600080fd5b506102c260048036038101906102bd9190614347565b61092c565b005b3480156102d057600080fd5b506102eb60048036038101906102e6919061418f565b610b10565b6040516102f891906150d9565b60405180910390f35b34801561030d57600080fd5b5061032860048036038101906103239190613e5e565b610ba4565b005b34801561033657600080fd5b5061033f610c45565b005b34801561034d57600080fd5b506103686004803603810190610363919061418f565b610c96565b005b34801561037657600080fd5b50610391600480360381019061038c919061418f565b610d4c565b005b34801561039f57600080fd5b506103ba60048036038101906103b59190614024565b611107565b6040516103c79190615065565b60405180910390f35b3480156103dc57600080fd5b506103f760048036038101906103f291906142a8565b6112b8565b005b34801561040557600080fd5b50610420600480360381019061041b919061421d565b611391565b005b34801561042e57600080fd5b50610449600480360381019061044491906142a8565b611539565b005b34801561045757600080fd5b50610472600480360381019061046d91906142e4565b6115b9565b005b34801561048057600080fd5b5061049b600480360381019061049691906141e1565b611671565b6040516104a8919061547b565b60405180910390f35b6104cb60048036038101906104c69190614090565b611696565b005b3480156104d957600080fd5b506104e2611df5565b005b3480156104f057600080fd5b5061050b6004803603810190610506919061414e565b611e09565b005b34801561051957600080fd5b50610522611e1d565b60405161052f9190614f88565b60405180910390f35b34801561054457600080fd5b5061055f600480360381019061055a919061418f565b611e47565b005b34801561056d57600080fd5b5061058860048036038101906105839190613fac565b611efd565b005b6105a4600480360381019061059f9190614090565b611f13565b005b3480156105b257600080fd5b506105cd60048036038101906105c8919061426c565b6124fa565b005b3480156105db57600080fd5b506105f660048036038101906105f19190613e22565b61257a565b60405161060391906150be565b60405180910390f35b34801561061857600080fd5b50610633600480360381019061062e919061418f565b61260e565b60405161064b9c9b9a999897969594939291906154bf565b60405180910390f35b34801561066057600080fd5b5061067b60048036038101906106769190613f1d565b612695565b005b34801561068957600080fd5b506106a4600480360381019061069f9190613df9565b612736565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e9061519b565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061083a57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061084a5750610849826127ba565b5b9050919050565b6007602052816000526040600020602052806000526040600020600091509150505481565b61087e612824565b60006005600083815260200190815260200160002060010154116108d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ce906152db565b60405180910390fd5b6005600082815260200190815260200160002060050160029054906101000a900460ff16156005600083815260200190815260200160002060050160026101000a81548160ff02191690831515021790555050565b610934612824565b60008911610977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096e9061535b565b60405180910390fd5b6000600560008c815260200190815260200160002060010154146109d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c79061545b565b60405180910390fd5b60006040518061018001604052808c81526020018b81526020018a8152602001898152602001888152602001871515815260200186151581526020018515158152602001848152602001838152602001600081526020016000815250905080600560008d8152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548160ff02191690831515021790555060c08201518160050160016101000a81548160ff02191690831515021790555060e08201518160050160026101000a81548160ff02191690831515021790555061010082015181600601556101208201518160070155610140820151816008015561016082015181600901559050505050505050505050505050565b60606000600560008481526020019081526020016000206001015411610b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b62906152db565b60405180910390fd5b610b74826128a2565b610b7d83612936565b604051602001610b8e929190614f64565b6040516020818303038152906040529050919050565b610bac612ae3565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610bf25750610bf185610bec612ae3565b61257a565b5b610c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c289061513b565b60405180910390fd5b610c3e8585858585612aeb565b5050505050565b610c4d612824565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610c93573d6000803e3d6000fd5b50565b610c9e612824565b6000600560008381526020019081526020016000206001015411610cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cee906152db565b60405180910390fd5b6005600082815260200190815260200160002060050160009054906101000a900460ff16156005600083815260200190815260200160002060050160006101000a81548160ff02191690831515021790555050565b6000600560008381526020019081526020016000206001015411610da5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9c906152db565b60405180910390fd5b60006006600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610e38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2f9061539b565b60405180910390fd5b6005600082815260200190815260200160002060050160019054906101000a900460ff16610e9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e92906152bb565b60405180910390fd5b60006006600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506005600083815260200190815260200160002060010154600560008481526020019081526020016000206008015482610f2991906156de565b1115610f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f619061525b565b60405180910390fd5b60006006600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806005600084815260200190815260200160002060090154610fe291906157bf565b600560008481526020019081526020016000206009018190555080600560008481526020019081526020016000206008015461101e91906156de565b6005600084815260200190815260200160002060080181905550806007600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461109491906156de565b6007600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061110333838360405180602001604052806000815250612e59565b5050565b6060815183511461114d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611144906153fb565b60405180910390fd5b6000835167ffffffffffffffff811115611190577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156111be5781602001602082028036833780820191505090505b50905060005b84518110156112ad57611257858281518110611209577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015185838151811061124a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516106a6565b828281518110611290577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050806112a6906158e5565b90506111c4565b508091505092915050565b6112c0612824565b6000600560008481526020019081526020016000206001015411611319576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611310906152db565b60405180910390fd5b8060056000848152602001908152602001600020600801541115611372576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611369906153db565b60405180910390fd5b8060056000848152602001908152602001600020600101819055505050565b611399612824565b6005600084815260200190815260200160002060050160009054906101000a900460ff1615611462576005600084815260200190815260200160002060010154600560008581526020019081526020016000206009015460056000868152602001908152602001600020600801548361141291906156de565b61141c91906156de565b111561145d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114549061525b565b60405180910390fd5b6114dd565b600560008481526020019081526020016000206001015460056000858152602001908152602001600020600801548261149b91906156de565b11156114dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d39061525b565b60405180910390fd5b5b8060056000858152602001908152602001600020600801546114ff91906156de565b600560008581526020019081526020016000206008018190555061153482848360405180602001604052806000815250612e59565b505050565b611541612824565b600060056000848152602001908152602001600020600101541161159a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611591906152db565b60405180910390fd5b8060056000848152602001908152602001600020600701819055505050565b6115c1612824565b600060056000868152602001908152602001600020600101541161161a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611611906152db565b60405180910390fd5b82600560008681526020019081526020016000206002018190555081600560008681526020019081526020016000206003018190555080600560008681526020019081526020016000206004018190555050505050565b6006602052816000526040600020602052806000526040600020600091509150505481565b600081116116d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d09061521b565b60405180910390fd5b6000600560008481526020019081526020016000206001015411611732576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611729906152db565b60405180910390fd5b6005600083815260200190815260200160002060050160019054906101000a900460ff16611795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178c906152bb565b60405180910390fd5b6005600083815260200190815260200160002060070154816006600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546007600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461185991906156de565b61186391906156de565b11156118a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189b906152fb565b60405180910390fd5b6005600083815260200190815260200160002060050160009054906101000a900460ff161561196d576005600083815260200190815260200160002060010154600560008481526020019081526020016000206009015460056000858152602001908152602001600020600801548361191d91906156de565b61192791906156de565b1115611968576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195f9061525b565b60405180910390fd5b6119e8565b60056000838152602001908152602001600020600101546005600084815260200190815260200160002060080154826119a691906156de565b11156119e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119de9061525b565b60405180910390fd5b5b6005600083815260200190815260200160002060050160029054906101000a900460ff1615611a7a5734816005600085815260200190815260200160002060040154611a349190615765565b1115611a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6c9061511b565b60405180910390fd5b611ce8565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663549b5bfc336040518263ffffffff1660e01b8152600401611ad79190614f88565b60206040518083038186803b158015611aef57600080fd5b505afa158015611b03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2791906141b8565b1115611b965734816005600085815260200190815260200160002060020154611b509190615765565b1115611b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b889061511b565b60405180910390fd5b611ce7565b6000600560008481526020019081526020016000206006015414611c8257600033604051602001611bc79190614f49565b604051602081830303815290604052805190602001209050611c41858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060056000868152602001908152602001600020600601548361300a565b611c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c779061537b565b60405180910390fd5b505b34816005600085815260200190815260200160002060030154611ca59190615765565b1115611ce6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdd9061511b565b60405180910390fd5b5b5b806005600084815260200190815260200160002060080154611d0a91906156de565b6005600084815260200190815260200160002060080181905550806007600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d8091906156de565b6007600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611def33838360405180602001604052806000815250612e59565b50505050565b611dfd612824565b611e076000613021565b565b611e11612824565b611e1a816130e7565b50565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611e4f612824565b6000600560008381526020019081526020016000206001015411611ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9f906152db565b60405180910390fd5b6005600082815260200190815260200160002060050160019054906101000a900460ff16156005600083815260200190815260200160002060050160016101000a81548160ff02191690831515021790555050565b611f0f611f08612ae3565b8383613101565b5050565b60008111611f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4d9061521b565b60405180910390fd5b6000600560008481526020019081526020016000206001015411611faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa6906152db565b60405180910390fd5b6005600083815260200190815260200160002060050160009054906101000a900460ff16612012576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612009906151bb565b60405180910390fd5b60056000838152602001908152602001600020600701546007600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826006600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120d691906156de565b6120e091906156de565b1115612121576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121189061523b565b60405180910390fd5b600560008381526020019081526020016000206001015460056000848152602001908152602001600020600901548261215a91906156de565b111561219b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612192906151db565b60405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663549b5bfc336040518263ffffffff1660e01b81526004016121f89190614f88565b60206040518083038186803b15801561221057600080fd5b505afa158015612224573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061224891906141b8565b11156122b757348160056000858152602001908152602001600020600201546122719190615765565b11156122b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a99061531b565b60405180910390fd5b612408565b60006005600084815260200190815260200160002060060154146123a3576000336040516020016122e89190614f49565b604051602081830303815290604052805190602001209050612362858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060056000868152602001908152602001600020600601548361300a565b6123a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123989061537b565b60405180910390fd5b505b348160056000858152602001908152602001600020600301546123c69190615765565b1115612407576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fe9061533b565b60405180910390fd5b5b80600560008481526020019081526020016000206009015461242a91906156de565b6005600084815260200190815260200160002060090181905550806006600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546124a091906156de565b6006600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505050565b612502612824565b600060056000848152602001908152602001600020600101541161255b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612552906152db565b60405180910390fd5b8060056000848152602001908152602001600020600601819055505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60056020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050160009054906101000a900460ff16908060050160019054906101000a900460ff16908060050160029054906101000a900460ff1690806006015490806007015490806008015490806009015490508c565b61269d612ae3565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806126e357506126e2856126dd612ae3565b61257a565b5b612722576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127199061513b565b60405180910390fd5b61272f858585858561326e565b5050505050565b61273e612824565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156127ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a59061517b565b60405180910390fd5b6127b781613021565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61282c612ae3565b73ffffffffffffffffffffffffffffffffffffffff1661284a611e1d565b73ffffffffffffffffffffffffffffffffffffffff16146128a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128979061529b565b60405180910390fd5b565b6060600280546128b1906158b3565b80601f01602080910402602001604051908101604052809291908181526020018280546128dd906158b3565b801561292a5780601f106128ff5761010080835404028352916020019161292a565b820191906000526020600020905b81548152906001019060200180831161290d57829003601f168201915b50505050509050919050565b6060600082141561297e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ade565b600082905060005b600082146129b0578080612999906158e5565b915050600a826129a99190615734565b9150612986565b60008167ffffffffffffffff8111156129f2577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a245781602001600182028036833780820191505090505b5090505b60008514612ad757600182612a3d91906157bf565b9150600a85612a4c9190615952565b6030612a5891906156de565b60f81b818381518110612a94577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ad09190615734565b9450612a28565b8093505050505b919050565b600033905090565b8151835114612b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b269061541b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612b9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b96906151fb565b60405180910390fd5b6000612ba9612ae3565b9050612bb981878787878761350a565b60005b8451811015612db6576000858281518110612c00577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000858381518110612c45577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612ce6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cdd9061527b565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d9b91906156de565b9250508190555050505080612daf906158e5565b9050612bbc565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612e2d929190615087565b60405180910390a4612e43818787878787613512565b612e5181878787878761351a565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec09061543b565b60405180910390fd5b6000612ed3612ae3565b90506000612ee0856136ea565b90506000612eed856136ea565b9050612efe8360008985858961350a565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f5d91906156de565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612fdb929190615496565b60405180910390a4612ff283600089858589613512565b613001836000898989896137b0565b50505050505050565b6000826130178584613980565b1490509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80600290805190602001906130fd929190613a7d565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613170576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613167906153bb565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161326191906150be565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156132de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132d5906151fb565b60405180910390fd5b60006132e8612ae3565b905060006132f5856136ea565b90506000613302856136ea565b905061331283898985858961350a565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050858110156133a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a09061527b565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461345e91906156de565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a6040516134db929190615496565b60405180910390a46134f1848a8a86868a613512565b6134ff848a8a8a8a8a6137b0565b505050505050505050565b505050505050565b505050505050565b6135398473ffffffffffffffffffffffffffffffffffffffff166139fc565b156136e2578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161357f959493929190614fa3565b602060405180830381600087803b15801561359957600080fd5b505af19250505080156135ca57506040513d601f19601f820116820180604052508101906135c79190614125565b60015b613659576135d6615a6a565b806135e1575061361e565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161361591906150d9565b60405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613650906150fb565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146136e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136d79061515b565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff81111561372f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561375d5781602001602082028036833780820191505090505b509050828160008151811061379b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080915050919050565b6137cf8473ffffffffffffffffffffffffffffffffffffffff166139fc565b15613978578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b815260040161381595949392919061500b565b602060405180830381600087803b15801561382f57600080fd5b505af192505050801561386057506040513d601f19601f8201168201806040525081019061385d9190614125565b60015b6138ef5761386c615a6a565b8061387757506138b4565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138ab91906150d9565b60405180910390fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138e6906150fb565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161396d9061515b565b60405180910390fd5b505b505050505050565b60008082905060005b84518110156139f1576139dc828683815181106139cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151613a3b565b915080806139e9906158e5565b915050613989565b508091505092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181526000908060200190933c51119050919050565b6000818310613a5357613a4e8284613a66565b613a5e565b613a5d8383613a66565b5b905092915050565b600082600052816020526040600020905092915050565b828054613a89906158b3565b90600052602060002090601f016020900481019282613aab5760008555613af2565b82601f10613ac457805160ff1916838001178555613af2565b82800160010185558215613af2579182015b82811115613af1578251825591602001919060010190613ad6565b5b509050613aff9190613b03565b5090565b5b80821115613b1c576000816000905550600101613b04565b5090565b6000613b33613b2e846155aa565b615579565b90508083825260208201905082856020860282011115613b5257600080fd5b60005b85811015613b825781613b688882613c74565b845260208401935060208301925050600181019050613b55565b5050509392505050565b6000613b9f613b9a846155d6565b615579565b90508083825260208201905082856020860282011115613bbe57600080fd5b60005b85811015613bee5781613bd48882613dcf565b845260208401935060208301925050600181019050613bc1565b5050509392505050565b6000613c0b613c0684615602565b615579565b905082815260208101848484011115613c2357600080fd5b613c2e848285615871565b509392505050565b6000613c49613c4484615632565b615579565b905082815260208101848484011115613c6157600080fd5b613c6c848285615871565b509392505050565b600081359050613c8381615b20565b92915050565b600082601f830112613c9a57600080fd5b8135613caa848260208601613b20565b91505092915050565b60008083601f840112613cc557600080fd5b8235905067ffffffffffffffff811115613cde57600080fd5b602083019150836020820283011115613cf657600080fd5b9250929050565b600082601f830112613d0e57600080fd5b8135613d1e848260208601613b8c565b91505092915050565b600081359050613d3681615b37565b92915050565b600081359050613d4b81615b4e565b92915050565b600081359050613d6081615b65565b92915050565b600081519050613d7581615b65565b92915050565b600082601f830112613d8c57600080fd5b8135613d9c848260208601613bf8565b91505092915050565b600082601f830112613db657600080fd5b8135613dc6848260208601613c36565b91505092915050565b600081359050613dde81615b7c565b92915050565b600081519050613df381615b7c565b92915050565b600060208284031215613e0b57600080fd5b6000613e1984828501613c74565b91505092915050565b60008060408385031215613e3557600080fd5b6000613e4385828601613c74565b9250506020613e5485828601613c74565b9150509250929050565b600080600080600060a08688031215613e7657600080fd5b6000613e8488828901613c74565b9550506020613e9588828901613c74565b945050604086013567ffffffffffffffff811115613eb257600080fd5b613ebe88828901613cfd565b935050606086013567ffffffffffffffff811115613edb57600080fd5b613ee788828901613cfd565b925050608086013567ffffffffffffffff811115613f0457600080fd5b613f1088828901613d7b565b9150509295509295909350565b600080600080600060a08688031215613f3557600080fd5b6000613f4388828901613c74565b9550506020613f5488828901613c74565b9450506040613f6588828901613dcf565b9350506060613f7688828901613dcf565b925050608086013567ffffffffffffffff811115613f9357600080fd5b613f9f88828901613d7b565b9150509295509295909350565b60008060408385031215613fbf57600080fd5b6000613fcd85828601613c74565b9250506020613fde85828601613d27565b9150509250929050565b60008060408385031215613ffb57600080fd5b600061400985828601613c74565b925050602061401a85828601613dcf565b9150509250929050565b6000806040838503121561403757600080fd5b600083013567ffffffffffffffff81111561405157600080fd5b61405d85828601613c89565b925050602083013567ffffffffffffffff81111561407a57600080fd5b61408685828601613cfd565b9150509250929050565b600080600080606085870312156140a657600080fd5b600085013567ffffffffffffffff8111156140c057600080fd5b6140cc87828801613cb3565b945094505060206140df87828801613dcf565b92505060406140f087828801613dcf565b91505092959194509250565b60006020828403121561410e57600080fd5b600061411c84828501613d51565b91505092915050565b60006020828403121561413757600080fd5b600061414584828501613d66565b91505092915050565b60006020828403121561416057600080fd5b600082013567ffffffffffffffff81111561417a57600080fd5b61418684828501613da5565b91505092915050565b6000602082840312156141a157600080fd5b60006141af84828501613dcf565b91505092915050565b6000602082840312156141ca57600080fd5b60006141d884828501613de4565b91505092915050565b600080604083850312156141f457600080fd5b600061420285828601613dcf565b925050602061421385828601613c74565b9150509250929050565b60008060006060848603121561423257600080fd5b600061424086828701613dcf565b935050602061425186828701613c74565b925050604061426286828701613dcf565b9150509250925092565b6000806040838503121561427f57600080fd5b600061428d85828601613dcf565b925050602061429e85828601613d3c565b9150509250929050565b600080604083850312156142bb57600080fd5b60006142c985828601613dcf565b92505060206142da85828601613dcf565b9150509250929050565b600080600080608085870312156142fa57600080fd5b600061430887828801613dcf565b945050602061431987828801613dcf565b935050604061432a87828801613dcf565b925050606061433b87828801613dcf565b91505092959194509250565b6000806000806000806000806000806101408b8d03121561436757600080fd5b60006143758d828e01613dcf565b9a505060206143868d828e01613dcf565b99505060406143978d828e01613dcf565b98505060606143a88d828e01613dcf565b97505060806143b98d828e01613dcf565b96505060a06143ca8d828e01613d27565b95505060c06143db8d828e01613d27565b94505060e06143ec8d828e01613d27565b9350506101006143fe8d828e01613d3c565b9250506101206144108d828e01613dcf565b9150509295989b9194979a5092959850565b600061442e8383614f2b565b60208301905092915050565b614443816157f3565b82525050565b61445a614455826157f3565b61592e565b82525050565b600061446b82615672565b61447581856156a0565b935061448083615662565b8060005b838110156144b15781516144988882614422565b97506144a383615693565b925050600181019050614484565b5085935050505092915050565b6144c781615805565b82525050565b6144d681615811565b82525050565b60006144e78261567d565b6144f181856156b1565b9350614501818560208601615880565b61450a81615a3f565b840191505092915050565b600061452082615688565b61452a81856156c2565b935061453a818560208601615880565b61454381615a3f565b840191505092915050565b600061455982615688565b61456381856156d3565b9350614573818560208601615880565b80840191505092915050565b600061458c6034836156c2565b91507f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008301527f526563656976657220696d706c656d656e7465720000000000000000000000006020830152604082019050919050565b60006145f26016836156c2565b91507f57726f6e672065746865722076616c75652073656e64000000000000000000006000830152602082019050919050565b6000614632602f836156c2565b91507f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008301527f6572206e6f7220617070726f76656400000000000000000000000000000000006020830152604082019050919050565b60006146986028836156c2565b91507f455243313135353a204552433131353552656365697665722072656a6563746560008301527f6420746f6b656e730000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146fe6026836156c2565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614764602a836156c2565b91507f455243313135353a2061646472657373207a65726f206973206e6f742061207660008301527f616c6964206f776e6572000000000000000000000000000000000000000000006020830152604082019050919050565b60006147ca6015836156c2565b91507f52657365727665206973206e6f742061637469766500000000000000000000006000830152602082019050919050565b600061480a6032836156c2565b91507f7265736572766520616d6f756e7420657863656564732074686520746f74616c60008301527f20636f6c6c656374696f6e20737570706c7900000000000000000000000000006020830152604082019050919050565b60006148706025836156c2565b91507f455243313135353a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006148d6601f836156c2565b91507f416d6f756e742073686f756c642062652067726561746572207468616e2030006000830152602082019050919050565b60006149166031836156c2565b91507f416d6f756e7420657863656564732074686520616c7265616479206d6178207460008301527f6f6b656e732070657220616464726573730000000000000000000000000000006020830152604082019050919050565b600061497c602a836156c2565b91507f616d6f756e7420657863656564732074686520746f74616c20636f6c6c65637460008301527f696f6e20737570706c79000000000000000000000000000000000000000000006020830152604082019050919050565b60006149e2602a836156c2565b91507f455243313135353a20696e73756666696369656e742062616c616e636520666f60008301527f72207472616e73666572000000000000000000000000000000000000000000006020830152604082019050919050565b6000614a486020836156c2565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614a886012836156c2565b91507f4d696e74206973206e6f742061637469766500000000000000000000000000006000830152602082019050919050565b6000614ac8601a836156c2565b91507f436f6c6c656374696f6e206964206e6f74206578697374696e670000000000006000830152602082019050919050565b6000614b08602e836156c2565b91507f4d696e7420616d6f756e74206578636565647320746865206d617820746f6b6560008301527f6e732070657220616464726573730000000000000000000000000000000000006020830152604082019050919050565b6000614b6e601d836156c2565b91507f5374616b65722077726f6e672065746865722076616c75652073656e740000006000830152602082019050919050565b6000614bae6019836156c2565b91507f574c2077726f6e672065746865722076616c75652073656e74000000000000006000830152602082019050919050565b6000614bee6013836156c2565b91507f537570706c792063616e206e6f742062652030000000000000000000000000006000830152602082019050919050565b6000614c2e600d836156c2565b91507f496e76616c69642050726f6f66000000000000000000000000000000000000006000830152602082019050919050565b6000614c6e6028836156c2565b91507f4164647265737320646f6573206e6f74206861766520616e792072657365727660008301527f6520746f6b656e730000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614cd46029836156c2565b91507f455243313135353a2073657474696e6720617070726f76616c2073746174757360008301527f20666f722073656c6600000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d3a6024836156c2565b91507f537570706c792063616e206e6f74206265206c6f776572207468616e206d696e60008301527f7465642e000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614da06029836156c2565b91507f455243313135353a206163636f756e747320616e6420696473206c656e67746860008301527f206d69736d6174636800000000000000000000000000000000000000000000006020830152604082019050919050565b6000614e066028836156c2565b91507f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008301527f6d69736d617463680000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614e6c6021836156c2565b91507f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ed26032836156c2565b91507f416c726561647920657869737473206120636f6c6c656374696f6e207769746860008301527f207468697320636f6c6c656374696f6e496400000000000000000000000000006020830152604082019050919050565b614f3481615867565b82525050565b614f4381615867565b82525050565b6000614f558284614449565b60148201915081905092915050565b6000614f70828561454e565b9150614f7c828461454e565b91508190509392505050565b6000602082019050614f9d600083018461443a565b92915050565b600060a082019050614fb8600083018861443a565b614fc5602083018761443a565b8181036040830152614fd78186614460565b90508181036060830152614feb8185614460565b90508181036080830152614fff81846144dc565b90509695505050505050565b600060a082019050615020600083018861443a565b61502d602083018761443a565b61503a6040830186614f3a565b6150476060830185614f3a565b818103608083015261505981846144dc565b90509695505050505050565b6000602082019050818103600083015261507f8184614460565b905092915050565b600060408201905081810360008301526150a18185614460565b905081810360208301526150b58184614460565b90509392505050565b60006020820190506150d360008301846144be565b92915050565b600060208201905081810360008301526150f38184614515565b905092915050565b600060208201905081810360008301526151148161457f565b9050919050565b60006020820190508181036000830152615134816145e5565b9050919050565b6000602082019050818103600083015261515481614625565b9050919050565b600060208201905081810360008301526151748161468b565b9050919050565b60006020820190508181036000830152615194816146f1565b9050919050565b600060208201905081810360008301526151b481614757565b9050919050565b600060208201905081810360008301526151d4816147bd565b9050919050565b600060208201905081810360008301526151f4816147fd565b9050919050565b6000602082019050818103600083015261521481614863565b9050919050565b60006020820190508181036000830152615234816148c9565b9050919050565b6000602082019050818103600083015261525481614909565b9050919050565b600060208201905081810360008301526152748161496f565b9050919050565b60006020820190508181036000830152615294816149d5565b9050919050565b600060208201905081810360008301526152b481614a3b565b9050919050565b600060208201905081810360008301526152d481614a7b565b9050919050565b600060208201905081810360008301526152f481614abb565b9050919050565b6000602082019050818103600083015261531481614afb565b9050919050565b6000602082019050818103600083015261533481614b61565b9050919050565b6000602082019050818103600083015261535481614ba1565b9050919050565b6000602082019050818103600083015261537481614be1565b9050919050565b6000602082019050818103600083015261539481614c21565b9050919050565b600060208201905081810360008301526153b481614c61565b9050919050565b600060208201905081810360008301526153d481614cc7565b9050919050565b600060208201905081810360008301526153f481614d2d565b9050919050565b6000602082019050818103600083015261541481614d93565b9050919050565b6000602082019050818103600083015261543481614df9565b9050919050565b6000602082019050818103600083015261545481614e5f565b9050919050565b6000602082019050818103600083015261547481614ec5565b9050919050565b60006020820190506154906000830184614f3a565b92915050565b60006040820190506154ab6000830185614f3a565b6154b86020830184614f3a565b9392505050565b6000610180820190506154d5600083018f614f3a565b6154e2602083018e614f3a565b6154ef604083018d614f3a565b6154fc606083018c614f3a565b615509608083018b614f3a565b61551660a083018a6144be565b61552360c08301896144be565b61553060e08301886144be565b61553e6101008301876144cd565b61554c610120830186614f3a565b61555a610140830185614f3a565b615568610160830184614f3a565b9d9c50505050505050505050505050565b6000604051905081810181811067ffffffffffffffff821117156155a05761559f615a10565b5b8060405250919050565b600067ffffffffffffffff8211156155c5576155c4615a10565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156155f1576155f0615a10565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561561d5761561c615a10565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561564d5761564c615a10565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006156e982615867565b91506156f483615867565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561572957615728615983565b5b828201905092915050565b600061573f82615867565b915061574a83615867565b92508261575a576157596159b2565b5b828204905092915050565b600061577082615867565b915061577b83615867565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156157b4576157b3615983565b5b828202905092915050565b60006157ca82615867565b91506157d583615867565b9250828210156157e8576157e7615983565b5b828203905092915050565b60006157fe82615847565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561589e578082015181840152602081019050615883565b838111156158ad576000848401525b50505050565b600060028204905060018216806158cb57607f821691505b602082108114156158df576158de6159e1565b5b50919050565b60006158f082615867565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561592357615922615983565b5b600182019050919050565b600061593982615940565b9050919050565b600061594b82615a50565b9050919050565b600061595d82615867565b915061596883615867565b925082615978576159776159b2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b60008160e01c9050919050565b600060443d1015615a7a57615b1d565b60046000803e615a8b600051615a5d565b6308c379a08114615a9c5750615b1d565b60405160043d036004823e80513d602482011167ffffffffffffffff82111715615ac857505050615b1d565b808201805167ffffffffffffffff811115615ae7575050505050615b1d565b8060208301013d8501811115615b0257505050505050615b1d565b615b0b82615a3f565b60208401016040528296505050505050505b90565b615b29816157f3565b8114615b3457600080fd5b50565b615b4081615805565b8114615b4b57600080fd5b50565b615b5781615811565b8114615b6257600080fd5b50565b615b6e8161581b565b8114615b7957600080fd5b50565b615b8581615867565b8114615b9057600080fd5b5056fea26469706673582212208484d5a3d69ebee76adbe647e1a9c170cedf0b6af7c5b1ae2dc5d4d279461b0d64736f6c63430008000033

Deployed Bytecode

0x6080604052600436106101b65760003560e01c806362eee469116100ec578063a22cb4651161008a578063e985e9c511610064578063e985e9c5146105cf578063ec1b49f01461060c578063f242432a14610654578063f2fde38b1461067d576101b6565b8063a22cb46514610561578063dba089811461058a578063e23a53a7146105a6576101b6565b8063715018a6116100c6578063715018a6146104cd5780637d7b17a1146104e45780638da5cb5b1461050d5780639b5fdaf314610538576101b6565b806362eee4691461044b578063656658fc1461047457806370121471146104b1576101b6565b80633ccfd60b116101595780634e1273f4116101335780634e1273f4146103935780634eb78a6c146103d057806351283541146103f95780635b6b369614610422576101b6565b80633ccfd60b1461032a5780633d1e789214610341578063402564bc1461036a576101b6565b80630daf2096116101955780630daf2096146102725780630e8691e11461029b5780630e89341c146102c45780632eb2c2d614610301576101b6565b8062fdd58e146101bb57806301ffc9a7146101f857806303cd29b014610235575b600080fd5b3480156101c757600080fd5b506101e260048036038101906101dd9190613fe8565b6106a6565b6040516101ef919061547b565b60405180910390f35b34801561020457600080fd5b5061021f600480360381019061021a91906140fc565b61076f565b60405161022c91906150be565b60405180910390f35b34801561024157600080fd5b5061025c600480360381019061025791906141e1565b610851565b604051610269919061547b565b60405180910390f35b34801561027e57600080fd5b506102996004803603810190610294919061418f565b610876565b005b3480156102a757600080fd5b506102c260048036038101906102bd9190614347565b61092c565b005b3480156102d057600080fd5b506102eb60048036038101906102e6919061418f565b610b10565b6040516102f891906150d9565b60405180910390f35b34801561030d57600080fd5b5061032860048036038101906103239190613e5e565b610ba4565b005b34801561033657600080fd5b5061033f610c45565b005b34801561034d57600080fd5b506103686004803603810190610363919061418f565b610c96565b005b34801561037657600080fd5b50610391600480360381019061038c919061418f565b610d4c565b005b34801561039f57600080fd5b506103ba60048036038101906103b59190614024565b611107565b6040516103c79190615065565b60405180910390f35b3480156103dc57600080fd5b506103f760048036038101906103f291906142a8565b6112b8565b005b34801561040557600080fd5b50610420600480360381019061041b919061421d565b611391565b005b34801561042e57600080fd5b50610449600480360381019061044491906142a8565b611539565b005b34801561045757600080fd5b50610472600480360381019061046d91906142e4565b6115b9565b005b34801561048057600080fd5b5061049b600480360381019061049691906141e1565b611671565b6040516104a8919061547b565b60405180910390f35b6104cb60048036038101906104c69190614090565b611696565b005b3480156104d957600080fd5b506104e2611df5565b005b3480156104f057600080fd5b5061050b6004803603810190610506919061414e565b611e09565b005b34801561051957600080fd5b50610522611e1d565b60405161052f9190614f88565b60405180910390f35b34801561054457600080fd5b5061055f600480360381019061055a919061418f565b611e47565b005b34801561056d57600080fd5b5061058860048036038101906105839190613fac565b611efd565b005b6105a4600480360381019061059f9190614090565b611f13565b005b3480156105b257600080fd5b506105cd60048036038101906105c8919061426c565b6124fa565b005b3480156105db57600080fd5b506105f660048036038101906105f19190613e22565b61257a565b60405161060391906150be565b60405180910390f35b34801561061857600080fd5b50610633600480360381019061062e919061418f565b61260e565b60405161064b9c9b9a999897969594939291906154bf565b60405180910390f35b34801561066057600080fd5b5061067b60048036038101906106769190613f1d565b612695565b005b34801561068957600080fd5b506106a4600480360381019061069f9190613df9565b612736565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e9061519b565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061083a57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061084a5750610849826127ba565b5b9050919050565b6007602052816000526040600020602052806000526040600020600091509150505481565b61087e612824565b60006005600083815260200190815260200160002060010154116108d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ce906152db565b60405180910390fd5b6005600082815260200190815260200160002060050160029054906101000a900460ff16156005600083815260200190815260200160002060050160026101000a81548160ff02191690831515021790555050565b610934612824565b60008911610977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096e9061535b565b60405180910390fd5b6000600560008c815260200190815260200160002060010154146109d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c79061545b565b60405180910390fd5b60006040518061018001604052808c81526020018b81526020018a8152602001898152602001888152602001871515815260200186151581526020018515158152602001848152602001838152602001600081526020016000815250905080600560008d8152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548160ff02191690831515021790555060c08201518160050160016101000a81548160ff02191690831515021790555060e08201518160050160026101000a81548160ff02191690831515021790555061010082015181600601556101208201518160070155610140820151816008015561016082015181600901559050505050505050505050505050565b60606000600560008481526020019081526020016000206001015411610b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b62906152db565b60405180910390fd5b610b74826128a2565b610b7d83612936565b604051602001610b8e929190614f64565b6040516020818303038152906040529050919050565b610bac612ae3565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610bf25750610bf185610bec612ae3565b61257a565b5b610c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c289061513b565b60405180910390fd5b610c3e8585858585612aeb565b5050505050565b610c4d612824565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610c93573d6000803e3d6000fd5b50565b610c9e612824565b6000600560008381526020019081526020016000206001015411610cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cee906152db565b60405180910390fd5b6005600082815260200190815260200160002060050160009054906101000a900460ff16156005600083815260200190815260200160002060050160006101000a81548160ff02191690831515021790555050565b6000600560008381526020019081526020016000206001015411610da5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9c906152db565b60405180910390fd5b60006006600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610e38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2f9061539b565b60405180910390fd5b6005600082815260200190815260200160002060050160019054906101000a900460ff16610e9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e92906152bb565b60405180910390fd5b60006006600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506005600083815260200190815260200160002060010154600560008481526020019081526020016000206008015482610f2991906156de565b1115610f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f619061525b565b60405180910390fd5b60006006600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806005600084815260200190815260200160002060090154610fe291906157bf565b600560008481526020019081526020016000206009018190555080600560008481526020019081526020016000206008015461101e91906156de565b6005600084815260200190815260200160002060080181905550806007600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461109491906156de565b6007600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061110333838360405180602001604052806000815250612e59565b5050565b6060815183511461114d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611144906153fb565b60405180910390fd5b6000835167ffffffffffffffff811115611190577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156111be5781602001602082028036833780820191505090505b50905060005b84518110156112ad57611257858281518110611209577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015185838151811061124a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516106a6565b828281518110611290577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050806112a6906158e5565b90506111c4565b508091505092915050565b6112c0612824565b6000600560008481526020019081526020016000206001015411611319576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611310906152db565b60405180910390fd5b8060056000848152602001908152602001600020600801541115611372576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611369906153db565b60405180910390fd5b8060056000848152602001908152602001600020600101819055505050565b611399612824565b6005600084815260200190815260200160002060050160009054906101000a900460ff1615611462576005600084815260200190815260200160002060010154600560008581526020019081526020016000206009015460056000868152602001908152602001600020600801548361141291906156de565b61141c91906156de565b111561145d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114549061525b565b60405180910390fd5b6114dd565b600560008481526020019081526020016000206001015460056000858152602001908152602001600020600801548261149b91906156de565b11156114dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d39061525b565b60405180910390fd5b5b8060056000858152602001908152602001600020600801546114ff91906156de565b600560008581526020019081526020016000206008018190555061153482848360405180602001604052806000815250612e59565b505050565b611541612824565b600060056000848152602001908152602001600020600101541161159a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611591906152db565b60405180910390fd5b8060056000848152602001908152602001600020600701819055505050565b6115c1612824565b600060056000868152602001908152602001600020600101541161161a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611611906152db565b60405180910390fd5b82600560008681526020019081526020016000206002018190555081600560008681526020019081526020016000206003018190555080600560008681526020019081526020016000206004018190555050505050565b6006602052816000526040600020602052806000526040600020600091509150505481565b600081116116d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d09061521b565b60405180910390fd5b6000600560008481526020019081526020016000206001015411611732576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611729906152db565b60405180910390fd5b6005600083815260200190815260200160002060050160019054906101000a900460ff16611795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178c906152bb565b60405180910390fd5b6005600083815260200190815260200160002060070154816006600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546007600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461185991906156de565b61186391906156de565b11156118a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189b906152fb565b60405180910390fd5b6005600083815260200190815260200160002060050160009054906101000a900460ff161561196d576005600083815260200190815260200160002060010154600560008481526020019081526020016000206009015460056000858152602001908152602001600020600801548361191d91906156de565b61192791906156de565b1115611968576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195f9061525b565b60405180910390fd5b6119e8565b60056000838152602001908152602001600020600101546005600084815260200190815260200160002060080154826119a691906156de565b11156119e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119de9061525b565b60405180910390fd5b5b6005600083815260200190815260200160002060050160029054906101000a900460ff1615611a7a5734816005600085815260200190815260200160002060040154611a349190615765565b1115611a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6c9061511b565b60405180910390fd5b611ce8565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663549b5bfc336040518263ffffffff1660e01b8152600401611ad79190614f88565b60206040518083038186803b158015611aef57600080fd5b505afa158015611b03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2791906141b8565b1115611b965734816005600085815260200190815260200160002060020154611b509190615765565b1115611b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b889061511b565b60405180910390fd5b611ce7565b6000600560008481526020019081526020016000206006015414611c8257600033604051602001611bc79190614f49565b604051602081830303815290604052805190602001209050611c41858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060056000868152602001908152602001600020600601548361300a565b611c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c779061537b565b60405180910390fd5b505b34816005600085815260200190815260200160002060030154611ca59190615765565b1115611ce6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdd9061511b565b60405180910390fd5b5b5b806005600084815260200190815260200160002060080154611d0a91906156de565b6005600084815260200190815260200160002060080181905550806007600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d8091906156de565b6007600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611def33838360405180602001604052806000815250612e59565b50505050565b611dfd612824565b611e076000613021565b565b611e11612824565b611e1a816130e7565b50565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611e4f612824565b6000600560008381526020019081526020016000206001015411611ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9f906152db565b60405180910390fd5b6005600082815260200190815260200160002060050160019054906101000a900460ff16156005600083815260200190815260200160002060050160016101000a81548160ff02191690831515021790555050565b611f0f611f08612ae3565b8383613101565b5050565b60008111611f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4d9061521b565b60405180910390fd5b6000600560008481526020019081526020016000206001015411611faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa6906152db565b60405180910390fd5b6005600083815260200190815260200160002060050160009054906101000a900460ff16612012576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612009906151bb565b60405180910390fd5b60056000838152602001908152602001600020600701546007600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826006600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120d691906156de565b6120e091906156de565b1115612121576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121189061523b565b60405180910390fd5b600560008381526020019081526020016000206001015460056000848152602001908152602001600020600901548261215a91906156de565b111561219b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612192906151db565b60405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663549b5bfc336040518263ffffffff1660e01b81526004016121f89190614f88565b60206040518083038186803b15801561221057600080fd5b505afa158015612224573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061224891906141b8565b11156122b757348160056000858152602001908152602001600020600201546122719190615765565b11156122b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a99061531b565b60405180910390fd5b612408565b60006005600084815260200190815260200160002060060154146123a3576000336040516020016122e89190614f49565b604051602081830303815290604052805190602001209050612362858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060056000868152602001908152602001600020600601548361300a565b6123a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123989061537b565b60405180910390fd5b505b348160056000858152602001908152602001600020600301546123c69190615765565b1115612407576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fe9061533b565b60405180910390fd5b5b80600560008481526020019081526020016000206009015461242a91906156de565b6005600084815260200190815260200160002060090181905550806006600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546124a091906156de565b6006600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505050565b612502612824565b600060056000848152602001908152602001600020600101541161255b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612552906152db565b60405180910390fd5b8060056000848152602001908152602001600020600601819055505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60056020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050160009054906101000a900460ff16908060050160019054906101000a900460ff16908060050160029054906101000a900460ff1690806006015490806007015490806008015490806009015490508c565b61269d612ae3565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806126e357506126e2856126dd612ae3565b61257a565b5b612722576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127199061513b565b60405180910390fd5b61272f858585858561326e565b5050505050565b61273e612824565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156127ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a59061517b565b60405180910390fd5b6127b781613021565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61282c612ae3565b73ffffffffffffffffffffffffffffffffffffffff1661284a611e1d565b73ffffffffffffffffffffffffffffffffffffffff16146128a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128979061529b565b60405180910390fd5b565b6060600280546128b1906158b3565b80601f01602080910402602001604051908101604052809291908181526020018280546128dd906158b3565b801561292a5780601f106128ff5761010080835404028352916020019161292a565b820191906000526020600020905b81548152906001019060200180831161290d57829003601f168201915b50505050509050919050565b6060600082141561297e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ade565b600082905060005b600082146129b0578080612999906158e5565b915050600a826129a99190615734565b9150612986565b60008167ffffffffffffffff8111156129f2577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a245781602001600182028036833780820191505090505b5090505b60008514612ad757600182612a3d91906157bf565b9150600a85612a4c9190615952565b6030612a5891906156de565b60f81b818381518110612a94577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ad09190615734565b9450612a28565b8093505050505b919050565b600033905090565b8151835114612b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b269061541b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612b9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b96906151fb565b60405180910390fd5b6000612ba9612ae3565b9050612bb981878787878761350a565b60005b8451811015612db6576000858281518110612c00577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000858381518110612c45577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612ce6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cdd9061527b565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d9b91906156de565b9250508190555050505080612daf906158e5565b9050612bbc565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612e2d929190615087565b60405180910390a4612e43818787878787613512565b612e5181878787878761351a565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec09061543b565b60405180910390fd5b6000612ed3612ae3565b90506000612ee0856136ea565b90506000612eed856136ea565b9050612efe8360008985858961350a565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f5d91906156de565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612fdb929190615496565b60405180910390a4612ff283600089858589613512565b613001836000898989896137b0565b50505050505050565b6000826130178584613980565b1490509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80600290805190602001906130fd929190613a7d565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613170576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613167906153bb565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161326191906150be565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156132de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132d5906151fb565b60405180910390fd5b60006132e8612ae3565b905060006132f5856136ea565b90506000613302856136ea565b905061331283898985858961350a565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050858110156133a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a09061527b565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461345e91906156de565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a6040516134db929190615496565b60405180910390a46134f1848a8a86868a613512565b6134ff848a8a8a8a8a6137b0565b505050505050505050565b505050505050565b505050505050565b6135398473ffffffffffffffffffffffffffffffffffffffff166139fc565b156136e2578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161357f959493929190614fa3565b602060405180830381600087803b15801561359957600080fd5b505af19250505080156135ca57506040513d601f19601f820116820180604052508101906135c79190614125565b60015b613659576135d6615a6a565b806135e1575061361e565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161361591906150d9565b60405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613650906150fb565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146136e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136d79061515b565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff81111561372f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561375d5781602001602082028036833780820191505090505b509050828160008151811061379b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080915050919050565b6137cf8473ffffffffffffffffffffffffffffffffffffffff166139fc565b15613978578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b815260040161381595949392919061500b565b602060405180830381600087803b15801561382f57600080fd5b505af192505050801561386057506040513d601f19601f8201168201806040525081019061385d9190614125565b60015b6138ef5761386c615a6a565b8061387757506138b4565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138ab91906150d9565b60405180910390fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138e6906150fb565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161396d9061515b565b60405180910390fd5b505b505050505050565b60008082905060005b84518110156139f1576139dc828683815181106139cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151613a3b565b915080806139e9906158e5565b915050613989565b508091505092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181526000908060200190933c51119050919050565b6000818310613a5357613a4e8284613a66565b613a5e565b613a5d8383613a66565b5b905092915050565b600082600052816020526040600020905092915050565b828054613a89906158b3565b90600052602060002090601f016020900481019282613aab5760008555613af2565b82601f10613ac457805160ff1916838001178555613af2565b82800160010185558215613af2579182015b82811115613af1578251825591602001919060010190613ad6565b5b509050613aff9190613b03565b5090565b5b80821115613b1c576000816000905550600101613b04565b5090565b6000613b33613b2e846155aa565b615579565b90508083825260208201905082856020860282011115613b5257600080fd5b60005b85811015613b825781613b688882613c74565b845260208401935060208301925050600181019050613b55565b5050509392505050565b6000613b9f613b9a846155d6565b615579565b90508083825260208201905082856020860282011115613bbe57600080fd5b60005b85811015613bee5781613bd48882613dcf565b845260208401935060208301925050600181019050613bc1565b5050509392505050565b6000613c0b613c0684615602565b615579565b905082815260208101848484011115613c2357600080fd5b613c2e848285615871565b509392505050565b6000613c49613c4484615632565b615579565b905082815260208101848484011115613c6157600080fd5b613c6c848285615871565b509392505050565b600081359050613c8381615b20565b92915050565b600082601f830112613c9a57600080fd5b8135613caa848260208601613b20565b91505092915050565b60008083601f840112613cc557600080fd5b8235905067ffffffffffffffff811115613cde57600080fd5b602083019150836020820283011115613cf657600080fd5b9250929050565b600082601f830112613d0e57600080fd5b8135613d1e848260208601613b8c565b91505092915050565b600081359050613d3681615b37565b92915050565b600081359050613d4b81615b4e565b92915050565b600081359050613d6081615b65565b92915050565b600081519050613d7581615b65565b92915050565b600082601f830112613d8c57600080fd5b8135613d9c848260208601613bf8565b91505092915050565b600082601f830112613db657600080fd5b8135613dc6848260208601613c36565b91505092915050565b600081359050613dde81615b7c565b92915050565b600081519050613df381615b7c565b92915050565b600060208284031215613e0b57600080fd5b6000613e1984828501613c74565b91505092915050565b60008060408385031215613e3557600080fd5b6000613e4385828601613c74565b9250506020613e5485828601613c74565b9150509250929050565b600080600080600060a08688031215613e7657600080fd5b6000613e8488828901613c74565b9550506020613e9588828901613c74565b945050604086013567ffffffffffffffff811115613eb257600080fd5b613ebe88828901613cfd565b935050606086013567ffffffffffffffff811115613edb57600080fd5b613ee788828901613cfd565b925050608086013567ffffffffffffffff811115613f0457600080fd5b613f1088828901613d7b565b9150509295509295909350565b600080600080600060a08688031215613f3557600080fd5b6000613f4388828901613c74565b9550506020613f5488828901613c74565b9450506040613f6588828901613dcf565b9350506060613f7688828901613dcf565b925050608086013567ffffffffffffffff811115613f9357600080fd5b613f9f88828901613d7b565b9150509295509295909350565b60008060408385031215613fbf57600080fd5b6000613fcd85828601613c74565b9250506020613fde85828601613d27565b9150509250929050565b60008060408385031215613ffb57600080fd5b600061400985828601613c74565b925050602061401a85828601613dcf565b9150509250929050565b6000806040838503121561403757600080fd5b600083013567ffffffffffffffff81111561405157600080fd5b61405d85828601613c89565b925050602083013567ffffffffffffffff81111561407a57600080fd5b61408685828601613cfd565b9150509250929050565b600080600080606085870312156140a657600080fd5b600085013567ffffffffffffffff8111156140c057600080fd5b6140cc87828801613cb3565b945094505060206140df87828801613dcf565b92505060406140f087828801613dcf565b91505092959194509250565b60006020828403121561410e57600080fd5b600061411c84828501613d51565b91505092915050565b60006020828403121561413757600080fd5b600061414584828501613d66565b91505092915050565b60006020828403121561416057600080fd5b600082013567ffffffffffffffff81111561417a57600080fd5b61418684828501613da5565b91505092915050565b6000602082840312156141a157600080fd5b60006141af84828501613dcf565b91505092915050565b6000602082840312156141ca57600080fd5b60006141d884828501613de4565b91505092915050565b600080604083850312156141f457600080fd5b600061420285828601613dcf565b925050602061421385828601613c74565b9150509250929050565b60008060006060848603121561423257600080fd5b600061424086828701613dcf565b935050602061425186828701613c74565b925050604061426286828701613dcf565b9150509250925092565b6000806040838503121561427f57600080fd5b600061428d85828601613dcf565b925050602061429e85828601613d3c565b9150509250929050565b600080604083850312156142bb57600080fd5b60006142c985828601613dcf565b92505060206142da85828601613dcf565b9150509250929050565b600080600080608085870312156142fa57600080fd5b600061430887828801613dcf565b945050602061431987828801613dcf565b935050604061432a87828801613dcf565b925050606061433b87828801613dcf565b91505092959194509250565b6000806000806000806000806000806101408b8d03121561436757600080fd5b60006143758d828e01613dcf565b9a505060206143868d828e01613dcf565b99505060406143978d828e01613dcf565b98505060606143a88d828e01613dcf565b97505060806143b98d828e01613dcf565b96505060a06143ca8d828e01613d27565b95505060c06143db8d828e01613d27565b94505060e06143ec8d828e01613d27565b9350506101006143fe8d828e01613d3c565b9250506101206144108d828e01613dcf565b9150509295989b9194979a5092959850565b600061442e8383614f2b565b60208301905092915050565b614443816157f3565b82525050565b61445a614455826157f3565b61592e565b82525050565b600061446b82615672565b61447581856156a0565b935061448083615662565b8060005b838110156144b15781516144988882614422565b97506144a383615693565b925050600181019050614484565b5085935050505092915050565b6144c781615805565b82525050565b6144d681615811565b82525050565b60006144e78261567d565b6144f181856156b1565b9350614501818560208601615880565b61450a81615a3f565b840191505092915050565b600061452082615688565b61452a81856156c2565b935061453a818560208601615880565b61454381615a3f565b840191505092915050565b600061455982615688565b61456381856156d3565b9350614573818560208601615880565b80840191505092915050565b600061458c6034836156c2565b91507f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008301527f526563656976657220696d706c656d656e7465720000000000000000000000006020830152604082019050919050565b60006145f26016836156c2565b91507f57726f6e672065746865722076616c75652073656e64000000000000000000006000830152602082019050919050565b6000614632602f836156c2565b91507f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008301527f6572206e6f7220617070726f76656400000000000000000000000000000000006020830152604082019050919050565b60006146986028836156c2565b91507f455243313135353a204552433131353552656365697665722072656a6563746560008301527f6420746f6b656e730000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146fe6026836156c2565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614764602a836156c2565b91507f455243313135353a2061646472657373207a65726f206973206e6f742061207660008301527f616c6964206f776e6572000000000000000000000000000000000000000000006020830152604082019050919050565b60006147ca6015836156c2565b91507f52657365727665206973206e6f742061637469766500000000000000000000006000830152602082019050919050565b600061480a6032836156c2565b91507f7265736572766520616d6f756e7420657863656564732074686520746f74616c60008301527f20636f6c6c656374696f6e20737570706c7900000000000000000000000000006020830152604082019050919050565b60006148706025836156c2565b91507f455243313135353a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006148d6601f836156c2565b91507f416d6f756e742073686f756c642062652067726561746572207468616e2030006000830152602082019050919050565b60006149166031836156c2565b91507f416d6f756e7420657863656564732074686520616c7265616479206d6178207460008301527f6f6b656e732070657220616464726573730000000000000000000000000000006020830152604082019050919050565b600061497c602a836156c2565b91507f616d6f756e7420657863656564732074686520746f74616c20636f6c6c65637460008301527f696f6e20737570706c79000000000000000000000000000000000000000000006020830152604082019050919050565b60006149e2602a836156c2565b91507f455243313135353a20696e73756666696369656e742062616c616e636520666f60008301527f72207472616e73666572000000000000000000000000000000000000000000006020830152604082019050919050565b6000614a486020836156c2565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614a886012836156c2565b91507f4d696e74206973206e6f742061637469766500000000000000000000000000006000830152602082019050919050565b6000614ac8601a836156c2565b91507f436f6c6c656374696f6e206964206e6f74206578697374696e670000000000006000830152602082019050919050565b6000614b08602e836156c2565b91507f4d696e7420616d6f756e74206578636565647320746865206d617820746f6b6560008301527f6e732070657220616464726573730000000000000000000000000000000000006020830152604082019050919050565b6000614b6e601d836156c2565b91507f5374616b65722077726f6e672065746865722076616c75652073656e740000006000830152602082019050919050565b6000614bae6019836156c2565b91507f574c2077726f6e672065746865722076616c75652073656e74000000000000006000830152602082019050919050565b6000614bee6013836156c2565b91507f537570706c792063616e206e6f742062652030000000000000000000000000006000830152602082019050919050565b6000614c2e600d836156c2565b91507f496e76616c69642050726f6f66000000000000000000000000000000000000006000830152602082019050919050565b6000614c6e6028836156c2565b91507f4164647265737320646f6573206e6f74206861766520616e792072657365727660008301527f6520746f6b656e730000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614cd46029836156c2565b91507f455243313135353a2073657474696e6720617070726f76616c2073746174757360008301527f20666f722073656c6600000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d3a6024836156c2565b91507f537570706c792063616e206e6f74206265206c6f776572207468616e206d696e60008301527f7465642e000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614da06029836156c2565b91507f455243313135353a206163636f756e747320616e6420696473206c656e67746860008301527f206d69736d6174636800000000000000000000000000000000000000000000006020830152604082019050919050565b6000614e066028836156c2565b91507f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008301527f6d69736d617463680000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614e6c6021836156c2565b91507f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ed26032836156c2565b91507f416c726561647920657869737473206120636f6c6c656374696f6e207769746860008301527f207468697320636f6c6c656374696f6e496400000000000000000000000000006020830152604082019050919050565b614f3481615867565b82525050565b614f4381615867565b82525050565b6000614f558284614449565b60148201915081905092915050565b6000614f70828561454e565b9150614f7c828461454e565b91508190509392505050565b6000602082019050614f9d600083018461443a565b92915050565b600060a082019050614fb8600083018861443a565b614fc5602083018761443a565b8181036040830152614fd78186614460565b90508181036060830152614feb8185614460565b90508181036080830152614fff81846144dc565b90509695505050505050565b600060a082019050615020600083018861443a565b61502d602083018761443a565b61503a6040830186614f3a565b6150476060830185614f3a565b818103608083015261505981846144dc565b90509695505050505050565b6000602082019050818103600083015261507f8184614460565b905092915050565b600060408201905081810360008301526150a18185614460565b905081810360208301526150b58184614460565b90509392505050565b60006020820190506150d360008301846144be565b92915050565b600060208201905081810360008301526150f38184614515565b905092915050565b600060208201905081810360008301526151148161457f565b9050919050565b60006020820190508181036000830152615134816145e5565b9050919050565b6000602082019050818103600083015261515481614625565b9050919050565b600060208201905081810360008301526151748161468b565b9050919050565b60006020820190508181036000830152615194816146f1565b9050919050565b600060208201905081810360008301526151b481614757565b9050919050565b600060208201905081810360008301526151d4816147bd565b9050919050565b600060208201905081810360008301526151f4816147fd565b9050919050565b6000602082019050818103600083015261521481614863565b9050919050565b60006020820190508181036000830152615234816148c9565b9050919050565b6000602082019050818103600083015261525481614909565b9050919050565b600060208201905081810360008301526152748161496f565b9050919050565b60006020820190508181036000830152615294816149d5565b9050919050565b600060208201905081810360008301526152b481614a3b565b9050919050565b600060208201905081810360008301526152d481614a7b565b9050919050565b600060208201905081810360008301526152f481614abb565b9050919050565b6000602082019050818103600083015261531481614afb565b9050919050565b6000602082019050818103600083015261533481614b61565b9050919050565b6000602082019050818103600083015261535481614ba1565b9050919050565b6000602082019050818103600083015261537481614be1565b9050919050565b6000602082019050818103600083015261539481614c21565b9050919050565b600060208201905081810360008301526153b481614c61565b9050919050565b600060208201905081810360008301526153d481614cc7565b9050919050565b600060208201905081810360008301526153f481614d2d565b9050919050565b6000602082019050818103600083015261541481614d93565b9050919050565b6000602082019050818103600083015261543481614df9565b9050919050565b6000602082019050818103600083015261545481614e5f565b9050919050565b6000602082019050818103600083015261547481614ec5565b9050919050565b60006020820190506154906000830184614f3a565b92915050565b60006040820190506154ab6000830185614f3a565b6154b86020830184614f3a565b9392505050565b6000610180820190506154d5600083018f614f3a565b6154e2602083018e614f3a565b6154ef604083018d614f3a565b6154fc606083018c614f3a565b615509608083018b614f3a565b61551660a083018a6144be565b61552360c08301896144be565b61553060e08301886144be565b61553e6101008301876144cd565b61554c610120830186614f3a565b61555a610140830185614f3a565b615568610160830184614f3a565b9d9c50505050505050505050505050565b6000604051905081810181811067ffffffffffffffff821117156155a05761559f615a10565b5b8060405250919050565b600067ffffffffffffffff8211156155c5576155c4615a10565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156155f1576155f0615a10565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561561d5761561c615a10565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561564d5761564c615a10565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006156e982615867565b91506156f483615867565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561572957615728615983565b5b828201905092915050565b600061573f82615867565b915061574a83615867565b92508261575a576157596159b2565b5b828204905092915050565b600061577082615867565b915061577b83615867565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156157b4576157b3615983565b5b828202905092915050565b60006157ca82615867565b91506157d583615867565b9250828210156157e8576157e7615983565b5b828203905092915050565b60006157fe82615847565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561589e578082015181840152602081019050615883565b838111156158ad576000848401525b50505050565b600060028204905060018216806158cb57607f821691505b602082108114156158df576158de6159e1565b5b50919050565b60006158f082615867565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561592357615922615983565b5b600182019050919050565b600061593982615940565b9050919050565b600061594b82615a50565b9050919050565b600061595d82615867565b915061596883615867565b925082615978576159776159b2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b60008160e01c9050919050565b600060443d1015615a7a57615b1d565b60046000803e615a8b600051615a5d565b6308c379a08114615a9c5750615b1d565b60405160043d036004823e80513d602482011167ffffffffffffffff82111715615ac857505050615b1d565b808201805167ffffffffffffffff811115615ae7575050505050615b1d565b8060208301013d8501811115615b0257505050505050615b1d565b615b0b82615a3f565b60208401016040528296505050505050505b90565b615b29816157f3565b8114615b3457600080fd5b50565b615b4081615805565b8114615b4b57600080fd5b50565b615b5781615811565b8114615b6257600080fd5b50565b615b6e8161581b565b8114615b7957600080fd5b50565b615b8581615867565b8114615b9057600080fd5b5056fea26469706673582212208484d5a3d69ebee76adbe647e1a9c170cedf0b6af7c5b1ae2dc5d4d279461b0d64736f6c63430008000033

Deployed Bytecode Sourcemap

60091:9695:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23406:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22429:310;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60747:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67919:250;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65802:681;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69544:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25350:439;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69429:107;;;;;;;;;;;;;:::i;:::-;;67385:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62576:1060;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23802:524;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66600:356;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68709:712;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68442:259;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66964:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60655:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63644:2150;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4633:103;;;;;;;;;;;;;:::i;:::-;;66491:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3985:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67655:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24399:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60958:1610;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68177:257;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24626:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60595:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;24866:407;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4891:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23406:230;23492:7;23539:1;23520:21;;:7;:21;;;;23512:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;23606:9;:13;23616:2;23606:13;;;;;;;;;;;:22;23620:7;23606:22;;;;;;;;;;;;;;;;23599:29;;23406:230;;;;:::o;22429:310::-;22531:4;22583:26;22568:41;;;:11;:41;;;;:110;;;;22641:37;22626:52;;;:11;:52;;;;22568:110;:163;;;;22695:36;22719:11;22695:23;:36::i;:::-;22568:163;22548:183;;22429:310;;;:::o;60747:82::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;67919:250::-;3871:13;:11;:13::i;:::-;68038:1:::1;68001:13;:27;68015:12;68001:27;;;;;;;;;;;:34;;;:38;67993:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;68123:13;:27;68137:12;68123:27;;;;;;;;;;;:38;;;;;;;;;;;;68122:39;68081:13;:27;68095:12;68081:27;;;;;;;;;;;:38;;;:80;;;;;;;;;;;;;;;;;;67919:250:::0;:::o;65802:681::-;3871:13;:11;:13::i;:::-;66078:1:::1;66069:6;:10;66061:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;66160:1;66122:13;:27;66136:12;66122:27;;;;;;;;;;;:34;;;:39;66114:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;66227:35;66265:154;;;;;;;;66279:12;66265:154;;;;66293:6;66265:154;;;;66301:12;66265:154;;;;66315:7;66265:154;;;;66324:11;66265:154;;;;66337:15;66265:154;;;;;;66354:12;66265:154;;;;;;66368:10;66265:154;;;;;;66380:11;66265:154;;;;66393:19;66265:154;;;;66414:1;66265:154;;;;66417:1;66265:154;;::::0;66227:192:::1;;66460:15;66430:13;:27;66444:12;66430:27;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3895:1;65802:681:::0;;;;;;;;;;:::o;69544:239::-;69600:13;69662:1;69634:13;:18;69648:3;69634:18;;;;;;;;;;;:25;;;:29;69626:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69736:14;69746:3;69736:9;:14::i;:::-;69752:21;69769:3;69752:16;:21::i;:::-;69719:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69705:70;;69544:239;;;:::o;25350:439::-;25591:12;:10;:12::i;:::-;25583:20;;:4;:20;;;:60;;;;25607:36;25624:4;25630:12;:10;:12::i;:::-;25607:16;:36::i;:::-;25583:60;25561:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;25729:52;25752:4;25758:2;25762:3;25767:7;25776:4;25729:22;:52::i;:::-;25350:439;;;;;:::o;69429:107::-;3871:13;:11;:13::i;:::-;69485:10:::1;69477:28;;:51;69506:21;69477:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;69429:107::o:0;67385:262::-;3871:13;:11;:13::i;:::-;67506:1:::1;67469:13;:27;67483:12;67469:27;;;;;;;;;;;:34;;;:38;67461:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;67596:13;:27;67610:12;67596:27;;;;;;;;;;;:43;;;;;;;;;;;;67595:44;67549:13;:27;67563:12;67549:27;;;;;;;;;;;:43;;;:90;;;;;;;;;;;;;;;;;;67385:262:::0;:::o;62576:1060::-;62694:1;62657:13;:27;62671:12;62657:27;;;;;;;;;;;:34;;;:38;62649:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;62803:1;62745:29;:43;62775:12;62745:43;;;;;;;;;;;:55;62789:10;62745:55;;;;;;;;;;;;;;;;:59;62737:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;62868:13;:27;62882:12;62868:27;;;;;;;;;;;:40;;;;;;;;;;;;62860:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;62942:14;62959:29;:43;62989:12;62959:43;;;;;;;;;;;:55;63003:10;62959:55;;;;;;;;;;;;;;;;62942:72;;63086:13;:27;63100:12;63086:27;;;;;;;;;;;:34;;;63042:13;:27;63056:12;63042:27;;;;;;;;;;;:40;;;63033:6;:49;;;;:::i;:::-;:87;;63025:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;63236:1;63178:29;:43;63208:12;63178:43;;;;;;;;;;;:55;63222:10;63178:55;;;;;;;;;;;;;;;:59;;;;63338:6;63293:13;:27;63307:12;63293:27;;;;;;;;;;;:42;;;:51;;;;:::i;:::-;63248:13;:27;63262:12;63248:27;;;;;;;;;;;:42;;:96;;;;63441:6;63398:13;:27;63412:12;63398:27;;;;;;;;;;;:40;;;:49;;;;:::i;:::-;63355:13;:27;63369:12;63355:27;;;;;;;;;;;:40;;:92;;;;63568:6;63513:26;:40;63540:12;63513:40;;;;;;;;;;;:52;63554:10;63513:52;;;;;;;;;;;;;;;;:61;;;;:::i;:::-;63458:26;:40;63485:12;63458:40;;;;;;;;;;;:52;63499:10;63458:52;;;;;;;;;;;;;;;:116;;;;63585:43;63591:10;63603:12;63617:6;63585:43;;;;;;;;;;;;:5;:43::i;:::-;62576:1060;;:::o;23802:524::-;23958:16;24019:3;:10;24000:8;:15;:29;23992:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;24088:30;24135:8;:15;24121:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24088:63;;24169:9;24164:122;24188:8;:15;24184:1;:19;24164:122;;;24244:30;24254:8;24263:1;24254:11;;;;;;;;;;;;;;;;;;;;;;24267:3;24271:1;24267:6;;;;;;;;;;;;;;;;;;;;;;24244:9;:30::i;:::-;24225:13;24239:1;24225:16;;;;;;;;;;;;;;;;;;;;;:49;;;;;24205:3;;;;:::i;:::-;;;24164:122;;;;24305:13;24298:20;;;23802:524;;;;:::o;66600:356::-;3871:13;:11;:13::i;:::-;66746:1:::1;66709:13;:27;66723:12;66709:27;;;;;;;;;;;:34;;;:38;66701:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;66841:9;66797:13;:27;66811:12;66797:27;;;;;;;;;;;:40;;;:53;;66789:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;66939:9;66902:13;:27;66916:12;66902:27;;;;;;;;;;;:34;;:46;;;;66600:356:::0;;:::o;68709:712::-;3871:13;:11;:13::i;:::-;68821::::1;:27;68835:12;68821:27;;;;;;;;;;;:43;;;;;;;;;;;;68817:438;;;68987:13;:27;69001:12;68987:27;;;;;;;;;;;:34;;;68941:13;:27;68955:12;68941:27;;;;;;;;;;;:42;;;68898:13;:27;68912:12;68898:27;;;;;;;;;;;:40;;;68889:6;:49;;;;:::i;:::-;:94;;;;:::i;:::-;:132;;68881:187;;;;;;;;;;;;:::i;:::-;;;;;;;;;68817:438;;;69162:13;:27;69176:12;69162:27;;;;;;;;;;;:34;;;69118:13;:27;69132:12;69118:27;;;;;;;;;;;:40;;;69109:6;:49;;;;:::i;:::-;:87;;69101:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;68817:438;69351:6;69308:13;:27;69322:12;69308:27;;;;;;;;;;;:40;;;:49;;;;:::i;:::-;69265:13;:27;69279:12;69265:27;;;;;;;;;;;:40;;:92;;;;69368:45;69374:12;69388;69402:6;69368:45;;;;;;;;;;;::::0;:5:::1;:45::i;:::-;68709:712:::0;;;:::o;68442:259::-;3871:13;:11;:13::i;:::-;68591:1:::1;68554:13;:27;68568:12;68554:27;;;;;;;;;;;:34;;;:38;68546:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;68684:9;68634:13;:27;68648:12;68634:27;;;;;;;;;;;:47;;:59;;;;68442:259:::0;;:::o;66964:413::-;3871:13;:11;:13::i;:::-;67151:1:::1;67114:13;:27;67128:12;67114:27;;;;;;;;;;;:34;;;:38;67106:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;67237:12;67194:13;:27;67208:12;67194:27;;;;;;;;;;;:40;;:55;;;;67298:7;67260:13;:27;67274:12;67260:27;;;;;;;;;;;:35;;:45;;;;67358:11;67316:13;:27;67330:12;67316:27;;;;;;;;;;;:39;;:53;;;;66964:413:::0;;;;:::o;60655:85::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;63644:2150::-;63784:1;63775:6;:10;63767:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;63877:1;63840:13;:27;63854:12;63840:27;;;;;;;;;;;:34;;;:38;63832:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;63928:13;:27;63942:12;63928:27;;;;;;;;;;;:40;;;;;;;;;;;;63920:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;64133:13;:27;64147:12;64133:27;;;;;;;;;;;:47;;;64123:6;64065:29;:43;64095:12;64065:43;;;;;;;;;;;:55;64109:10;64065:55;;;;;;;;;;;;;;;;64010:26;:40;64037:12;64010:40;;;;;;;;;;;:52;64051:10;64010:52;;;;;;;;;;;;;;;;:110;;;;:::i;:::-;:119;;;;:::i;:::-;:170;;64002:229;;;;;;;;;;;;:::i;:::-;;;;;;;;;64246:13;:27;64260:12;64246:27;;;;;;;;;;;:43;;;;;;;;;;;;64242:438;;;64412:13;:27;64426:12;64412:27;;;;;;;;;;;:34;;;64366:13;:27;64380:12;64366:27;;;;;;;;;;;:42;;;64323:13;:27;64337:12;64323:27;;;;;;;;;;;:40;;;64314:6;:49;;;;:::i;:::-;:94;;;;:::i;:::-;:132;;64306:187;;;;;;;;;;;;:::i;:::-;;;;;;;;;64242:438;;;64587:13;:27;64601:12;64587:27;;;;;;;;;;;:34;;;64543:13;:27;64557:12;64543:27;;;;;;;;;;;:40;;;64534:6;:49;;;;:::i;:::-;:87;;64526:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;64242:438;64694:13;:27;64708:12;64694:27;;;;;;;;;;;:38;;;;;;;;;;;;64690:813;;;64809:9;64799:6;64757:13;:27;64771:12;64757:27;;;;;;;;;;;:39;;;:48;;;;:::i;:::-;:61;;64749:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;64690:813;;;64928:1;64882:16;;;;;;;;;;;:31;;;64914:10;64882:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;64878:614;;;65011:9;65001:6;64958:13;:27;64972:12;64958:27;;;;;;;;;;;:40;;;:49;;;;:::i;:::-;:62;;64950:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;64878:614;;;65092:45;:13;:27;65106:12;65092:27;;;;;;;;;;;:39;;;:45;65088:278;;65163:12;65205:10;65188:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;65178:39;;;;;;65163:54;;65249:79;65268:12;;65249:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65282:13;:27;65296:12;65282:27;;;;;;;;;;;:39;;;65323:4;65249:18;:79::i;:::-;65241:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;65088:278;;65440:9;65430:6;65392:13;:27;65406:12;65392:27;;;;;;;;;;;:35;;;:44;;;;:::i;:::-;:57;;65384:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;64878:614;64690:813;65599:6;65556:13;:27;65570:12;65556:27;;;;;;;;;;;:40;;;:49;;;;:::i;:::-;65513:13;:27;65527:12;65513:27;;;;;;;;;;;:40;;:92;;;;65726:6;65671:26;:40;65698:12;65671:40;;;;;;;;;;;:52;65712:10;65671:52;;;;;;;;;;;;;;;;:61;;;;:::i;:::-;65616:26;:40;65643:12;65616:40;;;;;;;;;;;:52;65657:10;65616:52;;;;;;;;;;;;;;;:116;;;;65743:43;65749:10;65761:12;65775:6;65743:43;;;;;;;;;;;;:5;:43::i;:::-;63644:2150;;;;:::o;4633:103::-;3871:13;:11;:13::i;:::-;4698:30:::1;4725:1;4698:18;:30::i;:::-;4633:103::o:0;66491:101::-;3871:13;:11;:13::i;:::-;66567:17:::1;66575:8;66567:7;:17::i;:::-;66491:101:::0;:::o;3985:87::-;4031:7;4058:6;;;;;;;;;;;4051:13;;3985:87;:::o;67655:256::-;3871:13;:11;:13::i;:::-;67776:1:::1;67739:13;:27;67753:12;67739:27;;;;;;;;;;;:34;;;:38;67731:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;67863:13;:27;67877:12;67863:27;;;;;;;;;;;:40;;;;;;;;;;;;67862:41;67819:13;:27;67833:12;67819:27;;;;;;;;;;;:40;;;:84;;;;;;;;;;;;;;;;;;67655:256:::0;:::o;24399:155::-;24494:52;24513:12;:10;:12::i;:::-;24527:8;24537;24494:18;:52::i;:::-;24399:155;;:::o;60958:1610::-;61101:1;61092:6;:10;61084:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;61194:1;61157:13;:27;61171:12;61157:27;;;;;;;;;;;:34;;;:38;61149:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;61245:13;:27;61259:12;61245:27;;;;;;;;;;;:43;;;;;;;;;;;;61237:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;61456:13;:27;61470:12;61456:27;;;;;;;;;;;:47;;;61400:26;:40;61427:12;61400:40;;;;;;;;;;;:52;61441:10;61400:52;;;;;;;;;;;;;;;;61391:6;61333:29;:43;61363:12;61333:43;;;;;;;;;;;:55;61377:10;61333:55;;;;;;;;;;;;;;;;:64;;;;:::i;:::-;:119;;;;:::i;:::-;:170;;61325:232;;;;;;;;;;;;:::i;:::-;;;;;;;;;61631:13;:27;61645:12;61631:27;;;;;;;;;;;:34;;;61585:13;:27;61599:12;61585:27;;;;;;;;;;;:42;;;61576:6;:51;;;;:::i;:::-;:89;;61568:152;;;;;;;;;;;;:::i;:::-;;;;;;;;;61781:1;61735:16;;;;;;;;;;;:31;;;61767:10;61735:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;61731:590;;;61860:9;61850:6;61807:13;:27;61821:12;61807:27;;;;;;;;;;;:40;;;:49;;;;:::i;:::-;:62;;61799:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;61731:590;;;61940:45;:13;:27;61954:12;61940:27;;;;;;;;;;;:39;;;:45;61936:264;;62006:12;62048:10;62031:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;62021:39;;;;;;62006:54;;62087:79;62106:12;;62087:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62120:13;:27;62134:12;62120:27;;;;;;;;;;;:39;;;62161:4;62087:18;:79::i;:::-;62079:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;61936:264;;62270:9;62260:6;62222:13;:27;62236:12;62222:27;;;;;;;;;;;:35;;;:44;;;;:::i;:::-;:57;;62214:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;61731:590;62421:6;62376:13;:27;62390:12;62376:27;;;;;;;;;;;:42;;;:51;;;;:::i;:::-;62331:13;:27;62345:12;62331:27;;;;;;;;;;;:42;;:96;;;;62554:6;62496:29;:43;62526:12;62496:43;;;;;;;;;;;:55;62540:10;62496:55;;;;;;;;;;;;;;;;:64;;;;:::i;:::-;62438:29;:43;62468:12;62438:43;;;;;;;;;;;:55;62482:10;62438:55;;;;;;;;;;;;;;;:122;;;;60958:1610;;;;:::o;68177:257::-;3871:13;:11;:13::i;:::-;68328:1:::1;68291:13;:27;68305:12;68291:27;;;;;;;;;;;:34;;;:38;68283:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;68413:13;68371;:27;68385:12;68371:27;;;;;;;;;;;:39;;:55;;;;68177:257:::0;;:::o;24626:168::-;24725:4;24749:18;:27;24768:7;24749:27;;;;;;;;;;;;;;;:37;24777:8;24749:37;;;;;;;;;;;;;;;;;;;;;;;;;24742:44;;24626:168;;;;:::o;60595:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24866:407::-;25082:12;:10;:12::i;:::-;25074:20;;:4;:20;;;:60;;;;25098:36;25115:4;25121:12;:10;:12::i;:::-;25098:16;:36::i;:::-;25074:60;25052:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;25220:45;25238:4;25244:2;25248;25252:6;25260:4;25220:17;:45::i;:::-;24866:407;;;;;:::o;4891:201::-;3871:13;:11;:13::i;:::-;5000:1:::1;4980:22;;:8;:22;;;;4972:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5056:28;5075:8;5056:18;:28::i;:::-;4891:201:::0;:::o;2603:157::-;2688:4;2727:25;2712:40;;;:11;:40;;;;2705:47;;2603:157;;;:::o;4150:132::-;4225:12;:10;:12::i;:::-;4214:23;;:7;:5;:7::i;:::-;:23;;;4206:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4150:132::o;23150:105::-;23210:13;23243:4;23236:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23150:105;;;:::o;47865:723::-;47921:13;48151:1;48142:5;:10;48138:53;;;48169:10;;;;;;;;;;;;;;;;;;;;;48138:53;48201:12;48216:5;48201:20;;48232:14;48257:78;48272:1;48264:4;:9;48257:78;;48290:8;;;;;:::i;:::-;;;;48321:2;48313:10;;;;;:::i;:::-;;;48257:78;;;48345:19;48377:6;48367:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48345:39;;48395:154;48411:1;48402:5;:10;48395:154;;48439:1;48429:11;;;;;:::i;:::-;;;48506:2;48498:5;:10;;;;:::i;:::-;48485:2;:24;;;;:::i;:::-;48472:39;;48455:6;48462;48455:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;48535:2;48526:11;;;;;:::i;:::-;;;48395:154;;;48573:6;48559:21;;;;;47865:723;;;;:::o;604:98::-;657:7;684:10;677:17;;604:98;:::o;27585:1146::-;27812:7;:14;27798:3;:10;:28;27790:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;27904:1;27890:16;;:2;:16;;;;27882:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;27961:16;27980:12;:10;:12::i;:::-;27961:31;;28005:60;28026:8;28036:4;28042:2;28046:3;28051:7;28060:4;28005:20;:60::i;:::-;28083:9;28078:421;28102:3;:10;28098:1;:14;28078:421;;;28134:10;28147:3;28151:1;28147:6;;;;;;;;;;;;;;;;;;;;;;28134:19;;28168:14;28185:7;28193:1;28185:10;;;;;;;;;;;;;;;;;;;;;;28168:27;;28212:19;28234:9;:13;28244:2;28234:13;;;;;;;;;;;:19;28248:4;28234:19;;;;;;;;;;;;;;;;28212:41;;28291:6;28276:11;:21;;28268:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;28424:6;28410:11;:20;28388:9;:13;28398:2;28388:13;;;;;;;;;;;:19;28402:4;28388:19;;;;;;;;;;;;;;;:42;;;;28481:6;28460:9;:13;28470:2;28460:13;;;;;;;;;;;:17;28474:2;28460:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;28078:421;;;28114:3;;;;:::i;:::-;;;28078:421;;;;28546:2;28516:47;;28540:4;28516:47;;28530:8;28516:47;;;28550:3;28555:7;28516:47;;;;;;;:::i;:::-;;;;;;;;28576:59;28596:8;28606:4;28612:2;28616:3;28621:7;28630:4;28576:19;:59::i;:::-;28648:75;28684:8;28694:4;28700:2;28704:3;28709:7;28718:4;28648:35;:75::i;:::-;27585:1146;;;;;;:::o;30049:729::-;30216:1;30202:16;;:2;:16;;;;30194:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;30269:16;30288:12;:10;:12::i;:::-;30269:31;;30311:20;30334:21;30352:2;30334:17;:21::i;:::-;30311:44;;30366:24;30393:25;30411:6;30393:17;:25::i;:::-;30366:52;;30431:66;30452:8;30470:1;30474:2;30478:3;30483:7;30492:4;30431:20;:66::i;:::-;30531:6;30510:9;:13;30520:2;30510:13;;;;;;;;;;;:17;30524:2;30510:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;30590:2;30553:52;;30586:1;30553:52;;30568:8;30553:52;;;30594:2;30598:6;30553:52;;;;;;;:::i;:::-;;;;;;;;30618:65;30638:8;30656:1;30660:2;30664:3;30669:7;30678:4;30618:19;:65::i;:::-;30696:74;30727:8;30745:1;30749:2;30753;30757:6;30765:4;30696:30;:74::i;:::-;30049:729;;;;;;;:::o;40133:190::-;40258:4;40311;40282:25;40295:5;40302:4;40282:12;:25::i;:::-;:33;40275:40;;40133:190;;;;;:::o;5252:191::-;5326:16;5345:6;;;;;;;;;;;5326:25;;5371:8;5362:6;;:17;;;;;;;;;;;;;;;;;;5426:8;5395:40;;5416:8;5395:40;;;;;;;;;;;;5252:191;;:::o;29575:88::-;29649:6;29642:4;:13;;;;;;;;;;;;:::i;:::-;;29575:88;:::o;34462:331::-;34617:8;34608:17;;:5;:17;;;;34600:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;34720:8;34682:18;:25;34701:5;34682:25;;;;;;;;;;;;;;;:35;34708:8;34682:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;34766:8;34744:41;;34759:5;34744:41;;;34776:8;34744:41;;;;;;:::i;:::-;;;;;;;;34462:331;;;:::o;26253:974::-;26455:1;26441:16;;:2;:16;;;;26433:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;26512:16;26531:12;:10;:12::i;:::-;26512:31;;26554:20;26577:21;26595:2;26577:17;:21::i;:::-;26554:44;;26609:24;26636:25;26654:6;26636:17;:25::i;:::-;26609:52;;26674:60;26695:8;26705:4;26711:2;26715:3;26720:7;26729:4;26674:20;:60::i;:::-;26747:19;26769:9;:13;26779:2;26769:13;;;;;;;;;;;:19;26783:4;26769:19;;;;;;;;;;;;;;;;26747:41;;26822:6;26807:11;:21;;26799:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;26947:6;26933:11;:20;26911:9;:13;26921:2;26911:13;;;;;;;;;;;:19;26925:4;26911:19;;;;;;;;;;;;;;;:42;;;;26996:6;26975:9;:13;26985:2;26975:13;;;;;;;;;;;:17;26989:2;26975:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;27051:2;27020:46;;27045:4;27020:46;;27035:8;27020:46;;;27055:2;27059:6;27020:46;;;;;;;:::i;:::-;;;;;;;;27079:59;27099:8;27109:4;27115:2;27119:3;27124:7;27133:4;27079:19;:59::i;:::-;27151:68;27182:8;27192:4;27198:2;27202;27206:6;27214:4;27151:30;:68::i;:::-;26253:974;;;;;;;;;:::o;35751:221::-;;;;;;;:::o;36927:220::-;;;;;;;:::o;37907:813::-;38147:15;:2;:13;;;:15::i;:::-;38143:570;;;38200:2;38183:43;;;38227:8;38237:4;38243:3;38248:7;38257:4;38183:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38179:523;;;;:::i;:::-;;;;;;;;38575:6;38568:14;;;;;;;;;;;:::i;:::-;;;;;;;;38179:523;38624:62;;;;;;;;;;:::i;:::-;;;;;;;;38179:523;38356:48;;;38344:60;;;:8;:60;;;;38340:159;;38429:50;;;;;;;;;;:::i;:::-;;;;;;;;38340:159;38263:251;38143:570;37907:813;;;;;;:::o;38728:198::-;38794:16;38823:22;38862:1;38848:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38823:41;;38886:7;38875:5;38881:1;38875:8;;;;;;;;;;;;;;;;;;;;;:18;;;;;38913:5;38906:12;;;38728:198;;;:::o;37155:744::-;37370:15;:2;:13;;;:15::i;:::-;37366:526;;;37423:2;37406:38;;;37445:8;37455:4;37461:2;37465:6;37473:4;37406:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37402:479;;;;:::i;:::-;;;;;;;;37754:6;37747:14;;;;;;;;;;;:::i;:::-;;;;;;;;37402:479;37803:62;;;;;;;;;;:::i;:::-;;;;;;;;37402:479;37540:43;;;37528:55;;;:8;:55;;;;37524:154;;37608:50;;;;;;;;;;:::i;:::-;;;;;;;;37524:154;37479:214;37366:526;37155:744;;;;;;:::o;41000:296::-;41083:7;41103:20;41126:4;41103:27;;41146:9;41141:118;41165:5;:12;41161:1;:16;41141:118;;;41214:33;41224:12;41238:5;41244:1;41238:8;;;;;;;;;;;;;;;;;;;;;;41214:9;:33::i;:::-;41199:48;;41179:3;;;;;:::i;:::-;;;;41141:118;;;;41276:12;41269:19;;;41000:296;;;;:::o;14076:326::-;14136:4;14393:1;14371:7;:12;;;;;;;;;;;;;;;;;;;;;;;;;:19;:23;14364:30;;14076:326;;;:::o;47207:149::-;47270:7;47301:1;47297;:5;:51;;47328:20;47343:1;47346;47328:14;:20::i;:::-;47297:51;;;47305:20;47320:1;47323;47305:14;:20::i;:::-;47297:51;47290:58;;47207:149;;;;:::o;47364:268::-;47432:13;47539:1;47533:4;47526:15;47568:1;47562:4;47555:15;47609:4;47603;47593:21;47584:30;;47511:114;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:622:1:-;;145:80;160:64;217:6;160:64;:::i;:::-;145:80;:::i;:::-;136:89;;245:5;273:6;266:5;259:21;299:4;292:5;288:16;281:23;;324:6;374:3;366:4;358:6;354:17;349:3;345:27;342:36;339:2;;;391:1;388;381:12;339:2;419:1;404:236;429:6;426:1;423:13;404:236;;;496:3;524:37;557:3;545:10;524:37;:::i;:::-;519:3;512:50;591:4;586:3;582:14;575:21;;625:4;620:3;616:14;609:21;;464:176;451:1;448;444:9;439:14;;404:236;;;408:14;126:520;;;;;;;:::o;669:622::-;;790:80;805:64;862:6;805:64;:::i;:::-;790:80;:::i;:::-;781:89;;890:5;918:6;911:5;904:21;944:4;937:5;933:16;926:23;;969:6;1019:3;1011:4;1003:6;999:17;994:3;990:27;987:36;984:2;;;1036:1;1033;1026:12;984:2;1064:1;1049:236;1074:6;1071:1;1068:13;1049:236;;;1141:3;1169:37;1202:3;1190:10;1169:37;:::i;:::-;1164:3;1157:50;1236:4;1231:3;1227:14;1220:21;;1270:4;1265:3;1261:14;1254:21;;1109:176;1096:1;1093;1089:9;1084:14;;1049:236;;;1053:14;771:520;;;;;;;:::o;1297:342::-;;1399:64;1414:48;1455:6;1414:48;:::i;:::-;1399:64;:::i;:::-;1390:73;;1486:6;1479:5;1472:21;1524:4;1517:5;1513:16;1562:3;1553:6;1548:3;1544:16;1541:25;1538:2;;;1579:1;1576;1569:12;1538:2;1592:41;1626:6;1621:3;1616;1592:41;:::i;:::-;1380:259;;;;;;:::o;1645:344::-;;1748:65;1763:49;1805:6;1763:49;:::i;:::-;1748:65;:::i;:::-;1739:74;;1836:6;1829:5;1822:21;1874:4;1867:5;1863:16;1912:3;1903:6;1898:3;1894:16;1891:25;1888:2;;;1929:1;1926;1919:12;1888:2;1942:41;1976:6;1971:3;1966;1942:41;:::i;:::-;1729:260;;;;;;:::o;1995:139::-;;2079:6;2066:20;2057:29;;2095:33;2122:5;2095:33;:::i;:::-;2047:87;;;;:::o;2157:303::-;;2277:3;2270:4;2262:6;2258:17;2254:27;2244:2;;2295:1;2292;2285:12;2244:2;2335:6;2322:20;2360:94;2450:3;2442:6;2435:4;2427:6;2423:17;2360:94;:::i;:::-;2351:103;;2234:226;;;;;:::o;2483:367::-;;;2616:3;2609:4;2601:6;2597:17;2593:27;2583:2;;2634:1;2631;2624:12;2583:2;2670:6;2657:20;2647:30;;2700:18;2692:6;2689:30;2686:2;;;2732:1;2729;2722:12;2686:2;2769:4;2761:6;2757:17;2745:29;;2823:3;2815:4;2807:6;2803:17;2793:8;2789:32;2786:41;2783:2;;;2840:1;2837;2830:12;2783:2;2573:277;;;;;:::o;2873:303::-;;2993:3;2986:4;2978:6;2974:17;2970:27;2960:2;;3011:1;3008;3001:12;2960:2;3051:6;3038:20;3076:94;3166:3;3158:6;3151:4;3143:6;3139:17;3076:94;:::i;:::-;3067:103;;2950:226;;;;;:::o;3182:133::-;;3263:6;3250:20;3241:29;;3279:30;3303:5;3279:30;:::i;:::-;3231:84;;;;:::o;3321:139::-;;3405:6;3392:20;3383:29;;3421:33;3448:5;3421:33;:::i;:::-;3373:87;;;;:::o;3466:137::-;;3549:6;3536:20;3527:29;;3565:32;3591:5;3565:32;:::i;:::-;3517:86;;;;:::o;3609:141::-;;3696:6;3690:13;3681:22;;3712:32;3738:5;3712:32;:::i;:::-;3671:79;;;;:::o;3769:271::-;;3873:3;3866:4;3858:6;3854:17;3850:27;3840:2;;3891:1;3888;3881:12;3840:2;3931:6;3918:20;3956:78;4030:3;4022:6;4015:4;4007:6;4003:17;3956:78;:::i;:::-;3947:87;;3830:210;;;;;:::o;4060:273::-;;4165:3;4158:4;4150:6;4146:17;4142:27;4132:2;;4183:1;4180;4173:12;4132:2;4223:6;4210:20;4248:79;4323:3;4315:6;4308:4;4300:6;4296:17;4248:79;:::i;:::-;4239:88;;4122:211;;;;;:::o;4339:139::-;;4423:6;4410:20;4401:29;;4439:33;4466:5;4439:33;:::i;:::-;4391:87;;;;:::o;4484:143::-;;4572:6;4566:13;4557:22;;4588:33;4615:5;4588:33;:::i;:::-;4547:80;;;;:::o;4633:262::-;;4741:2;4729:9;4720:7;4716:23;4712:32;4709:2;;;4757:1;4754;4747:12;4709:2;4800:1;4825:53;4870:7;4861:6;4850:9;4846:22;4825:53;:::i;:::-;4815:63;;4771:117;4699:196;;;;:::o;4901:407::-;;;5026:2;5014:9;5005:7;5001:23;4997:32;4994:2;;;5042:1;5039;5032:12;4994:2;5085:1;5110:53;5155:7;5146:6;5135:9;5131:22;5110:53;:::i;:::-;5100:63;;5056:117;5212:2;5238:53;5283:7;5274:6;5263:9;5259:22;5238:53;:::i;:::-;5228:63;;5183:118;4984:324;;;;;:::o;5314:1241::-;;;;;;5549:3;5537:9;5528:7;5524:23;5520:33;5517:2;;;5566:1;5563;5556:12;5517:2;5609:1;5634:53;5679:7;5670:6;5659:9;5655:22;5634:53;:::i;:::-;5624:63;;5580:117;5736:2;5762:53;5807:7;5798:6;5787:9;5783:22;5762:53;:::i;:::-;5752:63;;5707:118;5892:2;5881:9;5877:18;5864:32;5923:18;5915:6;5912:30;5909:2;;;5955:1;5952;5945:12;5909:2;5983:78;6053:7;6044:6;6033:9;6029:22;5983:78;:::i;:::-;5973:88;;5835:236;6138:2;6127:9;6123:18;6110:32;6169:18;6161:6;6158:30;6155:2;;;6201:1;6198;6191:12;6155:2;6229:78;6299:7;6290:6;6279:9;6275:22;6229:78;:::i;:::-;6219:88;;6081:236;6384:3;6373:9;6369:19;6356:33;6416:18;6408:6;6405:30;6402:2;;;6448:1;6445;6438:12;6402:2;6476:62;6530:7;6521:6;6510:9;6506:22;6476:62;:::i;:::-;6466:72;;6327:221;5507:1048;;;;;;;;:::o;6561:955::-;;;;;;6746:3;6734:9;6725:7;6721:23;6717:33;6714:2;;;6763:1;6760;6753:12;6714:2;6806:1;6831:53;6876:7;6867:6;6856:9;6852:22;6831:53;:::i;:::-;6821:63;;6777:117;6933:2;6959:53;7004:7;6995:6;6984:9;6980:22;6959:53;:::i;:::-;6949:63;;6904:118;7061:2;7087:53;7132:7;7123:6;7112:9;7108:22;7087:53;:::i;:::-;7077:63;;7032:118;7189:2;7215:53;7260:7;7251:6;7240:9;7236:22;7215:53;:::i;:::-;7205:63;;7160:118;7345:3;7334:9;7330:19;7317:33;7377:18;7369:6;7366:30;7363:2;;;7409:1;7406;7399:12;7363:2;7437:62;7491:7;7482:6;7471:9;7467:22;7437:62;:::i;:::-;7427:72;;7288:221;6704:812;;;;;;;;:::o;7522:401::-;;;7644:2;7632:9;7623:7;7619:23;7615:32;7612:2;;;7660:1;7657;7650:12;7612:2;7703:1;7728:53;7773:7;7764:6;7753:9;7749:22;7728:53;:::i;:::-;7718:63;;7674:117;7830:2;7856:50;7898:7;7889:6;7878:9;7874:22;7856:50;:::i;:::-;7846:60;;7801:115;7602:321;;;;;:::o;7929:407::-;;;8054:2;8042:9;8033:7;8029:23;8025:32;8022:2;;;8070:1;8067;8060:12;8022:2;8113:1;8138:53;8183:7;8174:6;8163:9;8159:22;8138:53;:::i;:::-;8128:63;;8084:117;8240:2;8266:53;8311:7;8302:6;8291:9;8287:22;8266:53;:::i;:::-;8256:63;;8211:118;8012:324;;;;;:::o;8342:693::-;;;8517:2;8505:9;8496:7;8492:23;8488:32;8485:2;;;8533:1;8530;8523:12;8485:2;8604:1;8593:9;8589:17;8576:31;8634:18;8626:6;8623:30;8620:2;;;8666:1;8663;8656:12;8620:2;8694:78;8764:7;8755:6;8744:9;8740:22;8694:78;:::i;:::-;8684:88;;8547:235;8849:2;8838:9;8834:18;8821:32;8880:18;8872:6;8869:30;8866:2;;;8912:1;8909;8902:12;8866:2;8940:78;9010:7;9001:6;8990:9;8986:22;8940:78;:::i;:::-;8930:88;;8792:236;8475:560;;;;;:::o;9041:715::-;;;;;9218:2;9206:9;9197:7;9193:23;9189:32;9186:2;;;9234:1;9231;9224:12;9186:2;9305:1;9294:9;9290:17;9277:31;9335:18;9327:6;9324:30;9321:2;;;9367:1;9364;9357:12;9321:2;9403:80;9475:7;9466:6;9455:9;9451:22;9403:80;:::i;:::-;9385:98;;;;9248:245;9532:2;9558:53;9603:7;9594:6;9583:9;9579:22;9558:53;:::i;:::-;9548:63;;9503:118;9660:2;9686:53;9731:7;9722:6;9711:9;9707:22;9686:53;:::i;:::-;9676:63;;9631:118;9176:580;;;;;;;:::o;9762:260::-;;9869:2;9857:9;9848:7;9844:23;9840:32;9837:2;;;9885:1;9882;9875:12;9837:2;9928:1;9953:52;9997:7;9988:6;9977:9;9973:22;9953:52;:::i;:::-;9943:62;;9899:116;9827:195;;;;:::o;10028:282::-;;10146:2;10134:9;10125:7;10121:23;10117:32;10114:2;;;10162:1;10159;10152:12;10114:2;10205:1;10230:63;10285:7;10276:6;10265:9;10261:22;10230:63;:::i;:::-;10220:73;;10176:127;10104:206;;;;:::o;10316:375::-;;10434:2;10422:9;10413:7;10409:23;10405:32;10402:2;;;10450:1;10447;10440:12;10402:2;10521:1;10510:9;10506:17;10493:31;10551:18;10543:6;10540:30;10537:2;;;10583:1;10580;10573:12;10537:2;10611:63;10666:7;10657:6;10646:9;10642:22;10611:63;:::i;:::-;10601:73;;10464:220;10392:299;;;;:::o;10697:262::-;;10805:2;10793:9;10784:7;10780:23;10776:32;10773:2;;;10821:1;10818;10811:12;10773:2;10864:1;10889:53;10934:7;10925:6;10914:9;10910:22;10889:53;:::i;:::-;10879:63;;10835:117;10763:196;;;;:::o;10965:284::-;;11084:2;11072:9;11063:7;11059:23;11055:32;11052:2;;;11100:1;11097;11090:12;11052:2;11143:1;11168:64;11224:7;11215:6;11204:9;11200:22;11168:64;:::i;:::-;11158:74;;11114:128;11042:207;;;;:::o;11255:407::-;;;11380:2;11368:9;11359:7;11355:23;11351:32;11348:2;;;11396:1;11393;11386:12;11348:2;11439:1;11464:53;11509:7;11500:6;11489:9;11485:22;11464:53;:::i;:::-;11454:63;;11410:117;11566:2;11592:53;11637:7;11628:6;11617:9;11613:22;11592:53;:::i;:::-;11582:63;;11537:118;11338:324;;;;;:::o;11668:552::-;;;;11810:2;11798:9;11789:7;11785:23;11781:32;11778:2;;;11826:1;11823;11816:12;11778:2;11869:1;11894:53;11939:7;11930:6;11919:9;11915:22;11894:53;:::i;:::-;11884:63;;11840:117;11996:2;12022:53;12067:7;12058:6;12047:9;12043:22;12022:53;:::i;:::-;12012:63;;11967:118;12124:2;12150:53;12195:7;12186:6;12175:9;12171:22;12150:53;:::i;:::-;12140:63;;12095:118;11768:452;;;;;:::o;12226:407::-;;;12351:2;12339:9;12330:7;12326:23;12322:32;12319:2;;;12367:1;12364;12357:12;12319:2;12410:1;12435:53;12480:7;12471:6;12460:9;12456:22;12435:53;:::i;:::-;12425:63;;12381:117;12537:2;12563:53;12608:7;12599:6;12588:9;12584:22;12563:53;:::i;:::-;12553:63;;12508:118;12309:324;;;;;:::o;12639:407::-;;;12764:2;12752:9;12743:7;12739:23;12735:32;12732:2;;;12780:1;12777;12770:12;12732:2;12823:1;12848:53;12893:7;12884:6;12873:9;12869:22;12848:53;:::i;:::-;12838:63;;12794:117;12950:2;12976:53;13021:7;13012:6;13001:9;12997:22;12976:53;:::i;:::-;12966:63;;12921:118;12722:324;;;;;:::o;13052:698::-;;;;;13211:3;13199:9;13190:7;13186:23;13182:33;13179:2;;;13228:1;13225;13218:12;13179:2;13271:1;13296:53;13341:7;13332:6;13321:9;13317:22;13296:53;:::i;:::-;13286:63;;13242:117;13398:2;13424:53;13469:7;13460:6;13449:9;13445:22;13424:53;:::i;:::-;13414:63;;13369:118;13526:2;13552:53;13597:7;13588:6;13577:9;13573:22;13552:53;:::i;:::-;13542:63;;13497:118;13654:2;13680:53;13725:7;13716:6;13705:9;13701:22;13680:53;:::i;:::-;13670:63;;13625:118;13169:581;;;;;;;:::o;13756:1556::-;;;;;;;;;;;14008:3;13996:9;13987:7;13983:23;13979:33;13976:2;;;14025:1;14022;14015:12;13976:2;14068:1;14093:53;14138:7;14129:6;14118:9;14114:22;14093:53;:::i;:::-;14083:63;;14039:117;14195:2;14221:53;14266:7;14257:6;14246:9;14242:22;14221:53;:::i;:::-;14211:63;;14166:118;14323:2;14349:53;14394:7;14385:6;14374:9;14370:22;14349:53;:::i;:::-;14339:63;;14294:118;14451:2;14477:53;14522:7;14513:6;14502:9;14498:22;14477:53;:::i;:::-;14467:63;;14422:118;14579:3;14606:53;14651:7;14642:6;14631:9;14627:22;14606:53;:::i;:::-;14596:63;;14550:119;14708:3;14735:50;14777:7;14768:6;14757:9;14753:22;14735:50;:::i;:::-;14725:60;;14679:116;14834:3;14861:50;14903:7;14894:6;14883:9;14879:22;14861:50;:::i;:::-;14851:60;;14805:116;14960:3;14987:50;15029:7;15020:6;15009:9;15005:22;14987:50;:::i;:::-;14977:60;;14931:116;15086:3;15113:53;15158:7;15149:6;15138:9;15134:22;15113:53;:::i;:::-;15103:63;;15057:119;15215:3;15242:53;15287:7;15278:6;15267:9;15263:22;15242:53;:::i;:::-;15232:63;;15186:119;13966:1346;;;;;;;;;;;;;:::o;15318:179::-;;15408:46;15450:3;15442:6;15408:46;:::i;:::-;15486:4;15481:3;15477:14;15463:28;;15398:99;;;;:::o;15503:118::-;15590:24;15608:5;15590:24;:::i;:::-;15585:3;15578:37;15568:53;;:::o;15627:157::-;15732:45;15752:24;15770:5;15752:24;:::i;:::-;15732:45;:::i;:::-;15727:3;15720:58;15710:74;;:::o;15820:732::-;;15968:54;16016:5;15968:54;:::i;:::-;16038:86;16117:6;16112:3;16038:86;:::i;:::-;16031:93;;16148:56;16198:5;16148:56;:::i;:::-;16227:7;16258:1;16243:284;16268:6;16265:1;16262:13;16243:284;;;16344:6;16338:13;16371:63;16430:3;16415:13;16371:63;:::i;:::-;16364:70;;16457:60;16510:6;16457:60;:::i;:::-;16447:70;;16303:224;16290:1;16287;16283:9;16278:14;;16243:284;;;16247:14;16543:3;16536:10;;15944:608;;;;;;;:::o;16558:109::-;16639:21;16654:5;16639:21;:::i;:::-;16634:3;16627:34;16617:50;;:::o;16673:118::-;16760:24;16778:5;16760:24;:::i;:::-;16755:3;16748:37;16738:53;;:::o;16797:360::-;;16911:38;16943:5;16911:38;:::i;:::-;16965:70;17028:6;17023:3;16965:70;:::i;:::-;16958:77;;17044:52;17089:6;17084:3;17077:4;17070:5;17066:16;17044:52;:::i;:::-;17121:29;17143:6;17121:29;:::i;:::-;17116:3;17112:39;17105:46;;16887:270;;;;;:::o;17163:364::-;;17279:39;17312:5;17279:39;:::i;:::-;17334:71;17398:6;17393:3;17334:71;:::i;:::-;17327:78;;17414:52;17459:6;17454:3;17447:4;17440:5;17436:16;17414:52;:::i;:::-;17491:29;17513:6;17491:29;:::i;:::-;17486:3;17482:39;17475:46;;17255:272;;;;;:::o;17533:377::-;;17667:39;17700:5;17667:39;:::i;:::-;17722:89;17804:6;17799:3;17722:89;:::i;:::-;17715:96;;17820:52;17865:6;17860:3;17853:4;17846:5;17842:16;17820:52;:::i;:::-;17897:6;17892:3;17888:16;17881:23;;17643:267;;;;;:::o;17916:384::-;;18079:67;18143:2;18138:3;18079:67;:::i;:::-;18072:74;;18176:34;18172:1;18167:3;18163:11;18156:55;18242:22;18237:2;18232:3;18228:12;18221:44;18291:2;18286:3;18282:12;18275:19;;18062:238;;;:::o;18306:320::-;;18469:67;18533:2;18528:3;18469:67;:::i;:::-;18462:74;;18566:24;18562:1;18557:3;18553:11;18546:45;18617:2;18612:3;18608:12;18601:19;;18452:174;;;:::o;18632:379::-;;18795:67;18859:2;18854:3;18795:67;:::i;:::-;18788:74;;18892:34;18888:1;18883:3;18879:11;18872:55;18958:17;18953:2;18948:3;18944:12;18937:39;19002:2;18997:3;18993:12;18986:19;;18778:233;;;:::o;19017:372::-;;19180:67;19244:2;19239:3;19180:67;:::i;:::-;19173:74;;19277:34;19273:1;19268:3;19264:11;19257:55;19343:10;19338:2;19333:3;19329:12;19322:32;19380:2;19375:3;19371:12;19364:19;;19163:226;;;:::o;19395:370::-;;19558:67;19622:2;19617:3;19558:67;:::i;:::-;19551:74;;19655:34;19651:1;19646:3;19642:11;19635:55;19721:8;19716:2;19711:3;19707:12;19700:30;19756:2;19751:3;19747:12;19740:19;;19541:224;;;:::o;19771:374::-;;19934:67;19998:2;19993:3;19934:67;:::i;:::-;19927:74;;20031:34;20027:1;20022:3;20018:11;20011:55;20097:12;20092:2;20087:3;20083:12;20076:34;20136:2;20131:3;20127:12;20120:19;;19917:228;;;:::o;20151:319::-;;20314:67;20378:2;20373:3;20314:67;:::i;:::-;20307:74;;20411:23;20407:1;20402:3;20398:11;20391:44;20461:2;20456:3;20452:12;20445:19;;20297:173;;;:::o;20476:382::-;;20639:67;20703:2;20698:3;20639:67;:::i;:::-;20632:74;;20736:34;20732:1;20727:3;20723:11;20716:55;20802:20;20797:2;20792:3;20788:12;20781:42;20849:2;20844:3;20840:12;20833:19;;20622:236;;;:::o;20864:369::-;;21027:67;21091:2;21086:3;21027:67;:::i;:::-;21020:74;;21124:34;21120:1;21115:3;21111:11;21104:55;21190:7;21185:2;21180:3;21176:12;21169:29;21224:2;21219:3;21215:12;21208:19;;21010:223;;;:::o;21239:329::-;;21402:67;21466:2;21461:3;21402:67;:::i;:::-;21395:74;;21499:33;21495:1;21490:3;21486:11;21479:54;21559:2;21554:3;21550:12;21543:19;;21385:183;;;:::o;21574:381::-;;21737:67;21801:2;21796:3;21737:67;:::i;:::-;21730:74;;21834:34;21830:1;21825:3;21821:11;21814:55;21900:19;21895:2;21890:3;21886:12;21879:41;21946:2;21941:3;21937:12;21930:19;;21720:235;;;:::o;21961:374::-;;22124:67;22188:2;22183:3;22124:67;:::i;:::-;22117:74;;22221:34;22217:1;22212:3;22208:11;22201:55;22287:12;22282:2;22277:3;22273:12;22266:34;22326:2;22321:3;22317:12;22310:19;;22107:228;;;:::o;22341:374::-;;22504:67;22568:2;22563:3;22504:67;:::i;:::-;22497:74;;22601:34;22597:1;22592:3;22588:11;22581:55;22667:12;22662:2;22657:3;22653:12;22646:34;22706:2;22701:3;22697:12;22690:19;;22487:228;;;:::o;22721:330::-;;22884:67;22948:2;22943:3;22884:67;:::i;:::-;22877:74;;22981:34;22977:1;22972:3;22968:11;22961:55;23042:2;23037:3;23033:12;23026:19;;22867:184;;;:::o;23057:316::-;;23220:67;23284:2;23279:3;23220:67;:::i;:::-;23213:74;;23317:20;23313:1;23308:3;23304:11;23297:41;23364:2;23359:3;23355:12;23348:19;;23203:170;;;:::o;23379:324::-;;23542:67;23606:2;23601:3;23542:67;:::i;:::-;23535:74;;23639:28;23635:1;23630:3;23626:11;23619:49;23694:2;23689:3;23685:12;23678:19;;23525:178;;;:::o;23709:378::-;;23872:67;23936:2;23931:3;23872:67;:::i;:::-;23865:74;;23969:34;23965:1;23960:3;23956:11;23949:55;24035:16;24030:2;24025:3;24021:12;24014:38;24078:2;24073:3;24069:12;24062:19;;23855:232;;;:::o;24093:327::-;;24256:67;24320:2;24315:3;24256:67;:::i;:::-;24249:74;;24353:31;24349:1;24344:3;24340:11;24333:52;24411:2;24406:3;24402:12;24395:19;;24239:181;;;:::o;24426:323::-;;24589:67;24653:2;24648:3;24589:67;:::i;:::-;24582:74;;24686:27;24682:1;24677:3;24673:11;24666:48;24740:2;24735:3;24731:12;24724:19;;24572:177;;;:::o;24755:317::-;;24918:67;24982:2;24977:3;24918:67;:::i;:::-;24911:74;;25015:21;25011:1;25006:3;25002:11;24995:42;25063:2;25058:3;25054:12;25047:19;;24901:171;;;:::o;25078:311::-;;25241:67;25305:2;25300:3;25241:67;:::i;:::-;25234:74;;25338:15;25334:1;25329:3;25325:11;25318:36;25380:2;25375:3;25371:12;25364:19;;25224:165;;;:::o;25395:372::-;;25558:67;25622:2;25617:3;25558:67;:::i;:::-;25551:74;;25655:34;25651:1;25646:3;25642:11;25635:55;25721:10;25716:2;25711:3;25707:12;25700:32;25758:2;25753:3;25749:12;25742:19;;25541:226;;;:::o;25773:373::-;;25936:67;26000:2;25995:3;25936:67;:::i;:::-;25929:74;;26033:34;26029:1;26024:3;26020:11;26013:55;26099:11;26094:2;26089:3;26085:12;26078:33;26137:2;26132:3;26128:12;26121:19;;25919:227;;;:::o;26152:368::-;;26315:67;26379:2;26374:3;26315:67;:::i;:::-;26308:74;;26412:34;26408:1;26403:3;26399:11;26392:55;26478:6;26473:2;26468:3;26464:12;26457:28;26511:2;26506:3;26502:12;26495:19;;26298:222;;;:::o;26526:373::-;;26689:67;26753:2;26748:3;26689:67;:::i;:::-;26682:74;;26786:34;26782:1;26777:3;26773:11;26766:55;26852:11;26847:2;26842:3;26838:12;26831:33;26890:2;26885:3;26881:12;26874:19;;26672:227;;;:::o;26905:372::-;;27068:67;27132:2;27127:3;27068:67;:::i;:::-;27061:74;;27165:34;27161:1;27156:3;27152:11;27145:55;27231:10;27226:2;27221:3;27217:12;27210:32;27268:2;27263:3;27259:12;27252:19;;27051:226;;;:::o;27283:365::-;;27446:67;27510:2;27505:3;27446:67;:::i;:::-;27439:74;;27543:34;27539:1;27534:3;27530:11;27523:55;27609:3;27604:2;27599:3;27595:12;27588:25;27639:2;27634:3;27630:12;27623:19;;27429:219;;;:::o;27654:382::-;;27817:67;27881:2;27876:3;27817:67;:::i;:::-;27810:74;;27914:34;27910:1;27905:3;27901:11;27894:55;27980:20;27975:2;27970:3;27966:12;27959:42;28027:2;28022:3;28018:12;28011:19;;27800:236;;;:::o;28042:108::-;28119:24;28137:5;28119:24;:::i;:::-;28114:3;28107:37;28097:53;;:::o;28156:118::-;28243:24;28261:5;28243:24;:::i;:::-;28238:3;28231:37;28221:53;;:::o;28280:256::-;;28407:75;28478:3;28469:6;28407:75;:::i;:::-;28507:2;28502:3;28498:12;28491:19;;28527:3;28520:10;;28396:140;;;;:::o;28542:435::-;;28744:95;28835:3;28826:6;28744:95;:::i;:::-;28737:102;;28856:95;28947:3;28938:6;28856:95;:::i;:::-;28849:102;;28968:3;28961:10;;28726:251;;;;;:::o;28983:222::-;;29114:2;29103:9;29099:18;29091:26;;29127:71;29195:1;29184:9;29180:17;29171:6;29127:71;:::i;:::-;29081:124;;;;:::o;29211:1053::-;;29572:3;29561:9;29557:19;29549:27;;29586:71;29654:1;29643:9;29639:17;29630:6;29586:71;:::i;:::-;29667:72;29735:2;29724:9;29720:18;29711:6;29667:72;:::i;:::-;29786:9;29780:4;29776:20;29771:2;29760:9;29756:18;29749:48;29814:108;29917:4;29908:6;29814:108;:::i;:::-;29806:116;;29969:9;29963:4;29959:20;29954:2;29943:9;29939:18;29932:48;29997:108;30100:4;30091:6;29997:108;:::i;:::-;29989:116;;30153:9;30147:4;30143:20;30137:3;30126:9;30122:19;30115:49;30181:76;30252:4;30243:6;30181:76;:::i;:::-;30173:84;;29539:725;;;;;;;;:::o;30270:751::-;;30531:3;30520:9;30516:19;30508:27;;30545:71;30613:1;30602:9;30598:17;30589:6;30545:71;:::i;:::-;30626:72;30694:2;30683:9;30679:18;30670:6;30626:72;:::i;:::-;30708;30776:2;30765:9;30761:18;30752:6;30708:72;:::i;:::-;30790;30858:2;30847:9;30843:18;30834:6;30790:72;:::i;:::-;30910:9;30904:4;30900:20;30894:3;30883:9;30879:19;30872:49;30938:76;31009:4;31000:6;30938:76;:::i;:::-;30930:84;;30498:523;;;;;;;;:::o;31027:373::-;;31208:2;31197:9;31193:18;31185:26;;31257:9;31251:4;31247:20;31243:1;31232:9;31228:17;31221:47;31285:108;31388:4;31379:6;31285:108;:::i;:::-;31277:116;;31175:225;;;;:::o;31406:634::-;;31665:2;31654:9;31650:18;31642:26;;31714:9;31708:4;31704:20;31700:1;31689:9;31685:17;31678:47;31742:108;31845:4;31836:6;31742:108;:::i;:::-;31734:116;;31897:9;31891:4;31887:20;31882:2;31871:9;31867:18;31860:48;31925:108;32028:4;32019:6;31925:108;:::i;:::-;31917:116;;31632:408;;;;;:::o;32046:210::-;;32171:2;32160:9;32156:18;32148:26;;32184:65;32246:1;32235:9;32231:17;32222:6;32184:65;:::i;:::-;32138:118;;;;:::o;32262:313::-;;32413:2;32402:9;32398:18;32390:26;;32462:9;32456:4;32452:20;32448:1;32437:9;32433:17;32426:47;32490:78;32563:4;32554:6;32490:78;:::i;:::-;32482:86;;32380:195;;;;:::o;32581:419::-;;32785:2;32774:9;32770:18;32762:26;;32834:9;32828:4;32824:20;32820:1;32809:9;32805:17;32798:47;32862:131;32988:4;32862:131;:::i;:::-;32854:139;;32752:248;;;:::o;33006:419::-;;33210:2;33199:9;33195:18;33187:26;;33259:9;33253:4;33249:20;33245:1;33234:9;33230:17;33223:47;33287:131;33413:4;33287:131;:::i;:::-;33279:139;;33177:248;;;:::o;33431:419::-;;33635:2;33624:9;33620:18;33612:26;;33684:9;33678:4;33674:20;33670:1;33659:9;33655:17;33648:47;33712:131;33838:4;33712:131;:::i;:::-;33704:139;;33602:248;;;:::o;33856:419::-;;34060:2;34049:9;34045:18;34037:26;;34109:9;34103:4;34099:20;34095:1;34084:9;34080:17;34073:47;34137:131;34263:4;34137:131;:::i;:::-;34129:139;;34027:248;;;:::o;34281:419::-;;34485:2;34474:9;34470:18;34462:26;;34534:9;34528:4;34524:20;34520:1;34509:9;34505:17;34498:47;34562:131;34688:4;34562:131;:::i;:::-;34554:139;;34452:248;;;:::o;34706:419::-;;34910:2;34899:9;34895:18;34887:26;;34959:9;34953:4;34949:20;34945:1;34934:9;34930:17;34923:47;34987:131;35113:4;34987:131;:::i;:::-;34979:139;;34877:248;;;:::o;35131:419::-;;35335:2;35324:9;35320:18;35312:26;;35384:9;35378:4;35374:20;35370:1;35359:9;35355:17;35348:47;35412:131;35538:4;35412:131;:::i;:::-;35404:139;;35302:248;;;:::o;35556:419::-;;35760:2;35749:9;35745:18;35737:26;;35809:9;35803:4;35799:20;35795:1;35784:9;35780:17;35773:47;35837:131;35963:4;35837:131;:::i;:::-;35829:139;;35727:248;;;:::o;35981:419::-;;36185:2;36174:9;36170:18;36162:26;;36234:9;36228:4;36224:20;36220:1;36209:9;36205:17;36198:47;36262:131;36388:4;36262:131;:::i;:::-;36254:139;;36152:248;;;:::o;36406:419::-;;36610:2;36599:9;36595:18;36587:26;;36659:9;36653:4;36649:20;36645:1;36634:9;36630:17;36623:47;36687:131;36813:4;36687:131;:::i;:::-;36679:139;;36577:248;;;:::o;36831:419::-;;37035:2;37024:9;37020:18;37012:26;;37084:9;37078:4;37074:20;37070:1;37059:9;37055:17;37048:47;37112:131;37238:4;37112:131;:::i;:::-;37104:139;;37002:248;;;:::o;37256:419::-;;37460:2;37449:9;37445:18;37437:26;;37509:9;37503:4;37499:20;37495:1;37484:9;37480:17;37473:47;37537:131;37663:4;37537:131;:::i;:::-;37529:139;;37427:248;;;:::o;37681:419::-;;37885:2;37874:9;37870:18;37862:26;;37934:9;37928:4;37924:20;37920:1;37909:9;37905:17;37898:47;37962:131;38088:4;37962:131;:::i;:::-;37954:139;;37852:248;;;:::o;38106:419::-;;38310:2;38299:9;38295:18;38287:26;;38359:9;38353:4;38349:20;38345:1;38334:9;38330:17;38323:47;38387:131;38513:4;38387:131;:::i;:::-;38379:139;;38277:248;;;:::o;38531:419::-;;38735:2;38724:9;38720:18;38712:26;;38784:9;38778:4;38774:20;38770:1;38759:9;38755:17;38748:47;38812:131;38938:4;38812:131;:::i;:::-;38804:139;;38702:248;;;:::o;38956:419::-;;39160:2;39149:9;39145:18;39137:26;;39209:9;39203:4;39199:20;39195:1;39184:9;39180:17;39173:47;39237:131;39363:4;39237:131;:::i;:::-;39229:139;;39127:248;;;:::o;39381:419::-;;39585:2;39574:9;39570:18;39562:26;;39634:9;39628:4;39624:20;39620:1;39609:9;39605:17;39598:47;39662:131;39788:4;39662:131;:::i;:::-;39654:139;;39552:248;;;:::o;39806:419::-;;40010:2;39999:9;39995:18;39987:26;;40059:9;40053:4;40049:20;40045:1;40034:9;40030:17;40023:47;40087:131;40213:4;40087:131;:::i;:::-;40079:139;;39977:248;;;:::o;40231:419::-;;40435:2;40424:9;40420:18;40412:26;;40484:9;40478:4;40474:20;40470:1;40459:9;40455:17;40448:47;40512:131;40638:4;40512:131;:::i;:::-;40504:139;;40402:248;;;:::o;40656:419::-;;40860:2;40849:9;40845:18;40837:26;;40909:9;40903:4;40899:20;40895:1;40884:9;40880:17;40873:47;40937:131;41063:4;40937:131;:::i;:::-;40929:139;;40827:248;;;:::o;41081:419::-;;41285:2;41274:9;41270:18;41262:26;;41334:9;41328:4;41324:20;41320:1;41309:9;41305:17;41298:47;41362:131;41488:4;41362:131;:::i;:::-;41354:139;;41252:248;;;:::o;41506:419::-;;41710:2;41699:9;41695:18;41687:26;;41759:9;41753:4;41749:20;41745:1;41734:9;41730:17;41723:47;41787:131;41913:4;41787:131;:::i;:::-;41779:139;;41677:248;;;:::o;41931:419::-;;42135:2;42124:9;42120:18;42112:26;;42184:9;42178:4;42174:20;42170:1;42159:9;42155:17;42148:47;42212:131;42338:4;42212:131;:::i;:::-;42204:139;;42102:248;;;:::o;42356:419::-;;42560:2;42549:9;42545:18;42537:26;;42609:9;42603:4;42599:20;42595:1;42584:9;42580:17;42573:47;42637:131;42763:4;42637:131;:::i;:::-;42629:139;;42527:248;;;:::o;42781:419::-;;42985:2;42974:9;42970:18;42962:26;;43034:9;43028:4;43024:20;43020:1;43009:9;43005:17;42998:47;43062:131;43188:4;43062:131;:::i;:::-;43054:139;;42952:248;;;:::o;43206:419::-;;43410:2;43399:9;43395:18;43387:26;;43459:9;43453:4;43449:20;43445:1;43434:9;43430:17;43423:47;43487:131;43613:4;43487:131;:::i;:::-;43479:139;;43377:248;;;:::o;43631:419::-;;43835:2;43824:9;43820:18;43812:26;;43884:9;43878:4;43874:20;43870:1;43859:9;43855:17;43848:47;43912:131;44038:4;43912:131;:::i;:::-;43904:139;;43802:248;;;:::o;44056:419::-;;44260:2;44249:9;44245:18;44237:26;;44309:9;44303:4;44299:20;44295:1;44284:9;44280:17;44273:47;44337:131;44463:4;44337:131;:::i;:::-;44329:139;;44227:248;;;:::o;44481:222::-;;44612:2;44601:9;44597:18;44589:26;;44625:71;44693:1;44682:9;44678:17;44669:6;44625:71;:::i;:::-;44579:124;;;;:::o;44709:332::-;;44868:2;44857:9;44853:18;44845:26;;44881:71;44949:1;44938:9;44934:17;44925:6;44881:71;:::i;:::-;44962:72;45030:2;45019:9;45015:18;45006:6;44962:72;:::i;:::-;44835:206;;;;;:::o;45047:1409::-;;45470:3;45459:9;45455:19;45447:27;;45484:71;45552:1;45541:9;45537:17;45528:6;45484:71;:::i;:::-;45565:72;45633:2;45622:9;45618:18;45609:6;45565:72;:::i;:::-;45647;45715:2;45704:9;45700:18;45691:6;45647:72;:::i;:::-;45729;45797:2;45786:9;45782:18;45773:6;45729:72;:::i;:::-;45811:73;45879:3;45868:9;45864:19;45855:6;45811:73;:::i;:::-;45894:67;45956:3;45945:9;45941:19;45932:6;45894:67;:::i;:::-;45971;46033:3;46022:9;46018:19;46009:6;45971:67;:::i;:::-;46048;46110:3;46099:9;46095:19;46086:6;46048:67;:::i;:::-;46125:73;46193:3;46182:9;46178:19;46169:6;46125:73;:::i;:::-;46208;46276:3;46265:9;46261:19;46252:6;46208:73;:::i;:::-;46291:74;46360:3;46349:9;46345:19;46335:7;46291:74;:::i;:::-;46375;46444:3;46433:9;46429:19;46419:7;46375:74;:::i;:::-;45437:1019;;;;;;;;;;;;;;;:::o;46462:283::-;;46528:2;46522:9;46512:19;;46570:4;46562:6;46558:17;46677:6;46665:10;46662:22;46641:18;46629:10;46626:34;46623:62;46620:2;;;46688:18;;:::i;:::-;46620:2;46728:10;46724:2;46717:22;46502:243;;;;:::o;46751:311::-;;46918:18;46910:6;46907:30;46904:2;;;46940:18;;:::i;:::-;46904:2;46990:4;46982:6;46978:17;46970:25;;47050:4;47044;47040:15;47032:23;;46833:229;;;:::o;47068:311::-;;47235:18;47227:6;47224:30;47221:2;;;47257:18;;:::i;:::-;47221:2;47307:4;47299:6;47295:17;47287:25;;47367:4;47361;47357:15;47349:23;;47150:229;;;:::o;47385:331::-;;47536:18;47528:6;47525:30;47522:2;;;47558:18;;:::i;:::-;47522:2;47643:4;47639:9;47632:4;47624:6;47620:17;47616:33;47608:41;;47704:4;47698;47694:15;47686:23;;47451:265;;;:::o;47722:332::-;;47874:18;47866:6;47863:30;47860:2;;;47896:18;;:::i;:::-;47860:2;47981:4;47977:9;47970:4;47962:6;47958:17;47954:33;47946:41;;48042:4;48036;48032:15;48024:23;;47789:265;;;:::o;48060:132::-;;48150:3;48142:11;;48180:4;48175:3;48171:14;48163:22;;48132:60;;;:::o;48198:114::-;;48299:5;48293:12;48283:22;;48272:40;;;:::o;48318:98::-;;48403:5;48397:12;48387:22;;48376:40;;;:::o;48422:99::-;;48508:5;48502:12;48492:22;;48481:40;;;:::o;48527:113::-;;48629:4;48624:3;48620:14;48612:22;;48602:38;;;:::o;48646:184::-;;48779:6;48774:3;48767:19;48819:4;48814:3;48810:14;48795:29;;48757:73;;;;:::o;48836:168::-;;48953:6;48948:3;48941:19;48993:4;48988:3;48984:14;48969:29;;48931:73;;;;:::o;49010:169::-;;49128:6;49123:3;49116:19;49168:4;49163:3;49159:14;49144:29;;49106:73;;;;:::o;49185:148::-;;49324:3;49309:18;;49299:34;;;;:::o;49339:305::-;;49398:20;49416:1;49398:20;:::i;:::-;49393:25;;49432:20;49450:1;49432:20;:::i;:::-;49427:25;;49586:1;49518:66;49514:74;49511:1;49508:81;49505:2;;;49592:18;;:::i;:::-;49505:2;49636:1;49633;49629:9;49622:16;;49383:261;;;;:::o;49650:185::-;;49707:20;49725:1;49707:20;:::i;:::-;49702:25;;49741:20;49759:1;49741:20;:::i;:::-;49736:25;;49780:1;49770:2;;49785:18;;:::i;:::-;49770:2;49827:1;49824;49820:9;49815:14;;49692:143;;;;:::o;49841:348::-;;49904:20;49922:1;49904:20;:::i;:::-;49899:25;;49938:20;49956:1;49938:20;:::i;:::-;49933:25;;50126:1;50058:66;50054:74;50051:1;50048:81;50043:1;50036:9;50029:17;50025:105;50022:2;;;50133:18;;:::i;:::-;50022:2;50181:1;50178;50174:9;50163:20;;49889:300;;;;:::o;50195:191::-;;50255:20;50273:1;50255:20;:::i;:::-;50250:25;;50289:20;50307:1;50289:20;:::i;:::-;50284:25;;50328:1;50325;50322:8;50319:2;;;50333:18;;:::i;:::-;50319:2;50378:1;50375;50371:9;50363:17;;50240:146;;;;:::o;50392:96::-;;50458:24;50476:5;50458:24;:::i;:::-;50447:35;;50437:51;;;:::o;50494:90::-;;50571:5;50564:13;50557:21;50546:32;;50536:48;;;:::o;50590:77::-;;50656:5;50645:16;;50635:32;;;:::o;50673:149::-;;50749:66;50742:5;50738:78;50727:89;;50717:105;;;:::o;50828:126::-;;50905:42;50898:5;50894:54;50883:65;;50873:81;;;:::o;50960:77::-;;51026:5;51015:16;;51005:32;;;:::o;51043:154::-;51127:6;51122:3;51117;51104:30;51189:1;51180:6;51175:3;51171:16;51164:27;51094:103;;;:::o;51203:307::-;51271:1;51281:113;51295:6;51292:1;51289:13;51281:113;;;51380:1;51375:3;51371:11;51365:18;51361:1;51356:3;51352:11;51345:39;51317:2;51314:1;51310:10;51305:15;;51281:113;;;51412:6;51409:1;51406:13;51403:2;;;51492:1;51483:6;51478:3;51474:16;51467:27;51403:2;51252:258;;;;:::o;51516:320::-;;51597:1;51591:4;51587:12;51577:22;;51644:1;51638:4;51634:12;51665:18;51655:2;;51721:4;51713:6;51709:17;51699:27;;51655:2;51783;51775:6;51772:14;51752:18;51749:38;51746:2;;;51802:18;;:::i;:::-;51746:2;51567:269;;;;:::o;51842:233::-;;51904:24;51922:5;51904:24;:::i;:::-;51895:33;;51950:66;51943:5;51940:77;51937:2;;;52020:18;;:::i;:::-;51937:2;52067:1;52060:5;52056:13;52049:20;;51885:190;;;:::o;52081:100::-;;52149:26;52169:5;52149:26;:::i;:::-;52138:37;;52128:53;;;:::o;52187:94::-;;52255:20;52269:5;52255:20;:::i;:::-;52244:31;;52234:47;;;:::o;52287:176::-;;52336:20;52354:1;52336:20;:::i;:::-;52331:25;;52370:20;52388:1;52370:20;:::i;:::-;52365:25;;52409:1;52399:2;;52414:18;;:::i;:::-;52399:2;52455:1;52452;52448:9;52443:14;;52321:142;;;;:::o;52469:180::-;52517:77;52514:1;52507:88;52614:4;52611:1;52604:15;52638:4;52635:1;52628:15;52655:180;52703:77;52700:1;52693:88;52800:4;52797:1;52790:15;52824:4;52821:1;52814:15;52841:180;52889:77;52886:1;52879:88;52986:4;52983:1;52976:15;53010:4;53007:1;53000:15;53027:180;53075:77;53072:1;53065:88;53172:4;53169:1;53162:15;53196:4;53193:1;53186:15;53213:102;;53305:2;53301:7;53296:2;53289:5;53285:14;53281:28;53271:38;;53261:54;;;:::o;53321:94::-;;53402:5;53398:2;53394:14;53373:35;;53363:52;;;:::o;53421:106::-;;53514:5;53509:3;53505:15;53484:36;;53474:53;;;:::o;53533:833::-;;53610:4;53592:16;53589:26;53586:2;;;53618:5;;53586:2;53656:1;53653;53650;53635:23;53678:34;53709:1;53703:8;53678:34;:::i;:::-;53739:10;53734:3;53731:19;53721:2;;53754:5;;;53721:2;53789;53783:9;53847:1;53829:16;53825:24;53822:1;53816:4;53801:49;53880:4;53874:11;53979:16;53972:4;53964:6;53960:17;53957:39;53924:18;53916:6;53913:30;53897:113;53894:2;;;54025:5;;;;;53894:2;54071:6;54065:4;54061:17;54107:3;54101:10;54134:18;54126:6;54123:30;54120:2;;;54156:5;;;;;;;54120:2;54204:6;54197:4;54192:3;54188:14;54184:27;54241:16;54235:4;54231:27;54226:3;54223:36;54220:2;;;54262:5;;;;;;;;54220:2;54310:29;54332:6;54310:29;:::i;:::-;54303:4;54298:3;54294:14;54290:50;54286:2;54279:62;54357:3;54350:10;;53576:790;;;;;;;;:::o;54372:122::-;54445:24;54463:5;54445:24;:::i;:::-;54438:5;54435:35;54425:2;;54484:1;54481;54474:12;54425:2;54415:79;:::o;54500:116::-;54570:21;54585:5;54570:21;:::i;:::-;54563:5;54560:32;54550:2;;54606:1;54603;54596:12;54550:2;54540:76;:::o;54622:122::-;54695:24;54713:5;54695:24;:::i;:::-;54688:5;54685:35;54675:2;;54734:1;54731;54724:12;54675:2;54665:79;:::o;54750:120::-;54822:23;54839:5;54822:23;:::i;:::-;54815:5;54812:34;54802:2;;54860:1;54857;54850:12;54802:2;54792:78;:::o;54876:122::-;54949:24;54967:5;54949:24;:::i;:::-;54942:5;54939:35;54929:2;;54988:1;54985;54978:12;54929:2;54919:79;:::o

Swarm Source

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