Token Immutable World of Wallet Monsters

Overview CRC1155

Total Supply:
0 WMON

Holders:
4 addresses

Transfers:
-

Loading
[ Download CSV Export  ] 
Loading
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
WalletMonsters

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 1 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: contracts/walletmonsters.sol

/**
 *Submitted for verification at polygonscan.com on 2022-03-12
*/

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Address.sol


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol


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

pragma solidity ^0.8.0;


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

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

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC1155/ERC1155.sol


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

pragma solidity ^0.8.0;







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

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

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

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

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

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

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

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

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

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

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

        return batchBalances;
    }

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

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

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

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

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

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

        return array;
    }
}

// File: contracts/Official WM/walletmonsters_v3.sol


pragma solidity ^0.8.7;





//Created By The Suns Of DeFi | S.O.D
contract WalletMonsters is ERC1155, Ownable, IERC1155Receiver{
    
    //state variable
    uint256 nextId = 0;
    uint256 eightHours = 28800; 
    uint256 escrowedAmountTotal = 0;
    uint public faucetPrice;
    address reserves;
    address escrowedValut; 
    address payable public FULLSTACKCALI;
    uint256 amountBurned = 0;
    
    string public name;
    string public symbol;
 
    //Mappings
    mapping(uint256 => Enjimon) private _tokenDetails; 
    mapping(address => uint) balance;
    mapping(uint256 => uint256) public enjimonTVL;
    mapping(address => mapping(uint => uint)) public _hold; 
    
    mapping(address => mapping(uint256 => bool))activeItems; 

    mapping(address => bool) public tokenApproved;
 
    //Dapp Events
    event bornDate(address from, string name, uint256 enjimonID, uint256 date);
    event tokenSupplyMinted(address from, uint256 tokenID, uint256 amount, uint256 date);
    event artifactMinted(address from, uint256 tokenID, uint256 amount, uint256 date);
    event tokenSupplyBurned(address from, uint256 tokenID, uint256 amount, uint256 date);
    event itemBurned(address from, uint256 tokenID, uint256 amount, uint256 date);
    event enjimonSlayed(address from, uint256 tokenID, string name,uint256 TVL ,uint256 date);
    event enjimonFed(address from, uint256 enjimonID, string name, uint256 lastFed );
    event enjimonTrained(address from, uint256 enjimonID, string name, uint lastTrainded);
    event transferEnjimon(address from, address to, uint256 tokenId, string name);
    event transferItem(address from, address to, uint256 tokenId);
    event burnedCount(uint256 tokenID, uint256 amount, uint256 date);
    
    //Marketplace events
    event itemAdded(uint256 id, uint256 tokenId, address tokenAddress,uint amount ,uint256 askingPrice);
    event enjimonAdded(uint256 id, uint256 tokenId, address tokenAddress, uint256 askingPrice);
    event itemSold(uint256 id, address buyer,uint256 amount, uint256 askingPrice);
    event enjimonSold(uint256 id, address buyer,uint256 amount, uint256 askingPrice);
    event itemRemoved(uint256 id, address seller, uint256 amount, uint256 askingPrice, uint256 date); 
    event enjimonRemoved(uint256 id, address seller, uint256 amount, uint256 askingPrice, uint256 date); 

    struct Enjimon {
            string enjimonName;
            string nickname;
            uint256 healthPoints; 
            uint256 defense; 
            uint256 attack; 
            uint256 endurance;
            uint256 level;
            uint256 lastMeal;
            uint256 lastTrained;
            string enjimonType;
            string  sex;
            uint256 TVL;
    }
    
    struct AuctionItem {
            uint256 id;
            address tokenAddress;
            uint256 tokenId;
            address payable seller;
            uint256 askingPrice;
            uint256 units;
            bool isSold;
        }
        
    AuctionItem[] public itemsForSale;

    //Market Modifiers
    modifier OnlyItemOwner(address tokenAddress, uint256 tokenId)
        {
            IERC1155 tokenContract = IERC1155(tokenAddress);
            require(tokenContract.balanceOf(msg.sender, tokenId) > 0); 
            _;
        }   
    modifier HasTransferApproval(address tokenAddress, uint256 tokenId)
        {
            IERC1155 tokenContract = IERC1155(tokenAddress);
            require(tokenContract.isApprovedForAll(msg.sender, address(this)) == true); 
            _;
        }
    modifier ItemExist(uint256 id) 
        {
            require(id < itemsForSale.length && itemsForSale[id].id == id,"can't find id");
            _;
        }
    modifier IsForSale(uint256 id) 
        {
            require(itemsForSale[id].isSold == false,"id already sold");
            _;
        }
 
 
    constructor() ERC1155("https://oxitcquxqc4e.usemoralis.com/{id}.json") {
        
        reserves = 0xC686855C52C918Fb7b18E8dc149CFecF4Fa2E574;
        FULLSTACKCALI = payable(msg.sender);
        faucetPrice = 2500000000000000;
        escrowedValut = address(this);
        tokenApproved[0x40F57dF4AEcE26C4975f48424a42403C5e7FF8EB] = true;

        name = "Immutable World of Wallet Monsters";
        symbol = "WMON";
       
    
        _mint(msg.sender, nextId, 10**8, ""); //UUJI
        nextId++;

        _mint(msg.sender, nextId, 10000**1, ""); //potions
        nextId++;

        _mint(msg.sender, nextId, 25000**1, ""); //eATK
        nextId++;

        _mint(msg.sender, nextId, 25000**1, ""); //eDef
        nextId++;

        _mint(msg.sender, nextId, 2000**1, ""); //elixer
         nextId++;

        _mint(msg.sender, nextId, 2500**1, ""); //walle
        
        nextId++; //6
                
        setApprovalForAll(address(this), true);

    }
   
     function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external override pure returns (bytes4)
    {
 
       return this.onERC1155Received.selector;
    }
    
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external override pure returns (bytes4)
    {
        return this.onERC1155BatchReceived.selector;
    }

    function Randomness() private view returns (uint) {
     
        return ((uint(keccak256(abi.encodePacked(block.difficulty, block.timestamp))) % 10)+ 1);
    } 

    function mintMonster(string memory enjimonName, uint256 healthPoints, uint256 defense, uint256 attack, uint256 endurance, uint256 level, string memory enjimonType,  string memory sex) public onlyOwner {

        _tokenDetails[nextId] = Enjimon(enjimonName,"unnamed", healthPoints, defense, attack, endurance, level, block.timestamp, block.timestamp, enjimonType, sex, 0);
        
        _mint(msg.sender, nextId, 1, "");
        
        
        
        emit bornDate(msg.sender, enjimonName, nextId, block.timestamp);
        
        nextId++;
   
    }
    
function trainerMarket(uint256 itemId, uint256 amount) public  {
         require(msg.sender != FULLSTACKCALI, "Not allowed");
         require(itemId != 0, "Invalid ID"); 
         require(itemId != 1, "Invalid ID"); 
         require(itemId < 4, "only eDEF, and eATK"); 
         require(balanceOf(msg.sender, 0) >= (50 * amount), "not enough UUJI");
         
         
         
         if(amount > 1){
             
             uint txAmount = amount * 50;
             uint txCost =  txAmount / 2;
             
             amountBurned+= txCost;

             _burn(msg.sender, 0, txCost); 
            _safeTransferFrom(msg.sender, reserves, 0, txCost, ""); 
           
            emit burnedCount(0, amountBurned, block.timestamp);

         }
         else
         {
             amountBurned+= 25;
             _burn(msg.sender, 0, 25); 
            _safeTransferFrom(msg.sender, reserves, 0, 25, ""); 

            emit burnedCount(0, amountBurned, block.timestamp);
         }
         
        _mint(msg.sender, itemId, amount, "");
       
        if(isApprovedForAll(msg.sender, address(this)) == false){
            
            setApprovalForAll(escrowedValut, true);
        }
        
        
        emit artifactMinted(msg.sender, itemId, amount, block.timestamp);  
    }
    
    function burn(address account, uint256 id, uint256 amount) public onlyOwner {
        require(id < 6, "cant burn $Enjimon"); 
       
        if(id == 0)
        {
            require(amount < escrowedAmountTotal, "can't burn Escrowed value, decrease");
            
             _burn(account, id, amount);
             amountBurned+= amount;

             emit tokenSupplyBurned(msg.sender, id, amount, block.timestamp);
             emit burnedCount(0, amountBurned, block.timestamp);
        }
        else
        {
            _burn(account, id, amount);
            amountBurned+= amount;
            emit itemBurned(msg.sender, id, amount, block.timestamp);
            emit burnedCount(0, amountBurned, block.timestamp);
        }
     
    }

   function useWaly(address token,uint tokenId) public {
        require(tokenApproved[token] == true, "We don't accept those");
        require(tokenId != 0 && tokenId < 6);
        require(balanceOf(FULLSTACKCALI, tokenId) >= 50, "Reserves Depleted.");
        

        IERC20(token).transferFrom(msg.sender, reserves, 50000 *(10**18));

        _safeTransferFrom(FULLSTACKCALI, msg.sender, tokenId, 1, '');


  
}
    
    function faucet() payable public returns(uint UUJIs){
        require(balanceOf(FULLSTACKCALI, 0) >= 50, "faucet is empty, check later.");
        require(msg.value >= faucetPrice, "Not enough to cover tx");
        
        FULLSTACKCALI.transfer(msg.value);
        _safeTransferFrom(FULLSTACKCALI, msg.sender, 0, 50, '');

        return UUJIs;
    }

    function setFaucet(uint _cost) public onlyOwner returns(uint){
            faucetPrice = _cost;

            return faucetPrice;
    }


    //$Enjimon interaction logic
    function slay(address account, uint256 amount, uint256 enjimonId) public 
    {
         
        require(enjimonId >= 6, "only slay $Enjimon"); 
        require(balanceOf(msg.sender, enjimonId) > 0, "Not your $Enjimon"); 
        require(_hold[msg.sender][enjimonId] == 0, "$Enjimon unavailable");
        
        
        Enjimon storage enjimon =_tokenDetails[enjimonId];
        
        require(enjimon.lastMeal + enjimon.endurance > block.timestamp, "$Enjimon reached Immutable Death");
        require(enjimon.TVL > 0, "Can Not slay yet");

        uint256 _amount = enjimonTVL[enjimonId]; 
        enjimonTVL[enjimonId] = 0;  
        enjimon.TVL = 0; 
            
        _safeTransferFrom(escrowedValut, msg.sender, 0, _amount, ""); 
        _burn(account, enjimonId, amount); 
        
        emit enjimonSlayed(msg.sender, enjimonId, enjimon.enjimonName,_amount ,block.timestamp);
    }
     
    function feed(uint256 tokenId) public {
        require(tokenId >= 6, "invalid ID");
        require(balanceOf(msg.sender, tokenId) > 0); 
        
        Enjimon storage enjimon = _tokenDetails[tokenId]; 
        
        uint uujiBalance = balanceOf(msg.sender, 0);
        
         if(_hold[msg.sender][0] > 0){
             uint256 restrictedUnits = _hold[msg.sender][0];
             
             uint256 txFee = (50 + (27 + enjimon.level)) + restrictedUnits;
             
            require(uujiBalance > txFee, "exceeds available UUJIs");
        }
        
        require(enjimon.lastMeal + enjimon.endurance > block.timestamp, "$Enjimon reached Immutable Death"); 
        require(uujiBalance > (50 + (27 + enjimon.level)), "Not enough UUJI Tokens"); 
        
        _burn(msg.sender, 0, 25 ); 
        _escrow(25, tokenId); 
        _safeTransferFrom(msg.sender, reserves, 0, 27 + enjimon.level, "");  

        amountBurned+= 25;

        enjimon.lastMeal = block.timestamp; 
        enjimon.TVL+= 25; 
         
        escrowedAmountTotal+= 25; 
        
        emit enjimonFed(msg.sender, tokenId,  enjimon.enjimonName, block.timestamp);
        emit burnedCount(0, amountBurned, block.timestamp);
    }
    
    function train(uint256 tokenId) public {
        require(tokenId >= 6, "invalid ID");
        require(balanceOf(msg.sender, tokenId) > 0);
        
        Enjimon storage enjimon =_tokenDetails[tokenId];
        uint uujiBalance = balanceOf(msg.sender, 0);
        
         if(_hold[msg.sender][0] > 0){
             uint256 restrictedUnits = _hold[msg.sender][0];
             
             uint256 txFee = (100 + (27 + enjimon.level)) + restrictedUnits;
             
            require(uujiBalance > txFee, "UUJI unavailable");
        }
        
        require(block.timestamp > enjimon.lastTrained + eightHours);
        require(uujiBalance > (100 + (27 + enjimon.level)), "Not enough UUJI"); 
        require(enjimon.lastMeal + enjimon.endurance > block.timestamp, "$Enjimon reached Immutable Death");
     
         _burn(msg.sender, 0, 50 );
         _escrow(50, tokenId);
         _safeTransferFrom(msg.sender, reserves, 0, 27 + enjimon.level, "");
         amountBurned+= 50;
       
        uint index = Randomness();
      
         
        enjimon.lastTrained = block.timestamp;
        enjimon.level+=1;
        enjimon.endurance+=(3600 + index); 
        enjimon.defense+=(2 + index);
        enjimon.attack+=(1 + index);
        enjimon.healthPoints+=index;
        enjimon.TVL+= 50;
        
        escrowedAmountTotal+= 50;
        
        emit enjimonTrained(msg.sender, tokenId, enjimon.enjimonName, block.timestamp);
        emit burnedCount(0, amountBurned, block.timestamp);
    }

    function givePotion(uint256 tokenId) public {
        require(tokenId >= 6, "Invalid ID");
        require(balanceOf(msg.sender, 1) > 0); 
        require(balanceOf(msg.sender, tokenId) > 0);
        
        if(_hold[msg.sender][1] > 0){
             uint256 restrictedUnits = _hold[msg.sender][1];
             require(balanceOf(msg.sender, 1) > restrictedUnits); 
        }
        
        Enjimon storage enjimon =_tokenDetails[tokenId];
        uint uujiBalance = balanceOf(msg.sender, 0);
        
        require(uujiBalance > 10, "Not enough UUJI");
        require(enjimon.lastMeal + enjimon.endurance > block.timestamp, "$Enjimon reached Immutable Death"); 

        _burn(msg.sender, 0, 5); 
        _burn(msg.sender, 1, 1); 
        _safeTransferFrom(msg.sender, reserves, 0, 5, ""); 

        amountBurned+= 5;

        uint index = Randomness();
        
        index+=5;

        enjimon.healthPoints+=index;

        emit burnedCount(0, amountBurned, block.timestamp);

    }

    function giveEATK(uint256 tokenId) public{
        require(tokenId >= 6, "Invalid ID");
        require(balanceOf(msg.sender, 2) > 0); 
        require(balanceOf(msg.sender, tokenId) > 0); 
        
        if(_hold[msg.sender][2] > 0){
             uint256 restrictedUnits = _hold[msg.sender][2];
             require(balanceOf(msg.sender, 2) > restrictedUnits); 
        }
        
        Enjimon storage enjimon =_tokenDetails[tokenId];
        uint uujiBalance = balanceOf(msg.sender, 0);

        require(uujiBalance > 10, "Not enough UUJI"); 
        require(enjimon.lastMeal + enjimon.endurance > block.timestamp, "$Enjimon reached Immutable Death");
        
        _burn(msg.sender, 0, 5); //burn uuji
        _burn(msg.sender, 2, 1); //burn eATK
        _safeTransferFrom(msg.sender, reserves, 0, 5, "");

        amountBurned+= 5;

        uint index = Randomness();
        
        enjimon.attack+=index;

        emit burnedCount(0, amountBurned, block.timestamp);

    }

    function giveEDEF(uint256 tokenId) public{
        require(tokenId >= 6, "Invalid ID");
        require(balanceOf(msg.sender, 3) > 0); 
        require(balanceOf(msg.sender, tokenId) > 0); 
        
        if(_hold[msg.sender][3] > 0){
             uint256 restrictedUnits = _hold[msg.sender][3];
             require(balanceOf(msg.sender, 3) > restrictedUnits); 
        }
        
        Enjimon storage enjimon =_tokenDetails[tokenId];
        uint uujiBalance = balanceOf(msg.sender, 0);

        require(uujiBalance > 10, "Not enough UUJI"); 
        require(enjimon.lastMeal + enjimon.endurance > block.timestamp, "$Enjimon reached Immutable Death");
        
        _burn(msg.sender, 0, 5); 
        _burn(msg.sender, 3, 1); 
        _safeTransferFrom(msg.sender, reserves, 0, 5, "");
        amountBurned+= 5;

        uint index = Randomness();
        
        enjimon.defense+=index;
        emit burnedCount(0, amountBurned, block.timestamp);

    }

    function giveElixer(uint256 tokenId) public{
        require(tokenId >= 6, "Invalid ID");
        require(balanceOf(msg.sender, 4) > 0, "no elixers!"); 
        require(balanceOf(msg.sender, tokenId) > 0); 
        
        if(_hold[msg.sender][4] > 0){
             uint256 restrictedUnits = _hold[msg.sender][4];
             require(balanceOf(msg.sender, 4) > restrictedUnits);
        }
        
        Enjimon storage enjimon =_tokenDetails[tokenId];
        uint uujiBalance = balanceOf(msg.sender, 0);
        

        require(uujiBalance > 10, "Not enough UUJI Tokens");
        require(enjimon.lastMeal + enjimon.endurance > block.timestamp, "$Enjimon reached Immutable Death"); 
        
        _burn(msg.sender, 0, 5); 
        _burn(msg.sender, 4, 1); 
        _safeTransferFrom(msg.sender, reserves, 0, 5, "");

        amountBurned+= 5;

        uint index = Randomness();

        enjimon.healthPoints+= index;
        enjimon.level+= 1;
        enjimon.endurance+=(900 + index);
        enjimon.defense+=1;
        enjimon.attack+=1;

        emit burnedCount(0, amountBurned, block.timestamp);
    }
    function giveWalle(uint256 tokenId)public{
        require(tokenId >= 6, "Invalid ID");
        require(balanceOf(msg.sender, 5) > 0, "no walle"); 
        require(balanceOf(msg.sender, tokenId) > 0);   

        Enjimon storage enjimon =_tokenDetails[tokenId];

        _burn(msg.sender, 5, 1); 

        enjimon.lastMeal = block.timestamp;

    }
    function _escrow(uint amount, uint tokenId) private {
        
       uint256 previousEnjimonBalance = enjimonTVL[tokenId];
       
        enjimonTVL[tokenId] += amount;
       
       _safeTransferFrom(msg.sender, escrowedValut, 0, amount, "");
  
       assert((enjimonTVL[tokenId] - amount) == previousEnjimonBalance);
    
    }
    
    function getTokenDetails(uint256 tokenId) public view returns(Enjimon memory){
        return _tokenDetails[tokenId];
 }
    
 
     
    function giveEnjimonName(uint enjimonId, string memory _name) public returns(string memory nickname)
    {
        require(enjimonId >= 6, "You can only name $Enjimon!");
        require(balanceOf(msg.sender, enjimonId) > 0, "you can only give your $Enjimon nickname!");
        require(balanceOf(msg.sender, 0) > 10, "not enough UUJI");
        
        Enjimon storage enjimon =_tokenDetails[enjimonId];
        require(enjimon.lastMeal + enjimon.endurance > block.timestamp, "$Enjimon reached Immutable Death"); 

        _burn(msg.sender, 0, 5);
        _safeTransferFrom(msg.sender, reserves, 0, 3, "");
        _escrow(2, enjimonId);
        amountBurned+= 5;

        enjimon.nickname = _name;
        enjimon.TVL+= 2;
        
        escrowedAmountTotal+= 2;
        emit burnedCount(0, amountBurned, block.timestamp);
        return enjimon.nickname;
        
    }
    
     //requires enjimon to be alive or they can never transfer the token
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        uint256 amount,
        bytes memory data
    ) public virtual  override {
         
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        
        if(tokenId >= 6 ){
              Enjimon storage enjimon =_tokenDetails[tokenId];

              require(enjimon.lastMeal + enjimon.endurance > block.timestamp, "$Enjimon reached Immutable Death"); 
              require(_hold[msg.sender][tokenId] == 0, "$Enjimon unavailable");
            
             _safeTransferFrom(from, to, tokenId, 1, data);
             
             emit transferEnjimon(msg.sender, to, tokenId, enjimon.enjimonName);
        }
        else{
            
             if(_hold[msg.sender][0] > 0){
                uint uujiBalance = balanceOf(msg.sender, 0);
                
                uint256 restrictedUnits = _hold[msg.sender][0];
             
                require(uujiBalance > restrictedUnits);
                require(amount <= (uujiBalance - restrictedUnits));
            }
            else if(_hold[msg.sender][tokenId] > 0)
            {
                uint totalItems = balanceOf(msg.sender, tokenId);

                uint256 restrictedUnits = _hold[msg.sender][tokenId];

                require(balanceOf(from, tokenId) > restrictedUnits); 
                require(amount <= (totalItems - restrictedUnits));
            }
            
            _safeTransferFrom(from, to, tokenId, amount, data);
            
            emit transferItem(from, to, tokenId);
            
        }
    }
    
    //Market functionality
    function additemToMarket(uint256 tokenId, uint256 units, uint256 askingPrice) OnlyItemOwner(address(this),tokenId) HasTransferApproval(address(this),tokenId) public returns(uint256){
            require(tokenId < 6, "Invalid ID");
            require(balanceOf(msg.sender, tokenId) >= units, "not enough tokens available!");
            
            _hold[msg.sender][tokenId] += units; 
                
            uint256 newItemId = itemsForSale.length;
            
            itemsForSale.push(AuctionItem(newItemId, address(this), tokenId, payable(msg.sender), askingPrice, units, false));
            
            activeItems[address(this)][tokenId] = true; 
            setApprovalForAll(escrowedValut, true);
                
            assert(itemsForSale[newItemId].id == newItemId);
            emit itemAdded(newItemId, tokenId, address(this), units ,askingPrice);
                
            return newItemId;
            
        }
        
    function addEnjimonToMarket(uint256 tokenId,  uint256 askingPrice) OnlyItemOwner(address(this),tokenId) HasTransferApproval(address(this),tokenId) public returns(uint256){
            require(tokenId >= 6, "Invalid ID");
            require(balanceOf(msg.sender, tokenId) == 1, "no $Enjimon");
            require(activeItems[address(this)][tokenId] == false,"Item for sale already");

            Enjimon storage enjimon =_tokenDetails[tokenId];    
            require(enjimon.lastMeal + enjimon.endurance > block.timestamp, "$Enjimon in Immutable Death");            
            
            _hold[msg.sender][tokenId] = 1;
            
            uint256 newItemId = itemsForSale.length;
            
            itemsForSale.push(AuctionItem(newItemId, address(this), tokenId, payable(msg.sender), askingPrice, 1, false));
            
            activeItems[address(this)][tokenId] = true;
            setApprovalForAll(escrowedValut, true);
            
            assert(itemsForSale[newItemId].id == newItemId);
            emit enjimonAdded(newItemId, tokenId, address(this), askingPrice);
            
            return newItemId;
            
        }

    function buyItem(uint256 id) payable public ItemExist(id) IsForSale(id) {
            require(msg.sender != itemsForSale[id].seller, "cannot buy your own item, remove instead");
            require(msg.value >= itemsForSale[id].askingPrice, "Not enough funds sent"); 
            require(balanceOf(msg.sender, 0) >= 10, "You nedd 10 UUJI min.");
    
            
            if(itemsForSale[id].tokenId >= 6)
            {
                Enjimon storage enjimon =_tokenDetails[itemsForSale[id].tokenId];
                require(enjimon.lastMeal + enjimon.endurance > block.timestamp, "$Enjimon's in Immutable Death");

                _hold[itemsForSale[id].seller][itemsForSale[id].tokenId] = 0;

                itemsForSale[id].isSold = true; 
                activeItems[itemsForSale[id].tokenAddress][itemsForSale[id].tokenId] = false; 
            
                _safeTransferFrom(itemsForSale[id].seller, msg.sender, itemsForSale[id].tokenId, 1, '');
                 itemsForSale[id].seller.transfer(msg.value);
                 
                 //UUJI Fees
                _safeTransferFrom(msg.sender, itemsForSale[id].seller, 0, 5, '');
                _safeTransferFrom(msg.sender, FULLSTACKCALI, 0, 2, '');
                _burn(msg.sender, 0, 3);
                amountBurned+=3;

                emit enjimonSold(id, msg.sender, 1 ,itemsForSale[id].askingPrice);
                emit burnedCount(0, amountBurned, block.timestamp);
                
            }
            else
            {
                _hold[itemsForSale[id].seller][itemsForSale[id].tokenId]-= itemsForSale[id].units;

                itemsForSale[id].isSold = true; 
                activeItems[itemsForSale[id].tokenAddress][itemsForSale[id].tokenId] = false; 
                
                _safeTransferFrom(itemsForSale[id].seller, msg.sender, itemsForSale[id].tokenId, itemsForSale[id].units, '');
                
                itemsForSale[id].seller.transfer(msg.value); 
                
                
                _safeTransferFrom(msg.sender, itemsForSale[id].seller, 0, 5, '');
                _safeTransferFrom(msg.sender, FULLSTACKCALI, 0, 2, '');
                _burn(msg.sender, 0, 3);
                amountBurned+=3;
                emit itemSold(id, msg.sender, itemsForSale[id].units ,itemsForSale[id].askingPrice);
                emit burnedCount(0, amountBurned, block.timestamp);
            }
           
        }
    
    function removeItem(uint256 id) public ItemExist(id) IsForSale(id) returns(bool success){
            require(msg.sender == itemsForSale[id].seller);

            activeItems[itemsForSale[id].tokenAddress][itemsForSale[id].tokenId] = false;
            itemsForSale[id].isSold = true;

            _hold[msg.sender][itemsForSale[id].tokenId] -= itemsForSale[id].units;
             
            delete itemsForSale[id];

            if(itemsForSale[id].tokenId >= 6){
                emit enjimonRemoved(id, msg.sender, itemsForSale[id].units , itemsForSale[id].askingPrice, block.timestamp); 
            }else{
                emit itemRemoved(id, msg.sender, itemsForSale[id].units , itemsForSale[id].askingPrice, block.timestamp); 
            }  
            

             return success;
            
        }  
}

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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"date","type":"uint256"}],"name":"artifactMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"uint256","name":"enjimonID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"date","type":"uint256"}],"name":"bornDate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"date","type":"uint256"}],"name":"burnedCount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"askingPrice","type":"uint256"}],"name":"enjimonAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"enjimonID","type":"uint256"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"uint256","name":"lastFed","type":"uint256"}],"name":"enjimonFed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"askingPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"date","type":"uint256"}],"name":"enjimonRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenID","type":"uint256"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"uint256","name":"TVL","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"date","type":"uint256"}],"name":"enjimonSlayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"askingPrice","type":"uint256"}],"name":"enjimonSold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"enjimonID","type":"uint256"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"uint256","name":"lastTrainded","type":"uint256"}],"name":"enjimonTrained","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"askingPrice","type":"uint256"}],"name":"itemAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"date","type":"uint256"}],"name":"itemBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"askingPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"date","type":"uint256"}],"name":"itemRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"askingPrice","type":"uint256"}],"name":"itemSold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"date","type":"uint256"}],"name":"tokenSupplyBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"date","type":"uint256"}],"name":"tokenSupplyMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"transferEnjimon","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferItem","type":"event"},{"inputs":[],"name":"FULLSTACKCALI","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"_hold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"askingPrice","type":"uint256"}],"name":"addEnjimonToMarket","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"units","type":"uint256"},{"internalType":"uint256","name":"askingPrice","type":"uint256"}],"name":"additemToMarket","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"buyItem","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"enjimonTVL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"faucet","outputs":[{"internalType":"uint256","name":"UUJIs","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"faucetPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"feed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenDetails","outputs":[{"components":[{"internalType":"string","name":"enjimonName","type":"string"},{"internalType":"string","name":"nickname","type":"string"},{"internalType":"uint256","name":"healthPoints","type":"uint256"},{"internalType":"uint256","name":"defense","type":"uint256"},{"internalType":"uint256","name":"attack","type":"uint256"},{"internalType":"uint256","name":"endurance","type":"uint256"},{"internalType":"uint256","name":"level","type":"uint256"},{"internalType":"uint256","name":"lastMeal","type":"uint256"},{"internalType":"uint256","name":"lastTrained","type":"uint256"},{"internalType":"string","name":"enjimonType","type":"string"},{"internalType":"string","name":"sex","type":"string"},{"internalType":"uint256","name":"TVL","type":"uint256"}],"internalType":"struct WalletMonsters.Enjimon","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"giveEATK","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"giveEDEF","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"giveElixer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"enjimonId","type":"uint256"},{"internalType":"string","name":"_name","type":"string"}],"name":"giveEnjimonName","outputs":[{"internalType":"string","name":"nickname","type":"string"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"givePotion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"giveWalle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"itemsForSale","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address payable","name":"seller","type":"address"},{"internalType":"uint256","name":"askingPrice","type":"uint256"},{"internalType":"uint256","name":"units","type":"uint256"},{"internalType":"bool","name":"isSold","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"enjimonName","type":"string"},{"internalType":"uint256","name":"healthPoints","type":"uint256"},{"internalType":"uint256","name":"defense","type":"uint256"},{"internalType":"uint256","name":"attack","type":"uint256"},{"internalType":"uint256","name":"endurance","type":"uint256"},{"internalType":"uint256","name":"level","type":"uint256"},{"internalType":"string","name":"enjimonType","type":"string"},{"internalType":"string","name":"sex","type":"string"}],"name":"mintMonster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"removeItem","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setFaucet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"enjimonId","type":"uint256"}],"name":"slay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenApproved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"train","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"itemId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"trainerMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"useWaly","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600060045561708060055560006006556000600b553480156200002657600080fd5b506040518060600160405280602d815260200162006a3f602d91396200004c81620002d5565b506200005833620002ee565b600880546001600160a01b031990811673c686855c52c918fb7b18e8dc149cfecf4fa2e57417909155600a80548216331790556608e1bc9bf0400060075560098054909116301790557340f57df4aece26c4975f48424a42403c5e7ff8eb600052601360209081527f0d46798b091eb7acae5dd32532f71871923cd3f246bd2443abaaafde2c3f1abc805460ff1916600117905560408051606081019091526022808252909162006a6c9083013980516200011c91600c916020909101906200079b565b50604080518082019091526004808252632ba6a7a760e11b60209092019182526200014a91600d916200079b565b5062000174336004546305f5e100604051806020016040528060008152506200034060201b60201c565b600480549060006200018683620009b3565b9190505550620001b233600454612710604051806020016040528060008152506200034060201b60201c565b60048054906000620001c483620009b3565b9190505550620001f0336004546161a8604051806020016040528060008152506200034060201b60201c565b600480549060006200020283620009b3565b91905055506200022e336004546161a8604051806020016040528060008152506200034060201b60201c565b600480549060006200024083620009b3565b91905055506200026c336004546107d0604051806020016040528060008152506200034060201b60201c565b600480549060006200027e83620009b3565b9190505550620002aa336004546109c4604051806020016040528060008152506200034060201b60201c565b60048054906000620002bc83620009b3565b90915550620002cf905030600162000460565b62000aa9565b8051620002ea9060029060208401906200079b565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038416620003a65760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084015b60405180910390fd5b33620003cc81600087620003ba886200046d565b620003c5886200046d565b5050505050565b6000848152602081815260408083206001600160a01b038916845290915281208054859290620003fe90849062000920565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4620003c581600087878787620004c3565b620002ea338383620006a9565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110620004aa57620004aa620009e7565b602090810291909101015292915050565b505050505050565b620004e2846001600160a01b03166200078c60201b620043a21760201c565b15620004bb5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906200051e9089908990889088908890600401620008c4565b602060405180830381600087803b1580156200053957600080fd5b505af19250505080156200056c575060408051601f3d908101601f19168201909252620005699181019062000841565b60015b6200062d576200057b620009fd565b806308c379a01415620005bc57506200059362000a1a565b80620005a05750620005be565b8060405162461bcd60e51b81526004016200039d91906200090b565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e74657200000000000000000000000060648201526084016200039d565b6001600160e01b0319811663f23a6e6160e01b14620006a05760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b60648201526084016200039d565b50505050505050565b816001600160a01b0316836001600160a01b031614156200071f5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016200039d565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b03163b151590565b828054620007a9906200093b565b90600052602060002090601f016020900481019282620007cd576000855562000818565b82601f10620007e857805160ff191683800117855562000818565b8280016001018555821562000818579182015b8281111562000818578251825591602001919060010190620007fb565b50620008269291506200082a565b5090565b5b808211156200082657600081556001016200082b565b6000602082840312156200085457600080fd5b81516001600160e01b0319811681146200086d57600080fd5b9392505050565b6000815180845260005b818110156200089c576020818501810151868301820152016200087e565b81811115620008af576000602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090620009009083018462000874565b979650505050505050565b6020815260006200086d602083018462000874565b60008219821115620009365762000936620009d1565b500190565b600181811c908216806200095057607f821691505b602082108114156200097257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f191681016001600160401b0381118282101715620009ac57634e487b7160e01b600052604160045260246000fd5b6040525050565b6000600019821415620009ca57620009ca620009d1565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600060033d111562000a175760046000803e5060005160e01c5b90565b600060443d101562000a295790565b6040516003193d81016004833e81513d6001600160401b03808311602484018310171562000a5957505050505090565b828501915081518181111562000a725750505050505090565b843d870101602082850101111562000a8d5750505050505090565b62000a9e6020828601018762000978565b509095945050505050565b615f868062000ab96000396000f3fe6080604052600436106101d55760003560e01c8062fdd58e146101da578063019ddde71461020d57806301ffc9a71461022f57806306fdde031461025f578063092d0afc146102815780630e89341c146102e3578063170e2b8a146103035780632453d8b61461033357806326e91d6a1461036b5780632eb2c2d61461039857806335bba03f146103b8578063368004ed146103f05780633e142fb6146104105780634e1273f414610430578063520b09301461045d578063561377871461047d5780635e78e95b1461049d578063653c556d146104bd5780636d6eaf57146104dd57806371261061146104fd578063713291711461051d578063715018a61461053d5780637c7c6dac146105525780638da5cb5b1461056857806395d89b411461057d5780639948912c14610592578063a22cb465146105b2578063a35e55bd146105d2578063a59a05e7146105f2578063b271aab414610612578063bc197c8114610632578063c1e037281461067a578063de5f72fd146106a7578063e7fb74c7146106af578063e985e9c5146106c2578063f23a6e61146106e2578063f242432a1461070f578063f2fde38b1461072f578063f39172d31461074f578063f5298aca1461076f578063f59dfdfb1461078f575b600080fd5b3480156101e657600080fd5b506101fa6101f5366004615276565b6107af565b6040519081526020015b60405180910390f35b34801561021957600080fd5b5061022d6102283660046154b2565b610846565b005b34801561023b57600080fd5b5061024f61024a3660046153c0565b610ac0565b6040519015158152602001610204565b34801561026b57600080fd5b50610274610b12565b60405161020491906158f4565b34801561028d57600080fd5b506102a161029c3660046154b2565b610ba0565b604080519788526001600160a01b039687166020890152870194909452939091166060850152608084015260a0830191909152151560c082015260e001610204565b3480156102ef57600080fd5b506102746102fe3660046154b2565b610bff565b34801561030f57600080fd5b5061024f61031e366004614fac565b60136020526000908152604090205460ff1681565b34801561033f57600080fd5b506101fa61034e366004615276565b601160209081526000928352604080842090915290825290205481565b34801561037757600080fd5b506101fa6103863660046154b2565b60106020526000908152604090205481565b3480156103a457600080fd5b5061022d6103b33660046150bb565b610c93565b3480156103c457600080fd5b50600a546103d8906001600160a01b031681565b6040516001600160a01b039091168152602001610204565b3480156103fc57600080fd5b5061022d61040b3660046154b2565b610d2a565b34801561041c57600080fd5b5061022d61042b3660046154b2565b61106e565b34801561043c57600080fd5b5061045061044b3660046152d3565b61110f565b604051610204919061589d565b34801561046957600080fd5b5061022d6104783660046154b2565b611238565b34801561048957600080fd5b5061022d6104983660046154b2565b6113dc565b3480156104a957600080fd5b5061022d6104b8366004615520565b611574565b3480156104c957600080fd5b506101fa6104d8366004615520565b61182c565b3480156104e957600080fd5b5061022d6104f83660046153fa565b611cca565b34801561050957600080fd5b506102746105183660046154e4565b611ec1565b34801561052957600080fd5b5061024f6105383660046154b2565b612157565b34801561054957600080fd5b5061022d612542565b34801561055e57600080fd5b506101fa60075481565b34801561057457600080fd5b506103d861257d565b34801561058957600080fd5b5061027461258c565b34801561059e57600080fd5b506101fa6105ad3660046154b2565b612599565b3480156105be57600080fd5b5061022d6105cd36600461523f565b6125d7565b3480156105de57600080fd5b5061022d6105ed3660046152a0565b6125e6565b3480156105fe57600080fd5b506101fa61060d366004615542565b6127d1565b34801561061e57600080fd5b5061022d61062d366004615276565b612ba9565b34801561063e57600080fd5b5061066161064d366004615001565b63bc197c8160e01b98975050505050505050565b6040516001600160e01b03199091168152602001610204565b34801561068657600080fd5b5061069a6106953660046154b2565b612d3f565b6040516102049190615b90565b6101fa61305b565b61022d6106bd3660046154b2565b613179565b3480156106ce57600080fd5b5061024f6106dd366004614fce565b613b02565b3480156106ee57600080fd5b506106616106fd366004615164565b63f23a6e6160e01b9695505050505050565b34801561071b57600080fd5b5061022d61072a3660046151db565b613b30565b34801561073b57600080fd5b5061022d61074a366004614fac565b613da8565b34801561075b57600080fd5b5061022d61076a3660046154b2565b613e48565b34801561077b57600080fd5b5061022d61078a3660046152a0565b613fe0565b34801561079b57600080fd5b5061022d6107aa3660046154b2565b614166565b60006001600160a01b0383166108205760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60068110156108675760405162461bcd60e51b815260040161081790615a0d565b60006108743360046107af565b116108af5760405162461bcd60e51b815260206004820152600b60248201526a6e6f20656c69786572732160a81b6044820152606401610817565b60006108bb33836107af565b116108c557600080fd5b336000908152601160209081526040808320600484529091529020541561091c57336000818152601160209081526040808320600480855292529091205491829161091091906107af565b1161091a57600080fd5b505b6000818152600e602052604081209061093533826107af565b9050600a81116109575760405162461bcd60e51b815260040161081790615ab0565b428260050154836007015461096c9190615ce2565b116109895760405162461bcd60e51b815260040161081790615b0e565b61099633600060056143b1565b6109a333600460016143b1565b6109d633600860009054906101000a90046001600160a01b03166000600560405180602001604052806000815250614519565b6005600b60008282546109e99190615ce2565b90915550600090506109f961462d565b905080836002016000828254610a0f9190615ce2565b925050819055506001836006016000828254610a2b9190615ce2565b90915550610a3d905081610384615ce2565b836005016000828254610a509190615ce2565b925050819055506001836003016000828254610a6c9190615ce2565b925050819055506001836004016000828254610a889190615ce2565b9091555050600b54604051600080516020615f3183398151915291610ab2916000919042906158de565b60405180910390a150505050565b60006001600160e01b03198216636cdb3d1360e11b1480610af157506001600160e01b031982166303a24d0760e21b145b80610b0c57506301ffc9a760e01b6001600160e01b03198316145b92915050565b600c8054610b1f90615d44565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4b90615d44565b8015610b985780601f10610b6d57610100808354040283529160200191610b98565b820191906000526020600020905b815481529060010190602001808311610b7b57829003601f168201915b505050505081565b60148181548110610bb057600080fd5b600091825260209091206007909102018054600182015460028301546003840154600485015460058601546006909601549496506001600160a01b039384169592949190931692919060ff1687565b606060028054610c0e90615d44565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3a90615d44565b8015610c875780601f10610c5c57610100808354040283529160200191610c87565b820191906000526020600020905b815481529060010190602001808311610c6a57829003601f168201915b50505050509050919050565b6001600160a01b038516331480610caf5750610caf8533613b02565b610d165760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610817565b610d238585858585614680565b5050505050565b6006811015610d4b5760405162461bcd60e51b815260040161081790615b6c565b6000610d5733836107af565b11610d6157600080fd5b6000818152600e6020526040812090610d7a33826107af565b33600090815260116020908152604080832083805290915290205490915015610e295733600090815260116020908152604080832083805290915281205460068401549091908290610dcd90601b615ce2565b610dd8906064615ce2565b610de29190615ce2565b9050808311610e265760405162461bcd60e51b815260206004820152601060248201526f55554a4920756e617661696c61626c6560801b6044820152606401610817565b50505b6005548260080154610e3b9190615ce2565b4211610e4657600080fd5b6006820154610e5690601b615ce2565b610e61906064615ce2565b8111610e7f5760405162461bcd60e51b815260040161081790615b43565b4282600501548360070154610e949190615ce2565b11610eb15760405162461bcd60e51b815260040161081790615b0e565b610ebe33600060326143b1565b610ec960328461485d565b6008546006830154610f069133916001600160a01b0390911690600090610ef190601b615ce2565b60405180602001604052806000815250614519565b6032600b6000828254610f199190615ce2565b9091555060009050610f2961462d565b90504283600801819055506001836006016000828254610f499190615ce2565b90915550610f5b905081610e10615ce2565b836005016000828254610f6e9190615ce2565b90915550610f7f9050816002615ce2565b836003016000828254610f929190615ce2565b90915550610fa39050816001615ce2565b836004016000828254610fb69190615ce2565b9250508190555080836002016000828254610fd19190615ce2565b92505081905550603283600b016000828254610fed9190615ce2565b925050819055506032600660008282546110079190615ce2565b90915550506040517f98e4f60fda6e3ab8a3f56f25bdde061d4d88989982401caa13c6c61691d4e31690611042903390879087904290615804565b60405180910390a1600080516020615f318339815191526000600b5442604051610ab2939291906158de565b600681101561108f5760405162461bcd60e51b815260040161081790615a0d565b600061109c3360056107af565b116110d45760405162461bcd60e51b81526020600482015260086024820152676e6f2077616c6c6560c01b6044820152606401610817565b60006110e033836107af565b116110ea57600080fd5b6000818152600e6020526040902061110533600560016143b1565b4260079091015550565b606081518351146111745760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610817565b600083516001600160401b0381111561118f5761118f615e32565b6040519080825280602002602001820160405280156111b8578160200160208202803683370190505b50905060005b8451811015611230576112038582815181106111dc576111dc615e1c565b60200260200101518583815181106111f6576111f6615e1c565b60200260200101516107af565b82828151811061121557611215615e1c565b602090810291909101015261122981615dab565b90506111be565b509392505050565b60068110156112595760405162461bcd60e51b815260040161081790615a0d565b60006112663360016107af565b1161127057600080fd5b600061127c33836107af565b1161128657600080fd5b33600090815260116020908152604080832060018452909152902054156112dd5733600081815260116020908152604080832060018085529252909120549182916112d191906107af565b116112db57600080fd5b505b6000818152600e60205260408120906112f633826107af565b9050600a81116113185760405162461bcd60e51b815260040161081790615b43565b428260050154836007015461132d9190615ce2565b1161134a5760405162461bcd60e51b815260040161081790615b0e565b61135733600060056143b1565b611363336001806143b1565b61139633600860009054906101000a90046001600160a01b03166000600560405180602001604052806000815250614519565b6005600b60008282546113a99190615ce2565b90915550600090506113b961462d565b90506113c6600582615ce2565b905080836002016000828254610a889190615ce2565b60068110156113fd5760405162461bcd60e51b815260040161081790615a0d565b600061140a3360036107af565b1161141457600080fd5b600061142033836107af565b1161142a57600080fd5b336000908152601160209081526040808320600384529091529020541561148157336000818152601160209081526040808320600380855292529091205491829161147591906107af565b1161147f57600080fd5b505b6000818152600e602052604081209061149a33826107af565b9050600a81116114bc5760405162461bcd60e51b815260040161081790615b43565b42826005015483600701546114d19190615ce2565b116114ee5760405162461bcd60e51b815260040161081790615b0e565b6114fb33600060056143b1565b61150833600360016143b1565b61153b33600860009054906101000a90046001600160a01b03166000600560405180602001604052806000815250614519565b6005600b600082825461154e9190615ce2565b909155506000905061155e61462d565b905080836003016000828254610a889190615ce2565b600a546001600160a01b03163314156115bd5760405162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b6044820152606401610817565b816115da5760405162461bcd60e51b815260040161081790615a0d565b81600114156115fb5760405162461bcd60e51b815260040161081790615a0d565b600482106116415760405162461bcd60e51b81526020600482015260136024820152726f6e6c7920654445462c20616e64206541544b60681b6044820152606401610817565b61164c816032615d0e565b6116573360006107af565b10156116755760405162461bcd60e51b815260040161081790615976565b600181111561172557600061168b826032615d0e565b9050600061169a600283615cfa565b905080600b60008282546116ae9190615ce2565b909155506116c09050336000836143b1565b6116f233600860009054906101000a90046001600160a01b031660008460405180602001604052806000815250614519565b600080516020615f318339815191526000600b5442604051611716939291906158de565b60405180910390a150506117ab565b6019600b60008282546117389190615ce2565b9091555061174b905033600060196143b1565b61177e33600860009054906101000a90046001600160a01b03166000601960405180602001604052806000815250614519565b600080516020615f318339815191526000600b54426040516117a2939291906158de565b60405180910390a15b6117c6338383604051806020016040528060008152506148d6565b6117d03330613b02565b6117eb576009546117eb906001600160a01b031660016125d7565b7f6f38e2f02c1bff24941036f6b0d49bf52d5cc650b0d1787b9c3911668a2912b0338383426040516118209493929190615877565b60405180910390a15050565b604051627eeac760e11b81526000903090849082908490829062fdd58e9061185a90339087906004016157eb565b60206040518083038186803b15801561187257600080fd5b505afa158015611886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118aa91906154cb565b116118b457600080fd5b60405163e985e9c560e01b8152309087908290819063e985e9c5906118df9033908490600401615696565b60206040518083038186803b1580156118f757600080fd5b505afa15801561190b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192f91906153a3565b151560011461193d57600080fd5b600689101561195e5760405162461bcd60e51b815260040161081790615a0d565b611968338a6107af565b6001146119a55760405162461bcd60e51b815260206004820152600b60248201526a3737901222b73534b6b7b760a91b6044820152606401610817565b3060009081526012602090815260408083208c845290915290205460ff1615611a085760405162461bcd60e51b81526020600482015260156024820152744974656d20666f722073616c6520616c726561647960581b6044820152606401610817565b6000898152600e60205260409020600581015460078201544291611a2b91615ce2565b11611a765760405162461bcd60e51b815260206004820152601b60248201527a0488adcd4d2dadedc40d2dc4092dadaeae8c2c4d8ca4088cac2e8d602b1b6044820152606401610817565b600160116000336001600160a01b03166001600160a01b0316815260200190815260200160002060008c8152602001908152602001600020819055506000601480549050905060146040518060e00160405280838152602001306001600160a01b031681526020018d8152602001336001600160a01b031681526020018c8152602001600181526020016000151581525090806001815401808255809150506001900390600052602060002090600702016000909190919091506000820151816000015560208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506040820151816002015560608201518160030160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506080820151816004015560a0820151816005015560c08201518160060160006101000a81548160ff0219169083151502179055505050600160126000306001600160a01b03166001600160a01b0316815260200190815260200160002060008d815260200190815260200160002060006101000a81548160ff021916908315150217905550611c43600960009054906101000a90046001600160a01b031660016125d7565b8060148281548110611c5757611c57615e1c565b90600052602060002090600702016000015414611c7657611c76615dda565b60408051828152602081018d90523081830152606081018c905290517fc2a17761751ea4b66c0f9e20da5c34396de533221d10f811e0b25fb93ec27b259181900360800190a19a9950505050505050505050565b33611cd361257d565b6001600160a01b031614611cf95760405162461bcd60e51b815260040161081790615a7b565b604051806101800160405280898152602001604051806040016040528060078152602001661d5b9b985b595960ca1b81525081526020018881526020018781526020018681526020018581526020018481526020014281526020014281526020018381526020018281526020016000815250600e600060045481526020019081526020016000206000820151816000019080519060200190611d9c929190614d86565b506020828101518051611db59260018501920190614d86565b5060408201516002820155606082015160038201556080820151600482015560a0820151600582015560c0820151600682015560e0820151600782015561010082015160088201556101208201518051611e19916009840191602090910190614d86565b506101408201518051611e3691600a840191602090910190614d86565b5061016082015181600b0155905050611e63336004546001604051806020016040528060008152506148d6565b7fb19fcf7e2ddd656fcbe48a85256cc74546912bc7b343e22cd905b784d3bdb18d338960045442604051611e9a94939291906157b4565b60405180910390a160048054906000611eb283615dab565b91905055505050505050505050565b60606006831015611f125760405162461bcd60e51b815260206004820152601b60248201527a596f752063616e206f6e6c79206e616d652024456e6a696d6f6e2160281b6044820152606401610817565b6000611f1e33856107af565b11611f7d5760405162461bcd60e51b815260206004820152602960248201527f796f752063616e206f6e6c79206769766520796f75722024456e6a696d6f6e206044820152686e69636b6e616d652160b81b6064820152608401610817565b600a611f8a3360006107af565b11611fa75760405162461bcd60e51b815260040161081790615976565b6000838152600e60205260409020600581015460078201544291611fca91615ce2565b11611fe75760405162461bcd60e51b815260040161081790615b0e565b611ff433600060056143b1565b61202733600860009054906101000a90046001600160a01b03166000600360405180602001604052806000815250614519565b61203260028561485d565b6005600b60008282546120459190615ce2565b9091555050825161205f9060018301906020860190614d86565b50600281600b0160008282546120759190615ce2565b9250508190555060026006600082825461208f9190615ce2565b9091555050600b54604051600080516020615f31833981519152916120b9916000919042906158de565b60405180910390a18060010180546120d090615d44565b80601f01602080910402602001604051908101604052809291908181526020018280546120fc90615d44565b80156121495780601f1061211e57610100808354040283529160200191612149565b820191906000526020600020905b81548152906001019060200180831161212c57829003601f168201915b505050505091505092915050565b6014546000908290811080156121905750806014828154811061217c5761217c615e1c565b906000526020600020906007020160000154145b6121ac5760405162461bcd60e51b81526004016108179061594f565b82601481815481106121c0576121c0615e1c565b600091825260209091206006600790920201015460ff16156121f45760405162461bcd60e51b81526004016108179061599f565b6014848154811061220757612207615e1c565b60009182526020909120600790910201600301546001600160a01b0316331461222f57600080fd5b6000601260006014878154811061224857612248615e1c565b60009182526020808320600160079093020191909101546001600160a01b031683528201929092526040018120601480549192918890811061228c5761228c615e1c565b906000526020600020906007020160020154815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601485815481106122d8576122d8615e1c565b906000526020600020906007020160060160006101000a81548160ff0219169083151502179055506014848154811061231357612313615e1c565b90600052602060002090600702016005015460116000336001600160a01b03166001600160a01b0316815260200190815260200160002060006014878154811061235f5761235f615e1c565b9060005260206000209060070201600201548152602001908152602001600020600082825461238e9190615d2d565b909155505060148054859081106123a7576123a7615e1c565b6000918252602082206007909102018181556001810180546001600160a01b03199081169091556002820183905560038201805490911690556004810182905560058101919091556006908101805460ff19169055601480548690811061241057612410615e1c565b906000526020600020906007020160020154106124b3577f069fcbd5f1b01073577f9134c848b4436c4916c1baf28f81d3acbf98f4b63afe84336014878154811061245d5761245d615e1c565b9060005260206000209060070201600501546014888154811061248257612482615e1c565b906000526020600020906007020160040154426040516124a6959493929190615c93565b60405180910390a161253b565b7f2a38a4a02b90d45e34da87b8403da02dcba1ad52e2b1e3258502025a3d54a03c8433601487815481106124e9576124e9615e1c565b9060005260206000209060070201600501546014888154811061250e5761250e615e1c565b90600052602060002090600702016004015442604051612532959493929190615c93565b60405180910390a15b5050919050565b3361254b61257d565b6001600160a01b0316146125715760405162461bcd60e51b815260040161081790615a7b565b61257b60006149c5565b565b6003546001600160a01b031690565b600d8054610b1f90615d44565b6000336125a461257d565b6001600160a01b0316146125ca5760405162461bcd60e51b815260040161081790615a7b565b506007819055805b919050565b6125e2338383614a17565b5050565b600681101561262c5760405162461bcd60e51b815260206004820152601260248201527137b7363c9039b630bc901222b73534b6b7b760711b6044820152606401610817565b600061263833836107af565b116126795760405162461bcd60e51b81526020600482015260116024820152702737ba103cb7bab9101222b73534b6b7b760791b6044820152606401610817565b336000908152601160209081526040808320848452909152902054156126b15760405162461bcd60e51b815260040161081790615ae0565b6000818152600e602052604090206005810154600782015442916126d491615ce2565b116126f15760405162461bcd60e51b815260040161081790615b0e565b600081600b0154116127385760405162461bcd60e51b815260206004820152601060248201526f10d85b88139bdd081cdb185e481e595d60821b6044820152606401610817565b6000828152601060209081526040808320805490849055600b850184905560095482519384019092528383529261277f926001600160a01b03909216913391908590614519565b61278a8584866143b1565b6040517ff00fe229c364cb7bef0bfccbdeaf6b7e3bec08835157a4fa90f551649361f8b5906127c2903390869086908690429061583c565b60405180910390a15050505050565b604051627eeac760e11b81526000903090859082908490829062fdd58e906127ff90339087906004016157eb565b60206040518083038186803b15801561281757600080fd5b505afa15801561282b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061284f91906154cb565b1161285957600080fd5b60405163e985e9c560e01b8152309088908290819063e985e9c5906128849033908490600401615696565b60206040518083038186803b15801561289c57600080fd5b505afa1580156128b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128d491906153a3565b15156001146128e257600080fd5b60068a106129025760405162461bcd60e51b815260040161081790615a0d565b8861290d338c6107af565b101561295a5760405162461bcd60e51b815260206004820152601c60248201527b6e6f7420656e6f75676820746f6b656e7320617661696c61626c652160201b6044820152606401610817565b3360009081526011602090815260408083208d8452909152812080548b9290612984908490615ce2565b925050819055506000601480549050905060146040518060e00160405280838152602001306001600160a01b031681526020018d8152602001336001600160a01b031681526020018b81526020018c81526020016000151581525090806001815401808255809150506001900390600052602060002090600702016000909190919091506000820151816000015560208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506040820151816002015560608201518160030160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506080820151816004015560a0820151816005015560c08201518160060160006101000a81548160ff0219169083151502179055505050600160126000306001600160a01b03166001600160a01b0316815260200190815260200160002060008d815260200190815260200160002060006101000a81548160ff021916908315150217905550612b1b600960009054906101000a90046001600160a01b031660016125d7565b8060148281548110612b2f57612b2f615e1c565b90600052602060002090600702016000015414612b4e57612b4e615dda565b60408051828152602081018d90523081830152606081018c9052608081018b905290517fe11c6edf4ad885532ff587119be9d83321c443658190a3e9709c39dc61d7bdc79181900360a00190a19a9950505050505050505050565b6001600160a01b03821660009081526013602052604090205460ff161515600114612c0e5760405162461bcd60e51b8152602060048201526015602482015274576520646f6e2774206163636570742074686f736560581b6044820152606401610817565b8015801590612c1d5750600681105b612c2657600080fd5b600a54603290612c3f906001600160a01b0316836107af565b1015612c825760405162461bcd60e51b81526020600482015260126024820152712932b9b2b93b32b9902232b83632ba32b21760711b6044820152606401610817565b6008546040516323b872dd60e01b81526001600160a01b03808516926323b872dd92612cc09233921690690a968163f0a57b4000009060040161570e565b602060405180830381600087803b158015612cda57600080fd5b505af1158015612cee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d1291906153a3565b50600a546040805160208101909152600081526125e2916001600160a01b03169033908490600190614519565b612da36040518061018001604052806060815260200160608152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016060815260200160608152602001600081525090565b6000828152600e60205260409081902081516101808101909252805482908290612dcc90615d44565b80601f0160208091040260200160405190810160405280929190818152602001828054612df890615d44565b8015612e455780601f10612e1a57610100808354040283529160200191612e45565b820191906000526020600020905b815481529060010190602001808311612e2857829003601f168201915b50505050508152602001600182018054612e5e90615d44565b80601f0160208091040260200160405190810160405280929190818152602001828054612e8a90615d44565b8015612ed75780601f10612eac57610100808354040283529160200191612ed7565b820191906000526020600020905b815481529060010190602001808311612eba57829003601f168201915b5050505050815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820154815260200160088201548152602001600982018054612f3690615d44565b80601f0160208091040260200160405190810160405280929190818152602001828054612f6290615d44565b8015612faf5780601f10612f8457610100808354040283529160200191612faf565b820191906000526020600020905b815481529060010190602001808311612f9257829003601f168201915b50505050508152602001600a82018054612fc890615d44565b80601f0160208091040260200160405190810160405280929190818152602001828054612ff490615d44565b80156130415780601f1061301657610100808354040283529160200191613041565b820191906000526020600020905b81548152906001019060200180831161302457829003601f168201915b50505050508152602001600b820154815250509050919050565b600a54600090603290613077906001600160a01b0316836107af565b10156130c55760405162461bcd60e51b815260206004820152601d60248201527f66617563657420697320656d7074792c20636865636b206c617465722e0000006044820152606401610817565b6007543410156131105760405162461bcd60e51b815260206004820152601660248201527509cdee840cadcdeeaced040e8de40c6deeccae440e8f60531b6044820152606401610817565b600a546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015613149573d6000803e3d6000fd5b50600a5460408051602081019091526000808252613176926001600160a01b031691339190603290614519565b90565b6014548190811080156131af5750806014828154811061319b5761319b615e1c565b906000526020600020906007020160000154145b6131cb5760405162461bcd60e51b81526004016108179061594f565b81601481815481106131df576131df615e1c565b600091825260209091206006600790920201015460ff16156132135760405162461bcd60e51b81526004016108179061599f565b6014838154811061322657613226615e1c565b60009182526020909120600790910201600301546001600160a01b03163314156132a35760405162461bcd60e51b815260206004820152602860248201527f63616e6e6f742062757920796f7572206f776e206974656d2c2072656d6f7665604482015267081a5b9cdd19585960c21b6064820152608401610817565b601483815481106132b6576132b6615e1c565b90600052602060002090600702016004015434101561330f5760405162461bcd60e51b8152602060048201526015602482015274139bdd08195b9bdd59da08199d5b991cc81cd95b9d605a1b6044820152606401610817565b600a61331c3360006107af565b10156133625760405162461bcd60e51b81526020600482015260156024820152742cb7ba903732b232101898102aaaa5249036b4b71760591b6044820152606401610817565b60066014848154811061337757613377615e1c565b9060005260206000209060070201600201541061375b576000600e6000601486815481106133a7576133a7615e1c565b9060005260206000209060070201600201548152602001908152602001600020905042816005015482600701546133de9190615ce2565b1161342b5760405162461bcd60e51b815260206004820152601d60248201527f24456e6a696d6f6e277320696e20496d6d757461626c652044656174680000006044820152606401610817565b6000601160006014878154811061344457613444615e1c565b60009182526020808320600360079093020191909101546001600160a01b031683528201929092526040018120601480549192918890811061348857613488615e1c565b9060005260206000209060070201600201548152602001908152602001600020819055506001601485815481106134c1576134c1615e1c565b906000526020600020906007020160060160006101000a81548160ff0219169083151502179055506000601260006014878154811061350257613502615e1c565b60009182526020808320600160079093020191909101546001600160a01b031683528201929092526040018120601480549192918890811061354657613546615e1c565b906000526020600020906007020160020154815260200190815260200160002060006101000a81548160ff0219169083151502179055506135f56014858154811061359357613593615e1c565b906000526020600020906007020160030160009054906101000a90046001600160a01b031633601487815481106135cc576135cc615e1c565b906000526020600020906007020160020154600160405180602001604052806000815250614519565b6014848154811061360857613608615e1c565b600091825260208220600360079092020101546040516001600160a01b03909116913480156108fc02929091818181858888f19350505050158015613651573d6000803e3d6000fd5b506136a7336014868154811061366957613669615e1c565b906000526020600020906007020160030160009054906101000a90046001600160a01b03166000600560405180602001604052806000815250614519565b6136da33600a60009054906101000a90046001600160a01b03166000600260405180602001604052806000815250614519565b6136e733600060036143b1565b6003600b60008282546136fa9190615ce2565b925050819055507f4837b5404d7488f1441f68b751d9e858beb983aa3574bc719a2ccb348d9ff1f9843360016014888154811061373957613739615e1c565b9060005260206000209060070201600401546040516110429493929190615c6f565b6014838154811061376e5761376e615e1c565b906000526020600020906007020160050154601160006014868154811061379757613797615e1c565b60009182526020808320600360079093020191909101546001600160a01b03168352820192909252604001812060148054919291879081106137db576137db615e1c565b9060005260206000209060070201600201548152602001908152602001600020600082825461380a9190615d2d565b9250508190555060016014848154811061382657613826615e1c565b906000526020600020906007020160060160006101000a81548160ff0219169083151502179055506000601260006014868154811061386757613867615e1c565b60009182526020808320600160079093020191909101546001600160a01b03168352820192909252604001812060148054919291879081106138ab576138ab615e1c565b906000526020600020906007020160020154815260200190815260200160002060006101000a81548160ff02191690831515021790555061397d601484815481106138f8576138f8615e1c565b906000526020600020906007020160030160009054906101000a90046001600160a01b0316336014868154811061393157613931615e1c565b9060005260206000209060070201600201546014878154811061395657613956615e1c565b90600052602060002090600702016005015460405180602001604052806000815250614519565b6014838154811061399057613990615e1c565b600091825260208220600360079092020101546040516001600160a01b03909116913480156108fc02929091818181858888f193505050501580156139d9573d6000803e3d6000fd5b506139f1336014858154811061366957613669615e1c565b613a2433600a60009054906101000a90046001600160a01b03166000600260405180602001604052806000815250614519565b613a3133600060036143b1565b6003600b6000828254613a449190615ce2565b925050819055507ff5cd6af1a84d20f94426f2aa2d420b06231a715660d36dc2cb1f02b9ccd3c68d833360148681548110613a8157613a81615e1c565b90600052602060002090600702016005015460148781548110613aa657613aa6615e1c565b906000526020600020906007020160040154604051613ac89493929190615c6f565b60405180910390a1600080516020615f318339815191526000600b5442604051613af4939291906158de565b60405180910390a15b505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6001600160a01b038516331480613b4c5750613b4c8533613b02565b613baa5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b6064820152608401610817565b60068310613c7c576000838152600e60205260409020600581015460078201544291613bd591615ce2565b11613bf25760405162461bcd60e51b815260040161081790615b0e565b33600090815260116020908152604080832087845290915290205415613c2a5760405162461bcd60e51b815260040161081790615ae0565b613c38868686600186614519565b6040517f97399410e088fc717f9914df624e1996b73d9a196cc0ac88099a8b8059649a3d90613c6e903390889088908690615732565b60405180910390a150610d23565b33600090815260116020908152604080832083805290915290205415613cf0576000613ca93360006107af565b336000908152601160209081526040808320838052909152902054909150808211613cd357600080fd5b613cdd8183615d2d565b841115613ce957600080fd5b5050613d68565b33600090815260116020908152604080832086845290915290205415613d68576000613d1c33856107af565b33600090815260116020908152604080832088845290915290205490915080613d4588876107af565b11613d4f57600080fd5b613d598183615d2d565b841115613d6557600080fd5b50505b613d758585858585614519565b7f6295c61a2e18ceb1896e045e2fc54d792c8fc5f33f0d7988a9d289ddc104881d8585856040516127c29392919061570e565b33613db161257d565b6001600160a01b031614613dd75760405162461bcd60e51b815260040161081790615a7b565b6001600160a01b038116613e3c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610817565b613e45816149c5565b50565b6006811015613e695760405162461bcd60e51b815260040161081790615a0d565b6000613e763360026107af565b11613e8057600080fd5b6000613e8c33836107af565b11613e9657600080fd5b3360009081526011602090815260408083206002845290915290205415613eed573360008181526011602090815260408083206002808552925290912054918291613ee191906107af565b11613eeb57600080fd5b505b6000818152600e6020526040812090613f0633826107af565b9050600a8111613f285760405162461bcd60e51b815260040161081790615b43565b4282600501548360070154613f3d9190615ce2565b11613f5a5760405162461bcd60e51b815260040161081790615b0e565b613f6733600060056143b1565b613f7433600260016143b1565b613fa733600860009054906101000a90046001600160a01b03166000600560405180602001604052806000815250614519565b6005600b6000828254613fba9190615ce2565b9091555060009050613fca61462d565b905080836004016000828254610a889190615ce2565b33613fe961257d565b6001600160a01b03161461400f5760405162461bcd60e51b815260040161081790615a7b565b600682106140545760405162461bcd60e51b815260206004820152601260248201527131b0b73a10313ab937101222b73534b6b7b760711b6044820152606401610817565b8161410e5760065481106140b65760405162461bcd60e51b815260206004820152602360248201527f63616e2774206275726e20457363726f7765642076616c75652c20646563726560448201526261736560e81b6064820152608401610817565b6140c18383836143b1565b80600b60008282546140d39190615ce2565b90915550506040517fc8123f17312175ddaa6c965f2dac2047d4ff6fa35d18361f0af438fd8fd411bf90613ac8903390859085904290615877565b6141198383836143b1565b80600b600082825461412b9190615ce2565b90915550506040517fca86624bebda4b3a54e8ebc9edf494079bdb9b30f76236f9ee66daaa84a082e690613ac8903390859085904290615877565b60068110156141875760405162461bcd60e51b815260040161081790615b6c565b600061419333836107af565b1161419d57600080fd5b6000818152600e60205260408120906141b633826107af565b3360009081526011602090815260408083208380529091529020549091501561426c573360009081526011602090815260408083208380529091528120546006840154909190829061420990601b615ce2565b614214906032615ce2565b61421e9190615ce2565b90508083116142695760405162461bcd60e51b81526020600482015260176024820152766578636565647320617661696c61626c652055554a497360481b6044820152606401610817565b50505b42826005015483600701546142819190615ce2565b1161429e5760405162461bcd60e51b815260040161081790615b0e565b60068201546142ae90601b615ce2565b6142b9906032615ce2565b81116142d75760405162461bcd60e51b815260040161081790615ab0565b6142e433600060196143b1565b6142ef60198461485d565b60085460068301546143179133916001600160a01b0390911690600090610ef190601b615ce2565b6019600b600082825461432a9190615ce2565b9091555050426007830155600b820180546019919060009061434d908490615ce2565b925050819055506019600660008282546143679190615ce2565b90915550506040517ff8d25f5a58961b42fe7faca567e9b89b0c7ab40e6c27117deb95d1ca140fba5490613ac8903390869086904290615804565b6001600160a01b03163b151590565b6001600160a01b0383166144135760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b6064820152608401610817565b336144438185600061442487614af8565b61442d87614af8565b5050604080516020810190915260009052505050565b6000838152602081815260408083206001600160a01b0388168452909152902054828110156144c05760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b6064820152608401610817565b6000848152602081815260408083206001600160a01b0389811680865291845282852088870390558251898152938401889052909290861691600080516020615f11833981519152910160405180910390a45050505050565b6001600160a01b03841661453f5760405162461bcd60e51b8152600401610817906159c8565b3361455881878761454f88614af8565b610d2388614af8565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156145995760405162461bcd60e51b815260040161081790615a31565b6000858152602081815260408083206001600160a01b038b81168552925280832087850390559088168252812080548692906145d6908490615ce2565b909155505060408051868152602081018690526001600160a01b03808916928a82169291861691600080516020615f11833981519152910160405180910390a4614624828888888888614b43565b50505050505050565b6000600a444260405160200161464d929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c6146709190615dc6565b61467b906001615ce2565b905090565b81518351146146e25760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610817565b6001600160a01b0384166147085760405162461bcd60e51b8152600401610817906159c8565b3360005b84518110156147ef57600085828151811061472957614729615e1c565b60200260200101519050600085838151811061474757614747615e1c565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156147975760405162461bcd60e51b815260040161081790615a31565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906147d4908490615ce2565b92505081905550505050806147e890615dab565b905061470c565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161483f9291906158b0565b60405180910390a4614855818787878787614cb5565b505050505050565b600081815260106020526040812080549184919061487b8385615ce2565b9091555050600954604080516020810190915260008082526148ad9233926001600160a01b0390911691908790614519565b60008281526010602052604090205481906148c9908590615d2d565b14613afd57613afd615dda565b6001600160a01b0384166149365760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610817565b336149478160008761454f88614af8565b6000848152602081815260408083206001600160a01b038916845290915281208054859290614977908490615ce2565b909155505060408051858152602081018590526001600160a01b038088169260009291851691600080516020615f11833981519152910160405180910390a4610d2381600087878787614b43565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415614a8b5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610817565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110614b3257614b32615e1c565b602090810291909101015292915050565b614b55846001600160a01b03166143a2565b156148555760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190614b8e908990899088908890889060040161576f565b602060405180830381600087803b158015614ba857600080fd5b505af1925050508015614bd8575060408051601f3d908101601f19168201909252614bd5918101906153dd565b60015b614c8557614be4615e48565b806308c379a01415614c1e5750614bf9615e63565b80614c045750614c20565b8060405162461bcd60e51b815260040161081791906158f4565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610817565b6001600160e01b0319811663f23a6e6160e01b146146245760405162461bcd60e51b815260040161081790615907565b614cc7846001600160a01b03166143a2565b156148555760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190614d0090899089908890889088906004016156b0565b602060405180830381600087803b158015614d1a57600080fd5b505af1925050508015614d4a575060408051601f3d908101601f19168201909252614d47918101906153dd565b60015b614d5657614be4615e48565b6001600160e01b0319811663bc197c8160e01b146146245760405162461bcd60e51b815260040161081790615907565b828054614d9290615d44565b90600052602060002090601f016020900481019282614db45760008555614dfa565b82601f10614dcd57805160ff1916838001178555614dfa565b82800160010185558215614dfa579182015b82811115614dfa578251825591602001919060010190614ddf565b50614e06929150614e0a565b5090565b5b80821115614e065760008155600101614e0b565b80356001600160a01b03811681146125d257600080fd5b60008083601f840112614e4857600080fd5b5081356001600160401b03811115614e5f57600080fd5b6020830191508360208260051b8501011115614e7a57600080fd5b9250929050565b600082601f830112614e9257600080fd5b81356020614e9f82615cbf565b604051614eac8282615d7f565b8381528281019150858301600585901b87018401881015614ecc57600080fd5b60005b85811015614eeb57813584529284019290840190600101614ecf565b5090979650505050505050565b60008083601f840112614f0a57600080fd5b5081356001600160401b03811115614f2157600080fd5b602083019150836020828501011115614e7a57600080fd5b600082601f830112614f4a57600080fd5b81356001600160401b03811115614f6357614f63615e32565b604051614f7a601f8301601f191660200182615d7f565b818152846020838601011115614f8f57600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215614fbe57600080fd5b614fc782614e1f565b9392505050565b60008060408385031215614fe157600080fd5b614fea83614e1f565b9150614ff860208401614e1f565b90509250929050565b60008060008060008060008060a0898b03121561501d57600080fd5b61502689614e1f565b975061503460208a01614e1f565b965060408901356001600160401b038082111561505057600080fd5b61505c8c838d01614e36565b909850965060608b013591508082111561507557600080fd5b6150818c838d01614e36565b909650945060808b013591508082111561509a57600080fd5b506150a78b828c01614ef8565b999c989b5096995094979396929594505050565b600080600080600060a086880312156150d357600080fd5b6150dc86614e1f565b94506150ea60208701614e1f565b935060408601356001600160401b038082111561510657600080fd5b61511289838a01614e81565b9450606088013591508082111561512857600080fd5b61513489838a01614e81565b9350608088013591508082111561514a57600080fd5b5061515788828901614f39565b9150509295509295909350565b60008060008060008060a0878903121561517d57600080fd5b61518687614e1f565b955061519460208801614e1f565b9450604087013593506060870135925060808701356001600160401b038111156151bd57600080fd5b6151c989828a01614ef8565b979a9699509497509295939492505050565b600080600080600060a086880312156151f357600080fd5b6151fc86614e1f565b945061520a60208701614e1f565b9350604086013592506060860135915060808601356001600160401b0381111561523357600080fd5b61515788828901614f39565b6000806040838503121561525257600080fd5b61525b83614e1f565b9150602083013561526b81615eec565b809150509250929050565b6000806040838503121561528957600080fd5b61529283614e1f565b946020939093013593505050565b6000806000606084860312156152b557600080fd5b6152be84614e1f565b95602085013595506040909401359392505050565b600080604083850312156152e657600080fd5b82356001600160401b03808211156152fd57600080fd5b818501915085601f83011261531157600080fd5b8135602061531e82615cbf565b60405161532b8282615d7f565b8381528281019150858301600585901b870184018b101561534b57600080fd5b600096505b848710156153755761536181614e1f565b835260019690960195918301918301615350565b509650508601359250508082111561538c57600080fd5b5061539985828601614e81565b9150509250929050565b6000602082840312156153b557600080fd5b8151614fc781615eec565b6000602082840312156153d257600080fd5b8135614fc781615efa565b6000602082840312156153ef57600080fd5b8151614fc781615efa565b600080600080600080600080610100898b03121561541757600080fd5b88356001600160401b038082111561542e57600080fd5b61543a8c838d01614f39565b995060208b0135985060408b0135975060608b0135965060808b0135955060a08b0135945060c08b013591508082111561547357600080fd5b61547f8c838d01614f39565b935060e08b013591508082111561549557600080fd5b506154a28b828c01614f39565b9150509295985092959890939650565b6000602082840312156154c457600080fd5b5035919050565b6000602082840312156154dd57600080fd5b5051919050565b600080604083850312156154f757600080fd5b8235915060208301356001600160401b0381111561551457600080fd5b61539985828601614f39565b6000806040838503121561553357600080fd5b50508035926020909101359150565b60008060006060848603121561555757600080fd5b505081359360208301359350604090920135919050565b600081518084526020808501945080840160005b8381101561559e57815187529582019590820190600101615582565b509495945050505050565b6000815180845260005b818110156155cf576020818501810151868301820152016155b3565b818111156155e1576000602083870101525b50601f01601f19169290920160200192915050565b8054600090600181811c908083168061561057607f831692505b602080841082141561563257634e487b7160e01b600052602260045260246000fd5b8388526020880182801561564d576001811461565e57615689565b60ff19871682528282019750615689565b60008981526020902060005b878110156156835781548482015290860190840161566a565b83019850505b5050505050505092915050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0386811682528516602082015260a0604082018190526000906156dc9083018661556e565b82810360608401526156ee818661556e565b9050828103608084015261570281856155a9565b98975050505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615765908301846155f6565b9695505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906157a9908301846155a9565b979650505050505050565b6001600160a01b03851681526080602082018190526000906157d8908301866155a9565b6040830194909452506060015292915050565b6001600160a01b03929092168252602082015260400190565b60018060a01b038516815283602082015260806040820152600061582b60808301856155f6565b905082606083015295945050505050565b60018060a01b038616815284602082015260a06040820152600061586360a08301866155f6565b606083019490945250608001529392505050565b6001600160a01b0394909416845260208401929092526040830152606082015260800190565b602081526000614fc7602083018461556e565b6040815260006158c3604083018561556e565b82810360208401526158d5818561556e565b95945050505050565b9283526020830191909152604082015260600190565b602081526000614fc760208301846155a9565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6020808252600d908201526c18d85b89dd08199a5b99081a59609a1b604082015260600190565b6020808252600f908201526e6e6f7420656e6f7567682055554a4960881b604082015260600190565b6020808252600f908201526e1a5908185b1c9958591e481cdbdb19608a1b604082015260600190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252600a9082015269125b9d985b1a5908125160b21b604082015260600190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601690820152754e6f7420656e6f7567682055554a4920546f6b656e7360501b604082015260600190565b60208082526014908201527324456e6a696d6f6e20756e617661696c61626c6560601b604082015260600190565b6020808252818101527f24456e6a696d6f6e207265616368656420496d6d757461626c65204465617468604082015260600190565b6020808252600f908201526e4e6f7420656e6f7567682055554a4960881b604082015260600190565b6020808252600a90820152691a5b9d985b1a5908125160b21b604082015260600190565b6020815260008251610180806020850152615baf6101a08501836155a9565b91506020850151601f1980868503016040870152615bcd84836155a9565b93506040870151606087015260608701516080870152608087015160a087015260a087015160c087015260c087015160e087015260e08701519150610100828188015280880151925050610120828188015280880151925050610140818786030181880152615c3c85846155a9565b945080880151925050610160818786030181880152615c5b85846155a9565b970151959092019490945250929392505050565b9384526001600160a01b039290921660208401526040830152606082015260800190565b9485526001600160a01b0393909316602085015260408401919091526060830152608082015260a00190565b60006001600160401b03821115615cd857615cd8615e32565b5060051b60200190565b60008219821115615cf557615cf5615df0565b500190565b600082615d0957615d09615e06565b500490565b6000816000190483118215151615615d2857615d28615df0565b500290565b600082821015615d3f57615d3f615df0565b500390565b600181811c90821680615d5857607f821691505b60208210811415615d7957634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f191681016001600160401b0381118282101715615da457615da4615e32565b6040525050565b6000600019821415615dbf57615dbf615df0565b5060010190565b600082615dd557615dd5615e06565b500690565b634e487b7160e01b600052600160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d11156131765760046000803e5060005160e01c90565b600060443d1015615e715790565b6040516003193d81016004833e81513d6001600160401b038083116024840183101715615ea057505050505090565b8285019150815181811115615eb85750505050505090565b843d8701016020828501011115615ed25750505050505090565b615ee160208286010187615d7f565b509095945050505050565b8015158114613e4557600080fd5b6001600160e01b031981168114613e4557600080fdfec3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62cb9e94a45d17d54d2b850cc1a3468fac892fe9813f3638580bc7ff1ea0b80695a264697066735822122040dbac1934fe838d3dd03f8c93fd0fb5d95d22b255c44d9d7265bf07afbcad6b64736f6c6343000807003368747470733a2f2f6f78697463717578716334652e7573656d6f72616c69732e636f6d2f7b69647d2e6a736f6e496d6d757461626c6520576f726c64206f662057616c6c6574204d6f6e7374657273

Deployed ByteCode Sourcemap

40006:26501:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26371:231;;;;;;;;;;-1:-1:-1;26371:231:0;;;;;:::i;:::-;;:::i;:::-;;;40818:25:1;;;40806:2;40791:18;26371:231:0;;;;;;;;56180:1151;;;;;;;;;;-1:-1:-1;56180:1151:0;;;;;:::i;:::-;;:::i;:::-;;25394:310;;;;;;;;;;-1:-1:-1;25394:310:0;;;;;:::i;:::-;;:::i;:::-;;;20197:14:1;;20190:22;20172:41;;20160:2;20145:18;25394:310:0;20032:187:1;40361:18:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;43006:33::-;;;;;;;;;;-1:-1:-1;43006:33:0;;;;;:::i;:::-;;:::i;:::-;;;;41609:25:1;;;-1:-1:-1;;;;;41708:15:1;;;41703:2;41688:18;;41681:43;41740:18;;41733:34;;;;41803:15;;;;41798:2;41783:18;;41776:43;41850:3;41835:19;;41828:35;41661:3;41879:19;;41872:35;;;;41951:14;41944:22;41938:3;41923:19;;41916:51;41596:3;41581:19;43006:33:0;41284:689:1;26115:105:0;;;;;;;;;;-1:-1:-1;26115:105:0;;;;;:::i;:::-;;:::i;40713:45::-;;;;;;;;;;-1:-1:-1;40713:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;40580:54;;;;;;;;;;-1:-1:-1;40580:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;40528:45;;;;;;;;;;-1:-1:-1;40528:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;28310:442;;;;;;;;;;-1:-1:-1;28310:442:0;;;;;:::i;:::-;;:::i;40281:36::-;;;;;;;;;;-1:-1:-1;40281:36:0;;;;-1:-1:-1;;;;;40281:36:0;;;;;;-1:-1:-1;;;;;13852:32:1;;;13834:51;;13822:2;13807:18;40281:36:0;13688:203:1;51571:1549:0;;;;;;;;;;-1:-1:-1;51571:1549:0;;;;;:::i;:::-;;:::i;57337:359::-;;;;;;;;;;-1:-1:-1;57337:359:0;;;;;:::i;:::-;;:::i;26768:524::-;;;;;;;;;;-1:-1:-1;26768:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;53128:1023::-;;;;;;;;;;-1:-1:-1;53128:1023:0;;;;;:::i;:::-;;:::i;55182:990::-;;;;;;;;;;-1:-1:-1;55182:990:0;;;;;:::i;:::-;;:::i;46245:1341::-;;;;;;;;;;-1:-1:-1;46245:1341:0;;;;;:::i;:::-;;:::i;61961:1191::-;;;;;;;;;;-1:-1:-1;61961:1191:0;;;;;:::i;:::-;;:::i;45666:571::-;;;;;;;;;;-1:-1:-1;45666:571:0;;;;;:::i;:::-;;:::i;58201:896::-;;;;;;;;;;-1:-1:-1;58201:896:0;;;;;:::i;:::-;;:::i;65666:836::-;;;;;;;;;;-1:-1:-1;65666:836:0;;;;;:::i;:::-;;:::i;5600:103::-;;;;;;;;;;;;;:::i;40199:23::-;;;;;;;;;;;;;;;;4949:87;;;;;;;;;;;;;:::i;40386:20::-;;;;;;;;;;;;;:::i;49184:138::-;;;;;;;;;;-1:-1:-1;49184:138:0;;;;;:::i;:::-;;:::i;27365:155::-;;;;;;;;;;-1:-1:-1;27365:155:0;;;;;:::i;:::-;;:::i;49366:922::-;;;;;;;;;;-1:-1:-1;49366:922:0;;;;;:::i;:::-;;:::i;60977:968::-;;;;;;;;;;-1:-1:-1;60977:968:0;;;;;:::i;:::-;;:::i;48377:426::-;;;;;;;;;;-1:-1:-1;48377:426:0;;;;;:::i;:::-;;:::i;45191:295::-;;;;;;;;;;-1:-1:-1;45191:295:0;;;;;:::i;:::-;-1:-1:-1;;;45191:295:0;;;;;;;;;;;;;;-1:-1:-1;;;;;;20386:33:1;;;20368:52;;20356:2;20341:18;45191:295:0;20224:202:1;58057:122:0;;;;;;;;;;-1:-1:-1;58057:122:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;48815:361::-;;;:::i;63160:2494::-;;;;;;:::i;:::-;;:::i;27592:168::-;;;;;;;;;;-1:-1:-1;27592:168:0;;;;;:::i;:::-;;:::i;44916:263::-;;;;;;;;;;-1:-1:-1;44916:263:0;;;;;:::i;:::-;-1:-1:-1;;;44916:263:0;;;;;;;;;59183:1754;;;;;;;;;;-1:-1:-1;59183:1754:0;;;;;:::i;:::-;;:::i;5858:201::-;;;;;;;;;;-1:-1:-1;5858:201:0;;;;;:::i;:::-;;:::i;54159:1015::-;;;;;;;;;;-1:-1:-1;54159:1015:0;;;;;:::i;:::-;;:::i;47598:772::-;;;;;;;;;;-1:-1:-1;47598:772:0;;;;;:::i;:::-;;:::i;50301:1258::-;;;;;;;;;;-1:-1:-1;50301:1258:0;;;;;:::i;:::-;;:::i;26371:231::-;26457:7;-1:-1:-1;;;;;26485:21:0;;26477:77;;;;-1:-1:-1;;;26477:77:0;;23745:2:1;26477:77:0;;;23727:21:1;23784:2;23764:18;;;23757:30;23823:34;23803:18;;;23796:62;-1:-1:-1;;;23874:18:1;;;23867:41;23925:19;;26477:77:0;;;;;;;;;-1:-1:-1;26572:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;26572:22:0;;;;;;;;;;;;26371:231::o;56180:1151::-;56253:1;56242:7;:12;;56234:35;;;;-1:-1:-1;;;56234:35:0;;;;;;;:::i;:::-;56315:1;56288:24;56298:10;56310:1;56288:9;:24::i;:::-;:28;56280:52;;;;-1:-1:-1;;;56280:52:0;;30435:2:1;56280:52:0;;;30417:21:1;30474:2;30454:18;;;30447:30;-1:-1:-1;;;30493:18:1;;;30486:41;30544:18;;56280:52:0;30233:335:1;56280:52:0;56385:1;56352:30;56362:10;56374:7;56352:9;:30::i;:::-;:34;56344:43;;;;;;56418:10;56435:1;56412:17;;;:5;:17;;;;;;;;56430:1;56412:20;;;;;;;;:24;56409:169;;56485:10;56453:23;56479:17;;;:5;:17;;;;;;;;56497:1;56479:20;;;;;;;;;;;;56523:24;;56485:10;56523:9;:24::i;:::-;:42;56515:51;;;;;;56437:141;56409:169;56598:23;56623:22;;;:13;:22;;;;;;56675:24;56685:10;56598:23;56675:9;:24::i;:::-;56656:43;;56744:2;56730:11;:16;56722:51;;;;-1:-1:-1;;;56722:51:0;;;;;;;:::i;:::-;56831:15;56811:7;:17;;;56792:7;:16;;;:36;;;;:::i;:::-;:54;56784:99;;;;-1:-1:-1;;;56784:99:0;;;;;;;:::i;:::-;56905:23;56911:10;56923:1;56926;56905:5;:23::i;:::-;56940;56946:10;56958:1;56961;56940:5;:23::i;:::-;56975:49;56993:10;57005:8;;;;;;;;;-1:-1:-1;;;;;57005:8:0;57015:1;57018;56975:49;;;;;;;;;;;;:17;:49::i;:::-;57052:1;57037:12;;:16;;;;;;;:::i;:::-;;;;-1:-1:-1;57066:10:0;;-1:-1:-1;57079:12:0;:10;:12::i;:::-;57066:25;;57127:5;57104:7;:20;;;:28;;;;;;;:::i;:::-;;;;;;;;57159:1;57143:7;:13;;;:17;;;;;;;:::i;:::-;;;;-1:-1:-1;57191:11:0;;-1:-1:-1;57197:5:0;57191:3;:11;:::i;:::-;57171:7;:17;;;:32;;;;;;;:::i;:::-;;;;;;;;57231:1;57214:7;:15;;;:18;;;;;;;:::i;:::-;;;;;;;;57259:1;57243:7;:14;;;:17;;;;;;;:::i;:::-;;;;-1:-1:-1;;57293:12:0;;57278:45;;-1:-1:-1;;;;;;;;;;;57278:45:0;;;57290:1;;57293:12;57307:15;;57278:45;:::i;:::-;;;;;;;;56223:1108;;;56180:1151;:::o;25394:310::-;25496:4;-1:-1:-1;;;;;;25533:41:0;;-1:-1:-1;;;25533:41:0;;:110;;-1:-1:-1;;;;;;;25591:52:0;;-1:-1:-1;;;25591:52:0;25533:110;:163;;;-1:-1:-1;;;;;;;;;;16811:40:0;;;25660:36;25513:183;25394:310;-1:-1:-1;;25394:310:0:o;40361:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43006:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;43006:33:0;;;;;;;;;;;;;;;;:::o;26115:105::-;26175:13;26208:4;26201:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26115:105;;;:::o;28310:442::-;-1:-1:-1;;;;;28543:20:0;;3753:10;28543:20;;:60;;-1:-1:-1;28567:36:0;28584:4;3753:10;27592:168;:::i;28567:36::-;28521:160;;;;-1:-1:-1;;;28521:160:0;;28563:2:1;28521:160:0;;;28545:21:1;28602:2;28582:18;;;28575:30;28641:34;28621:18;;;28614:62;-1:-1:-1;;;28692:18:1;;;28685:48;28750:19;;28521:160:0;28361:414:1;28521:160:0;28692:52;28715:4;28721:2;28725:3;28730:7;28739:4;28692:22;:52::i;:::-;28310:442;;;;;:::o;51571:1549::-;51640:1;51629:7;:12;;51621:35;;;;-1:-1:-1;;;51621:35:0;;;;;;;:::i;:::-;51708:1;51675:30;51685:10;51697:7;51675:9;:30::i;:::-;:34;51667:43;;;;;;51731:23;51756:22;;;:13;:22;;;;;;51808:24;51818:10;51731:23;51808:9;:24::i;:::-;51863:10;51880:1;51857:17;;;:5;:17;;;;;;;;:20;;;;;;;;;51789:43;;-1:-1:-1;51857:24:0;51854:273;;51930:10;51898:23;51924:17;;;:5;:17;;;;;;;;:20;;;;;;;;;52004:13;;;;51924:20;;51898:23;51924:20;;51999:18;;:2;:18;:::i;:::-;51992:26;;:3;:26;:::i;:::-;51991:46;;;;:::i;:::-;51975:62;;52089:5;52075:11;:19;52067:48;;;;-1:-1:-1;;;52067:48:0;;27468:2:1;52067:48:0;;;27450:21:1;27507:2;27487:18;;;27480:30;-1:-1:-1;;;27526:18:1;;;27519:46;27582:18;;52067:48:0;27266:340:1;52067:48:0;51882:245;;51854:273;52195:10;;52173:7;:19;;;:32;;;;:::i;:::-;52155:15;:50;52147:59;;;;;;52252:13;;;;52247:18;;:2;:18;:::i;:::-;52240:26;;:3;:26;:::i;:::-;52225:11;:42;52217:70;;;;-1:-1:-1;;;52217:70:0;;;;;;;:::i;:::-;52346:15;52326:7;:17;;;52307:7;:16;;;:36;;;;:::i;:::-;:54;52299:99;;;;-1:-1:-1;;;52299:99:0;;;;;;;:::i;:::-;52417:25;52423:10;52435:1;52438:2;52417:5;:25::i;:::-;52454:20;52462:2;52466:7;52454;:20::i;:::-;52516:8;;52534:13;;;;52486:66;;52504:10;;-1:-1:-1;;;;;52516:8:0;;;;;;52529:18;;:2;:18;:::i;:::-;52486:66;;;;;;;;;;;;:17;:66::i;:::-;52579:2;52564:12;;:17;;;;;;;:::i;:::-;;;;-1:-1:-1;52601:10:0;;-1:-1:-1;52614:12:0;:10;:12::i;:::-;52601:25;;52678:15;52656:7;:19;;:37;;;;52719:1;52704:7;:13;;;:16;;;;;;;:::i;:::-;;;;-1:-1:-1;52751:12:0;;-1:-1:-1;52758:5:0;52751:4;:12;:::i;:::-;52731:7;:17;;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;52794:9:0;;-1:-1:-1;52798:5:0;52794:1;:9;:::i;:::-;52776:7;:15;;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;52832:9:0;;-1:-1:-1;52836:5:0;52832:1;:9;:::i;:::-;52815:7;:14;;;:27;;;;;;;:::i;:::-;;;;;;;;52875:5;52853:7;:20;;;:27;;;;;;;:::i;:::-;;;;;;;;52905:2;52891:7;:11;;;:16;;;;;;;:::i;:::-;;;;;;;;52950:2;52928:19;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;;52978:73:0;;;;;;52993:10;;53005:7;;53014;;53035:15;;52978:73;:::i;:::-;;;;;;;;-1:-1:-1;;;;;;;;;;;53079:1:0;53082:12;;53096:15;53067:45;;;;;;;;:::i;57337:359::-;57408:1;57397:7;:12;;57389:35;;;;-1:-1:-1;;;57389:35:0;;;;;;;:::i;:::-;57470:1;57443:24;57453:10;57465:1;57443:9;:24::i;:::-;:28;57435:49;;;;-1:-1:-1;;;57435:49:0;;23059:2:1;57435:49:0;;;23041:21:1;23098:1;23078:18;;;23071:29;-1:-1:-1;;;23116:18:1;;;23109:38;23164:18;;57435:49:0;22857:331:1;57435:49:0;57537:1;57504:30;57514:10;57526:7;57504:9;:30::i;:::-;:34;57496:43;;;;;;57555:23;57580:22;;;:13;:22;;;;;57615:23;57621:10;57633:1;57636;57615:5;:23::i;:::-;57671:15;57652:16;;;;:34;-1:-1:-1;57337:359:0:o;26768:524::-;26924:16;26985:3;:10;26966:8;:15;:29;26958:83;;;;-1:-1:-1;;;26958:83:0;;36620:2:1;26958:83:0;;;36602:21:1;36659:2;36639:18;;;36632:30;36698:34;36678:18;;;36671:62;-1:-1:-1;;;36749:18:1;;;36742:39;36798:19;;26958:83:0;36418:405:1;26958:83:0;27054:30;27101:8;:15;-1:-1:-1;;;;;27087:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27087:30:0;;27054:63;;27135:9;27130:122;27154:8;:15;27150:1;:19;27130:122;;;27210:30;27220:8;27229:1;27220:11;;;;;;;;:::i;:::-;;;;;;;27233:3;27237:1;27233:6;;;;;;;;:::i;:::-;;;;;;;27210:9;:30::i;:::-;27191:13;27205:1;27191:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;27171:3;;;:::i;:::-;;;27130:122;;;-1:-1:-1;27271:13:0;26768:524;-1:-1:-1;;;26768:524:0:o;53128:1023::-;53202:1;53191:7;:12;;53183:35;;;;-1:-1:-1;;;53183:35:0;;;;;;;:::i;:::-;53264:1;53237:24;53247:10;53259:1;53237:9;:24::i;:::-;:28;53229:37;;;;;;53319:1;53286:30;53296:10;53308:7;53286:9;:30::i;:::-;:34;53278:43;;;;;;53351:10;53368:1;53345:17;;;:5;:17;;;;;;;;53363:1;53345:20;;;;;;;;:24;53342:170;;53418:10;53386:23;53412:17;;;:5;:17;;;;;;;;53430:1;53412:20;;;;;;;;;;;;53456:24;;53418:10;53456:9;:24::i;:::-;:42;53448:51;;;;;;53370:142;53342:170;53532:23;53557:22;;;:13;:22;;;;;;53609:24;53619:10;53532:23;53609:9;:24::i;:::-;53590:43;;53676:2;53662:11;:16;53654:44;;;;-1:-1:-1;;;53654:44:0;;;;;;;:::i;:::-;53756:15;53736:7;:17;;;53717:7;:16;;;:36;;;;:::i;:::-;:54;53709:99;;;;-1:-1:-1;;;53709:99:0;;;;;;;:::i;:::-;53822:23;53828:10;53840:1;53843;53822:5;:23::i;:::-;53857;53863:10;53875:1;53878;53857:5;:23::i;:::-;53892:49;53910:10;53922:8;;;;;;;;;-1:-1:-1;;;;;53922:8:0;53932:1;53935;53892:49;;;;;;;;;;;;:17;:49::i;:::-;53970:1;53955:12;;:16;;;;;;;:::i;:::-;;;;-1:-1:-1;53984:10:0;;-1:-1:-1;53997:12:0;:10;:12::i;:::-;53984:25;-1:-1:-1;54030:8:0;54037:1;53984:25;54030:8;:::i;:::-;;;54073:5;54051:7;:20;;;:27;;;;;;;:::i;55182:990::-;55253:1;55242:7;:12;;55234:35;;;;-1:-1:-1;;;55234:35:0;;;;;;;:::i;:::-;55315:1;55288:24;55298:10;55310:1;55288:9;:24::i;:::-;:28;55280:37;;;;;;55370:1;55337:30;55347:10;55359:7;55337:9;:30::i;:::-;:34;55329:43;;;;;;55403:10;55420:1;55397:17;;;:5;:17;;;;;;;;55415:1;55397:20;;;;;;;;:24;55394:170;;55470:10;55438:23;55464:17;;;:5;:17;;;;;;;;55482:1;55464:20;;;;;;;;;;;;55508:24;;55470:10;55508:9;:24::i;:::-;:42;55500:51;;;;;;55422:142;55394:170;55584:23;55609:22;;;:13;:22;;;;;;55661:24;55671:10;55584:23;55661:9;:24::i;:::-;55642:43;;55720:2;55706:11;:16;55698:44;;;;-1:-1:-1;;;55698:44:0;;;;;;;:::i;:::-;55801:15;55781:7;:17;;;55762:7;:16;;;:36;;;;:::i;:::-;:54;55754:99;;;;-1:-1:-1;;;55754:99:0;;;;;;;:::i;:::-;55874:23;55880:10;55892:1;55895;55874:5;:23::i;:::-;55909;55915:10;55927:1;55930;55909:5;:23::i;:::-;55944:49;55962:10;55974:8;;;;;;;;;-1:-1:-1;;;;;55974:8:0;55984:1;55987;55944:49;;;;;;;;;;;;:17;:49::i;:::-;56019:1;56004:12;;:16;;;;;;;:::i;:::-;;;;-1:-1:-1;56033:10:0;;-1:-1:-1;56046:12:0;:10;:12::i;:::-;56033:25;;56096:5;56079:7;:15;;;:22;;;;;;;:::i;46245:1341::-;46342:13;;-1:-1:-1;;;;;46342:13:0;46328:10;:27;;46320:51;;;;-1:-1:-1;;;46320:51:0;;32978:2:1;46320:51:0;;;32960:21:1;33017:2;32997:18;;;32990:30;-1:-1:-1;;;33036:18:1;;;33029:41;33087:18;;46320:51:0;32776:335:1;46320:51:0;46391:11;46383:34;;;;-1:-1:-1;;;46383:34:0;;;;;;;:::i;:::-;46438:6;46448:1;46438:11;;46430:34;;;;-1:-1:-1;;;46430:34:0;;;;;;;:::i;:::-;46494:1;46485:6;:10;46477:42;;;;-1:-1:-1;;;46477:42:0;;22019:2:1;46477:42:0;;;22001:21:1;22058:2;22038:18;;;22031:30;-1:-1:-1;;;22077:18:1;;;22070:49;22136:18;;46477:42:0;21817:343:1;46477:42:0;46569:11;46574:6;46569:2;:11;:::i;:::-;46540:24;46550:10;46562:1;46540:9;:24::i;:::-;:41;;46532:69;;;;-1:-1:-1;;;46532:69:0;;;;;;;:::i;:::-;46658:1;46649:6;:10;46646:623;;;46691:13;46707:11;:6;46716:2;46707:11;:::i;:::-;46691:27;-1:-1:-1;46734:11:0;46749:12;46760:1;46691:27;46749:12;:::i;:::-;46734:27;;46807:6;46792:12;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;46831:28:0;;-1:-1:-1;46837:10:0;46849:1;46852:6;46831:5;:28::i;:::-;46875:54;46893:10;46905:8;;;;;;;;;-1:-1:-1;;;;;46905:8:0;46915:1;46918:6;46875:54;;;;;;;;;;;;:17;:54::i;:::-;-1:-1:-1;;;;;;;;;;;46975:1:0;46978:12;;46992:15;46963:45;;;;;;;;:::i;:::-;;;;;;;;46660:363;;46646:623;;;47080:2;47065:12;;:17;;;;;;;:::i;:::-;;;;-1:-1:-1;47098:24:0;;-1:-1:-1;47104:10:0;47116:1;47119:2;47098:5;:24::i;:::-;47138:50;47156:10;47168:8;;;;;;;;;-1:-1:-1;;;;;47168:8:0;47178:1;47181:2;47138:50;;;;;;;;;;;;:17;:50::i;:::-;-1:-1:-1;;;;;;;;;;;47223:1:0;47226:12;;47240:15;47211:45;;;;;;;;:::i;:::-;;;;;;;;46646:623;47290:37;47296:10;47308:6;47316;47290:37;;;;;;;;;;;;:5;:37::i;:::-;47350:43;47367:10;47387:4;47350:16;:43::i;:::-;47347:135;;47450:13;;47432:38;;-1:-1:-1;;;;;47450:13:0;;47432:17;:38::i;:::-;47517:59;47532:10;47544:6;47552;47560:15;47517:59;;;;;;;;;:::i;:::-;;;;;;;;46245:1341;;:::o;61961:1191::-;43228:44;;-1:-1:-1;;;43228:44:0;;62123:7;;62050:4;;62056:7;;62050:4;;62123:7;;62050:4;;43228:23;;:44;;43252:10;;62056:7;;43228:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;43220:57;;;;;;43477::::1;::::0;-1:-1:-1;;;43477:57:0;;62093:4:::1;::::0;62099:7;;62093:4;;;;43477:30:::1;::::0;:57:::1;::::0;43508:10:::1;::::0;62093:4;;43477:57:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:65;;43538:4;43477:65;43469:74;;;::::0;::::1;;62165:1:::2;62154:7;:12;;62146:35;;;;-1:-1:-1::0;;;62146:35:0::2;;;;;;;:::i;:::-;62204:30;62214:10;62226:7;62204:9;:30::i;:::-;62238:1;62204:35;62196:59;;;::::0;-1:-1:-1;;;62196:59:0;;31484:2:1;62196:59:0::2;::::0;::::2;31466:21:1::0;31523:2;31503:18;;;31496:30;-1:-1:-1;;;31542:18:1;;;31535:41;31593:18;;62196:59:0::2;31282:335:1::0;62196:59:0::2;62298:4;62278:26;::::0;;;:11:::2;:26;::::0;;;;;;;:35;;;;;;;;;::::2;;:44;62270:77;;;::::0;-1:-1:-1;;;62270:77:0;;34030:2:1;62270:77:0::2;::::0;::::2;34012:21:1::0;34069:2;34049:18;;;34042:30;-1:-1:-1;;;34088:18:1;;;34081:51;34149:18;;62270:77:0::2;33828:345:1::0;62270:77:0::2;62364:23;62389:22:::0;;;:13:::2;:22;::::0;;;;62457:17:::2;::::0;::::2;::::0;62438:16:::2;::::0;::::2;::::0;62477:15:::2;::::0;62438:36:::2;::::0;::::2;:::i;:::-;:54;62430:94;;;::::0;-1:-1:-1;;;62430:94:0;;38524:2:1;62430:94:0::2;::::0;::::2;38506:21:1::0;38563:2;38543:18;;;38536:30;-1:-1:-1;;;38582:18:1;;;38575:57;38649:18;;62430:94:0::2;38322:351:1::0;62430:94:0::2;62594:1;62565:5;:17;62571:10;-1:-1:-1::0;;;;;62565:17:0::2;-1:-1:-1::0;;;;;62565:17:0::2;;;;;;;;;;;;:26;62583:7;62565:26;;;;;;;;;;;:30;;;;62624:17;62644:12;:19;;;;62624:39;;62692:12;62710:90;;;;;;;;62722:9;62710:90;;;;62741:4;-1:-1:-1::0;;;;;62710:90:0::2;;;;;62748:7;62710:90;;;;62765:10;-1:-1:-1::0;;;;;62710:90:0::2;;;;;62778:11;62710:90;;;;62791:1;62710:90;;;;62794:5;62710:90;;;;::::0;62692:109:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;62692:109:0::2;;;;;-1:-1:-1::0;;;;;62692:109:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;62692:109:0::2;;;;;-1:-1:-1::0;;;;;62692:109:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62868:4;62830:11;:26;62850:4;-1:-1:-1::0;;;;;62830:26:0::2;-1:-1:-1::0;;;;;62830:26:0::2;;;;;;;;;;;;:35;62857:7;62830:35;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;62887:38;62905:13;;;;;;;;;-1:-1:-1::0;;;;;62905:13:0::2;62920:4;62887:17;:38::i;:::-;62991:9;62961:12;62974:9;62961:23;;;;;;;;:::i;:::-;;;;;;;;;;;:26;;;:39;62954:47;;;;:::i;:::-;63021:60;::::0;;43378:25:1;;;43434:2;43419:18;;43412:34;;;63062:4:0::2;43462:18:1::0;;;43455:60;43546:2;43531:18;;43524:34;;;63021:60:0;;::::2;::::0;;;;43365:3:1;63021:60:0;;::::2;63117:9:::0;61961:1191;-1:-1:-1;;;;;;;;;;61961:1191:0:o;45666:571::-;3753:10;5169:7;:5;:7::i;:::-;-1:-1:-1;;;;;5169:23:0;;5161:68;;;;-1:-1:-1;;;5161:68:0;;;;;;;:::i;:::-;45904:134:::1;;;;;;;;45912:11;45904:134;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;45904:134:0::1;;::::0;::::1;;;;45935:12;45904:134;;;;45949:7;45904:134;;;;45958:6;45904:134;;;;45966:9;45904:134;;;;45977:5;45904:134;;;;45984:15;45904:134;;;;46001:15;45904:134;;;;46018:11;45904:134;;;;46031:3;45904:134;;;;46036:1;45904:134;;::::0;45880:13:::1;:21;45894:6;;45880:21;;;;;;;;;;;:158;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;45880:158:0::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;45880:158:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;45880:158:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;46059:32;46065:10;46077:6;;46085:1;46059:32;;;;;;;;;;;::::0;:5:::1;:32::i;:::-;46137:58;46146:10;46158:11;46171:6;;46179:15;46137:58;;;;;;;;;:::i;:::-;;;;;;;;46216:6;:8:::0;;;:6:::1;:8;::::0;::::1;:::i;:::-;;;;;;45666:571:::0;;;;;;;;:::o;58201:896::-;58278:22;58339:1;58326:9;:14;;58318:54;;;;-1:-1:-1;;;58318:54:0;;24564:2:1;58318:54:0;;;24546:21:1;24603:2;24583:18;;;24576:30;-1:-1:-1;;;24622:18:1;;;24615:57;24689:18;;58318:54:0;24362:351:1;58318:54:0;58426:1;58391:32;58401:10;58413:9;58391;:32::i;:::-;:36;58383:90;;;;-1:-1:-1;;;58383:90:0;;38880:2:1;58383:90:0;;;38862:21:1;38919:2;38899:18;;;38892:30;38958:34;38938:18;;;38931:62;-1:-1:-1;;;39009:18:1;;;39002:39;39058:19;;58383:90:0;38678:405:1;58383:90:0;58519:2;58492:24;58502:10;58514:1;58492:9;:24::i;:::-;:29;58484:57;;;;-1:-1:-1;;;58484:57:0;;;;;;;:::i;:::-;58562:23;58587:24;;;:13;:24;;;;;58649:17;;;;58630:16;;;;58669:15;;58630:36;;;:::i;:::-;:54;58622:99;;;;-1:-1:-1;;;58622:99:0;;;;;;;:::i;:::-;58735:23;58741:10;58753:1;58756;58735:5;:23::i;:::-;58769:49;58787:10;58799:8;;;;;;;;;-1:-1:-1;;;;;58799:8:0;58809:1;58812;58769:49;;;;;;;;;;;;:17;:49::i;:::-;58829:21;58837:1;58840:9;58829:7;:21::i;:::-;58876:1;58861:12;;:16;;;;;;;:::i;:::-;;;;-1:-1:-1;;58890:24:0;;;;:16;;;;:24;;;;;:::i;:::-;;58939:1;58925:7;:11;;;:15;;;;;;;:::i;:::-;;;;;;;;58983:1;58961:19;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;;59015:12:0;;59000:45;;-1:-1:-1;;;;;;;;;;;59000:45:0;;;59012:1;;59015:12;59029:15;;59000:45;:::i;:::-;;;;;;;;59063:7;:16;;59056:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58201:896;;;;:::o;65666:836::-;43647:12;:19;65741:12;;65715:2;;43642:24;;:53;;;;;43693:2;43670:12;43683:2;43670:16;;;;;;;;:::i;:::-;;;;;;;;;;;:19;;;:25;43642:53;43634:78;;;;-1:-1:-1;;;43634:78:0;;;;;;;:::i;:::-;65729:2:::1;43810:12;43823:2;43810:16;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:23:::1;:16;::::0;;::::1;;:23;::::0;::::1;;:32;43802:59;;;;-1:-1:-1::0;;;43802:59:0::1;;;;;;;:::i;:::-;65791:12:::2;65804:2;65791:16;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;;:23;;::::0;-1:-1:-1;;;;;65791:23:0::2;65777:10;:37;65769:46;;;::::0;::::2;;65903:5;65832:11;:42;65844:12;65857:2;65844:16;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:29:::2;:16;::::0;;::::2;;:29:::0;;;::::2;::::0;-1:-1:-1;;;;;65844:29:0::2;65832:42:::0;;;::::2;::::0;;;;;;;;65875:12:::2;:16:::0;;65832:42;;65844:16;65888:2;;65875:16;::::2;;;;;:::i;:::-;;;;;;;;;;;:24;;;65832:68;;;;;;;;;;;;:76;;;;;;;;;;;;;;;;;;65949:4;65923:12;65936:2;65923:16;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;;:30;;;;;;;;;;;;;;;;;;66017:12;66030:2;66017:16;;;;;;;;:::i;:::-;;;;;;;;;;;:22;;;65970:5;:17;65976:10;-1:-1:-1::0;;;;;65970:17:0::2;-1:-1:-1::0;;;;;65970:17:0::2;;;;;;;;;;;;:43;65988:12;66001:2;65988:16;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;;65970:43;;;;;;;;;;;;:69;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;66076:12:0::2;:16:::0;;66089:2;;66076:16;::::2;;;;;:::i;:::-;;::::0;;;::::2;::::0;;::::2;::::0;;::::2;;66069:23:::0;;;::::2;::::0;::::2;::::0;;-1:-1:-1;;;;;;66069:23:0;;::::2;::::0;;;::::2;::::0;::::2;::::0;;;::::2;::::0;::::2;::::0;;;;::::2;::::0;;::::2;::::0;::::2;::::0;;;::::2;::::0;::::2;::::0;;;;::::2;::::0;;::::2;::::0;;-1:-1:-1;;66069:23:0::2;::::0;;66112:12:::2;:16:::0;;66125:2;;66112:16;::::2;;;;;:::i;:::-;;;;;;;;;;;:24;;;:29;66109:320;;66166:102;66181:2;66185:10;66197:12;66210:2;66197:16;;;;;;;;:::i;:::-;;;;;;;;;;;:22;;;66222:12;66235:2;66222:16;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;;66252:15;66166:102;;;;;;;;;;:::i;:::-;;;;;;;;66109:320;;;66313:99;66325:2;66329:10;66341:12;66354:2;66341:16;;;;;;;;:::i;:::-;;;;;;;;;;;:22;;;66366:12;66379:2;66366:16;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;;66396:15;66313:99;;;;;;;;;;:::i;:::-;;;;;;;;66109:320;43727:1:::1;65666:836:::0;;;;:::o;5600:103::-;3753:10;5169:7;:5;:7::i;:::-;-1:-1:-1;;;;;5169:23:0;;5161:68;;;;-1:-1:-1;;;5161:68:0;;;;;;;:::i;:::-;5665:30:::1;5692:1;5665:18;:30::i;:::-;5600:103::o:0;4949:87::-;5022:6;;-1:-1:-1;;;;;5022:6:0;;4949:87::o;40386:20::-;;;;;;;:::i;49184:138::-;49240:4;3753:10;5169:7;:5;:7::i;:::-;-1:-1:-1;;;;;5169:23:0;;5161:68;;;;-1:-1:-1;;;5161:68:0;;;;;;;:::i;:::-;-1:-1:-1;49260:11:0::1;:19:::0;;;49274:5;5240:1:::1;49184:138:::0;;;:::o;27365:155::-;27460:52;3753:10;27493:8;27503;27460:18;:52::i;:::-;27365:155;;:::o;49366:922::-;49488:1;49475:9;:14;;49467:45;;;;-1:-1:-1;;;49467:45:0;;22367:2:1;49467:45:0;;;22349:21:1;22406:2;22386:18;;;22379:30;-1:-1:-1;;;22425:18:1;;;22418:48;22483:18;;49467:45:0;22165:342:1;49467:45:0;49567:1;49532:32;49542:10;49554:9;49532;:32::i;:::-;:36;49524:66;;;;-1:-1:-1;;;49524:66:0;;30089:2:1;49524:66:0;;;30071:21:1;30128:2;30108:18;;;30101:30;-1:-1:-1;;;30147:18:1;;;30140:47;30204:18;;49524:66:0;29887:341:1;49524:66:0;49616:10;49610:17;;;;:5;:17;;;;;;;;:28;;;;;;;;;:33;49602:66;;;;-1:-1:-1;;;49602:66:0;;;;;;;:::i;:::-;49699:23;49724:24;;;:13;:24;;;;;49796:17;;;;49777:16;;;;49816:15;;49777:36;;;:::i;:::-;:54;49769:99;;;;-1:-1:-1;;;49769:99:0;;;;;;;:::i;:::-;49901:1;49887:7;:11;;;:15;49879:44;;;;-1:-1:-1;;;49879:44:0;;22714:2:1;49879:44:0;;;22696:21:1;22753:2;22733:18;;;22726:30;-1:-1:-1;;;22772:18:1;;;22765:46;22828:18;;49879:44:0;22512:340:1;49879:44:0;49936:15;49954:21;;;:10;:21;;;;;;;;;;49987:25;;;;50025:11;;;:15;;;50084:13;;50066:60;;;;;;;;;;;49954:21;50066:60;;-1:-1:-1;;;;;50084:13:0;;;;50099:10;;49936:15;49954:21;;50066:17;:60::i;:::-;50138:33;50144:7;50153:9;50164:6;50138:5;:33::i;:::-;50198:82;;;;;;50212:10;;50224:9;;50235:7;;50255;;50264:15;;50198:82;:::i;:::-;;;;;;;;49445:843;;49366:922;;;:::o;60977:968::-;43228:44;;-1:-1:-1;;;43228:44:0;;61150:7;;61077:4;;61083:7;;61077:4;;61150:7;;61077:4;;43228:23;;:44;;43252:10;;61083:7;;43228:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;43220:57;;;;;;43477::::1;::::0;-1:-1:-1;;;43477:57:0;;61120:4:::1;::::0;61126:7;;61120:4;;;;43477:30:::1;::::0;:57:::1;::::0;43508:10:::1;::::0;61120:4;;43477:57:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:65;;43538:4;43477:65;43469:74;;;::::0;::::1;;61191:1:::2;61181:7;:11;61173:34;;;;-1:-1:-1::0;;;61173:34:0::2;;;;;;;:::i;:::-;61264:5;61230:30;61240:10;61252:7;61230:9;:30::i;:::-;:39;;61222:80;;;::::0;-1:-1:-1;;;61222:80:0;;30775:2:1;61222:80:0::2;::::0;::::2;30757:21:1::0;30814:2;30794:18;;;30787:30;-1:-1:-1;;;30833:18:1;;;30826:58;30901:18;;61222:80:0::2;30573:352:1::0;61222:80:0::2;61337:10;61331:17;::::0;;;:5:::2;:17;::::0;;;;;;;:26;;;;;;;;:35;;61361:5;;61331:17;:35:::2;::::0;61361:5;;61331:35:::2;:::i;:::-;;;;;;;;61400:17;61420:12;:19;;;;61400:39;;61468:12;61486:94;;;;;;;;61498:9;61486:94;;;;61517:4;-1:-1:-1::0;;;;;61486:94:0::2;;;;;61524:7;61486:94;;;;61541:10;-1:-1:-1::0;;;;;61486:94:0::2;;;;;61554:11;61486:94;;;;61567:5;61486:94;;;;61574:5;61486:94;;;;::::0;61468:113:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;61468:113:0::2;;;;;-1:-1:-1::0;;;;;61468:113:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;61468:113:0::2;;;;;-1:-1:-1::0;;;;;61468:113:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61648:4;61610:11;:26;61630:4;-1:-1:-1::0;;;;;61610:26:0::2;-1:-1:-1::0;;;;;61610:26:0::2;;;;;;;;;;;;:35;61637:7;61610:35;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;61668:38;61686:13;;;;;;;;;-1:-1:-1::0;;;;;61686:13:0::2;61701:4;61668:17;:38::i;:::-;61776:9;61746:12;61759:9;61746:23;;;;;;;;:::i;:::-;;;;;;;;;;;:26;;;:39;61739:47;;;;:::i;:::-;61806:64;::::0;;43828:25:1;;;43884:2;43869:18;;43862:34;;;61844:4:0::2;43912:18:1::0;;;43905:60;43996:2;43981:18;;43974:34;;;44039:3;44024:19;;44017:35;;;61806:64:0;;::::2;::::0;;;;43815:3:1;61806:64:0;;::::2;61910:9:::0;60977:968;-1:-1:-1;;;;;;;;;;60977:968:0:o;48377:426::-;-1:-1:-1;;;;;48448:20:0;;;;;;:13;:20;;;;;;;;:28;;:20;:28;48440:62;;;;-1:-1:-1;;;48440:62:0;;26432:2:1;48440:62:0;;;26414:21:1;26471:2;26451:18;;;26444:30;-1:-1:-1;;;26490:18:1;;;26483:51;26551:18;;48440:62:0;26230:345:1;48440:62:0;48521:12;;;;;:27;;;48547:1;48537:7;:11;48521:27;48513:36;;;;;;48578:13;;48605:2;;48568:33;;-1:-1:-1;;;;;48578:13:0;48593:7;48568:9;:33::i;:::-;:39;;48560:70;;;;-1:-1:-1;;;48560:70:0;;29742:2:1;48560:70:0;;;29724:21:1;29781:2;29761:18;;;29754:30;-1:-1:-1;;;29800:18:1;;;29793:48;29858:18;;48560:70:0;29540:342:1;48560:70:0;48692:8;;48653:65;;-1:-1:-1;;;48653:65:0;;-1:-1:-1;;;;;48653:26:0;;;;;;:65;;48680:10;;48692:8;;48702:15;;48653:65;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;48749:13:0;;48731:60;;;;;;;;;48749:13;48731:60;;;;-1:-1:-1;;;;;48749:13:0;;48764:10;;48776:7;;48749:13;;48731:17;:60::i;58057:122::-;58119:14;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58119:14:0;58152:22;;;;:13;:22;;;;;;;58145:29;;;;;;;;;;;;58152:22;;58145:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58057:122;;;:::o;48815:361::-;48896:13;;48856:10;;48917:2;;48886:27;;-1:-1:-1;;;;;48896:13:0;48856:10;48886:9;:27::i;:::-;:33;;48878:75;;;;-1:-1:-1;;;48878:75:0;;35133:2:1;48878:75:0;;;35115:21:1;35172:2;35152:18;;;35145:30;35211:31;35191:18;;;35184:59;35260:18;;48878:75:0;34931:353:1;48878:75:0;48985:11;;48972:9;:24;;48964:59;;;;-1:-1:-1;;;48964:59:0;;29391:2:1;48964:59:0;;;29373:21:1;29430:2;29410:18;;;29403:30;-1:-1:-1;;;29449:18:1;;;29442:52;29511:18;;48964:59:0;29189:346:1;48964:59:0;49044:13;;:33;;-1:-1:-1;;;;;49044:13:0;;;;49067:9;49044:33;;;;;:13;:33;:13;:33;49067:9;49044:13;:33;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49106:13:0;;49088:55;;;;;;;;;49106:13;49088:55;;;;;-1:-1:-1;;;;;49106:13:0;;49121:10;;49106:13;49136:2;;49088:17;:55::i;:::-;48815:361;:::o;63160:2494::-;43647:12;:19;63214:2;;43642:24;;:53;;;;;43693:2;43670:12;43683:2;43670:16;;;;;;;;:::i;:::-;;;;;;;;;;;:19;;;:25;43642:53;43634:78;;;;-1:-1:-1;;;43634:78:0;;;;;;;:::i;:::-;63228:2:::1;43810:12;43823:2;43810:16;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:23:::1;:16;::::0;;::::1;;:23;::::0;::::1;;:32;43802:59;;;;-1:-1:-1::0;;;43802:59:0::1;;;;;;;:::i;:::-;63269:12:::2;63282:2;63269:16;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;;:23;;::::0;-1:-1:-1;;;;;63269:23:0::2;63255:10;:37;;63247:90;;;::::0;-1:-1:-1;;;63247:90:0;;28982:2:1;63247:90:0::2;::::0;::::2;28964:21:1::0;29021:2;29001:18;;;28994:30;29060:34;29040:18;;;29033:62;-1:-1:-1;;;29111:18:1;;;29104:38;29159:19;;63247:90:0::2;28780:404:1::0;63247:90:0::2;63373:12;63386:2;63373:16;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;;63360:9;:41;;63352:75;;;::::0;-1:-1:-1;;;63352:75:0;;23395:2:1;63352:75:0::2;::::0;::::2;23377:21:1::0;23434:2;23414:18;;;23407:30;-1:-1:-1;;;23453:18:1;;;23446:51;23514:18;;63352:75:0::2;23193:345:1::0;63352:75:0::2;63479:2;63451:24;63461:10;63473:1;63451:9;:24::i;:::-;:30;;63443:64;;;::::0;-1:-1:-1;;;63443:64:0;;25325:2:1;63443:64:0::2;::::0;::::2;25307:21:1::0;25364:2;25344:18;;;25337:30;-1:-1:-1;;;25383:18:1;;;25376:51;25444:18;;63443:64:0::2;25123:345:1::0;63443:64:0::2;63573:1;63545:12;63558:2;63545:16;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;;:29;63542:2088;;63608:23;63633:13;:39;63647:12;63660:2;63647:16;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;;63633:39;;;;;;;;;;;63608:64;;63738:15;63718:7;:17;;;63699:7;:16;;;:36;;;;:::i;:::-;:54;63691:96;;;::::0;-1:-1:-1;;;63691:96:0;;35491:2:1;63691:96:0::2;::::0;::::2;35473:21:1::0;35530:2;35510:18;;;35503:30;35569:31;35549:18;;;35542:59;35618:18;;63691:96:0::2;35289:353:1::0;63691:96:0::2;63867:1;63808:5;:30;63814:12;63827:2;63814:16;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:23:::2;:16;::::0;;::::2;;:23:::0;;;::::2;::::0;-1:-1:-1;;;;;63814:23:0::2;63808:30:::0;;;::::2;::::0;;;;;;;;63839:12:::2;:16:::0;;63808:30;;63814:16;63852:2;;63839:16;::::2;;;;;:::i;:::-;;;;;;;;;;;:24;;;63808:56;;;;;;;;;;;:60;;;;63915:4;63889:12;63902:2;63889:16;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;;:30;;;;;;;;;;;;;;;;;;64010:5;63939:11;:42;63951:12;63964:2;63951:16;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:29:::2;:16;::::0;;::::2;;:29:::0;;;::::2;::::0;-1:-1:-1;;;;;63951:29:0::2;63939:42:::0;;;::::2;::::0;;;;;;;;63982:12:::2;:16:::0;;63939:42;;63951:16;63995:2;;63982:16;::::2;;;;;:::i;:::-;;;;;;;;;;;:24;;;63939:68;;;;;;;;;;;;:76;;;;;;;;;;;;;;;;;;64049:87;64067:12;64080:2;64067:16;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;;;;;;;;;-1:-1:-1::0;;;;;64067:23:0::2;64092:10;64104:12;64117:2;64104:16;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;;64130:1;64049:87;;;;;;;;;;;::::0;:17:::2;:87::i;:::-;64156:12;64169:2;64156:16;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;:23:::2;:16;::::0;;::::2;;:23;::::0;:43:::2;::::0;-1:-1:-1;;;;;64156:23:0;;::::2;::::0;64189:9:::2;64156:43:::0;::::2;;;::::0;64189:9;;64156:43;:16;:43;64189:9;64156:23;:43;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;64267:64;64285:10;64297:12;64310:2;64297:16;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;;;;;;;;;-1:-1:-1::0;;;;;64297:23:0::2;64322:1;64325;64267:64;;;;;;;;;;;::::0;:17:::2;:64::i;:::-;64350:54;64368:10;64380:13;;;;;;;;;-1:-1:-1::0;;;;;64380:13:0::2;64395:1;64398;64350:54;;;;;;;;;;;::::0;:17:::2;:54::i;:::-;64423:23;64429:10;64441:1;64444;64423:5;:23::i;:::-;64479:1;64465:12;;:15;;;;;;;:::i;:::-;;;;;;;;64506:60;64518:2;64522:10;64534:1;64537:12;64550:2;64537:16;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;;64506:60;;;;;;;;;:::i;63542:2088::-;64779:12;64792:2;64779:16;;;;;;;;:::i;:::-;;;;;;;;;;;:22;;;64720:5;:30;64726:12;64739:2;64726:16;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:23:::2;:16;::::0;;::::2;;:23:::0;;;::::2;::::0;-1:-1:-1;;;;;64726:23:0::2;64720:30:::0;;;::::2;::::0;;;;;;;;64751:12:::2;:16:::0;;64720:30;;64726:16;64764:2;;64751:16;::::2;;;;;:::i;:::-;;;;;;;;;;;:24;;;64720:56;;;;;;;;;;;;:81;;;;;;;:::i;:::-;;;;;;;;64848:4;64822:12;64835:2;64822:16;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;;:30;;;;;;;;;;;;;;;;;;64943:5;64872:11;:42;64884:12;64897:2;64884:16;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:29:::2;:16;::::0;;::::2;;:29:::0;;;::::2;::::0;-1:-1:-1;;;;;64884:29:0::2;64872:42:::0;;;::::2;::::0;;;;;;;;64915:12:::2;:16:::0;;64872:42;;64884:16;64928:2;;64915:16;::::2;;;;;:::i;:::-;;;;;;;;;;;:24;;;64872:68;;;;;;;;;;;;:76;;;;;;;;;;;;;;;;;;64986:108;65004:12;65017:2;65004:16;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;;;;;;;;;-1:-1:-1::0;;;;;65004:23:0::2;65029:10;65041:12;65054:2;65041:16;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;;65067:12;65080:2;65067:16;;;;;;;;:::i;:::-;;;;;;;;;;;:22;;;64986:108;;;;;;;;;;;::::0;:17:::2;:108::i;:::-;65131:12;65144:2;65131:16;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;:23:::2;:16;::::0;;::::2;;:23;::::0;:43:::2;::::0;-1:-1:-1;;;;;65131:23:0;;::::2;::::0;65164:9:::2;65131:43:::0;::::2;;;::::0;65164:9;;65131:43;:16;:43;65164:9;65131:23;:43;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;65230:64;65248:10;65260:12;65273:2;65260:16;;;;;;;;:::i;65230:64::-;65313:54;65331:10;65343:13;;;;;;;;;-1:-1:-1::0;;;;;65343:13:0::2;65358:1;65361;65313:54;;;;;;;;;;;::::0;:17:::2;:54::i;:::-;65386:23;65392:10;65404:1;65407;65386:5;:23::i;:::-;65442:1;65428:12;;:15;;;;;;;:::i;:::-;;;;;;;;65467:78;65476:2;65480:10;65492:12;65505:2;65492:16;;;;;;;;:::i;:::-;;;;;;;;;;;:22;;;65516:12;65529:2;65516:16;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;;65467:78;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;;;;;;;65581:1:0::2;65584:12;;65598:15;65569:45;;;;;;;;:::i;:::-;;;;;;;;63542:2088;43727:1:::1;63160:2494:::0;;:::o;27592:168::-;-1:-1:-1;;;;;27715:27:0;;;27691:4;27715:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;27592:168::o;59183:1754::-;-1:-1:-1;;;;;59408:20:0;;3753:10;59408:20;;:60;;-1:-1:-1;59432:36:0;59449:4;3753:10;27592:168;:::i;59432:36::-;59386:151;;;;-1:-1:-1;;;59386:151:0;;25675:2:1;59386:151:0;;;25657:21:1;25714:2;25694:18;;;25687:30;25753:34;25733:18;;;25726:62;-1:-1:-1;;;25804:18:1;;;25797:39;25853:19;;59386:151:0;25473:405:1;59386:151:0;59572:1;59561:7;:12;59558:1372;;59592:23;59617:22;;;:13;:22;;;;;59685:17;;;;59666:16;;;;59705:15;;59666:36;;;:::i;:::-;:54;59658:99;;;;-1:-1:-1;;;59658:99:0;;;;;;;:::i;:::-;59789:10;59783:17;;;;:5;:17;;;;;;;;:26;;;;;;;;;:31;59775:64;;;;-1:-1:-1;;;59775:64:0;;;;;;;:::i;:::-;59869:45;59887:4;59893:2;59897:7;59906:1;59909:4;59869:17;:45::i;:::-;59950:61;;;;;;59966:10;;59978:2;;59982:7;;59991;;59950:61;:::i;:::-;;;;;;;;59575:448;59558:1372;;;60076:10;60093:1;60070:17;;;:5;:17;;;;;;;;:20;;;;;;;;;:24;60067:694;;60114:16;60133:24;60143:10;60155:1;60133:9;:24::i;:::-;60226:10;60194:23;60220:17;;;:5;:17;;;;;;;;:20;;;;;;;;;60114:43;;-1:-1:-1;60282:29:0;;;60274:38;;;;;;60350:29;60364:15;60350:11;:29;:::i;:::-;60339:6;:41;;60331:50;;;;;;60095:302;;60067:694;;;60425:10;60448:1;60419:17;;;:5;:17;;;;;;;;:26;;;;;;;;;:30;60416:345;;60483:15;60501:30;60511:10;60523:7;60501:9;:30::i;:::-;60584:10;60552:23;60578:17;;;:5;:17;;;;;;;;:26;;;;;;;;;60483:48;;-1:-1:-1;60578:26:0;60633:24;60643:4;60596:7;60633:9;:24::i;:::-;:42;60625:51;;;;;;60715:28;60728:15;60715:10;:28;:::i;:::-;60704:6;:40;;60696:49;;;;;;60464:297;;60416:345;60789:50;60807:4;60813:2;60817:7;60826:6;60834:4;60789:17;:50::i;:::-;60873:31;60886:4;60892:2;60896:7;60873:31;;;;;;;;:::i;5858:201::-;3753:10;5169:7;:5;:7::i;:::-;-1:-1:-1;;;;;5169:23:0;;5161:68;;;;-1:-1:-1;;;5161:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5947:22:0;::::1;5939:73;;;::::0;-1:-1:-1;;;5939:73:0;;24157:2:1;5939:73:0::1;::::0;::::1;24139:21:1::0;24196:2;24176:18;;;24169:30;24235:34;24215:18;;;24208:62;-1:-1:-1;;;24286:18:1;;;24279:36;24332:19;;5939:73:0::1;23955:402:1::0;5939:73:0::1;6023:28;6042:8;6023:18;:28::i;:::-;5858:201:::0;:::o;54159:1015::-;54230:1;54219:7;:12;;54211:35;;;;-1:-1:-1;;;54211:35:0;;;;;;;:::i;:::-;54292:1;54265:24;54275:10;54287:1;54265:9;:24::i;:::-;:28;54257:37;;;;;;54347:1;54314:30;54324:10;54336:7;54314:9;:30::i;:::-;:34;54306:43;;;;;;54380:10;54397:1;54374:17;;;:5;:17;;;;;;;;54392:1;54374:20;;;;;;;;:24;54371:170;;54447:10;54415:23;54441:17;;;:5;:17;;;;;;;;54459:1;54441:20;;;;;;;;;;;;54485:24;;54447:10;54485:9;:24::i;:::-;:42;54477:51;;;;;;54399:142;54371:170;54561:23;54586:22;;;:13;:22;;;;;;54638:24;54648:10;54561:23;54638:9;:24::i;:::-;54619:43;;54697:2;54683:11;:16;54675:44;;;;-1:-1:-1;;;54675:44:0;;;;;;;:::i;:::-;54778:15;54758:7;:17;;;54739:7;:16;;;:36;;;;:::i;:::-;:54;54731:99;;;;-1:-1:-1;;;54731:99:0;;;;;;;:::i;:::-;54851:23;54857:10;54869:1;54872;54851:5;:23::i;:::-;54897;54903:10;54915:1;54918;54897:5;:23::i;:::-;54943:49;54961:10;54973:8;;;;;;;;;-1:-1:-1;;;;;54973:8:0;54983:1;54986;54943:49;;;;;;;;;;;;:17;:49::i;:::-;55020:1;55005:12;;:16;;;;;;;:::i;:::-;;;;-1:-1:-1;55034:10:0;;-1:-1:-1;55047:12:0;:10;:12::i;:::-;55034:25;;55096:5;55080:7;:14;;;:21;;;;;;;:::i;47598:772::-;3753:10;5169:7;:5;:7::i;:::-;-1:-1:-1;;;;;5169:23:0;;5161:68;;;;-1:-1:-1;;;5161:68:0;;;;;;;:::i;:::-;47698:1:::1;47693:2;:6;47685:37;;;::::0;-1:-1:-1;;;47685:37:0;;26085:2:1;47685:37:0::1;::::0;::::1;26067:21:1::0;26124:2;26104:18;;;26097:30;-1:-1:-1;;;26143:18:1;;;26136:48;26201:18;;47685:37:0::1;25883:342:1::0;47685:37:0::1;47746:7:::0;47743:613:::1;;47796:19;;47787:6;:28;47779:76;;;::::0;-1:-1:-1;;;47779:76:0;;34380:2:1;47779:76:0::1;::::0;::::1;34362:21:1::0;34419:2;34399:18;;;34392:30;34458:34;34438:18;;;34431:62;-1:-1:-1;;;34509:18:1;;;34502:33;34552:19;;47779:76:0::1;34178:399:1::0;47779:76:0::1;47885:26;47891:7;47900:2;47904:6;47885:5;:26::i;:::-;47942:6;47927:12;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;47971:58:0::1;::::0;::::1;::::0;::::1;::::0;47989:10:::1;::::0;48001:2;;48005:6;;48013:15:::1;::::0;47971:58:::1;:::i;47743:613::-;48146:26;48152:7;48161:2;48165:6;48146:5;:26::i;:::-;48202:6;48187:12;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;48228:51:0::1;::::0;::::1;::::0;::::1;::::0;48239:10:::1;::::0;48251:2;;48255:6;;48263:15:::1;::::0;48228:51:::1;:::i;50301:1258::-:0;50369:1;50358:7;:12;;50350:35;;;;-1:-1:-1;;;50350:35:0;;;;;;;:::i;:::-;50437:1;50404:30;50414:10;50426:7;50404:9;:30::i;:::-;:34;50396:43;;;;;;50461:23;50487:22;;;:13;:22;;;;;;50550:24;50560:10;50461:23;50550:9;:24::i;:::-;50605:10;50622:1;50599:17;;;:5;:17;;;;;;;;:20;;;;;;;;;50531:43;;-1:-1:-1;50599:24:0;50596:279;;50672:10;50640:23;50666:17;;;:5;:17;;;;;;;;:20;;;;;;;;;50745:13;;;;50666:20;;50640:23;50666:20;;50740:18;;:2;:18;:::i;:::-;50734:25;;:2;:25;:::i;:::-;50733:45;;;;:::i;:::-;50717:61;;50830:5;50816:11;:19;50808:55;;;;-1:-1:-1;;;50808:55:0;;31132:2:1;50808:55:0;;;31114:21:1;31171:2;31151:18;;;31144:30;-1:-1:-1;;;31190:18:1;;;31183:53;31253:18;;50808:55:0;30930:347:1;50808:55:0;50624:251;;50596:279;50942:15;50922:7;:17;;;50903:7;:16;;;:36;;;;:::i;:::-;:54;50895:99;;;;-1:-1:-1;;;50895:99:0;;;;;;;:::i;:::-;51040:13;;;;51035:18;;:2;:18;:::i;:::-;51029:25;;:2;:25;:::i;:::-;51014:11;:41;51006:76;;;;-1:-1:-1;;;51006:76:0;;;;;;;:::i;:::-;51104:25;51110:10;51122:1;51125:2;51104:5;:25::i;:::-;51141:20;51149:2;51153:7;51141;:20::i;:::-;51203:8;;51221:13;;;;51173:66;;51191:10;;-1:-1:-1;;;;;51203:8:0;;;;;;51216:18;;:2;:18;:::i;51173:66::-;51269:2;51254:12;;:17;;;;;;;:::i;:::-;;;;-1:-1:-1;;51303:15:0;51284:16;;;:34;51330:11;;;:16;;51344:2;;51330:11;;;:16;;51344:2;;51330:16;:::i;:::-;;;;;;;;51391:2;51369:19;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;;51420:70:0;;;;;;51431:10;;51443:7;;51453;;51474:15;;51420:70;:::i;7650:326::-;-1:-1:-1;;;;;7945:19:0;;:23;;;7650:326::o;34696:648::-;-1:-1:-1;;;;;34823:18:0;;34815:66;;;;-1:-1:-1;;;34815:66:0;;32163:2:1;34815:66:0;;;32145:21:1;32202:2;32182:18;;;32175:30;32241:34;32221:18;;;32214:62;-1:-1:-1;;;32292:18:1;;;32285:33;32335:19;;34815:66:0;31961:399:1;34815:66:0;3753:10;34938:102;3753:10;34969:4;34894:16;34987:21;35005:2;34987:17;:21::i;:::-;35010:25;35028:6;35010:17;:25::i;:::-;-1:-1:-1;;34938:102:0;;;;;;;;;-1:-1:-1;34938:102:0;;-1:-1:-1;;;30394:1074:0;34938:102;35053:19;35075:13;;;;;;;;;;;-1:-1:-1;;;;;35075:19:0;;;;;;;;;;35113:21;;;;35105:70;;;;-1:-1:-1;;;35105:70:0;;24920:2:1;35105:70:0;;;24902:21:1;24959:2;24939:18;;;24932:30;24998:34;24978:18;;;24971:62;-1:-1:-1;;;25049:18:1;;;25042:34;25093:19;;35105:70:0;24718:400:1;35105:70:0;35211:9;:13;;;;;;;;;;;-1:-1:-1;;;;;35211:19:0;;;;;;;;;;;;35233:20;;;35211:42;;35282:54;;43068:25:1;;;43109:18;;;43102:34;;;35211:19:0;;35282:54;;;;-1:-1:-1;;;;;;;;;;;35282:54:0;43041:18:1;35282:54:0;;;;;;;34804:540;;34696:648;;;:::o;29216:820::-;-1:-1:-1;;;;;29404:16:0;;29396:66;;;;-1:-1:-1;;;29396:66:0;;;;;;;:::i;:::-;3753:10;29519:96;3753:10;29550:4;29556:2;29560:21;29578:2;29560:17;:21::i;:::-;29583:25;29601:6;29583:17;:25::i;29519:96::-;29628:19;29650:13;;;;;;;;;;;-1:-1:-1;;;;;29650:19:0;;;;;;;;;;29688:21;;;;29680:76;;;;-1:-1:-1;;;29680:76:0;;;;;;;:::i;:::-;29792:9;:13;;;;;;;;;;;-1:-1:-1;;;;;29792:19:0;;;;;;;;;;29814:20;;;29792:42;;29856:17;;;;;;;:27;;29814:20;;29792:9;29856:27;;29814:20;;29856:27;:::i;:::-;;;;-1:-1:-1;;29901:46:0;;;43068:25:1;;;43124:2;43109:18;;43102:34;;;-1:-1:-1;;;;;29901:46:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;29901:46:0;43041:18:1;29901:46:0;;;;;;;29960:68;29991:8;30001:4;30007:2;30011;30015:6;30023:4;29960:30;:68::i;:::-;29385:651;;29216:820;;;;;:::o;45494:163::-;45538:4;45642:2;45603:16;45621:15;45586:51;;;;;;;;13593:19:1;;;13637:2;13628:12;;13621:28;13674:2;13665:12;;13436:247;45586:51:0;;;;;;;;;;;;;45576:62;;;;;;45571:68;;:73;;;;:::i;:::-;45570:78;;45647:1;45570:78;:::i;:::-;45562:87;;45494:163;:::o;30394:1074::-;30621:7;:14;30607:3;:10;:28;30599:81;;;;-1:-1:-1;;;30599:81:0;;37030:2:1;30599:81:0;;;37012:21:1;37069:2;37049:18;;;37042:30;37108:34;37088:18;;;37081:62;-1:-1:-1;;;37159:18:1;;;37152:38;37207:19;;30599:81:0;36828:404:1;30599:81:0;-1:-1:-1;;;;;30699:16:0;;30691:66;;;;-1:-1:-1;;;30691:66:0;;;;;;;:::i;:::-;3753:10;30770:16;30887:421;30911:3;:10;30907:1;:14;30887:421;;;30943:10;30956:3;30960:1;30956:6;;;;;;;;:::i;:::-;;;;;;;30943:19;;30977:14;30994:7;31002:1;30994:10;;;;;;;;:::i;:::-;;;;;;;;;;;;31021:19;31043:13;;;;;;;;;;-1:-1:-1;;;;;31043:19:0;;;;;;;;;;;;30994:10;;-1:-1:-1;31085:21:0;;;;31077:76;;;;-1:-1:-1;;;31077:76:0;;;;;;;:::i;:::-;31197:9;:13;;;;;;;;;;;-1:-1:-1;;;;;31197:19:0;;;;;;;;;;31219:20;;;31197:42;;31269:17;;;;;;;:27;;31219:20;;31197:9;31269:27;;31219:20;;31269:27;:::i;:::-;;;;;;;;30928:380;;;30923:3;;;;:::i;:::-;;;30887:421;;;;31355:2;-1:-1:-1;;;;;31325:47:0;31349:4;-1:-1:-1;;;;;31325:47:0;31339:8;-1:-1:-1;;;;;31325:47:0;;31359:3;31364:7;31325:47;;;;;;;:::i;:::-;;;;;;;;31385:75;31421:8;31431:4;31437:2;31441:3;31446:7;31455:4;31385:35;:75::i;:::-;30588:880;30394:1074;;;;;:::o;57702:343::-;57774:30;57807:19;;;:10;:19;;;;;;;;57869:6;;57807:19;57846:29;57869:6;57807:19;57846:29;:::i;:::-;;;;-1:-1:-1;;57924:13:0;;57894:59;;;;;;;;;57924:13;57894:59;;;;;57912:10;;-1:-1:-1;;;;;57924:13:0;;;;;57942:6;;57894:17;:59::i;:::-;57975:19;;;;:10;:19;;;;;;58008:22;;57975:28;;57997:6;;57975:28;:::i;:::-;57974:56;57967:64;;;;:::i;32786:569::-;-1:-1:-1;;;;;32939:16:0;;32931:62;;;;-1:-1:-1;;;32931:62:0;;37439:2:1;32931:62:0;;;37421:21:1;37478:2;37458:18;;;37451:30;37517:34;37497:18;;;37490:62;-1:-1:-1;;;37568:18:1;;;37561:31;37609:19;;32931:62:0;37237:397:1;32931:62:0;3753:10;33050:102;3753:10;33006:16;33093:2;33097:21;33115:2;33097:17;:21::i;33050:102::-;33165:9;:13;;;;;;;;;;;-1:-1:-1;;;;;33165:17:0;;;;;;;;;:27;;33186:6;;33165:9;:27;;33186:6;;33165:27;:::i;:::-;;;;-1:-1:-1;;33208:52:0;;;43068:25:1;;;43124:2;43109:18;;43102:34;;;-1:-1:-1;;;;;33208:52:0;;;;33241:1;;33208:52;;;;-1:-1:-1;;;;;;;;;;;33208:52:0;43041:18:1;33208:52:0;;;;;;;33273:74;33304:8;33322:1;33326:2;33330;33334:6;33342:4;33273:30;:74::i;6219:191::-;6312:6;;;-1:-1:-1;;;;;6329:17:0;;;-1:-1:-1;;;;;;6329:17:0;;;;;;;6362:40;;6312:6;;;6329:17;6312:6;;6362:40;;6293:16;;6362:40;6282:128;6219:191;:::o;36580:331::-;36735:8;-1:-1:-1;;;;;36726:17:0;:5;-1:-1:-1;;;;;36726:17:0;;;36718:71;;;;-1:-1:-1;;;36718:71:0;;36210:2:1;36718:71:0;;;36192:21:1;36249:2;36229:18;;;36222:30;36288:34;36268:18;;;36261:62;-1:-1:-1;;;36339:18:1;;;36332:39;36388:19;;36718:71:0;36008:405:1;36718:71:0;-1:-1:-1;;;;;36800:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;36800:46:0;;;;;;;;;;36862:41;;20172::1;;;36862::0;;20145:18:1;36862:41:0;;;;;;;36580:331;;;:::o;39669:198::-;39789:16;;;39803:1;39789:16;;;;;;;;;39735;;39764:22;;39789:16;;;;;;;;;;;;-1:-1:-1;39789:16:0;39764:41;;39827:7;39816:5;39822:1;39816:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;39854:5;39669:198;-1:-1:-1;;39669:198:0:o;38096:744::-;38311:15;:2;-1:-1:-1;;;;;38311:13:0;;:15::i;:::-;38307:526;;;38347:72;;-1:-1:-1;;;38347:72:0;;-1:-1:-1;;;;;38347:38:0;;;;;:72;;38386:8;;38396:4;;38402:2;;38406:6;;38414:4;;38347:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38347:72:0;;;;;;;;-1:-1:-1;;38347:72:0;;;;;;;;;;;;:::i;:::-;;;38343:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;38695:6;38688:14;;-1:-1:-1;;;38688:14:0;;;;;;;;:::i;38343:479::-;;;38744:62;;-1:-1:-1;;;38744:62:0;;21189:2:1;38744:62:0;;;21171:21:1;21228:2;21208:18;;;21201:30;21267:34;21247:18;;;21240:62;-1:-1:-1;;;21318:18:1;;;21311:50;21378:19;;38744:62:0;20987:416:1;38343:479:0;-1:-1:-1;;;;;;38469:55:0;;-1:-1:-1;;;38469:55:0;38465:154;;38549:50;;-1:-1:-1;;;38549:50:0;;;;;;;:::i;38848:813::-;39088:15;:2;-1:-1:-1;;;;;39088:13:0;;:15::i;:::-;39084:570;;;39124:79;;-1:-1:-1;;;39124:79:0;;-1:-1:-1;;;;;39124:43:0;;;;;:79;;39168:8;;39178:4;;39184:3;;39189:7;;39198:4;;39124:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39124:79:0;;;;;;;;-1:-1:-1;;39124:79:0;;;;;;;;;;;;:::i;:::-;;;39120:523;;;;:::i;:::-;-1:-1:-1;;;;;;39285:60:0;;-1:-1:-1;;;39285:60:0;39281:159;;39370:50;;-1:-1:-1;;;39370:50:0;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;192:367;255:8;265:6;319:3;312:4;304:6;300:17;296:27;286:55;;337:1;334;327:12;286:55;-1:-1:-1;360:20:1;;-1:-1:-1;;;;;392:30:1;;389:50;;;435:1;432;425:12;389:50;472:4;464:6;460:17;448:29;;532:3;525:4;515:6;512:1;508:14;500:6;496:27;492:38;489:47;486:67;;;549:1;546;539:12;486:67;192:367;;;;;:::o;564:735::-;618:5;671:3;664:4;656:6;652:17;648:27;638:55;;689:1;686;679:12;638:55;725:6;712:20;751:4;774:43;814:2;774:43;:::i;:::-;846:2;840:9;858:31;886:2;878:6;858:31;:::i;:::-;924:18;;;958:15;;;;-1:-1:-1;993:15:1;;;1043:1;1039:10;;;1027:23;;1023:32;;1020:41;-1:-1:-1;1017:61:1;;;1074:1;1071;1064:12;1017:61;1096:1;1106:163;1120:2;1117:1;1114:9;1106:163;;;1177:17;;1165:30;;1215:12;;;;1247;;;;1138:1;1131:9;1106:163;;;-1:-1:-1;1287:6:1;;564:735;-1:-1:-1;;;;;;;564:735:1:o;1304:347::-;1355:8;1365:6;1419:3;1412:4;1404:6;1400:17;1396:27;1386:55;;1437:1;1434;1427:12;1386:55;-1:-1:-1;1460:20:1;;-1:-1:-1;;;;;1492:30:1;;1489:50;;;1535:1;1532;1525:12;1489:50;1572:4;1564:6;1560:17;1548:29;;1624:3;1617:4;1608:6;1600;1596:19;1592:30;1589:39;1586:59;;;1641:1;1638;1631:12;1656:555;1698:5;1751:3;1744:4;1736:6;1732:17;1728:27;1718:55;;1769:1;1766;1759:12;1718:55;1792:20;;-1:-1:-1;;;;;1824:26:1;;1821:52;;;1853:18;;:::i;:::-;1902:2;1896:9;1914:67;1969:2;1950:13;;-1:-1:-1;;1946:27:1;1975:4;1942:38;1896:9;1914:67;:::i;:::-;2005:2;1997:6;1990:18;2051:3;2044:4;2039:2;2031:6;2027:15;2023:26;2020:35;2017:55;;;2068:1;2065;2058:12;2017:55;2132:2;2125:4;2117:6;2113:17;2106:4;2098:6;2094:17;2081:54;2179:1;2155:15;;;2172:4;2151:26;2144:37;;;;2159:6;1656:555;-1:-1:-1;;;1656:555:1:o;2216:186::-;2275:6;2328:2;2316:9;2307:7;2303:23;2299:32;2296:52;;;2344:1;2341;2334:12;2296:52;2367:29;2386:9;2367:29;:::i;:::-;2357:39;2216:186;-1:-1:-1;;;2216:186:1:o;2407:260::-;2475:6;2483;2536:2;2524:9;2515:7;2511:23;2507:32;2504:52;;;2552:1;2549;2542:12;2504:52;2575:29;2594:9;2575:29;:::i;:::-;2565:39;;2623:38;2657:2;2646:9;2642:18;2623:38;:::i;:::-;2613:48;;2407:260;;;;;:::o;2672:1210::-;2832:6;2840;2848;2856;2864;2872;2880;2888;2941:3;2929:9;2920:7;2916:23;2912:33;2909:53;;;2958:1;2955;2948:12;2909:53;2981:29;3000:9;2981:29;:::i;:::-;2971:39;;3029:38;3063:2;3052:9;3048:18;3029:38;:::i;:::-;3019:48;-1:-1:-1;3118:2:1;3103:18;;3090:32;-1:-1:-1;;;;;3171:14:1;;;3168:34;;;3198:1;3195;3188:12;3168:34;3237:70;3299:7;3290:6;3279:9;3275:22;3237:70;:::i;:::-;3326:8;;-1:-1:-1;3211:96:1;-1:-1:-1;3414:2:1;3399:18;;3386:32;;-1:-1:-1;3430:16:1;;;3427:36;;;3459:1;3456;3449:12;3427:36;3498:72;3562:7;3551:8;3540:9;3536:24;3498:72;:::i;:::-;3589:8;;-1:-1:-1;3472:98:1;-1:-1:-1;3677:3:1;3662:19;;3649:33;;-1:-1:-1;3694:16:1;;;3691:36;;;3723:1;3720;3713:12;3691:36;;3762:60;3814:7;3803:8;3792:9;3788:24;3762:60;:::i;:::-;2672:1210;;;;-1:-1:-1;2672:1210:1;;-1:-1:-1;2672:1210:1;;;;;;3841:8;-1:-1:-1;;;2672:1210:1:o;3887:943::-;4041:6;4049;4057;4065;4073;4126:3;4114:9;4105:7;4101:23;4097:33;4094:53;;;4143:1;4140;4133:12;4094:53;4166:29;4185:9;4166:29;:::i;:::-;4156:39;;4214:38;4248:2;4237:9;4233:18;4214:38;:::i;:::-;4204:48;-1:-1:-1;4303:2:1;4288:18;;4275:32;-1:-1:-1;;;;;4356:14:1;;;4353:34;;;4383:1;4380;4373:12;4353:34;4406:61;4459:7;4450:6;4439:9;4435:22;4406:61;:::i;:::-;4396:71;;4520:2;4509:9;4505:18;4492:32;4476:48;;4549:2;4539:8;4536:16;4533:36;;;4565:1;4562;4555:12;4533:36;4588:63;4643:7;4632:8;4621:9;4617:24;4588:63;:::i;:::-;4578:73;;4704:3;4693:9;4689:19;4676:33;4660:49;;4734:2;4724:8;4721:16;4718:36;;;4750:1;4747;4740:12;4718:36;;4773:51;4816:7;4805:8;4794:9;4790:24;4773:51;:::i;:::-;4763:61;;;3887:943;;;;;;;;:::o;4835:695::-;4941:6;4949;4957;4965;4973;4981;5034:3;5022:9;5013:7;5009:23;5005:33;5002:53;;;5051:1;5048;5041:12;5002:53;5074:29;5093:9;5074:29;:::i;:::-;5064:39;;5122:38;5156:2;5145:9;5141:18;5122:38;:::i;:::-;5112:48;-1:-1:-1;5207:2:1;5192:18;;5179:32;;-1:-1:-1;5258:2:1;5243:18;;5230:32;;-1:-1:-1;5313:3:1;5298:19;;5285:33;-1:-1:-1;;;;;5330:30:1;;5327:50;;;5373:1;5370;5363:12;5327:50;5412:58;5462:7;5453:6;5442:9;5438:22;5412:58;:::i;:::-;4835:695;;;;-1:-1:-1;4835:695:1;;-1:-1:-1;4835:695:1;;5489:8;;4835:695;-1:-1:-1;;;4835:695:1:o;5535:606::-;5639:6;5647;5655;5663;5671;5724:3;5712:9;5703:7;5699:23;5695:33;5692:53;;;5741:1;5738;5731:12;5692:53;5764:29;5783:9;5764:29;:::i;:::-;5754:39;;5812:38;5846:2;5835:9;5831:18;5812:38;:::i;:::-;5802:48;-1:-1:-1;5897:2:1;5882:18;;5869:32;;-1:-1:-1;5948:2:1;5933:18;;5920:32;;-1:-1:-1;6003:3:1;5988:19;;5975:33;-1:-1:-1;;;;;6020:30:1;;6017:50;;;6063:1;6060;6053:12;6017:50;6086:49;6127:7;6118:6;6107:9;6103:22;6086:49;:::i;6146:315::-;6211:6;6219;6272:2;6260:9;6251:7;6247:23;6243:32;6240:52;;;6288:1;6285;6278:12;6240:52;6311:29;6330:9;6311:29;:::i;:::-;6301:39;;6390:2;6379:9;6375:18;6362:32;6403:28;6425:5;6403:28;:::i;:::-;6450:5;6440:15;;;6146:315;;;;;:::o;6466:254::-;6534:6;6542;6595:2;6583:9;6574:7;6570:23;6566:32;6563:52;;;6611:1;6608;6601:12;6563:52;6634:29;6653:9;6634:29;:::i;:::-;6624:39;6710:2;6695:18;;;;6682:32;;-1:-1:-1;;;6466:254:1:o;6725:322::-;6802:6;6810;6818;6871:2;6859:9;6850:7;6846:23;6842:32;6839:52;;;6887:1;6884;6877:12;6839:52;6910:29;6929:9;6910:29;:::i;:::-;6900:39;6986:2;6971:18;;6958:32;;-1:-1:-1;7037:2:1;7022:18;;;7009:32;;6725:322;-1:-1:-1;;;6725:322:1:o;7052:1219::-;7170:6;7178;7231:2;7219:9;7210:7;7206:23;7202:32;7199:52;;;7247:1;7244;7237:12;7199:52;7274:23;;-1:-1:-1;;;;;7346:14:1;;;7343:34;;;7373:1;7370;7363:12;7343:34;7411:6;7400:9;7396:22;7386:32;;7456:7;7449:4;7445:2;7441:13;7437:27;7427:55;;7478:1;7475;7468:12;7427:55;7514:2;7501:16;7536:4;7559:43;7599:2;7559:43;:::i;:::-;7631:2;7625:9;7643:31;7671:2;7663:6;7643:31;:::i;:::-;7709:18;;;7743:15;;;;-1:-1:-1;7778:11:1;;;7820:1;7816:10;;;7808:19;;7804:28;;7801:41;-1:-1:-1;7798:61:1;;;7855:1;7852;7845:12;7798:61;7877:1;7868:10;;7887:169;7901:2;7898:1;7895:9;7887:169;;;7958:23;7977:3;7958:23;:::i;:::-;7946:36;;7919:1;7912:9;;;;;8002:12;;;;8034;;7887:169;;;-1:-1:-1;8075:6:1;-1:-1:-1;;8119:18:1;;8106:32;;-1:-1:-1;;8150:16:1;;;8147:36;;;8179:1;8176;8169:12;8147:36;;8202:63;8257:7;8246:8;8235:9;8231:24;8202:63;:::i;:::-;8192:73;;;7052:1219;;;;;:::o;8276:245::-;8343:6;8396:2;8384:9;8375:7;8371:23;8367:32;8364:52;;;8412:1;8409;8402:12;8364:52;8444:9;8438:16;8463:28;8485:5;8463:28;:::i;8526:245::-;8584:6;8637:2;8625:9;8616:7;8612:23;8608:32;8605:52;;;8653:1;8650;8643:12;8605:52;8692:9;8679:23;8711:30;8735:5;8711:30;:::i;8776:249::-;8845:6;8898:2;8886:9;8877:7;8873:23;8869:32;8866:52;;;8914:1;8911;8904:12;8866:52;8946:9;8940:16;8965:30;8989:5;8965:30;:::i;9030:1085::-;9182:6;9190;9198;9206;9214;9222;9230;9238;9291:3;9279:9;9270:7;9266:23;9262:33;9259:53;;;9308:1;9305;9298:12;9259:53;9335:23;;-1:-1:-1;;;;;9407:14:1;;;9404:34;;;9434:1;9431;9424:12;9404:34;9457:49;9498:7;9489:6;9478:9;9474:22;9457:49;:::i;:::-;9447:59;;9553:2;9542:9;9538:18;9525:32;9515:42;;9604:2;9593:9;9589:18;9576:32;9566:42;;9655:2;9644:9;9640:18;9627:32;9617:42;;9706:3;9695:9;9691:19;9678:33;9668:43;;9758:3;9747:9;9743:19;9730:33;9720:43;;9816:3;9805:9;9801:19;9788:33;9772:49;;9846:2;9836:8;9833:16;9830:36;;;9862:1;9859;9852:12;9830:36;9885:51;9928:7;9917:8;9906:9;9902:24;9885:51;:::i;:::-;9875:61;;9989:3;9978:9;9974:19;9961:33;9945:49;;10019:2;10009:8;10006:16;10003:36;;;10035:1;10032;10025:12;10003:36;;10058:51;10101:7;10090:8;10079:9;10075:24;10058:51;:::i;:::-;10048:61;;;9030:1085;;;;;;;;;;;:::o;10120:180::-;10179:6;10232:2;10220:9;10211:7;10207:23;10203:32;10200:52;;;10248:1;10245;10238:12;10200:52;-1:-1:-1;10271:23:1;;10120:180;-1:-1:-1;10120:180:1:o;10305:184::-;10375:6;10428:2;10416:9;10407:7;10403:23;10399:32;10396:52;;;10444:1;10441;10434:12;10396:52;-1:-1:-1;10467:16:1;;10305:184;-1:-1:-1;10305:184:1:o;10494:389::-;10572:6;10580;10633:2;10621:9;10612:7;10608:23;10604:32;10601:52;;;10649:1;10646;10639:12;10601:52;10672:23;;;-1:-1:-1;10746:2:1;10731:18;;10718:32;-1:-1:-1;;;;;10762:30:1;;10759:50;;;10805:1;10802;10795:12;10759:50;10828:49;10869:7;10860:6;10849:9;10845:22;10828:49;:::i;10888:248::-;10956:6;10964;11017:2;11005:9;10996:7;10992:23;10988:32;10985:52;;;11033:1;11030;11023:12;10985:52;-1:-1:-1;;11056:23:1;;;11126:2;11111:18;;;11098:32;;-1:-1:-1;10888:248:1:o;11141:316::-;11218:6;11226;11234;11287:2;11275:9;11266:7;11262:23;11258:32;11255:52;;;11303:1;11300;11293:12;11255:52;-1:-1:-1;;11326:23:1;;;11396:2;11381:18;;11368:32;;-1:-1:-1;11447:2:1;11432:18;;;11419:32;;11141:316;-1:-1:-1;11141:316:1:o;11462:435::-;11515:3;11553:5;11547:12;11580:6;11575:3;11568:19;11606:4;11635:2;11630:3;11626:12;11619:19;;11672:2;11665:5;11661:14;11693:1;11703:169;11717:6;11714:1;11711:13;11703:169;;;11778:13;;11766:26;;11812:12;;;;11847:15;;;;11739:1;11732:9;11703:169;;;-1:-1:-1;11888:3:1;;11462:435;-1:-1:-1;;;;;11462:435:1:o;11902:471::-;11943:3;11981:5;11975:12;12008:6;12003:3;11996:19;12033:1;12043:162;12057:6;12054:1;12051:13;12043:162;;;12119:4;12175:13;;;12171:22;;12165:29;12147:11;;;12143:20;;12136:59;12072:12;12043:162;;;12223:6;12220:1;12217:13;12214:87;;;12289:1;12282:4;12273:6;12268:3;12264:16;12260:27;12253:38;12214:87;-1:-1:-1;12355:2:1;12334:15;-1:-1:-1;;12330:29:1;12321:39;;;;12362:4;12317:50;;11902:471;-1:-1:-1;;11902:471:1:o;12378:1053::-;12463:12;;12428:3;;12518:1;12538:18;;;;12591;;;;12618:61;;12672:4;12664:6;12660:17;12650:27;;12618:61;12698:2;12746;12738:6;12735:14;12715:18;12712:38;12709:161;;;12792:10;12787:3;12783:20;12780:1;12773:31;12827:4;12824:1;12817:15;12855:4;12852:1;12845:15;12709:161;44475:19;;;44527:4;44518:14;;12967:18;12994:104;;;;13112:1;13107:318;;;;12960:465;;12994:104;-1:-1:-1;;13029:24:1;;13015:39;;13074:14;;;;-1:-1:-1;12994:104:1;;13107:318;44324:1;44317:14;;;44361:4;44348:18;;13201:1;13215:167;13229:6;13226:1;13223:13;13215:167;;;13309:14;;13294:13;;;13287:37;13352:16;;;;13244:10;;13215:167;;;13402:13;;;-1:-1:-1;;12960:465:1;;;;;;;;12378:1053;;;;:::o;14120:304::-;-1:-1:-1;;;;;14350:15:1;;;14332:34;;14402:15;;14397:2;14382:18;;14375:43;14282:2;14267:18;;14120:304::o;14429:826::-;-1:-1:-1;;;;;14826:15:1;;;14808:34;;14878:15;;14873:2;14858:18;;14851:43;14788:3;14925:2;14910:18;;14903:31;;;14751:4;;14957:57;;14994:19;;14986:6;14957:57;:::i;:::-;15062:9;15054:6;15050:22;15045:2;15034:9;15030:18;15023:50;15096:44;15133:6;15125;15096:44;:::i;:::-;15082:58;;15189:9;15181:6;15177:22;15171:3;15160:9;15156:19;15149:51;15217:32;15242:6;15234;15217:32;:::i;:::-;15209:40;14429:826;-1:-1:-1;;;;;;;;14429:826:1:o;15260:405::-;-1:-1:-1;;;;;15548:15:1;;;15530:34;;15600:15;;;;15595:2;15580:18;;15573:43;15647:2;15632:18;;15625:34;;;;15480:2;15465:18;;15260:405::o;16050:496::-;-1:-1:-1;;;;;16318:15:1;;;16300:34;;16370:15;;16365:2;16350:18;;16343:43;16417:2;16402:18;;16395:34;;;16465:3;16460:2;16445:18;;16438:31;;;16243:4;;16486:54;;16520:19;;16512:6;16486:54;:::i;:::-;16478:62;16050:496;-1:-1:-1;;;;;;16050:496:1:o;16551:560::-;-1:-1:-1;;;;;16848:15:1;;;16830:34;;16900:15;;16895:2;16880:18;;16873:43;16947:2;16932:18;;16925:34;;;16990:2;16975:18;;16968:34;;;16810:3;17033;17018:19;;17011:32;;;16773:4;;17060:45;;17085:19;;17077:6;17060:45;:::i;:::-;17052:53;16551:560;-1:-1:-1;;;;;;;16551:560:1:o;17116:460::-;-1:-1:-1;;;;;17349:32:1;;17331:51;;17418:3;17413:2;17398:18;;17391:31;;;-1:-1:-1;;17439:45:1;;17464:19;;17456:6;17439:45;:::i;:::-;17515:2;17500:18;;17493:34;;;;-1:-1:-1;17558:2:1;17543:18;17536:34;17431:53;17116:460;-1:-1:-1;;17116:460:1:o;17581:274::-;-1:-1:-1;;;;;17773:32:1;;;;17755:51;;17837:2;17822:18;;17815:34;17743:2;17728:18;;17581:274::o;17860:466::-;18119:1;18115;18110:3;18106:11;18102:19;18094:6;18090:32;18079:9;18072:51;18159:6;18154:2;18143:9;18139:18;18132:34;18202:3;18197:2;18186:9;18182:18;18175:31;18053:4;18223:54;18272:3;18261:9;18257:19;18249:6;18223:54;:::i;:::-;18215:62;;18313:6;18308:2;18297:9;18293:18;18286:34;17860:466;;;;;;;:::o;18331:538::-;18618:1;18614;18609:3;18605:11;18601:19;18593:6;18589:32;18578:9;18571:51;18658:6;18653:2;18642:9;18638:18;18631:34;18701:3;18696:2;18685:9;18681:18;18674:31;18552:4;18722:54;18771:3;18760:9;18756:19;18748:6;18722:54;:::i;:::-;18807:2;18792:18;;18785:34;;;;-1:-1:-1;18850:3:1;18835:19;18828:35;18714:62;18331:538;-1:-1:-1;;;18331:538:1:o;18874:417::-;-1:-1:-1;;;;;19123:32:1;;;;19105:51;;19187:2;19172:18;;19165:34;;;;19230:2;19215:18;;19208:34;19273:2;19258:18;;19251:34;19092:3;19077:19;;18874:417::o;19296:261::-;19475:2;19464:9;19457:21;19438:4;19495:56;19547:2;19536:9;19532:18;19524:6;19495:56;:::i;19562:465::-;19819:2;19808:9;19801:21;19782:4;19845:56;19897:2;19886:9;19882:18;19874:6;19845:56;:::i;:::-;19949:9;19941:6;19937:22;19932:2;19921:9;19917:18;19910:50;19977:44;20014:6;20006;19977:44;:::i;:::-;19969:52;19562:465;-1:-1:-1;;;;;19562:465:1:o;20431:327::-;20641:25;;;20697:2;20682:18;;20675:34;;;;20740:2;20725:18;;20718:34;20629:2;20614:18;;20431:327::o;20763:219::-;20912:2;20901:9;20894:21;20875:4;20932:44;20972:2;20961:9;20957:18;20949:6;20932:44;:::i;21408:404::-;21610:2;21592:21;;;21649:2;21629:18;;;21622:30;21688:34;21683:2;21668:18;;21661:62;-1:-1:-1;;;21754:2:1;21739:18;;21732:38;21802:3;21787:19;;21408:404::o;26580:337::-;26782:2;26764:21;;;26821:2;26801:18;;;26794:30;-1:-1:-1;;;26855:2:1;26840:18;;26833:43;26908:2;26893:18;;26580:337::o;26922:339::-;27124:2;27106:21;;;27163:2;27143:18;;;27136:30;-1:-1:-1;;;27197:2:1;27182:18;;27175:45;27252:2;27237:18;;26922:339::o;27611:::-;27813:2;27795:21;;;27852:2;27832:18;;;27825:30;-1:-1:-1;;;27886:2:1;27871:18;;27864:45;27941:2;27926:18;;27611:339::o;27955:401::-;28157:2;28139:21;;;28196:2;28176:18;;;28169:30;28235:34;28230:2;28215:18;;28208:62;-1:-1:-1;;;28301:2:1;28286:18;;28279:35;28346:3;28331:19;;27955:401::o;31622:334::-;31824:2;31806:21;;;31863:2;31843:18;;;31836:30;-1:-1:-1;;;31897:2:1;31882:18;;31875:40;31947:2;31932:18;;31622:334::o;32365:406::-;32567:2;32549:21;;;32606:2;32586:18;;;32579:30;32645:34;32640:2;32625:18;;32618:62;-1:-1:-1;;;32711:2:1;32696:18;;32689:40;32761:3;32746:19;;32365:406::o;33116:356::-;33318:2;33300:21;;;33337:18;;;33330:30;33396:34;33391:2;33376:18;;33369:62;33463:2;33448:18;;33116:356::o;33477:346::-;33679:2;33661:21;;;33718:2;33698:18;;;33691:30;-1:-1:-1;;;33752:2:1;33737:18;;33730:52;33814:2;33799:18;;33477:346::o;34582:344::-;34784:2;34766:21;;;34823:2;34803:18;;;34796:30;-1:-1:-1;;;34857:2:1;34842:18;;34835:50;34917:2;34902:18;;34582:344::o;35647:356::-;35849:2;35831:21;;;35868:18;;;35861:30;35927:34;35922:2;35907:18;;35900:62;35994:2;35979:18;;35647:356::o;37639:339::-;37841:2;37823:21;;;37880:2;37860:18;;;37853:30;-1:-1:-1;;;37914:2:1;37899:18;;37892:45;37969:2;37954:18;;37639:339::o;37983:334::-;38185:2;38167:21;;;38224:2;38204:18;;;38197:30;-1:-1:-1;;;38258:2:1;38243:18;;38236:40;38308:2;38293:18;;37983:334::o;39088:1579::-;39267:2;39256:9;39249:21;39230:4;39305:6;39299:13;39331:6;39373:2;39368;39357:9;39353:18;39346:30;39399:51;39445:3;39434:9;39430:19;39416:12;39399:51;:::i;:::-;39385:65;;39499:2;39491:6;39487:15;39481:22;39526:2;39522:7;39593:2;39581:9;39573:6;39569:22;39565:31;39560:2;39549:9;39545:18;39538:59;39620:40;39653:6;39637:14;39620:40;:::i;:::-;39606:54;;39714:2;39706:6;39702:15;39696:22;39691:2;39680:9;39676:18;39669:50;39774:2;39766:6;39762:15;39756:22;39750:3;39739:9;39735:19;39728:51;39834:3;39826:6;39822:16;39816:23;39810:3;39799:9;39795:19;39788:52;39895:3;39887:6;39883:16;39877:23;39871:3;39860:9;39856:19;39849:52;39956:3;39948:6;39944:16;39938:23;39932:3;39921:9;39917:19;39910:52;39999:3;39991:6;39987:16;39981:23;39971:33;;40023:3;40062:2;40057;40046:9;40042:18;40035:30;40102:2;40094:6;40090:15;40084:22;40074:32;;;40125:3;40164:2;40159;40148:9;40144:18;40137:30;40216:2;40208:6;40204:15;40198:22;40176:44;;;40239:3;40306:2;40294:9;40286:6;40282:22;40278:31;40273:2;40262:9;40258:18;40251:59;40333:40;40366:6;40350:14;40333:40;:::i;:::-;40319:54;;40422:2;40414:6;40410:15;40404:22;40382:44;;;40445:3;40512:2;40500:9;40492:6;40488:22;40484:31;40479:2;40468:9;40464:18;40457:59;40539:40;40572:6;40556:14;40539:40;:::i;:::-;40621:15;;40615:22;40595:18;;;;40588:50;;;;-1:-1:-1;40525:54:1;;39088:1579;-1:-1:-1;;;39088:1579:1:o;40854:425::-;41093:25;;;-1:-1:-1;;;;;41154:32:1;;;;41149:2;41134:18;;41127:60;41218:2;41203:18;;41196:34;41261:2;41246:18;;41239:34;41080:3;41065:19;;40854:425::o;42400:489::-;42659:25;;;-1:-1:-1;;;;;42720:32:1;;;;42715:2;42700:18;;42693:60;42784:2;42769:18;;42762:34;;;;42827:2;42812:18;;42805:34;42870:3;42855:19;;42848:35;42646:3;42631:19;;42400:489::o;44063:183::-;44123:4;-1:-1:-1;;;;;44145:30:1;;44142:56;;;44178:18;;:::i;:::-;-1:-1:-1;44223:1:1;44219:14;44235:4;44215:25;;44063:183::o;44543:128::-;44583:3;44614:1;44610:6;44607:1;44604:13;44601:39;;;44620:18;;:::i;:::-;-1:-1:-1;44656:9:1;;44543:128::o;44676:120::-;44716:1;44742;44732:35;;44747:18;;:::i;:::-;-1:-1:-1;44781:9:1;;44676:120::o;44801:168::-;44841:7;44907:1;44903;44899:6;44895:14;44892:1;44889:21;44884:1;44877:9;44870:17;44866:45;44863:71;;;44914:18;;:::i;:::-;-1:-1:-1;44954:9:1;;44801:168::o;44974:125::-;45014:4;45042:1;45039;45036:8;45033:34;;;45047:18;;:::i;:::-;-1:-1:-1;45084:9:1;;44974:125::o;45104:380::-;45183:1;45179:12;;;;45226;;;45247:61;;45301:4;45293:6;45289:17;45279:27;;45247:61;45354:2;45346:6;45343:14;45323:18;45320:38;45317:161;;;45400:10;45395:3;45391:20;45388:1;45381:31;45435:4;45432:1;45425:15;45463:4;45460:1;45453:15;45317:161;;45104:380;;;:::o;45489:249::-;45599:2;45580:13;;-1:-1:-1;;45576:27:1;45564:40;;-1:-1:-1;;;;;45619:34:1;;45655:22;;;45616:62;45613:88;;;45681:18;;:::i;:::-;45717:2;45710:22;-1:-1:-1;;45489:249:1:o;45743:135::-;45782:3;-1:-1:-1;;45803:17:1;;45800:43;;;45823:18;;:::i;:::-;-1:-1:-1;45870:1:1;45859:13;;45743:135::o;45883:112::-;45915:1;45941;45931:35;;45946:18;;:::i;:::-;-1:-1:-1;45980:9:1;;45883:112::o;46000:127::-;46061:10;46056:3;46052:20;46049:1;46042:31;46092:4;46089:1;46082:15;46116:4;46113:1;46106:15;46132:127;46193:10;46188:3;46184:20;46181:1;46174:31;46224:4;46221:1;46214:15;46248:4;46245:1;46238:15;46264:127;46325:10;46320:3;46316:20;46313:1;46306:31;46356:4;46353:1;46346:15;46380:4;46377:1;46370:15;46396:127;46457:10;46452:3;46448:20;46445:1;46438:31;46488:4;46485:1;46478:15;46512:4;46509:1;46502:15;46528:127;46589:10;46584:3;46580:20;46577:1;46570:31;46620:4;46617:1;46610:15;46644:4;46641:1;46634:15;46660:179;46695:3;46737:1;46719:16;46716:23;46713:120;;;46783:1;46780;46777;46762:23;-1:-1:-1;46820:1:1;46814:8;46809:3;46805:18;46660:179;:::o;46844:671::-;46883:3;46925:4;46907:16;46904:26;46901:39;;;46844:671;:::o;46901:39::-;46967:2;46961:9;-1:-1:-1;;47032:16:1;47028:25;;47025:1;46961:9;47004:50;47077:11;;47107:16;-1:-1:-1;;;;;47175:14:1;;;47206:4;47194:17;;47191:25;-1:-1:-1;47172:45:1;47169:58;;;47220:5;;;;;46844:671;:::o;47169:58::-;47257:6;47251:4;47247:17;47236:28;;47293:3;47287:10;47320:2;47312:6;47309:14;47306:27;;;47326:5;;;;;;46844:671;:::o;47306:27::-;47410:2;47391:16;47385:4;47381:27;47377:36;47370:4;47361:6;47356:3;47352:16;47348:27;47345:69;47342:82;;;47417:5;;;;;;46844:671;:::o;47342:82::-;47433:57;47484:4;47475:6;47467;47463:19;47459:30;47453:4;47433:57;:::i;:::-;-1:-1:-1;47506:3:1;;46844:671;-1:-1:-1;;;;;46844:671:1:o;47520:118::-;47606:5;47599:13;47592:21;47585:5;47582:32;47572:60;;47628:1;47625;47618:12;47643:131;-1:-1:-1;;;;;;47717:32:1;;47707:43;;47697:71;;47764:1;47761;47754:12

Swarm Source

ipfs://40dbac1934fe838d3dd03f8c93fd0fb5d95d22b255c44d9d7265bf07afbcad6b
Loading